[open-ils-commits] [GIT] Evergreen ILS branch tags/rel_2_11_rc created. 8d9ed22eed75134ecd4682f17feee9452b9ed33e

Evergreen Git git at git.evergreen-ils.org
Wed Sep 14 18:42:03 EDT 2016


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Evergreen ILS".

The branch, tags/rel_2_11_rc has been created
        at  8d9ed22eed75134ecd4682f17feee9452b9ed33e (commit)

- Log -----------------------------------------------------------------
commit 8d9ed22eed75134ecd4682f17feee9452b9ed33e
Author: Dan Wells <dbw2 at calvin.edu>
Date:   Fri Sep 9 10:10:40 2016 -0400

    Bumping version numbers, adding Upgrade Script and Changelog
    
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>

diff --git a/ChangeLog b/ChangeLog
index 1f72b2c..0afd82b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,3925 @@
-Evergreen doesn't keep a GNU-style ChangeLog except in release tarballs.
-Those seeking a change log are encouraged to run 'git log -v', or read
-it online at: http://git.evergreen-ils.org/?p=Evergreen.git;a=log
+commit e8717537d36741b38dd92d613f722a10e4e56a33
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Aug 25 18:08:07 2016 -0400
+
+    Update release notes
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+522	0	docs/RELEASE_NOTES_2_11.adoc
+0	16	docs/RELEASE_NOTES_NEXT/Administration/Action_Trigger_Email_Headers.adoc
+0	15	docs/RELEASE_NOTES_NEXT/Administration/lp1568046-tablefunc-extension-removed.adoc
+0	29	docs/RELEASE_NOTES_NEXT/Administration/user-activity-purge.adoc
+0	6	docs/RELEASE_NOTES_NEXT/Cataloging/auth_bib_update.adoc
+0	16	docs/RELEASE_NOTES_NEXT/Cataloging/auth_prop_bib_update.adoc
+0	6	docs/RELEASE_NOTES_NEXT/Cataloging/bib_source_in_901s.txt
+0	15	docs/RELEASE_NOTES_NEXT/Cataloging/marc_bib_update.adoc
+0	21	docs/RELEASE_NOTES_NEXT/Circulation/aged-circs-see-light-of-day.adoc
+0	26	docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc
+0	17	docs/RELEASE_NOTES_NEXT/Circulation/copy-status-is-avail.adoc
+0	20	docs/RELEASE_NOTES_NEXT/Circulation/email_cko_receipts.adoc
+0	16	docs/RELEASE_NOTES_NEXT/Circulation/limit_payment_amounts_accepted.txt
+0	17	docs/RELEASE_NOTES_NEXT/Client/added-fields-for-client-interfaces.adoc
+0	7	docs/RELEASE_NOTES_NEXT/OPAC/combine_notice_prefs_tables.adoc
+0	14	docs/RELEASE_NOTES_NEXT/OPAC/improved-myopac-holds-screens.adoc
+0	101	docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
+0	9	docs/RELEASE_NOTES_NEXT/OPAC/remove_advanced_hold_options_for_parts.adoc
+0	8	docs/RELEASE_NOTES_NEXT/SIP/SIP_Workstation_Name.adoc
+0	7	docs/RELEASE_NOTES_NEXT/SIP/SIP_renewal_blocks.adoc
+0	7	docs/RELEASE_NOTES_NEXT/Translations/Updates.adoc
+21	41	docs/installation/server_upgrade.txt
+ create mode 100644 docs/RELEASE_NOTES_2_11.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Administration/Action_Trigger_Email_Headers.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Administration/lp1568046-tablefunc-extension-removed.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Administration/user-activity-purge.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/auth_bib_update.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/auth_prop_bib_update.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/bib_source_in_901s.txt
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/marc_bib_update.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/aged-circs-see-light-of-day.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/copy-status-is-avail.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/email_cko_receipts.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/limit_payment_amounts_accepted.txt
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Client/added-fields-for-client-interfaces.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/combine_notice_prefs_tables.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/improved-myopac-holds-screens.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/remove_advanced_hold_options_for_parts.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/SIP/SIP_Workstation_Name.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/SIP/SIP_renewal_blocks.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Translations/Updates.adoc
+
+commit 6c0ab72596821d89d5c460f0826f422c118905f2
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Jul 28 18:51:35 2016 -0400
+
+    Bumping Perl version string for 2.11.0
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS.pm
+
+commit 8284edcdd3de5392b4265f3ee2e806dda761cdc1
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Sep 9 09:37:31 2016 -0400
+
+    Translation updates - po files
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+9	9	build/i18n/po/acq.js/es-ES.po
+1853	0	build/i18n/po/acq/cs-CZ.po
+198	0	build/i18n/po/actor/cs-CZ.po
+54	0	build/i18n/po/booking/cs-CZ.po
+8	4	build/i18n/po/cat.properties/cs-CZ.po
+7	3	build/i18n/po/cat.properties/de-DE.po
+7	3	build/i18n/po/cat.properties/en-CA.po
+7	3	build/i18n/po/cat.properties/en-GB.po
+7	3	build/i18n/po/cat.properties/es-ES.po
+7	3	build/i18n/po/cat.properties/fi-FI.po
+7	3	build/i18n/po/cat.properties/fr-CA.po
+7	3	build/i18n/po/cat.properties/hy-AM.po
+7	3	build/i18n/po/cat.properties/oc-FR.po
+7	3	build/i18n/po/cat.properties/pt-BR.po
+7	3	build/i18n/po/cat.properties/ru-RU.po
+7	3	build/i18n/po/cat.properties/tr-TR.po
+58	0	build/i18n/po/cat/cs-CZ.po
+16	4	build/i18n/po/circ.properties/cs-CZ.po
+16	4	build/i18n/po/circ.properties/de-DE.po
+15	3	build/i18n/po/circ.properties/en-CA.po
+15	3	build/i18n/po/circ.properties/en-GB.po
+15	3	build/i18n/po/circ.properties/es-ES.po
+15	3	build/i18n/po/circ.properties/fi-FI.po
+15	3	build/i18n/po/circ.properties/fr-CA.po
+15	3	build/i18n/po/circ.properties/hy-AM.po
+15	3	build/i18n/po/circ.properties/oc-FR.po
+15	3	build/i18n/po/circ.properties/pt-BR.po
+15	3	build/i18n/po/circ.properties/ru-RU.po
+15	3	build/i18n/po/circ.properties/tr-TR.po
+335	0	build/i18n/po/circ/cs-CZ.po
+12	4	build/i18n/po/common.properties/cs-CZ.po
+11	3	build/i18n/po/common.properties/de-DE.po
+11	3	build/i18n/po/common.properties/en-CA.po
+11	3	build/i18n/po/common.properties/en-GB.po
+11	3	build/i18n/po/common.properties/es-ES.po
+11	3	build/i18n/po/common.properties/fi-FI.po
+11	3	build/i18n/po/common.properties/fr-CA.po
+11	3	build/i18n/po/common.properties/hy-AM.po
+11	3	build/i18n/po/common.properties/oc-FR.po
+11	3	build/i18n/po/common.properties/pt-BR.po
+11	3	build/i18n/po/common.properties/ru-RU.po
+23	10	build/i18n/po/conify.js/cs-CZ.po
+17	7	build/i18n/po/conify.js/de-DE.po
+19	9	build/i18n/po/conify.js/en-CA.po
+19	9	build/i18n/po/conify.js/en-GB.po
+19	9	build/i18n/po/conify.js/es-ES.po
+19	9	build/i18n/po/conify.js/fi-FI.po
+19	9	build/i18n/po/conify.js/fr-CA.po
+19	9	build/i18n/po/conify.js/hy-AM.po
+17	7	build/i18n/po/conify.js/oc-FR.po
+19	9	build/i18n/po/conify.js/pt-BR.po
+19	9	build/i18n/po/conify.js/ru-RU.po
+17	7	build/i18n/po/conify.js/tr-TR.po
+3290	3222	build/i18n/po/db.seed/cs-CZ.po
+3278	3217	build/i18n/po/db.seed/de-DE.po
+3283	3219	build/i18n/po/db.seed/en-CA.po
+3283	3219	build/i18n/po/db.seed/en-GB.po
+3284	3220	build/i18n/po/db.seed/es-ES.po
+3285	3221	build/i18n/po/db.seed/fi-FI.po
+3284	3220	build/i18n/po/db.seed/fr-CA.po
+3285	3221	build/i18n/po/db.seed/hy-AM.po
+3283	3219	build/i18n/po/db.seed/oc-FR.po
+3283	3219	build/i18n/po/db.seed/pt-BR.po
+3283	3219	build/i18n/po/db.seed/ru-RU.po
+3283	3219	build/i18n/po/db.seed/tr-TR.po
+2857	2720	build/i18n/po/fm_IDL.dtd/cs-CZ.po
+2829	2699	build/i18n/po/fm_IDL.dtd/de-DE.po
+2839	2709	build/i18n/po/fm_IDL.dtd/en-CA.po
+2836	2706	build/i18n/po/fm_IDL.dtd/en-GB.po
+2839	2709	build/i18n/po/fm_IDL.dtd/es-ES.po
+2839	2709	build/i18n/po/fm_IDL.dtd/fi-FI.po
+2831	2701	build/i18n/po/fm_IDL.dtd/fr-CA.po
+2839	2709	build/i18n/po/fm_IDL.dtd/hy-AM.po
+2829	2699	build/i18n/po/fm_IDL.dtd/oc-FR.po
+2834	2704	build/i18n/po/fm_IDL.dtd/pt-BR.po
+2834	2704	build/i18n/po/fm_IDL.dtd/ru-RU.po
+2829	2699	build/i18n/po/fm_IDL.dtd/tr-TR.po
+58	42	build/i18n/po/ils_events.xml/cs-CZ.po
+55	39	build/i18n/po/ils_events.xml/de-DE.po
+57	41	build/i18n/po/ils_events.xml/en-CA.po
+57	41	build/i18n/po/ils_events.xml/en-GB.po
+57	41	build/i18n/po/ils_events.xml/es-ES.po
+57	41	build/i18n/po/ils_events.xml/fi-FI.po
+58	42	build/i18n/po/ils_events.xml/fr-CA.po
+57	41	build/i18n/po/ils_events.xml/hy-AM.po
+57	41	build/i18n/po/ils_events.xml/pt-BR.po
+56	40	build/i18n/po/ils_events.xml/ru-RU.po
+385	0	build/i18n/po/kpac/cs-CZ.po
+11	3	build/i18n/po/lang.dtd/ar-AR.po
+16	8	build/i18n/po/lang.dtd/cs-CZ.po
+11	3	build/i18n/po/lang.dtd/de-DE.po
+11	3	build/i18n/po/lang.dtd/en-CA.po
+11	3	build/i18n/po/lang.dtd/en-GB.po
+11	3	build/i18n/po/lang.dtd/es-ES.po
+11	3	build/i18n/po/lang.dtd/fi-FI.po
+11	3	build/i18n/po/lang.dtd/fr-CA.po
+11	3	build/i18n/po/lang.dtd/hy-AM.po
+11	3	build/i18n/po/lang.dtd/oc-FR.po
+11	3	build/i18n/po/lang.dtd/pt-BR.po
+11	3	build/i18n/po/lang.dtd/ru-RU.po
+11	3	build/i18n/po/lang.dtd/tr-TR.po
+4	4	build/i18n/po/offline.properties/cs-CZ.po
+16	4	build/i18n/po/patron.properties/cs-CZ.po
+15	3	build/i18n/po/patron.properties/de-DE.po
+15	3	build/i18n/po/patron.properties/en-CA.po
+15	3	build/i18n/po/patron.properties/en-GB.po
+15	3	build/i18n/po/patron.properties/es-ES.po
+15	3	build/i18n/po/patron.properties/fi-FI.po
+15	3	build/i18n/po/patron.properties/fr-CA.po
+15	3	build/i18n/po/patron.properties/hy-AM.po
+15	3	build/i18n/po/patron.properties/oc-FR.po
+15	3	build/i18n/po/patron.properties/pt-BR.po
+15	3	build/i18n/po/patron.properties/ru-RU.po
+15	3	build/i18n/po/patron.properties/tr-TR.po
+6	6	build/i18n/po/reports.js/cs-CZ.po
+413	0	build/i18n/po/serial/cs-CZ.po
+188	159	build/i18n/po/tpac/ar-AR.po
+196	165	build/i18n/po/tpac/cs-CZ.po
+189	160	build/i18n/po/tpac/de-DE.po
+192	163	build/i18n/po/tpac/en-CA.po
+192	163	build/i18n/po/tpac/en-GB.po
+196	164	build/i18n/po/tpac/es-ES.po
+192	163	build/i18n/po/tpac/fi-FI.po
+244	215	build/i18n/po/tpac/fr-CA.po
+192	163	build/i18n/po/tpac/hy-AM.po
+189	160	build/i18n/po/tpac/oc-FR.po
+192	163	build/i18n/po/tpac/pt-BR.po
+189	160	build/i18n/po/tpac/tr-TR.po
+146	0	build/i18n/po/urlverify/cs-CZ.po
+1409	290	build/i18n/po/webstaff/cs-CZ.po
+1395	289	build/i18n/po/webstaff/es-ES.po
+ create mode 100644 build/i18n/po/acq/cs-CZ.po
+ create mode 100644 build/i18n/po/actor/cs-CZ.po
+ create mode 100644 build/i18n/po/booking/cs-CZ.po
+ create mode 100644 build/i18n/po/cat/cs-CZ.po
+ create mode 100644 build/i18n/po/circ/cs-CZ.po
+ create mode 100644 build/i18n/po/kpac/cs-CZ.po
+ create mode 100644 build/i18n/po/serial/cs-CZ.po
+ create mode 100644 build/i18n/po/urlverify/cs-CZ.po
+
+commit ee711968b69b8e4a6613f630d975965d28162e27
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Mon Mar 7 12:42:51 2016 -0500
+
+    LP#1436987: webstaff - fix patron search form
+    
+    This patch ensures that the patron profile and
+    search OU values are retained when going from a patron
+    search to a single record and back to the patron search.
+    
+    To test the fix for this bug:
+    
+    [1] Search for a patron using the expanded patron search fields,
+        making sure to select values for the profile and search
+        OU dropdowns.
+    [2] Open a record, then click "Patron Search" to return to the
+        search form.
+    [3] Verify that the profile and search library are set and
+        that the same patron records are retrieved.
+    
+    This patch includes elements from a patch originally written
+    by Victoria Lewis <vlewis at catalystitservices.com>
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+6	1	Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+
+commit 58e107fbe24035e1f4944f2df975ac91126470af
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Jun 2 15:27:06 2016 -0400
+
+    LP#1413352 Brief record price sets lineitem price
+    
+    Propagate lineitem MARC 'price' attribute value to the lineitem
+    estimated_unit_price field.  This allows users to apply a lineitem
+    price directly from the ACQ Brief Record interface.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+35	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Lineitem.pm
+
+commit e1a555e3d1d1c2a079a0fd6294e8d1fafa3f8818
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Sep 5 21:34:20 2016 -0400
+
+    SIP manual testing formatting cleanup
+    
+    The extra ** in the sample SIP lines was distracting. Also, it wasn't clear
+    which password to use when $password was used twice, so disambiguate it to
+    identify user vs. SIP password.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+27	14	docs/admin/sip_server.txt
+
+commit 43bf9d219862d45668cf2229b7b181350cd3ce65
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Wed Aug 31 07:14:49 2016 -0400
+
+    LP1613374: Release notes formatting fix.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+9	9	docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc
+
+commit 9b47089fd67daa7041161a9c71a02320797055d6
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Mon Aug 29 17:38:10 2016 -0400
+
+    Stamping upgrade script for Spanish locale seed data
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+11	0	Open-ILS/src/sql/Pg/upgrade/1000.data.add-spanish-to-i18n-locale.sql
+0	11	Open-ILS/src/sql/Pg/upgrade/XXXX.data.add-spanish-to-i18n-locale.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1000.data.add-spanish-to-i18n-locale.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.add-spanish-to-i18n-locale.sql
+
+commit dddb70dff3d508b673d12b169fb41ca0473c6f9e
+Author: Ben Shum <ben at evergreener.net>
+Date:   Mon Aug 29 15:37:48 2016 -0400
+
+    LP#1618183: Add Spanish to config.i18n_locale
+    
+    Add Spanish to this table so that it is an option for supported translations.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+3	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+11	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.add-spanish-to-i18n-locale.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.add-spanish-to-i18n-locale.sql
+
+commit 6bc0bc2fb3f405ad4609a9be2992374c57bf0328
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Mon Aug 29 12:58:27 2016 -0400
+
+    LP#1618136 Fix webstaff IDL2js.js test failures
+    
+    Fix webstaff test failures due to an invalid IDL2js.js file by adding
+    newly-required preprocessing to the support script that generates that
+    file when running tests.
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+15	1	Open-ILS/web/js/ui/default/staff/test/data/idl2js.pl
+
+commit e07ac6c32679a87ecf2dcc5c4c11a01347871313
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 26 17:00:20 2016 -0400
+
+    Stamp 0999 upgrade; remove merge conflict markers
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+0	3	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+14	0	Open-ILS/src/sql/Pg/upgrade/0999.schema.staging-user-setting.sql
+0	12	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.staging-user-setting.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0999.schema.staging-user-setting.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.staging-user-setting.sql
+
+commit 936fbc26d45f6685225988008241aac11de524e3
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Thu Aug 25 20:47:47 2016 -0400
+
+    forward-port 2.10.5-2.10.6 schema update script
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+5	0	Open-ILS/src/sql/Pg/version-upgrade/2.10.5-2.10.6-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.10.5-2.10.6-upgrade-db.sql
+
+commit ec802af48798087d8fda770fff67d9e2ebcffc40
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Aug 25 17:55:36 2016 -0400
+
+    Translation updates - newpot
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1835	0	build/i18n/po/acq/acq.pot
+192	0	build/i18n/po/actor/actor.pot
+52	0	build/i18n/po/booking/booking.pot
+5	1	build/i18n/po/cat.properties/cat.properties.pot
+56	0	build/i18n/po/cat/cat.pot
+13	1	build/i18n/po/circ.properties/circ.properties.pot
+333	0	build/i18n/po/circ/circ.pot
+9	1	build/i18n/po/common.properties/common.properties.pot
+16	5	build/i18n/po/conify.js/conify.js.pot
+1592	0	build/i18n/po/conify/conify.pot
+3293	3219	build/i18n/po/db.seed/db.seed.pot
+2827	2697	build/i18n/po/fm_IDL.dtd/fm_IDL.dtd.pot
+51	40	build/i18n/po/ils_events.xml/ils_events.xml.pot
+365	0	build/i18n/po/kpac/kpac.pot
+9	1	build/i18n/po/lang.dtd/lang.dtd.pot
+13	1	build/i18n/po/patron.properties/patron.properties.pot
+406	0	build/i18n/po/serial/serial.pot
+183	156	build/i18n/po/tpac/tpac.pot
+132	0	build/i18n/po/urlverify/urlverify.pot
+620	0	build/i18n/po/vandelay/vandelay.pot
+1380	284	build/i18n/po/webstaff/webstaff.pot
+ create mode 100644 build/i18n/po/acq/acq.pot
+ create mode 100644 build/i18n/po/actor/actor.pot
+ create mode 100644 build/i18n/po/booking/booking.pot
+ create mode 100644 build/i18n/po/cat/cat.pot
+ create mode 100644 build/i18n/po/circ/circ.pot
+ create mode 100644 build/i18n/po/conify/conify.pot
+ create mode 100644 build/i18n/po/kpac/kpac.pot
+ create mode 100644 build/i18n/po/serial/serial.pot
+ create mode 100644 build/i18n/po/urlverify/urlverify.pot
+ create mode 100644 build/i18n/po/vandelay/vandelay.pot
+
+commit b54e57616d0659975e250faa1fa069d16a6bd598
+Author: Ben Shum <ben at evergreener.net>
+Date:   Wed Aug 24 16:33:18 2016 -0400
+
+    LP#1095280: i18n - Add templates to update_pofiles
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+10	0	build/i18n/scripts/update_pofiles
+
+commit df174c20829437634a7a4377420af88e1e057757
+Author: Ben Shum <ben at evergreener.net>
+Date:   Wed Aug 24 09:32:47 2016 -0400
+
+    LP#1095280: i18n - Add new templates for translation to Makefile
+    
+    Add various source and output files for new templates directories for i18n
+    along with make targets and other copy commands.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+93	1	build/i18n/Makefile
+
+commit a66cccae9cd9a76356437bce06ffd155e05276ab
+Author: Ben Shum <ben at evergreener.net>
+Date:   Wed Aug 24 09:25:27 2016 -0400
+
+    LP#1095280: i18n - Move existing templates closer together in Makefile
+    
+    In the interest of making it easier to edit, move all the lines
+    for generating i18n translation files for Open-ILS/src/templates/*
+    closer together.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	2	build/i18n/Makefile
+
+commit 18c769a8441e9728007c59ae88c6965f3655cc56
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Thu Aug 25 07:15:11 2016 -0400
+
+    LP#1613374 - Canceled Transit status Release Notes
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+26	0	docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc
+
+commit b2af4872895e860abd8b48cc5cb2cf06c68bb852
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Aug 24 19:43:44 2016 -0400
+
+    Docs: Some missing release notes for 2.11
+    
+    We were missing release notes for some of the new fields added to client
+    interfaces as well as one of the new SIP features.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+17	0	docs/RELEASE_NOTES_NEXT/Client/added-fields-for-client-interfaces.adoc
+7	0	docs/RELEASE_NOTES_NEXT/SIP/SIP_renewal_blocks.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/added-fields-for-client-interfaces.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/SIP/SIP_renewal_blocks.adoc
+
+commit 15ad6d45c3066c3e88c6d6e0c28b2f445a3132b0
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 24 18:32:02 2016 -0400
+
+    Stamping upgrade scripts for aged circs display branch
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+141	0	Open-ILS/src/sql/Pg/upgrade/0998.schema.aged-circ-chains.sql
+0	141	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.aged-circ-chains.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0998.schema.aged-circ-chains.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.aged-circ-chains.sql
+
+commit 3f2d3a0335fe935e4ec3a310b018b76cdd9f7e3f
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 24 17:01:01 2016 -0400
+
+    LP#1497335 Show Last Few Circs patron retrieve options
+    
+    In the Show Last Few Circulations window (XUL), disable the "Retrieve
+    Last Patron" button when the most recent circulation is aged.  Disable
+    the "Retrieve All These Patrons" button when all circulations displayed
+    are aged.
+    
+    Fixes a sort bug in open-ils.circ.copy_checkout_history.retrieve.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+14	0	Open-ILS/xul/staff_client/server/circ/circ_summary.xul
+
+commit 57697077ec3a4431c16d043d1d9270c3e18c1fba
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 3 15:18:59 2016 -0400
+
+    LP#1497335 Aged circ display release notes
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+21	0	docs/RELEASE_NOTES_NEXT/Circulation/aged-circs-see-light-of-day.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/aged-circs-see-light-of-day.adoc
+
+commit b9e5c623f2cde86b1b87d07ba9e4a637f1b3ac5e
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 3 14:45:39 2016 -0400
+
+    LP#1497335 Item details shows aged circs (XUL edition)
+    
+    * Item Status -> Circulation History now displays aged circulations as
+      appropriate, showing "<Aged Circulation>" in lieu the patron's name.
+    
+    * Item Status (and others) -> Show Last Few Circulations, ditto above.
+      Also, the 'Add Billing' button is disabled when displayed with an aged
+      circulation row.
+    
+    * Copy -> Retrieve Last Patron action now includes aged circulations
+      when looking for the most recent circulation.  When the most recent
+      circ is an aged circ, the UI reports "Item XXX circulation is an aged
+      circulation and has no linked user".  Among other things, this means
+      the 3rd from last circ will not be confused as the 2nd to last circ
+      when the 2nd to last is aged.
+    
+    * Mark Item Damaged will warn if the circ in question is aged.  This is
+      just a sanity check and should never happen in reality, since the UI
+      only supports this option on checked out items (i.e. active circs).
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+14	0	Open-ILS/xul/staff_client/server/cat/util.js
+34	19	Open-ILS/xul/staff_client/server/circ/alternate_copy_summary.js
+10	1	Open-ILS/xul/staff_client/server/circ/checkin.js
+17	9	Open-ILS/xul/staff_client/server/circ/circ_brief.xul
+10	1	Open-ILS/xul/staff_client/server/circ/renew.js
+4	0	Open-ILS/xul/staff_client/server/circ/util.js
+2	0	Open-ILS/xul/staff_client/server/locale/en-US/circ.properties
+
+commit 11d7f2206e4583db64626f9761c00c7746242cbe
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 3 13:52:33 2016 -0400
+
+    LP#1497335 Browser client item details aged circs
+    
+    1. Use all_circulation (combcirc) class (now accessible via pcrud) to
+    render the item Circ History List tab.  In cases where a combcirc object
+    has no 'usr' value, the interface displays <Aged Circulation> where
+    the patron's name would normally be and disables the 'Add Billing'
+    button.
+    
+    2. Handle null 'usr' values in the item status Recent Circ History tab.
+    When a renewal chain summary has no 'usr' value, the interface displays
+    <Aged Circulation> where the patron's name would normally be.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+5	2	Open-ILS/src/templates/staff/cat/item/t_circ_list_pane.tt2
+8	5	Open-ILS/src/templates/staff/cat/item/t_circs_pane.tt2
+11	9	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 52bf3fe8e791c43448c49fa9818f5790625c724c
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 3 13:34:29 2016 -0400
+
+    LP#1497335 Aged/All circulation API access
+    
+    Various SQL, IDL, and API changes for accessing aged circulations,
+    primarily via all_circulation objects, for imporoved staff client
+    integration.
+    
+    *. Support open-ils.pcrud access to the action.all_circulation DB view /
+       'combcirc' class.
+    
+    *. Add missing parent_circ, checkin_scan_time, checkin_workstation to
+       combcirc class.
+    
+    *. Add 'usr' field to combcirc.  The action.all_circulation VIEW will
+       return NULL as the 'usr' column value when returning data for an
+       aged_circulation.
+    
+    *. Add virtual 'active_circ' and 'aged_circ' fields to combcirc for
+       fleshing the related action.circulation or action.aged_circulation
+       object.
+    
+    * Adds SQL functions for action.all_circ_chain and
+      action.summarize_all_circ_chain, which pull data from
+      aged_circulation.
+    
+    *. API calls
+    open-ils.circ.[prev_]renewal_chain.retrieve_by_circ[.summary] now return
+    data for active and aged circulations by using action.all_circ_chain and
+    action.summarize_all_circ_chain.  When using these APIs, a null value
+    in the 'usr' column is the indication that a given circulation or circ
+    chain summary represents an aged circulation.
+    
+    * API open-ils.circ.copy_details.retrieve will now optionally return
+      aged circ data within the copy circ history.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+17	1	Open-ILS/examples/fm_IDL.xml
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+75	71	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+92	2	Open-ILS/src/sql/Pg/090.schema.action.sql
+141	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.aged-circ-chains.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.aged-circ-chains.sql
+
+commit 8decad6183c9c3786377bd59eae8c55472ab35c4
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 24 18:07:13 2016 -0400
+
+    Stamping upgrade script for Canceled Transit status branch
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+7	0	Open-ILS/src/sql/Pg/upgrade/0997.data.canceled-transit-item-status.sql
+0	7	Open-ILS/src/sql/Pg/upgrade/XXXX.data.canceled-transit-item-status.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0997.data.canceled-transit-item-status.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.canceled-transit-item-status.sql
+
+commit a5f6a489ea0436b085831fcf033ca176c61204f9
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Wed Aug 24 14:23:09 2016 -0400
+
+    LP#1613374 - Check stored copy status before clobbering it.
+    
+    Some transit.copy_statuses would result in some other behavior
+    upon checkin, so we check all that would go into 'Reshelving'
+    status, otherwise, restore the stored status.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+15	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Transit.pm
+
+commit 58cd99ec3a4f83fd2d68b2e732069587c70b1459
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Tue Aug 23 09:32:59 2016 -0400
+
+    LP#1613374 - Add 'Canceled Transit' to non-'BAD' copy statuses.
+    
+    During checkin, Circulate.pm checks the copy status and if it
+    isn't listed as an okay status, the event COPY_BAD_STATUS is
+    returned, which requires an override.  This change makes copies
+    in 'Canceled Transit' status check in without an alert.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+
+commit 49ea249d5f7d315aa7bf1980edb4c7ea961f7833
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Tue Aug 16 07:11:24 2016 -0400
+
+    LP#1613374 - Add 'Canceled Transit' to "magical statuses"
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	1	Open-ILS/xul/staff_client/chrome/content/main/constants.js
+
+commit fcc46ccaa72260f8dc970df156985c983f1e19f4
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Mon Aug 22 08:58:24 2016 -0400
+
+    LP#1613374 - Make 'Canceled Transit' status holdable and OPAC-visible.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/XXXX.data.canceled-transit-item-status.sql
+
+commit 6c27a324d4665b7c64d37784ac339037bdb31423
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Wed Aug 24 14:12:04 2016 -0400
+
+    LP#1613374 - Set item status to 'Canceled Transit' when transit is canceled.
+    
+    I opened a separate bug report on this issue (bug 1613374) before realizing
+    bug 1306666 was reported.  This commit creates a new 'Canceled Transit' status
+    that signals to staff what happened to an item when a transit is aborted/canceled.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    
+    Conflicts:
+    	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Transit.pm
+    
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	6	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Transit.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Const.pm
+1	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+7	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.canceled-transit-item-status.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.canceled-transit-item-status.sql
+
+commit c820aa492739c544e09a7b646a09b8507ae3993b
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 24 18:01:33 2016 -0400
+
+    Stamping upgrade for email receipts
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+105	0	Open-ILS/src/sql/Pg/upgrade/0996.data.email-checkout-receipt.sql
+0	103	Open-ILS/src/sql/Pg/upgrade/XXXX.data.email-checkout-receipt.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0996.data.email-checkout-receipt.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.email-checkout-receipt.sql
+
+commit 33746b32ffab1c7d5e530df8acc9336c2b15859f
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Mon Aug 22 18:08:37 2016 -0400
+
+    LP#1356477: release notes for email checkout receipts
+    
+    A portion of the text was written by Angela Kilsdonk.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+20	0	docs/RELEASE_NOTES_NEXT/Circulation/email_cko_receipts.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/email_cko_receipts.adoc
+
+commit 92f1bdb26d0027b52b3b3db84ff3d52104d6b1fe
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Aug 4 10:38:48 2016 -0400
+
+    LP#1356477: update selfcheck interface
+    
+    This patch replaces the Logout and Logout with Receipt buttons in
+    the selfcheck interface with a single Logout button and a set of radio
+    buttons (whose labels are clickable) that allow the user to specify
+    whether they want an email receipt, a print receipt, or no receipt upon
+    logging out.
+    
+    If the user has no email address, the option to select email receipts
+    will not be presented to them.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+7	2	Open-ILS/src/templates/circ/selfcheck/summary.tt2
+70	7	Open-ILS/web/js/ui/default/circ/selfcheck/selfcheck.js
+
+commit 4d512bfac53dfdc94696f1731bbae6e50542bccc
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Thu Aug 4 12:07:14 2016 -0400
+
+    LP#1356477: move email receipt checkbox on patron editor
+    
+    This patch updates the patron editor so that the checkbox
+    for setting whether the user wishes to get email checkout
+    receipts by default is moved next to the email address
+    input.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+13	2	Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+
+commit f8422d9abd41f9b10b1b1cc4cc824e0eaef5b84e
+Author: Mike Rylander <miker at esilibrary.com>
+Date:   Wed Aug 3 16:51:54 2016 -0400
+
+    LP#1356477: add quick receipt button
+    
+    This patch adds a new button to the webstaff checkout page
+    called Quick Receipt. If the button itself is pushed, a
+    receipt containing the current checkouts is either printed
+    or emailed, depending on the user's preference. If the
+    drop-down portion of the button is used, staff members can
+    override the user's default preference to print or email
+    the receipt.
+    
+    The Quick Receipt button is enabled only if at least one
+    checkout has been made during the current session.
+    
+    Note that email receipts is an option only when the patron
+    has an email address supplied.
+    
+    An icon next to the Quick Receipt button will be either a
+    printer or an envelope depending on the user's preferred
+    receipt setting.
+    
+    This patch also modifies the "Done" button. If pressed, the session
+    is ended and the receipt is generated according to the user's
+    preferences, but the drop-down portion can be used to end
+    the session while letting the staff member choose how the
+    receipt is emitted.
+    
+    If a receipt is emailed, a toast is displayed saying so.
+    
+    Signed-off-by: Mike Rylander <miker at esilibrary.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+2	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+25	4	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+2	0	Open-ILS/src/templates/staff/circ/share/circ_strings.tt2
+8	1	Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+83	10	Open-ILS/web/js/ui/default/staff/circ/patron/checkout.js
+1	0	Open-ILS/web/js/ui/default/staff/services/user.js
+2	0	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+
+commit 9d1d36d3d56dcbe46d462ce8e431911df7b7166b
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Aug 3 15:38:49 2016 -0400
+
+    LP#1356477: teach OPAC patron registration form about staged user (opt-in) settings
+    
+    This patch causes a checkbox to be added for each user setting
+    that controls opt-in for active Action/Trigger event definitions. In
+    the specific context of email checkout receipts, this means that
+    a patron who is self-registering can elect to get email checkout
+    receipts by default.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+52	2	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Register.pm
+15	0	Open-ILS/src/templates/opac/register.tt2
+
+commit aa47fc5fdc1a5a9f3889fc3f67588739ba9e1700
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Aug 3 15:36:18 2016 -0400
+
+    LP#1356477: teach webstaff patron editor about staged user settings
+    
+    This patch also fixes a bug that preferred the webstaff patron editor
+    from successfully removing a staged patron upon completing the
+    registration of the patron.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+5	1	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit f3d2d070e8ca3a8b12a820489ee6caff8dc1c7e9
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Aug 3 15:37:39 2016 -0400
+
+    LP#1356477: create new staging table for user settings
+    
+    This patch creates a new table called staging.setting_stage
+    that allows for storing user settings when a patron uses
+    (for example) the self-registration page.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+11	0	Open-ILS/examples/fm_IDL.xml
+17	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Stage.pm
+9	0	Open-ILS/src/sql/Pg/015.schema.staging.sql
+12	0	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.staging-user-setting.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.staging-user-setting.sql
+
+commit 7e3a8e2c61f4ee24317d11d478930851671b1c1d
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Mon Aug 8 16:50:08 2016 -0400
+
+    LP#1356477: add ability to unconditionally send email
+    
+    This patch defines and uses an
+    open-ils.trigger.event.autocreate.ignore_opt_in method that does what
+    it says on the tin; the caller is reponsible for not abusing this.
+    
+    This supports a use case in the webstaff checkout interface where staff
+    can choose to have the receipt be emailed, provided that the patron
+    record has an email address defined, even if the user setting to
+    email receipts by default is not set. (It is assumed that the staff
+    member would have gotten permission from the patron on the spot.)
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircNotify.pm
+9	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger.pm
+
+commit 53fc56475feedb6433a28f5c49096de7a46d87a9
+Author: Mike Rylander <miker at esilibrary.com>
+Date:   Wed Aug 3 12:45:10 2016 -0400
+
+    LP#1356477: business logic for email checking receipts
+    
+    This patch adds two methods, open-ils.circ.checkout.batch_notify
+    and open-ils.circ.checkout.batch_notify.session, that when passed
+    a set of circulation IDs, creates A/T events for the
+    checkout notification hooks. In the specific case of the email
+    checkout receipts feature, the seed data contains a stock
+    event that would send out emails, but it is conceivable
+    that other forms of notification could be done by defining
+    A/T events appropriately.
+    
+    Signed-off-by: Mike Rylander <miker at esilibrary.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+3	0	Open-ILS/src/extras/ils_events.xml
+1	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+145	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircNotify.pm
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircNotify.pm
+
+commit b09ad8fd9ccf37b374ddf9840cf20fc63f45a624
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Aug 3 12:18:19 2016 -0400
+
+    LP#1356477: seed data for email checkout receipts
+    
+    This patch adds seed data for email checkout receipts,
+    including:
+    
+    - The action/trigger hooks circ.checkout.batch_notify
+      and circ.checkout.batch_notify.session.
+    - The default event definition
+    - The circ.send_email_checkout_receipts (Email checkout receipts by
+      default?) user setting.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    
+    Conflicts:
+    	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+102	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+103	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.email-checkout-receipt.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.email-checkout-receipt.sql
+
+commit be0ed357743e8b36f13fe38a9127dc8bd0f4172e
+Author: Ben Shum <ben at evergreener.net>
+Date:   Tue Jul 5 13:03:57 2016 -0400
+
+    LP#1603708: Remove support for Ubuntu 12.04 Precise
+    
+    With support for Ubuntu 16.04 Xenial in place, remove the oldest LTS, which is
+    Ubuntu 12.04 Precise.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	11	Open-ILS/src/extras/Makefile.install
+1	1	Open-ILS/src/extras/install/Makefile.common
+0	148	Open-ILS/src/extras/install/Makefile.ubuntu-precise
+7	14	docs/installation/server_installation.txt
+1	2	docs/installation/server_upgrade.txt
+ delete mode 100644 Open-ILS/src/extras/install/Makefile.ubuntu-precise
+
+commit 7bdfe9f5a2e8771c481bf8e15ad7da350b654533
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 24 14:55:29 2016 -0400
+
+    Stamping upgrade script for badge seed data
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+8	0	Open-ILS/src/sql/Pg/upgrade/0995.data.popularity-badge-seed-data.sql
+0	8	Open-ILS/src/sql/Pg/upgrade/XXXX.data.popularity-badge-seed-data.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0995.data.popularity-badge-seed-data.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.popularity-badge-seed-data.sql
+
+commit 6d176feb4e4bbfc67e9c4179cd7e446fd148fd4d
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Aug 23 16:01:35 2016 -0400
+
+    LP#1614237: Popularity badge seed data
+    
+    Adding popularity badge seed data for a badge based on Holds Requested over the
+    past 5 years.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+4	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+8	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.popularity-badge-seed-data.sql
+3	0	docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.popularity-badge-seed-data.sql
+
+commit fd725a7eb939fedb31f6eb13066f45b35baabb9c
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Aug 17 18:29:09 2016 -0400
+
+    LP#1614290: Add badge_score_generator to example crontab
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+3	0	Open-ILS/examples/crontab.example
+
+commit 9fc06033c0805b3f1832e74c0953d243d1a9465d
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 24 14:51:32 2016 -0400
+
+    Moving function creation to later in the schema def, where its deps exist.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+0	20	Open-ILS/src/sql/Pg/002.schema.config.sql
+20	0	Open-ILS/src/sql/Pg/005.schema.actors.sql
+
+commit 12159383d46bf76db3e710a689ad8b5140436007
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 24 12:56:28 2016 -0400
+
+    Stamping upgrade script for authority edit changes and propagation improvement
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+144	0	Open-ILS/src/sql/Pg/upgrade/0994.schema.authority-propage-edit-date.sql
+0	142	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0994.schema.authority-propage-edit-date.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql
+
+commit 84bed711249098679ae25f83eeb588871022ed19
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 24 11:38:49 2016 -0400
+
+    LP#1588948: Only attempt a bib update if the heading changes
+    
+    This should significantly reduce the churn on bibs and the time to save
+    an authority where the heading that would propagate to bibs has not changed.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	2	Open-ILS/src/sql/Pg/999.functions.global.sql
+82	2	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql
+
+commit d61a652d97339961fd4a65bf27c77f4bc1314ffb
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Jun 13 13:57:30 2016 -0400
+
+    LP#1588948 Auth propagate bib meta on change only
+    
+    Only update bib record editor and edit_date if an authority record
+    change propagation resulted in a modified bib record.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+9	2	Open-ILS/src/sql/Pg/999.functions.global.sql
+20	1	Open-ILS/src/sql/Pg/t/authority-update-bib-propagation.pg
+9	2	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql
+
+commit 8e959742b7751403e942694d1123a3f38cbbb239
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Jun 6 10:19:30 2016 -0400
+
+    LP#1588948 Release notes (auth prop. bib edit[or|_date])
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+16	0	docs/RELEASE_NOTES_NEXT/Cataloging/auth_prop_bib_update.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/auth_prop_bib_update.adoc
+
+commit 7605ed8a65a2151e42a3e8c20cd8640f81fab962
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Jun 6 11:14:47 2016 -0400
+
+    LP#1588948 Authority propagation PGTAP test
+    
+    Adds a new general purpose authority->bib propagation pgtap test,
+    covering basic propagation and editor / edit_date propagation.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+105	0	Open-ILS/src/sql/Pg/t/authority-update-bib-propagation.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/authority-update-bib-propagation.pg
+
+commit 28d9ccf8df4cd3e9989d91e3053c26aca6a48e76
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Jun 3 15:16:58 2016 -0400
+
+    LP#1588948 Propagate authority->bib edit[or|_date]
+    
+    Adds a new global flag 'ingest.disable_authority_auto_update_bib_meta',
+    which is disabled by default.
+    
+    When disabled, the 'editor' and 'edit_date' columns on bib records
+    updated via authority field propagation are updated to the value of the
+    editor on the authority record and NOW(), respectively.
+    
+    When enabled, editor and edit_date are not modified.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+12	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+32	6	Open-ILS/src/sql/Pg/999.functions.global.sql
+55	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql
+
+commit 95ea3d5223963777f8d76d11ab0dd7e4eeeeceff
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 24 12:38:58 2016 -0400
+
+    Stamping upgrade script for transient usr_activity
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+35	0	Open-ILS/src/sql/Pg/upgrade/0993.schema.usr_activity_transient.sql
+0	35	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usr_activity_transient.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0993.schema.usr_activity_transient.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usr_activity_transient.sql
+
+commit cfad22b42c2b3bbe04697a31644c925eff8e6a1a
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Apr 15 17:07:02 2016 -0400
+
+    LP#1570909 User activity purge release notes
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+29	0	docs/RELEASE_NOTES_NEXT/Administration/user-activity-purge.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/user-activity-purge.adoc
+
+commit fc5b3ec873215363be00ca4ff51ccd4a42403280
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Apr 15 16:54:48 2016 -0400
+
+    LP#1570909 User activity purge pgtap test
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+68	0	Open-ILS/src/sql/Pg/live_t/purge-user-activity.pg
+ create mode 100644 Open-ILS/src/sql/Pg/live_t/purge-user-activity.pg
+
+commit ea8b2ae34dee14d15f4958ced3dadbdc4ea8ebbe
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Apr 15 16:26:57 2016 -0400
+
+    LP#1570909 User activity purge function
+    
+    Utility function for removing all activity entries by activity type,
+    except for the most recent entry per user.  This is primarily useful
+    when cleaning up rows prior to setting the transient flag on an
+    activity type to true.  It allows for immediate cleanup of data (e.g.
+    for patron privacy) and lets admins control when the data is deleted,
+    which could be useful for huge activity tables.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+20	0	Open-ILS/src/sql/Pg/002.schema.config.sql
+25	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usr_activity_transient.sql
+
+commit b1f4d599b87a375ab43b7439dcc2ba1208c7c5be
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Apr 15 11:23:33 2016 -0400
+
+    LP#1570909 User activity transient default
+    
+    Only retain the most recent user activity entry (per activity type) by
+    default.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+10	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usr_activity_transient.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usr_activity_transient.sql
+
+commit 40e20683c5d2aa78a128ed019be163349545a4d7
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 24 12:17:11 2016 -0400
+
+    Stamping upgrade of is_available branch
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+231	0	Open-ILS/src/sql/Pg/upgrade/0992.schema.copy_status_co_allowed.sql
+0	229	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_status_co_allowed.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0992.schema.copy_status_co_allowed.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_status_co_allowed.sql
+
+commit d60ea525afa3e4318f474f481e9c8b911ff39e99
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 24 10:26:28 2016 -0400
+
+    LP#1464709 Copy status is_available release notes
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+17	0	docs/RELEASE_NOTES_NEXT/Circulation/copy-status-is-avail.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/copy-status-is-avail.adoc
+
+commit f0aa5d587467a42e61669f1d3e417489e57813d3
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 23 16:59:33 2016 -0400
+
+    LP#1464709: Disentangle on-holds-shelf from is_available
+    
+    Avoid treating On-Holds-Shelf items as is_available so they do not
+    appear in the catalog as #available.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/100.circ_matrix.sql
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+2	2	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_status_co_allowed.sql
+
+commit fed65df3c669e1337f187d533e9033a697d6b263
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Aug 18 09:52:20 2016 -0400
+
+    LP#1464709: teach QP about is_available statuses
+    
+    We look them up, cache them, and use them for the #available modifier.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+11	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+
+commit 2c40b84273316525de7ef65ca6ceca9f939c7052
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Aug 27 17:24:38 2015 -0400
+
+    LP#1464709 Rename checkout_ok to is_available
+    
+    And update pgptap to check for only 2 is_available statuses (not
+    on-holds shelf).
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/examples/fm_IDL.xml
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+1	1	Open-ILS/src/sql/Pg/100.circ_matrix.sql
+3	3	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+4	4	Open-ILS/src/sql/Pg/live_t/lp1464709-copy-stat-co-ok.live.pg
+3	3	Open-ILS/src/sql/Pg/t/lp1464709-copy-stat-co-ok.pg
+3	3	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_status_co_allowed.sql
+3	3	Open-ILS/web/conify/global/config/copy_status.html
+1	1	Open-ILS/web/js/dojo/openils/conify/nls/conify.js
+
+commit 3c37c14663fbf9eea99e2bcd82773a229d02bf1c
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Jun 15 18:09:01 2015 -0400
+
+    LP#1464709 Non-standard copy status pgtap tests
+    
+    Includes unit test plus a set of live tests.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+48	0	Open-ILS/src/sql/Pg/live_t/lp1464709-copy-stat-co-ok.live.pg
+29	0	Open-ILS/src/sql/Pg/t/lp1464709-copy-stat-co-ok.pg
+ create mode 100644 Open-ILS/src/sql/Pg/live_t/lp1464709-copy-stat-co-ok.live.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1464709-copy-stat-co-ok.pg
+
+commit 31480730b2458e8915660f4fb78893418ccdf9cb
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Jun 3 19:30:40 2015 -0400
+
+    LP#1464709 Seamless non-standard copy status checkout
+    
+    Add a new boolean configuration option to copy statuses which allow such
+    copies to be checked out without requiring an alert or override.
+    
+    New column is config.copy_status.checkout_ok.  Any status with this
+    boolean enabled will be treated the same as Available, Reshelving, and
+    Holds Shelf status copies in that the status will be considered
+    checkout-able.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	1	Open-ILS/examples/fm_IDL.xml
+2	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+2	1	Open-ILS/src/sql/Pg/100.circ_matrix.sql
+3	3	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+229	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_status_co_allowed.sql
+12	0	Open-ILS/web/conify/global/config/copy_status.html
+1	0	Open-ILS/web/js/dojo/openils/conify/nls/conify.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_status_co_allowed.sql
+
+commit 51759b283ca19b15a252faa830c2e4b4a3199695
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 24 11:58:56 2016 -0400
+
+    Stamping upgrade script for ranked-volumes update
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+98	0	Open-ILS/src/sql/Pg/upgrade/0991.function.unapi.ranked_volumes.sql
+0	98	Open-ILS/src/sql/Pg/upgrade/XXXX.function.unapi.ranked_volumes.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0991.function.unapi.ranked_volumes.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.unapi.ranked_volumes.sql
+
+commit db9a0bb41e4bd569fbbdc7e4a57778da98f69604
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Tue May 10 15:41:54 2016 -0400
+
+    LP#1315552 Don't use circ_lib name in ranked_volumes
+    
+    ranked_volumes() is supposed to return only volume info, but the name
+    returned was from copy.circ_lib, not acn.owning_lib, so it could result
+    in duplicate rows if circ_lib's varied across a single acn.
+    
+    Let's just use the owning_lib name instead.  Note: the circ_lib join
+    is left undisturbed to keep the current sorting behavior
+    (necessary?).
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+3	2	Open-ILS/src/sql/Pg/990.schema.unapi.sql
+98	0	Open-ILS/src/sql/Pg/upgrade/XXXX.function.unapi.ranked_volumes.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.unapi.ranked_volumes.sql
+
+commit f5867b209304ecaf25ce94bf538299d9d15cc34e
+Author: Jason Boyer <jboyer at library.in.gov>
+Date:   Fri May 6 14:08:48 2016 -0400
+
+    LP1259196: Use Location as Workstation on Login
+    
+    When using a SIPServer with LP1579144 applied, use the
+    Location (CP) field of the Login (93) message as a
+    workstation name. This allows you to determine which
+    selfcheck performed which circulation.
+    
+    Signed-off-by: Jason Boyer <jboyer at library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+16	8	Open-ILS/src/perlmods/lib/OpenILS/SIP.pm
+8	0	docs/RELEASE_NOTES_NEXT/SIP/SIP_Workstation_Name.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/SIP/SIP_Workstation_Name.adoc
+
+commit 58fc8f0c8383c60299186debb54730f8883394ac
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 24 10:49:41 2016 -0400
+
+    Correct upgrade script
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/upgrade/0990.data.copy-count-badge.sql
+
+commit 36f331390345e05e264e96a0d70d598e1f2bc263
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Thu Aug 18 21:10:43 2016 -0400
+
+    LP#1612274: Release notes for improved holds interfaces
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+14	0	docs/RELEASE_NOTES_NEXT/OPAC/improved-myopac-holds-screens.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/improved-myopac-holds-screens.adoc
+
+commit 504076521062d6b52842e137e79877b1abf8f2a5
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Thu Aug 11 13:24:00 2016 -0400
+
+    LP#1612274: Add distinct classes for hold statuses
+    
+    With more data in the My Account hold status field, libraries may want to
+    style some statuses or dates differently so that they pop out to the user. Each
+    hold status and date now has its own class for more flexible styling.
+    
+    The available status also now has a green, bold font and the suspended status
+    has a red, bold font.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+10	0	Open-ILS/src/templates/opac/css/style.css.tt2
+51	39	Open-ILS/src/templates/opac/parts/hold_status.tt2
+
+commit b39eaf4328563a8965a2fabfdad52b898795d116
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Aug 10 23:41:51 2016 -0400
+
+    LP#1612274: Improve display of holds status in My Account
+    
+    Collapse the data contained in the Activate, Active, and Date Fulfilled columns
+    into the status filed on the My Account holds and holds history interfaces.
+    This change cleans up the display and removes extraneous information that the
+    user doesn't need to see.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+4	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+2	7	Open-ILS/src/templates/opac/css/style.css.tt2
+5	27	Open-ILS/src/templates/opac/myopac/hold_history.tt2
+0	10	Open-ILS/src/templates/opac/myopac/holds.tt2
+26	5	Open-ILS/src/templates/opac/parts/hold_status.tt2
+
+commit 2888b409b32cfe541247cc2e39ba23d0e19170c6
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Mon Aug 22 14:02:58 2016 -0400
+
+    LP#1613730: Stamping upgrade script for copy count badge
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+36	0	Open-ILS/src/sql/Pg/upgrade/0990.data.copy-count-badge.sql
+0	34	Open-ILS/src/sql/Pg/upgrade/XXXX.data.copy-count-badge.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0990.data.copy-count-badge.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.copy-count-badge.sql
+
+commit da240e76b8a16cf7e079ab09b1fd8571a4d68818
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Aug 18 12:58:25 2016 -0400
+
+    LP#1613730: Add a "Copy Count" rating function for badges
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+31	1	Open-ILS/src/sql/Pg/220.schema.rating.sql
+34	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.copy-count-badge.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.copy-count-badge.sql
+
+commit c597e8f644afc216f7ed86e01765da12a79f6780
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Sat Aug 20 14:52:15 2016 -0400
+
+    LP#1586221 - Remove "no spaces" message from login form.
+    
+    Since the fix to bug 1086064 removes any spaces entered into
+    the login form, it is now inaccurate to require the user to type
+    their cards with no spaces (since most library cards have spaces
+    in the number on the physical card).
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/templates/opac/parts/login/form.tt2
+
+commit 079d0ed5f08da74201b79f53275f559aba8a19f2
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Mon Aug 15 14:07:21 2016 -0400
+
+    LP#1613381: combine two tables in patron notification preferences
+    
+    This patch consolidates the two tables in the public catalog
+    notification preferences page into one table, as patrons have
+    no reason to care about the distinction between A/T opt-in
+    settings and the hold, phone, and SMS user settings.
+    
+    This patch also adds a <label> element for opt-in setting
+    names.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+12	23	Open-ILS/src/templates/opac/myopac/prefs_notify.tt2
+7	0	docs/RELEASE_NOTES_NEXT/OPAC/combine_notice_prefs_tables.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/combine_notice_prefs_tables.adoc
+
+commit 4e4525c85e795a42231ffbb0e8e10c027d50a682
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Aug 17 10:53:19 2016 -0400
+
+    LP#1476049: disable serve-cgi-bin Apache config on Jessie and Xenial
+    
+    This patch ensures that the stock Apache configuration
+    "serve-cgi-bin" is disabled when installing on Debian Jessie
+    and Ubuntu Xenial, as otherwise the default cgi-bin location
+    can override what Evergreen specifies for offline.pl.
+    
+    To test:
+    
+    [1] Run the Makefile.install step on Jessie or Xenial; verify
+        that there is no /etc/apache2/conf-enabled/serve-cgi-bin.conf
+        symlink.
+    [2] Proceed with the rest of the Evergreen installation; verify
+        that the Apache error log doesn't contain a warning like this:
+    
+        "The Alias directive in /etc/apache2/sites-enabled/eg.conf ...
+         will probably never match because it overlaps an earlier
+         ScriptAlias."
+    
+    [3] For extra credit, verify that one can access offline circulation
+        sessions.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+3	0	Open-ILS/src/extras/install/Makefile.debian-jessie
+3	0	Open-ILS/src/extras/install/Makefile.ubuntu-xenial
+
+commit 3d78e822af3a6337430825dcf328889ea254c6b6
+Author: Michele Morgan <mmorgan at noblenet.org>
+Date:   Tue Aug 16 14:47:43 2016 -0400
+
+    LP#1583729 Item status screen column options do not include age protection
+    
+    Adds the age_protect field to several missing copy interfaces:
+    
+    XUL client:
+    
+    - Item status list view column picker
+    - Item status alternate view
+    - Holdings Maintenance column picker
+    
+    Web client:
+    
+    - Item status alternate view
+    - Holdings view column picker
+    
+    Also addresses an issue with displaying the circ modifier in some item
+    interfaces.
+    
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	0	Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+2	0	Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+1	1	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+1	1	Open-ILS/web/js/ui/default/staff/cat/services/holdings.js
+1	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+1	0	Open-ILS/xul/staff_client/server/cat/copy_browser.js
+6	1	Open-ILS/xul/staff_client/server/circ/alternate_copy_summary.js
+2	1	Open-ILS/xul/staff_client/server/circ/alternate_copy_summary.xul
+15	0	Open-ILS/xul/staff_client/server/circ/util.js
+1	0	Open-ILS/xul/staff_client/server/locale/en-US/circ.properties
+1	0	Open-ILS/xul/staff_client/server/locale/en-US/common.properties
+
+commit 059411ba21bb1dffb2d2db351ce1eddfc540fb8f
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 5 12:39:54 2016 -0400
+
+    LP#1527694 Webstaff egHatch supports 'LoginSession' storage
+    
+    Adds support for a class of cached value (AKA "LoginSession" items)
+    that are cleared when either the user logs out or the browser is closed.
+    Values are stored as cookies.
+    
+    Authentication tokens and "retrieve last patron" data are now stored as
+    "LoginSession" items.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+6	6	Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+17	7	Open-ILS/web/js/ui/default/staff/services/auth.js
+85	3	Open-ILS/web/js/ui/default/staff/services/hatch.js
+
+commit 350500afb00a0a2b244ef93d5cabb9549ffa59cd
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Aug 4 12:34:56 2016 -0400
+
+    LP#1527694 Webstaff clear last patron
+    
+    Store most recent patron ID via cookie instead of localStorage so the
+    value can expire when then browser is closed.
+    
+    Adds angular-cookies (ngCookies) dependency.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    
+    Conflicts:
+    	Open-ILS/web/js/ui/default/staff/bower.json
+
+1	0	Open-ILS/src/templates/staff/base_js.tt2
+2	0	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+2	1	Open-ILS/web/js/ui/default/staff/bower.json
+6	6	Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+1	1	Open-ILS/web/js/ui/default/staff/services/core.js
+1	0	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+
+commit f6eeb168a73ac86506890997ae6f426d8ddaedbe
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Aug 4 17:56:32 2016 -0400
+
+    LP#1522635 Webstaff lost (etc.) checkout completes
+    
+    Resolves an issue in the browser client where checkout of LOST
+    (and other non status='checked out' copies) failed to show the
+    open-circ-exists dialog.  In short, when searching for an existing
+    open circulation, look for any open circulation linked to the copy,
+    regardless of the status of the copy.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+6	12	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+
+commit 997a30a6973b9161c7336a086534c41810665f50
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Aug 4 15:22:22 2016 -0400
+
+    LP#1464350 Webstaff home page catalog search
+    
+    Search the catalog directly from the home/splash page in the browser
+    client.
+    
+    A side effect of this commit is that it's now possible to jump directly
+    to a set of search results in the embedded catalog by going to:
+    
+    /eg/staff/cat/catalog/results?<query-params>
+    
+    E.g.
+    
+    /eg/staff/cat/catalog/results?query=scores&qtype=subject
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+13	0	Open-ILS/src/templates/staff/t_splash.tt2
+12	4	Open-ILS/web/js/ui/default/staff/app.js
+21	0	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+
+commit d78e8a4f5e3a9fa501573e7f26bf69de566632ad
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Aug 10 12:10:58 2016 -0400
+
+    start adding form validation to receipt template editor
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+5	2	Open-ILS/src/templates/staff/css/style.css.tt2
+5	3	Open-ILS/src/templates/staff/reporter/t_edit_template.tt2
+
+commit b1f1f64b932bf113c7e6ddf80ee66b892dc6fdfd
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Aug 8 17:05:10 2016 -0400
+
+    Ignore null fleshed objects in autofleshing grid columns
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	0	Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit 804a907f4b21132c2b5c7865eed955df2a5e3814
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Aug 8 15:09:43 2016 -0400
+
+    Repair output popup, and add Reports to the splash page
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+6	0	Open-ILS/src/templates/staff/t_splash.tt2
+1	1	Open-ILS/web/reports/oils_rpt_folder_window.js
+
+commit 59af472f0726b7ffdc89c66dab685fd3e686c9f7
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Aug 8 14:15:09 2016 -0400
+
+    Report Templates!
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+22	14	Open-ILS/examples/fm_IDL.xml
+5	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/IDL2js.pm
+0	0	Open-ILS/src/templates/staff/css/reporter.css
+21	0	Open-ILS/src/templates/staff/reporter/index.tt2
+180	0	Open-ILS/src/templates/staff/reporter/share/report_strings.tt2
+233	0	Open-ILS/src/templates/staff/reporter/t_edit_template.tt2
+1	0	Open-ILS/src/templates/staff/reporter/t_legacy.tt2
+1	1	Open-ILS/src/templates/staff/share/t_confirm_dialog.tt2
+23	0	Open-ILS/src/templates/staff/share/t_select_dialog.tt2
+1	1	Open-ILS/web/js/ui/default/staff/bower.json
+440	0	Open-ILS/web/js/ui/default/staff/reporter/services/template.js
+600	0	Open-ILS/web/js/ui/default/staff/reporter/template/app.js
+80	2	Open-ILS/web/js/ui/default/staff/services/idl.js
+72	9	Open-ILS/web/js/ui/default/staff/services/ui.js
+1	1	Open-ILS/xsl/fm_IDL2js.xsl
+ create mode 100644 Open-ILS/src/templates/staff/css/reporter.css
+ create mode 100644 Open-ILS/src/templates/staff/reporter/index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/reporter/share/report_strings.tt2
+ create mode 100644 Open-ILS/src/templates/staff/reporter/t_edit_template.tt2
+ create mode 100644 Open-ILS/src/templates/staff/reporter/t_legacy.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/t_select_dialog.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/reporter/services/template.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/reporter/template/app.js
+
+commit 541921ab1de0a45002a501a2bea545c47f2c5252
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Aug 8 14:10:32 2016 -0400
+
+    Let the legacy interface do the right thing when embedded in the web client
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+22	5	Open-ILS/web/reports/oils_rpt_folder_window.js
+2	1	Open-ILS/web/reports/oils_rpt_param_editor.js
+3	0	Open-ILS/web/reports/oils_rpt_utils.js
+
+commit 461eef4e0bd4caec45adafdce2ec9c8095a24256
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Mon Jul 11 15:57:48 2016 -0400
+
+    toward ou type dropdown
+
+12	0	Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+
+commit d72697057908bbbecc961cc9a0eae421ab688c7d
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Mon Jul 11 14:52:53 2016 -0400
+
+    child node creation
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+8	0	Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+14	4	Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit 60c2eb3b9137c7b07c1bdbb7c1cbd1ab598d0b5e
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Mon Jul 11 11:59:06 2016 -0400
+
+    change to delete to remove, since JS uses delete
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+1	1	Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+1	1	Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit a2d1ab854f916606d9af3ce991c9601ff8c9897f
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Mon Jul 11 11:25:00 2016 -0400
+
+    UI tweak and org deletion
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+2	0	Open-ILS/src/templates/staff/admin/actor/org_unit/index.tt2
+23	3	Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+16	2	Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit 4e911171a113e5d7562ed998229f108a9120badc
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Mon Jul 11 10:20:43 2016 -0400
+
+    toast, comments, logging
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+6	0	Open-ILS/src/templates/staff/admin/actor/org_unit/index.tt2
+1	1	Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+14	11	Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit 872c8c2f0d98016fc1639dcc0d49300ae03e1660
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Fri Jun 10 14:22:45 2016 -0400
+
+    programmatic selection of tree node still not working
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+13	2	Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit aca3dd932957a062eb5f6385bb89d3dfae08d011
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Fri Jun 10 14:17:13 2016 -0400
+
+    refactor
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+30	25	Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit d914aab30ba0ccf75a081aa8dfcf157e8385c1e1
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Fri Jun 10 14:16:22 2016 -0400
+
+    getting changes to stick within a session
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+15	3	Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit 297a0b142326320f54f83b1f3d9d7f7c9a0b495a
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Fri Jun 10 12:37:01 2016 -0400
+
+    better stub out the other tabs, and try to select CONS by default
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+1	0	Open-ILS/src/templates/staff/admin/actor/org_unit/t_addresses_tab.tt2
+1	0	Open-ILS/src/templates/staff/admin/actor/org_unit/t_hours_tab.tt2
+2	2	Open-ILS/src/templates/staff/admin/actor/org_unit/t_index.tt2
+1	0	Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit efa65bd5c7640758585070e66819f06e82522b78
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Wed May 11 15:17:47 2016 -0400
+
+    Toward an Angular replacement for Org Units Conify
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+15	0	Open-ILS/src/templates/staff/admin/actor/org_unit/index.tt2
+0	0	Open-ILS/src/templates/staff/admin/actor/org_unit/t_addresses_tab.tt2
+0	0	Open-ILS/src/templates/staff/admin/actor/org_unit/t_hours_tab.tt2
+51	0	Open-ILS/src/templates/staff/admin/actor/org_unit/t_index.tt2
+46	0	Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+7	0	Open-ILS/src/templates/staff/css/admin.css.tt2
+87	0	Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+ create mode 100644 Open-ILS/src/templates/staff/admin/actor/org_unit/index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/actor/org_unit/t_addresses_tab.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/actor/org_unit/t_hours_tab.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/actor/org_unit/t_index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit 4e93a8bd0d240a10ec545c927ca92864efba95e9
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Jun 10 18:21:31 2016 -0400
+
+    webstaff: add admin interface for MARC tag tables
+    
+    This is a simple interface using eg-edit-fm-record to start;
+    more work will be required to better deal with the semantics
+    for overriding tag definitions at various levels of the OU
+    hierarchy.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+53	0	Open-ILS/src/templates/staff/admin/server/config/marc_field.tt2
+2	1	Open-ILS/src/templates/staff/admin/server/t_splash.tt2
+88	0	Open-ILS/web/js/ui/default/staff/admin/server/config/marc_field.js
+ create mode 100644 Open-ILS/src/templates/staff/admin/server/config/marc_field.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/server/config/marc_field.js
+
+commit 3bf01639f186522674cd6d1f347b713f0d5766e8
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Jun 10 18:19:17 2016 -0400
+
+    webstaff: a couple strings for a generic record deletion dialog
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+2	0	Open-ILS/src/templates/staff/base_js.tt2
+
+commit eabda938c992ae2269ec793eefd2ec0980f100ed
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Jun 10 18:14:20 2016 -0400
+
+    webstaff: new directive: egEditFmRecord
+    
+    This implements a generic IDL record editor widget:
+    
+    <eg-edit-fm-record
+      idl-class            = "xyz"
+      mode                 = "update"
+      record-id            = "223"
+      hidden-fields        = "bar,baz"
+      readonly-fields      = "quux"
+      required-fields      = "foo"
+      is-required-override = "bundle_of_custom_functions"
+      on-save              = "on_save_handler"
+      on-cancel            = "on_cancel"
+    ></eg-edit-fm-record>
+    
+    The mode can be either "create" or "update"; if it is "create",
+    then it is not necessary or desired to pass a record-id.
+    
+    Currently eg-edit-fm-record expects to be invoked from
+    inside a uibModal.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+62	0	Open-ILS/src/templates/staff/share/t_fm_record_editor.tt2
+187	0	Open-ILS/web/js/ui/default/staff/services/fm_record_editor.js
+ create mode 100644 Open-ILS/src/templates/staff/share/t_fm_record_editor.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/services/fm_record_editor.js
+
+commit d271b796cebc71e916e85249c15c2484444a390b
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Jun 10 12:15:18 2016 -0400
+
+    IDL improvements for classes releated to MARC tag tables
+    
+    In the course of building the admin interface for the
+    MARC tag tables, some deficiencies in the IDL were
+    run across. This patch fixes them.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+15	15	Open-ILS/examples/fm_IDL.xml
+
+commit 2a8148341428dc0fc1c4947a148e5d996bc6db6b
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri May 13 11:51:42 2016 -0400
+
+    webstaff: fix typo in field name
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+1	1	Open-ILS/examples/fm_IDL.xml
+
+commit bface48e0fff0512d46dee412bc46e8454521c5a
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed May 25 13:14:44 2016 -0400
+
+    LP#1585369: Angular broke my copy editor!
+    
+    It seems Angular 1.5 is either less flexible or less forgiving in its
+    ng-repeat implementation, and does not like an orderBy filter on object
+    iterators.  Removing that, and the track by clause, allows the holdings
+    editor to render properly.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/cat/volcopy/t_edit.tt2
+1	1	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 28f7159c31279217d01258eb85d662fad2785680
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue May 17 22:09:34 2016 -0400
+
+    webstaff: circ audio alerts
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+19	1	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+4	0	Open-ILS/web/js/ui/default/staff/circ/services/holds.js
+1	0	Open-ILS/web/js/ui/default/staff/circ/services/transits.js
+
+commit 676fdff4e78bcf33eb4f8c488d8995fcf9f75f65
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon May 16 23:16:34 2016 -0400
+
+    webstaff: audio disable and testing options
+    
+    For workstation admin UI.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+24	0	Open-ILS/src/templates/staff/admin/workstation/t_splash.tt2
+17	0	Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+
+commit d02c84fce8a3e99ce7be5357277b5958d8b04183
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Sun May 15 12:51:24 2016 -0400
+
+    webstaff: egAudio HTML5 audio service
+    
+    egCore.audio.play('audio.event.dot.path');
+    
+    Service to look up audio URL's by key name.  Supports fall-thru behavior
+    where 'foo.bar.baz' will fall-thru to 'foo.bar' and 'foo' depending on
+    whether an audio file is avaialable.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	0	Open-ILS/src/templates/staff/base_js.tt2
+-	-	Open-ILS/web/audio/notifications/error.wav
+-	-	Open-ILS/web/audio/notifications/info.wav
+-	-	Open-ILS/web/audio/notifications/success.wav
+-	-	Open-ILS/web/audio/notifications/warning.wav
+1	0	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+78	0	Open-ILS/web/js/ui/default/staff/services/audio.js
+5	2	Open-ILS/web/js/ui/default/staff/services/coresvc.js
+2	2	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+ create mode 100644 Open-ILS/web/audio/notifications/error.wav
+ create mode 100644 Open-ILS/web/audio/notifications/info.wav
+ create mode 100644 Open-ILS/web/audio/notifications/success.wav
+ create mode 100644 Open-ILS/web/audio/notifications/warning.wav
+ create mode 100644 Open-ILS/web/js/ui/default/staff/services/audio.js
+
+commit eb53b50cf844ba7bfe3bf5f069cd6a9d80be868e
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Thu May 12 12:27:11 2016 -0400
+
+    LP#1581126: webstaff: make egDateInput respect format.date OUS
+    
+    This patch makes the egDateInput directive fetch the
+    date format from the format.date library setting. The
+    directive also now accepts a dateFormat attribute for cases
+    where there is a reason to override the library setting.
+    
+    If no format is set via library setting or in how the
+    directive is invoked, the format defaults to "mediumDate",
+    e.g., "May 2, 1999".
+    
+    To test:
+    
+    [1] Open the webstaff patron registration form. Verify that
+        date widgets display the date in the format that
+        corresponds to the value of the format.date library setting
+        for the current work station, or (if the library setting
+        is not set, "Month day, year".
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+1	1	Open-ILS/src/templates/staff/share/t_datetime.tt2
+12	3	Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit cea022c407e4193dcf3fed6b9ca81edfe04c3038
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu May 12 11:51:09 2016 -0400
+
+    Add images for angular-tree-control to bower
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+21	0	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+
+commit f20039da9caa3e43bf626b65b667516e4383b0d5
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed May 11 16:31:33 2016 -0400
+
+    webstaff: tweak legacy OU editor
+    
+    This adds a CSS hack so that the right-hand pane of
+    the legacy OU editor is displayed when embedded in
+    the web staff client.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+7	0	Open-ILS/web/conify/global/actor/org_unit.html
+
+commit cce69273995f6f6668e5f5a0c52cafd4ed20f54d
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed May 11 16:30:34 2016 -0400
+
+    webstaff: tweak permission group editor
+    
+    This adds a couple hackish formating tweaks so that
+    the permission group editor works when embedded
+    in the web staff client.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+9	1	Open-ILS/web/conify/global/permission/grp_tree.html
+
+commit 7292174f182bba027362946c0a4a47d3ba2534da
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed May 11 13:17:55 2016 -0400
+
+    webstaff: add server administration page
+    
+    This patch adds a landing page for Server Administration and
+    code to embed all of the admin pages available under Serer
+    Administration in the XUL staff client.
+    
+    TODO:
+    
+    * fix the permission groups editor so that it works
+      when embedded in the web staff client
+    * refactor admin/local/app.js and admin/server/app.js to
+      unify some of the copy and pasting
+    * replace the embedded legacy OU editor with a new
+      angular one
+    * fixes some CSS issues that make text hard to read in
+      a few places
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+15	0	Open-ILS/src/templates/staff/admin/server/index.tt2
+78	0	Open-ILS/src/templates/staff/admin/server/t_splash.tt2
+6	0	Open-ILS/src/templates/staff/navbar.tt2
+80	0	Open-ILS/web/js/ui/default/staff/admin/server/app.js
+ create mode 100644 Open-ILS/src/templates/staff/admin/server/index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/server/t_splash.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/server/app.js
+
+commit 84df55949e502b16c724fdfdcc8dcafa59dedd28
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed May 4 15:04:23 2016 -0400
+
+    webstaff: work log: various improvements
+    
+    * Don't use $location.path() to generate a URL for when opening
+      a new window, as that can cause the parent window to reset
+      itself.
+    * Fix the refresh button
+    * Add support for paging through worklog entries
+    * Don't prematurely resolve the promise that is
+      feeding rows to the grid
+    * Ensure that entries are displayed in timestamp order
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+54	50	Open-ILS/web/js/ui/default/staff/admin/workstation/log.js
+
+commit 51fe14771d2f117f0f980047f53a64772f2c2ba1
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Fri Dec 4 11:06:56 2015 -0500
+
+    webstaff: egWorkLog service and Work Log UI
+    
+    under Administration -> Local Administration
+    
+    The original XUL feature starts here: 29d1b357eef061bb3698e4ce0506eb93b63421be
+    
+    Make sure egCore from the calling interface is pulling in these org unit
+    settings:
+    
+    ui.admin.work_log.max_entries
+    ui.admin.patron_log.max_entries
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+11	7	Open-ILS/src/templates/opac/parts/place_hold_result.tt2
+17	0	Open-ILS/src/templates/staff/admin/workstation/log.tt2
+59	0	Open-ILS/src/templates/staff/admin/workstation/t_log.tt2
+13	0	Open-ILS/src/templates/staff/base_js.tt2
+1	0	Open-ILS/src/templates/staff/css/style.css.tt2
+162	0	Open-ILS/web/js/ui/default/staff/admin/workstation/log.js
+20	2	Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
+10	4	Open-ILS/web/js/ui/default/staff/circ/patron/holds.js
+23	5	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+23	7	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+1	0	Open-ILS/web/js/ui/default/staff/services/eframe.js
+116	0	Open-ILS/web/js/ui/default/staff/services/ui.js
+ create mode 100644 Open-ILS/src/templates/staff/admin/workstation/log.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/workstation/t_log.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/workstation/log.js
+
+commit 4e1a8f8245d649e8574b0357f5e79f92414bba3b
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Thu May 5 16:35:25 2016 -0400
+
+    webstaff: transit list: improve styling of form
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+18	7	Open-ILS/src/templates/staff/circ/transits/t_list.tt2
+
+commit 7482a039798fb9f71a64562b4a94d05be4db0ff8
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed May 4 15:01:50 2016 -0400
+
+    webstaff: transit list: don't reset form
+    
+    $location.path(foo) is a setter, and should not
+    be used to calculate a URL for opening a new window
+    unless you also want to refresh the source page.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+5	6	Open-ILS/web/js/ui/default/staff/circ/transits/list.js
+
+commit bc5aebd7b20b53b24fa2c5c7eb066d7d21cb3689
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu Oct 1 07:23:44 2015 -0400
+
+    webstaff: Transit List
+    
+    under Administration -> Local Administration
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+32	0	Open-ILS/src/templates/staff/circ/share/t_abort_transit_dialog.tt2
+18	0	Open-ILS/src/templates/staff/circ/transits/list.tt2
+50	0	Open-ILS/src/templates/staff/circ/transits/t_list.tt2
+68	0	Open-ILS/web/js/ui/default/staff/circ/services/transits.js
+154	0	Open-ILS/web/js/ui/default/staff/circ/transits/list.js
+ create mode 100644 Open-ILS/src/templates/staff/circ/share/t_abort_transit_dialog.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/transits/list.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/transits/t_list.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/circ/services/transits.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/circ/transits/list.js
+
+commit f3931174b5257fa1574b298c3608839bdcddaf12
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Tue Jan 5 11:23:36 2016 -0500
+
+    webstaff: links to Surveys, Transit List, Work Log
+    
+    Under Administration -> Local Administration
+    
+    Links to the existing Surveys interface; following commits implement
+    the new Transit List and Work Log interfaces.
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+3	0	Open-ILS/src/templates/staff/admin/local/t_splash.tt2
+
+commit dffd94b2e673c87faae1e5e49153d0f05bf35d6f
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Aug 12 14:15:29 2016 -0400
+
+    LP#1587639: stamp schema upgrade
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+124	0	Open-ILS/src/sql/Pg/upgrade/0989.schema.authority-vandeley-edit-date.sql
+0	124	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0989.schema.authority-vandeley-edit-date.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql
+
+commit 744c0e74493d09dff1a4f7e7a1cfb6d9597cf3fc
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Aug 4 14:00:17 2016 -0400
+
+    LP#1587639 Avoid double-update of editor/edit_date
+    
+    Look for an editor first, and if not found just use the existing values.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+33	32	Open-ILS/src/sql/Pg/012.schema.vandelay.sql
+33	32	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql
+
+commit ada5bc49fb90f34c18bb3551c83d27ca0bb89626
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Jun 1 11:55:27 2016 -0400
+
+    LP#1587639 Vand. authority updates release notes
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+6	0	docs/RELEASE_NOTES_NEXT/Cataloging/auth_bib_update.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/auth_bib_update.adoc
+
+commit 720cb4391ec0149632fbaf9687edf58a4a1d1142
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Jun 1 11:51:00 2016 -0400
+
+    LP#1587639 Vand. authority updates PGTAP
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+73	0	Open-ILS/src/sql/Pg/t/vandelay-auth-import.sql
+ create mode 100644 Open-ILS/src/sql/Pg/t/vandelay-auth-import.sql
+
+commit 43f06ef45bde83713b4b2700692dcc5606fb2a91
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Jun 1 10:40:45 2016 -0400
+
+    LP#1587639 Vandelay authority update editor/edit_date
+    
+    Update the editor and edit_date of authority records when modified by
+    Vandelay merge/overlay.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+9	9	Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
+48	8	Open-ILS/src/sql/Pg/012.schema.vandelay.sql
+123	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql
+
+commit 5317ba59cace4fd62365fc084addac6a3315fcd0
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 9 14:55:30 2016 -0400
+
+    Stamping upgrade for bib_source-in-901
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+122	0	Open-ILS/src/sql/Pg/upgrade/0988.schema.bib_source_in_901.sql
+0	122	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.bib_source_in_901.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0988.schema.bib_source_in_901.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.bib_source_in_901.sql
+
+commit 8db4cb64bb4741713edc7a364adcd9d0f865ba7d
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Aug 26 17:59:37 2015 +0000
+
+    LP#1037553: bibliographic record source now copied to 901$s
+    
+    If a bibliographic record has a source set, the name of that source
+    is now copied to the 901$s whenever the record is created or updated.
+    This allows the source to be used for record matching and MARC
+    field queries.
+    
+    To test:
+    
+    [1] Create or import a bibliographic record and ensure that its
+        source is set to a non-null value.
+    [2] Inspect the record in MARC format view and verify that its
+        901 field now has a subfield $s containing the name of the
+        source.
+    [3] Use pg_prove to run the pgTAP test added by this patch
+        and verify that the test passes.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+12	0	Open-ILS/src/sql/Pg/002.functions.config.sql
+21	0	Open-ILS/src/sql/Pg/t/bib_901_field.pg
+122	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.bib_source_in_901.sql
+6	0	docs/RELEASE_NOTES_NEXT/Cataloging/bib_source_in_901s.txt
+ create mode 100644 Open-ILS/src/sql/Pg/t/bib_901_field.pg
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.bib_source_in_901.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/bib_source_in_901s.txt
+
+commit 983e8f9cf1bbc69fd8a134b987cdc87e4fc8e406
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Thu Oct 8 09:39:34 2015 -0400
+
+    LP 1503867: Use ws_ou in open-ils.circ.copy_transit.receive.
+    
+    After putting NCIPServer into production, we discovered that a staff
+    user cannot receive a transit destined for their work org. unit if
+    the actor.usr.home_ou is not the same as their current work_ou.
+    This occurred because transit_receive in OpenILS::Application::
+    Circ::Transit uses the requestor's home_ou and not the ws_ou.
+    
+    If you want to trigger this bug, write a little script to receive
+    transits, then login with a staff account at a location other than
+    their home_ou and try to receive a transit destined for the work_ou.
+    It will fail.
+    
+    This small commit replaces home_ou in two places with ws_ou in order
+    to make the above work.
+    
+    NOTE: This bug affects an API call not used in Evergreen except in
+    one test script.  It used in two ILL add-ons for Evergreen: issa and
+    NCIPServer.  Receiving transits by checking copies in via the staff
+    client, the typical workflow, is not affected by this bug or its fix.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Transit.pm
+
+commit 31563d8f54fd65d318635375b3b07520bf7bfc31
+Author: Liam Whalen <liam.whalen at bc.libraries.coop>
+Date:   Thu Sep 24 15:00:17 2015 -0700
+
+    LP#1499537 Fixed kpac.xml caching problem
+    
+    KPAC config files must be cached per config path in order to support
+    cases where more than one KPAC interface has been configured in different
+    vhosts or locations.
+    
+    Signed-off-by: Liam Whalen <liam.whalen at bc.libraries.coop>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+13	12	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGKPacLoader.pm
+
+commit 5a5834d993e2ad7b4e9fdce9e839b956414a9ab3
+Author: Michele Morgan <mmorgan at noblenet.org>
+Date:   Thu Jun 2 12:44:02 2016 -0400
+
+    LP#1588450 asset.copy.cost Field Missing from Client Interfaces
+    
+    This patch adds the asset.copy.cost cost field, with the label 'Acquisition
+    Cost' to the following:
+    
+    XUL client:
+    
+    - Item status list view column picker
+    - Item status alternate view
+    - Copy editor
+    
+    Web client:
+    
+    - Item status alternate view
+    - Copy editor label change
+    
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+18	20	Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+1	1	Open-ILS/src/templates/staff/cat/volcopy/t_attr_edit.tt2
+1	1	Open-ILS/src/templates/staff/cat/volcopy/t_defaults.tt2
+1	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+8	0	Open-ILS/xul/staff_client/server/cat/copy_editor.js
+6	0	Open-ILS/xul/staff_client/server/circ/alternate_copy_summary.js
+16	15	Open-ILS/xul/staff_client/server/circ/alternate_copy_summary.xul
+16	0	Open-ILS/xul/staff_client/server/circ/util.js
+1	0	Open-ILS/xul/staff_client/server/locale/en-US/cat.properties
+1	0	Open-ILS/xul/staff_client/server/locale/en-US/common.properties
+
+commit 4c92d095da106a4c2a54bf26e392d5ad57938f4d
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Apr 26 11:47:27 2016 -0400
+
+    LP#1575177 Add text informing users they cannot add survey questions
+    
+    Survey questions cannot be added or modified once a survey has started, so
+    let's add some warning text in the interface letting them know why they can't
+    perform these actions.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	0	Open-ILS/web/js/dojo/openils/conify/nls/conify.js
+6	1	Open-ILS/web/js/ui/default/conify/global/action/survey/edit.js
+
+commit abefaa0dffe415bca9669de7a884ce22d6a9c2a3
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Jul 19 14:02:12 2016 -0400
+
+    LP#1604515: Remove Advanced Hold Options link when part holds are expected
+    
+    This branch removes the Advanced Hold Options link from the Place Hold
+    screen in cases where all copies on the bib record contain parts. If a user
+    attempts to place a metarecord hold and all other copies in the group also
+    contain parts, the hold will fail. By removing the link, we are removing one
+    potential point of failure for the user.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/templates/opac/parts/place_hold.tt2
+9	0	docs/RELEASE_NOTES_NEXT/OPAC/remove_advanced_hold_options_for_parts.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/remove_advanced_hold_options_for_parts.adoc
+
+commit 2ba2c3bf0c3fe3bcccd242fa435d589fe0847bf3
+Author: blake <blake at mobiusconsortium.org>
+Date:   Mon Apr 18 16:25:46 2016 -0500
+
+    LP1534283 SIP prevents renewal when user has any blocking standing penalties
+    
+    This code dives into each penalty to investigate weather or not the patron
+    can renew based on the block list column. Before, SIP would block renewals with
+    the presence of penalty 1 or 2 regardless.
+    
+    Signed-off-by: blake <blake at mobiusconsortium.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+38	4	Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm
+
+commit e51f6070f186e9f5504c3e1da5a93e7627738599
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 9 12:46:07 2016 -0400
+
+    Stamping upgrade for payment limits.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+33	0	Open-ILS/src/sql/Pg/upgrade/0987.data.lp1183964_payment_limit.sql
+0	33	Open-ILS/src/sql/Pg/upgrade/XXXX_lp1183964_payment_limit.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0987.data.lp1183964_payment_limit.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX_lp1183964_payment_limit.sql
+
+commit ad10cde090791e02cb106e36a310581bfaafface
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 9 12:41:54 2016 -0400
+
+    Stamping upgrade for accent-ignoring patron search
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+43	0	Open-ILS/src/sql/Pg/upgrade/0986.schema.patron_unaccent.sql
+0	43	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron_unaccent.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0986.schema.patron_unaccent.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron_unaccent.sql
+
+commit 10aaac3955bd6baaa68f502c1ef851fce093b183
+Author: Jason Stephenson <jstephenson at mvlcstaff.org>
+Date:   Thu Mar 17 17:47:52 2016 -0400
+
+    LP 1501781: Make patron name search diacritic/space insensitive.
+    
+    Add pgtap tests for the new org unit setting, the new indexes, and to
+    test the evergreen.unaccent_and_squash() functionality.  Many of the
+    latter tests are based on the tests for evergreen.lowercase().
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+61	0	Open-ILS/src/sql/Pg/t/lp1501781-unaccent_and_squash.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1501781-unaccent_and_squash.pg
+
+commit 42d5c82b1ca74ca4aa0581b930ecf0b22772fefe
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Thu Mar 17 08:01:54 2016 -0400
+
+    LP 1501781: Make patron name search diacritic/space insensitive.
+    
+    This commit adds the necessary code to storage actor publisher to use
+    the new evergreen.unaccent_and_squash db function when doing a patron
+    name search.
+    
+    It is based on code originally by Dan Pearl, but then modified to
+    remove a dependency on a new Perl module by calling the db function on
+    the search input as well.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+36	4	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm
+
+commit 85a470ef7144265ee0a2618fafffeac8bb36b65d
+Author: Dan Pearl <dpearl at cwmars.org>
+Date:   Thu Oct 1 09:49:17 2015 -0400
+
+    LP#1501781 - Make patron name search diacritic/space insensitive.
+    
+    Diacritical marks may exist in the patron record, as they should, but
+    this makes patron name search difficult for librarians who may be
+    unfamiliar with all the special characters used and also how to elicit
+    them from a keyboard.  To ease this, accented characters will be
+    converted into their 'plain' analogs for comparison purposes.
+    
+    So, for example, if the patron's last name is Chávez, typing "Chavez"
+    in the Last Name box in Patron Search will match it.
+    
+    Spaces in a name (like "De la Croix") will be squashed out so that
+    name would be matched by "Delacroix" or "De la Croix" or variants.
+    
+    The librarian can enter the accented characters or not.
+    
+    Signed-off-by: Dan Pearl <dpearl at cwmars.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+8	0	Open-ILS/src/sql/Pg/000.functions.general.sql
+3	0	Open-ILS/src/sql/Pg/005.schema.actors.sql
+20	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+1	0	Open-ILS/src/sql/Pg/create_database_extensions.sql
+43	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron_unaccent.sql
+20	0	docs/RELEASE_NOTES_NEXT/Client/accent_insensitive_patron_search
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron_unaccent.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/accent_insensitive_patron_search
+
+commit 9bdfdf9a870dceb5baa92ddde6575b9a34a624fb
+Author: Jason Boyer <jboyer at library.in.gov>
+Date:   Fri May 13 12:51:07 2016 -0400
+
+    LP1183964: Payment Limit Options
+    
+    Add support for 2 new OU settings, a payment warning
+    amount (try to pay more than this and you're required
+    to confirm it) and a hard limit where no payment larger
+    will be accepted. Support is also added to both the XUL
+    client and webstaff client.
+    
+    Signed-off-by: Jason Boyer <jboyer at library.in.gov>
+    Signed-off-by: Jeanette Lundgren <jlundgren at cwmars.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+20	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+33	0	Open-ILS/src/sql/Pg/upgrade/XXXX_lp1183964_payment_limit.sql
+3	0	Open-ILS/src/templates/staff/circ/patron/index.tt2
+45	3	Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
+3	0	Open-ILS/xul/staff_client/server/locale/en-US/patron.properties
+39	2	Open-ILS/xul/staff_client/server/patron/bill2.js
+16	0	docs/RELEASE_NOTES_NEXT/Circulation/limit_payment_amounts_accepted.txt
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX_lp1183964_payment_limit.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/limit_payment_amounts_accepted.txt
+
+commit 4b5b791fffef5420e6d142964dfefdb647051e22
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 9 12:04:35 2016 -0400
+
+    Stamping upgrade for reingest speedup
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+231	0	Open-ILS/src/sql/Pg/upgrade/0985.schema.speed_record_attr_ingest.sql
+0	231	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.speed_record_attr_ingest.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0985.schema.speed_record_attr_ingest.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.speed_record_attr_ingest.sql
+
+commit 982472f1110b5874757d57c421e121c0a5962f61
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Jul 29 11:40:46 2016 -0400
+
+    LP#1588543: schema update script
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+231	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.speed_record_attr_ingest.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.speed_record_attr_ingest.sql
+
+commit f668201078a11fe06d9bb8e1c658648e7ed2be60
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Jul 29 11:34:06 2016 -0400
+
+    LP#1588543: tests for verifying correct generated of record attributes
+    
+    This patch adds tests to verify that the expected
+    set of record attributes are generated when a bib record
+    is ingested.  The tests serve a couple purposes:
+    
+    - verifying that changes to the record attribute ingest
+      stored procedure don't have unexpected side-effects
+    - validating record attribute definitions in the seed data
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+211	0	Open-ILS/src/sql/Pg/t/lp1588543_marc_record_attributes.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1588543_marc_record_attributes.pg
+
+commit 6cc1d1e0911f4dd4a92d17a9b60025888b080bff
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Jul 29 11:24:07 2016 -0400
+
+    LP#1588543: further speed up record attribute ingest
+    
+    Following a suggestion from Dan Wells, this patch adds
+    an index on config.coded_value_map(ctype). My testing shows
+    that the index by itself can halve the time required to
+    fully ingest a new record; in conjunction with the
+    change in the previous patch, full reingest time is
+    reduced by about 60%.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	0	Open-ILS/src/sql/Pg/002.schema.config.sql
+
+commit cf3bd149e53585676a517d38093f2470dbcfaaeb
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Jun 1 14:36:29 2016 -0400
+
+    LP#1588543: Speed up record attribute ingest
+    
+    A huge number of rows (700+) have been added to
+    config.record_attr_definition in recent versions of Evergreen. However,
+    these rows do not actually define any indexing at all, but are used for
+    other purposes.  The reingest process currently churns over all of these
+    rows to ultimately do nothing.
+    
+    This commit limits the group of attributes considered at ingest to only
+    those which might index something.  Testing indicates a substantial
+    speed boost to typical use of metabib.reingest_record_attributes()
+    (over 2x speedup).
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+10	1	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+
+commit d5ce5929495c31eeac6bfdc3df6bd3e275a3ed0d
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Fri Jul 29 17:51:14 2016 -0400
+
+    LP#1549505: Stamping upgrade scripts 0983-84 for stat pop ratings
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+1005	0	Open-ILS/src/sql/Pg/upgrade/0983.schema.statistical-ratings.sql
+606	0	Open-ILS/src/sql/Pg/upgrade/0984.function.qp_search.sql
+0	1003	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+0	604	Open-ILS/src/sql/Pg/upgrade/YYYY.function.qp_search.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0983.schema.statistical-ratings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0984.function.qp_search.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.function.qp_search.sql
+
+commit ac561d3b347e4f7393000a6b76ea1071927d9d4e
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Thu Jul 28 12:19:15 2016 -0400
+
+    LP#1549505: update $modal to $uibModal
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+6	6	Open-ILS/web/js/ui/default/staff/admin/local/rating/badge.js
+
+commit 940270761e1ef9c4ea51c8ad9229e3c9bd8d45a2
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Thu Jul 21 12:02:38 2016 -0400
+
+    LP#1549505: Decrease value of Max popularity importance multiplier
+    
+    My testing found that a setting between 1.1 and 1.2 resulted in fairly good
+    results when using the popularity-adjusted relevance sort. Adjusting the value
+    in the seed data to 1.1 since it will be a better starting point for libraries.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+
+commit cf614499238ad958f34f91ec0107d482ac124d30
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Thu Jul 21 11:52:24 2016 -0400
+
+    LP#1549505: Remove stray semicolon from PgTap test
+    
+    The semicolon was causing failures in the test.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/t/regress/lp1549505_statistical_popularity_infrastructure.pg
+
+commit ae3bb32ede6e7569b935a92ed5bc7fc1cb0564cf
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu May 26 17:51:49 2016 -0400
+
+    LP#1549505: Query literal interpolation casts incorrectly
+    
+    We need to be sure that all query values are of the same type in the same
+    columns because PLPGSQL functions are compiled and cached.  In this case,
+    the core query of the in-db search cannot have its shape change.  This
+    commit assures that browse and search uses of the SP provide core queries
+    that match on their SELECT lists.  Of particular importance is the type
+    of the "rel" output column, which was variously float8 or numeric, depending
+    on whether the search contained any terms (a "search") or not (a browse
+    link).
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+4	4	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+4	4	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+4	4	Open-ILS/src/sql/Pg/upgrade/YYYY.function.qp_search.sql
+
+commit 3d5b37a1072bfd177bf484d02e717dae57a62427
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed May 25 12:53:24 2016 -0400
+
+    LP#1549505: fix staged browse
+    
+    This patch ensures that the core query passed to
+    query_parser_fts by staged browse contains dummy
+    badges and popularity columns (and thus, doesn't break);
+    note that browse itself cares nothing about popularity.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	0	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+208	0	Open-ILS/src/sql/Pg/upgrade/YYYY.function.qp_search.sql
+
+commit df0d763642e5841baaac36d09b1fa9df525b2b67
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri May 6 11:29:39 2016 -0400
+
+    LP#1549505: update baseline database schema
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	0	Open-ILS/src/sql/Pg/090.schema.action.sql
+905	0	Open-ILS/src/sql/Pg/220.schema.rating.sql
+9	1	Open-ILS/src/sql/Pg/300.schema.staged_search.sql
+0	2	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+73	19	Open-ILS/src/sql/Pg/reporter-schema.sql
+2	0	Open-ILS/src/sql/Pg/sql_file_manifest
+ create mode 100644 Open-ILS/src/sql/Pg/220.schema.rating.sql
+
+commit 36ed838b1bc73b4bb5957aa7a3da29fc94f2563f
+Author: Jason Stephenson <jstephenson at mvlcstaff.org>
+Date:   Fri Apr 15 09:36:51 2016 -0400
+
+    LP 1549505: Fix syntax error in OpenILS/WWW/EGCatLoader/Record.pm
+    
+    Typo/error apparently introduced on line 72 in commit eeee27c.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlcstaff.org>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
+
+commit 6fd72121637701f4dfc50e2cd3b2896c49197c5c
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Apr 5 16:26:41 2016 -0400
+
+    LP#1549505: Release notes for statistically generated record ratings (popularity)
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+98	0	docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
+
+commit 4f48f276d052a6211be625d3b87d8077a789999c
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Apr 5 12:10:53 2016 -0400
+
+    LP#1549505: PGTap test to show the infrastructure is working
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+33	0	Open-ILS/src/sql/Pg/t/regress/lp1549505_statistical_popularity_infrastructure.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/regress/lp1549505_statistical_popularity_infrastructure.pg
+
+commit 1fd8103bf33430fe0b4b5ae8d2b2b051802ac473
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Mar 11 13:27:03 2016 -0500
+
+    LP#1549505: add flag to tweak popularity-adjusted relevance
+    
+    This adds a new global_flag, search.max_popularity_importance_multiplier,
+    to control the factor by which popularity affects Popularity Adjusted
+    Relevance ranking.
+    
+    The value should be a decimal number, typically between 1.0 and 2.0:
+    
+    * 1.0 be would be equivalent to not adjusting relevance for popularity
+      at all.
+    * 1.1 would mean that the multiplier would range from 1 (for zero
+      popularity) to 1.1 (for maximum popularity), for a maximum boost of
+      10% of the base relevance value of the record.
+    
+    What's happening in the code:
+    
+    Scale the 0-5 effect of popularity badges by providing a multiplier
+    for the badge average based on the overall maximum multiplier.  Two
+    examples, comparing the effect to the default $max_mult value of 2.0,
+    which causes a $adjusted_scale value of 0.2:
+    
+     * Given the default $max_mult of 2.0, the value of
+       $adjusted_scale will be 0.2 [($max_mult - 1.0) / 5.0].
+       For a record whose average badge score is the maximum
+       of 5.0, that would make the relevance multiplier be
+       2.0:
+          1.0 + (5.0 [average score] * 0.2 [ $adjusted_scale ],
+       This would have the effect of doubling the effective
+       relevance of highly popular items.
+    
+     * Given a $max_mult of 1.1, the value of $adjusted_scale
+       will be 0.02, meaning that the average badge value will be
+       multiplied by 0.02 rather than 0.2, then added to 1.0 and
+       used as a multiplier against the base relevance.  Thus a
+       change of at most 10% to the base relevance for a record
+       with a 5.0 average badge score. This will allow records
+       that are naturally very relevant to avoid being pushed
+       below badge-heavy records.
+    
+     * Given a $max_mult of 3.0, the value of $adjusted_scale
+       will be 0.4, meaning that the average badge value will be
+       multiplied by 0.4 rather than 0.2, then added to 1.0 and
+       used as a multiplier against the base relevance. Thus a
+       change of as much as 200% to (or three times the size of)
+       the base relevance for a record with a 5.0 average badge
+       score.  This in turn will cause badges to outweigh
+       relevance to a very large degree.
+    
+    The maximum badge multiplier can be set to a value less than
+    1.0; this would have the effect of making less popular items
+    show up higher in the results.  While this is not a likely
+    option for production use, it could be useful for identifying
+    interesting long-tail hits, particularly in a database
+    where enough badges are configured so that very few records
+    have an average badge score of zero.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+62	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+13	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+12	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+12	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+
+commit d4d2f42e8674f93284d2932e171bf9a4f9cc8cf4
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Feb 24 17:19:14 2016 -0500
+
+    LP#1549505: add admin interface to manage badges
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/examples/fm_IDL.xml
+60	0	Open-ILS/src/templates/staff/admin/local/rating/badge.tt2
+42	0	Open-ILS/src/templates/staff/admin/local/rating/edit_badge.tt2
+1	0	Open-ILS/src/templates/staff/admin/local/t_splash.tt2
+3	0	Open-ILS/src/templates/staff/css/style.css.tt2
+189	0	Open-ILS/web/js/ui/default/staff/admin/local/rating/badge.js
+ create mode 100644 Open-ILS/src/templates/staff/admin/local/rating/badge.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/local/rating/edit_badge.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/local/rating/badge.js
+
+commit 701d069268f75620e145ea73a2e21aec7ec5db42
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Feb 4 17:19:03 2016 -0500
+
+    LP#1549505: Add ability to set default sorter via global flag
+    
+    In addition, support for sorting by ascending popularity remains
+    in the back end, however, since if one's configured badges such
+    that almost every record has a badge score, that sort order could
+    be useful for examining the long tail of the collection.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+5	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+14	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+7	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+5	1	Open-ILS/src/templates/opac/parts/advanced/search.tt2
+12	0	Open-ILS/src/templates/opac/parts/filtersort.tt2
+6	1	Open-ILS/src/templates/opac/parts/searchbar.tt2
+
+commit b6dd839f6c292849017cdc8a2f0ff590facd70cc
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Feb 3 15:46:52 2016 -0500
+
+    LP#1549505: Provide a cron-able script to perform badge recalculation
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+27	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/biblio.pm
+60	0	Open-ILS/src/support-scripts/badge_score_generator.pl
+ create mode 100755 Open-ILS/src/support-scripts/badge_score_generator.pl
+
+commit 8180b60d040d6b1025de21bbd587839076037493
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Jan 22 17:13:25 2016 -0500
+
+    LP#1549505: Teach QP and its caller stack how to use badges
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+54	7	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+59	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+15	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
+7	5	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
+396	0	Open-ILS/src/sql/Pg/upgrade/YYYY.function.qp_search.sql
+10	0	Open-ILS/src/templates/opac/parts/record/summary.tt2
+7	2	Open-ILS/src/templates/opac/parts/result/table.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.function.qp_search.sql
+
+commit 1dd8d953b01ccedc5e42162d53471f132156e77a
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Jan 7 22:00:20 2016 -0500
+
+    LP#1549505: schema and IDL for statistical poularity ratings
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+92	0	Open-ILS/examples/fm_IDL.xml
+984	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+
+commit 357aabae410bbe25160947acd52693841d690e92
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Thu May 12 15:58:49 2016 -0400
+
+    LP#1581196: webstaff: fix dirty form detection in patron editor
+    
+    This patch fixes a problem wherein the patron editor
+    form would think that it had been modified by the
+    user immediately after initialization.
+    
+    To test
+    -------
+    [1] Load the patron editor, then refresh the page. Note that
+        you are warned that there is unsaved input.
+    [2] As above, but hit the save button. Note that after saving,
+        you still get a warning that there is unsaved input.
+    [3] Apply the page, then repeat tests 1 and 2. This time, you
+        shouldn't get inappropriate unsaved data warnings.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+0	2	Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+6	0	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit 50eb643d555b8307e02a312d8e09919dd003b2d3
+Author: Ben Shum <ben at evergreener.net>
+Date:   Tue Jul 5 01:14:38 2016 -0400
+
+    LP#1568046: Stamping upgrade script for eliminating connectby from functions
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+256	0	Open-ILS/src/sql/Pg/upgrade/0982.function.perm_functions_without_connectby.sql
+0	256	Open-ILS/src/sql/Pg/upgrade/XXXX.function.perm_functions_without_connectby.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0982.function.perm_functions_without_connectby.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.perm_functions_without_connectby.sql
+
+commit 499d69d64e7c7b660ee1dffc250f8f9552df8daa
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Fri Jul 1 13:13:16 2016 -0400
+
+    LP#1568046: Replace last two uses of connectby with other function calls.
+    
+    Modify permission functions permission.usr_has_perm_at_nd and
+    permission.usr_has_perm_at_all_nd to no longer require the connectby
+    function from the tablefunc extension.  The connectby functionality is
+    replaced by existing database functions to retrieve org. unit
+    descendants.
+    
+    This change removes the need to load the tablefunc extension, so it is
+    dropped from the create scripts.  The upgrade script does not remove
+    the extension as sites may be using connectby or other functions from
+    the extension.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+5	28	Open-ILS/src/sql/Pg/006.schema.permissions.sql
+0	2	Open-ILS/src/sql/Pg/create_database_contribs.sql
+0	1	Open-ILS/src/sql/Pg/create_database_extensions.sql
+256	0	Open-ILS/src/sql/Pg/upgrade/XXXX.function.perm_functions_without_connectby.sql
+15	0	docs/RELEASE_NOTES_NEXT/Administration/lp1568046-tablefunc-extension-removed.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.perm_functions_without_connectby.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/lp1568046-tablefunc-extension-removed.adoc
+
+commit 1463f3597487048127cee5b19ba79bb3bec5a878
+Author: Ben Shum <ben at evergreener.net>
+Date:   Wed Jun 8 07:41:30 2016 -0400
+
+    LP#1554714: Set angular 1.5.5 as minimum, not exact version
+    
+    By adding the ~ in front of the angular version specified, we say
+    make this the minimum version to look for.  This bypasses the issue
+    for when new releases of the 1.5.x angular series is released, such
+    as 1.5.6, which is the current new version as of this patch.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/web/js/ui/default/staff/bower.json
+
+commit a6d3bdea207394fafc8caf92dcd18843410fcb2e
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Fri Jun 10 11:51:41 2016 -0400
+
+    LP#1526858: Stamping upgrade script for faster alhr query
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+8	0	Open-ILS/src/sql/Pg/upgrade/0981.schema.indexes_for_alhr_queries.sql
+0	8	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.indexes_for_alhr_queries.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0981.schema.indexes_for_alhr_queries.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.indexes_for_alhr_queries.sql
+
+commit ae4ccf75a047719ef3b8809349bde93398121cb1
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed May 25 11:29:22 2016 -0400
+
+    Docs: Adding 2.10.4 Point Release Notes
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+37	2	docs/RELEASE_NOTES_2_10.adoc
+
+commit 8ab630642cf7331a3cbb3d216f376ff837e7ed52
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Mon May 23 19:17:36 2016 -0400
+
+    LP#1447746: Fix lp957466_update_date_and_source regression test
+    
+    The new code introduced through LP1447746 adding an update_bib_source flag to
+    Vandelay merge profiles broke a test that was verifying the bib source and
+    edit fields were updated in Vandelay uploads.
+    
+    This patch fixes the test and also adds a new test to ensure the flag works as
+    expected when set to both true and false. It also renames the test since the
+    it's now testing the newer code rather than the previous expected behavior.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+137	0	Open-ILS/src/sql/Pg/t/regress/lp1447746_update_date_and_source.pg
+0	80	Open-ILS/src/sql/Pg/t/regress/lp957466_update_date_and_source.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/regress/lp1447746_update_date_and_source.pg
+ delete mode 100644 Open-ILS/src/sql/Pg/t/regress/lp957466_update_date_and_source.pg
+
+commit 2f024d424fefe801aafaf9f9b2debab0c6b74483
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu May 19 14:28:11 2016 -0400
+
+    LP#1554714 Add explicit phantomjs-prebuilt dependency
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlcstaff.org>
+
+1	0	Open-ILS/web/js/ui/default/staff/package.json
+
+commit 3e614940ad2fbdb6ec88e96b580ca7437e044410
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu May 19 16:25:12 2016 -0400
+
+    LP#1554714 Ang. 2.5 hotkeys plugin update
+    
+    As with other dependencies, the hotkeys package name changed since the
+    last update.  It's now cfp-angular-hotkeys
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlcstaff.org>
+
+2	2	Open-ILS/web/js/ui/default/staff/bower.json
+
+commit 670a9115b9aaad5570f1f7143d630f0c985537e6
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Thu May 12 16:49:11 2016 -0400
+
+    LP#1447746 Stamping upgrade script for update-bib-source flag in Vandelay
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+74	0	Open-ILS/src/sql/Pg/upgrade/0980.schema.merge.overlay_control.sql
+0	74	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.merge_overlay_control.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0980.schema.merge.overlay_control.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.merge_overlay_control.sql
+
+commit 651020ea6ceb732bc4ac743075bf0080c10ae39f
+Author: Dan Pearl <dpearl at cwmars.org>
+Date:   Thu Feb 4 12:46:46 2016 -0500
+
+    LP#1447746: Do not update bib source on match-only merge
+    
+    This adds a flag to control the updating of the bib source on a vandelay operation.
+    
+    Signed-off-by: Dan Pearl <dpearl at cwmars.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	0	Open-ILS/examples/fm_IDL.xml
+24	18	Open-ILS/src/sql/Pg/012.schema.vandelay.sql
+4	4	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+14	0	Open-ILS/src/sql/Pg/t/lp1447746_import_flag.pg
+74	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.merge_overlay_control.sql
+1	1	Open-ILS/src/templates/vandelay/inc/profiles.tt2
+15	0	docs/RELEASE_NOTES_NEXT/Cataloging/marc_bib_update.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1447746_import_flag.pg
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.merge_overlay_control.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/marc_bib_update.adoc
+
+commit 0f0f6c13effb05c0fb88a5485b615b57d0acc9f6
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Mon May 9 17:03:20 2016 -0400
+
+    release notes for 2.10.3
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+29	1	docs/RELEASE_NOTES_2_10.adoc
+
+commit 2cf65ef923145aade9a6ced615dfd29d4d6216b3
+Author: Ben Shum <ben at evergreener.net>
+Date:   Wed May 4 13:22:28 2016 -0400
+
+    LP#1551084: Add 16.04 version notes in server_upgrade doc
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+2	1	docs/installation/server_upgrade.txt
+
+commit ae4505cb7ae130906d8801b6ec726e052357eed9
+Author: Ben Shum <ben at evergreener.net>
+Date:   Tue Apr 19 10:36:39 2016 -0400
+
+    LP#1551084: Fixup typo for ubuntu-xenial-developer
+    
+    Jason spotted a typo. Can probably squash this in later.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+1	1	Open-ILS/src/extras/Makefile.install
+
+commit f811b197ab5381883961f38f1cf2a3e2d47f2e05
+Author: Ben Shum <ben at evergreener.net>
+Date:   Mon Feb 29 01:30:29 2016 -0500
+
+    LP#1551084: Update README to include references for 'ubuntu-xenial'
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+11	10	docs/installation/server_installation.txt
+
+commit 0605c1eb6d22a616773e6fba27a10e936a2c5d35
+Author: Ben Shum <ben at evergreener.net>
+Date:   Mon Feb 29 01:20:34 2016 -0500
+
+    LP#1551084: Start new Makefile target for 'ubuntu-xenial'
+    
+    For Ubuntu 16.04, let's start a new Makefile target for 'ubuntu-xenial'
+    
+    For major changes, the packaged version of PostgreSQL that ships with
+    Ubuntu 16.04 is PostgreSQL 9.5.
+    
+    Also, during the configure step, the build process looks for libpcre3-dev,
+    so we add that as an additional prerequisite now.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+11	1	Open-ILS/src/extras/Makefile.install
+156	0	Open-ILS/src/extras/install/Makefile.ubuntu-xenial
+ create mode 100644 Open-ILS/src/extras/install/Makefile.ubuntu-xenial
+
+commit 233e14df23361ef2e14e086be57d584ecb3eaca4
+Author: Ben Shum <ben at evergreener.net>
+Date:   Mon Feb 29 01:14:38 2016 -0500
+
+    LP#1551084: Symlink for 000.english.pg95.fts-config.sql
+    
+    We need this so that the eg_db_config script can make the Evergreen
+    database with PostgreSQL 9.5 systems.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+1	0	Open-ILS/src/sql/Pg/000.english.pg95.fts-config.sql
+ create mode 120000 Open-ILS/src/sql/Pg/000.english.pg95.fts-config.sql
+
+commit 463f5358841f1ec668290ad598dc0e83b9e8fc90
+Author: Ben Shum <ben at evergreener.net>
+Date:   Wed May 4 12:59:01 2016 -0400
+
+    LP#1568046: Stamping upgrade script for changes to permission.grp_ancestors
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+62	0	Open-ILS/src/sql/Pg/upgrade/0979.function.grp-tree-functions-via-cte.sql
+0	60	Open-ILS/src/sql/Pg/upgrade/XXXX.function.grp-tree-functions-via-cte.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0979.function.grp-tree-functions-via-cte.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.grp-tree-functions-via-cte.sql
+
+commit 5a4a6518b5ba10ab3b14bc0bd9530d47096fb29c
+Author: Jason Stephenson <jstephenson at mvlcstaff.org>
+Date:   Fri Apr 8 15:30:32 2016 -0400
+
+    LP#1568046: Fix some mistakes in previous commit.
+    
+    Looks like a few thinkos crept in from it being dashed off in a hurry.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlcstaff.org>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+8	8	Open-ILS/src/sql/Pg/006.schema.permissions.sql
+8	8	Open-ILS/src/sql/Pg/upgrade/XXXX.function.grp-tree-functions-via-cte.sql
+
+commit 452c4de9ed109717b216154fccd031aeb6e02007
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Apr 8 14:49:10 2016 -0400
+
+    LP#1568046: Use CTE instead of connectby for group tree queries
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlcstaff.org>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+48	11	Open-ILS/src/sql/Pg/006.schema.permissions.sql
+60	0	Open-ILS/src/sql/Pg/upgrade/XXXX.function.grp-tree-functions-via-cte.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.grp-tree-functions-via-cte.sql
+
+commit e6f79f6abe4ae4943c29cdf1c823f8e3d1f21c37
+Author: Jason Stephenson <jstephenson at mvlcstaff.org>
+Date:   Fri Apr 29 07:48:44 2016 -0400
+
+    Add entries to .mailmap.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlcstaff.org>
+
+3	0	.mailmap
+
+commit 2026b4bb6716d8c2ce34f21fbc007294d52e3e5e
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Tue Mar 15 11:59:44 2016 -0700
+
+    LP1494346: Docs syntax error
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+2	2	docs/cataloging/physical_char_wizard.txt
+
+commit b51c2799600c2e154591e41b657a61c306bcd35b
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Tue Mar 15 11:36:01 2016 -0700
+
+    Adding more information about authorities+Vandelay
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+6	1	docs/cataloging/authorities.txt
+
+commit 8c1035bbd5821cd5b183a0aff895f48d6829bd80
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Apr 20 11:20:36 2016 -0400
+
+    LP#1554714: update to latest Collapse attribute
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/cat/share/t_marcedit.tt2
+
+commit a07656a4f6fda9c50d6b8acc0e4774506bc659bf
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Apr 20 11:11:47 2016 -0400
+
+    LP#1554714: final $modal => $uibModal
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+22	22	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 87debaaadab41bb05d7a494f7ff1316452c70a48
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Apr 20 11:07:43 2016 -0400
+
+    LP#1554714: more drop-down fixes
+    
+    Should be the last of them.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+3	3	Open-ILS/src/templates/staff/cat/bucket/copy/t_bucket_selector.tt2
+3	3	Open-ILS/src/templates/staff/cat/bucket/record/t_bucket_selector.tt2
+3	3	Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
+3	3	Open-ILS/src/templates/staff/cat/item/index.tt2
+6	6	Open-ILS/src/templates/staff/cat/share/t_physchar_wizard.tt2
+
+commit c70a1988ed2be80559d1f79b420d60180afeb4f5
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Apr 20 11:03:06 2016 -0400
+
+    LP#1554714: specify resolution to make angular-animate happy
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+3	0	Open-ILS/web/js/ui/default/staff/bower.json
+
+commit f64cb46b636d175fb5d2ea9ec5420ef7d29160b7
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Apr 20 10:50:27 2016 -0400
+
+    LP#1554714: fix up more drop-down menus
+    
+    This patch intentionally doesn't change templates
+    under cat/; that will come later.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+3	3	Open-ILS/src/templates/staff/admin/local/circ/age_to_lost.tt2
+3	3	Open-ILS/src/templates/staff/admin/workstation/t_print_config.tt2
+3	3	Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2
+3	3	Open-ILS/src/templates/staff/circ/in_house_use/index.tt2
+3	3	Open-ILS/src/templates/staff/circ/patron/index.tt2
+3	3	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+12	12	Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+3	3	Open-ILS/src/templates/staff/circ/patron/t_patron_groups_dialog.tt2
+3	3	Open-ILS/src/templates/staff/circ/patron/t_search.tt2
+15	15	Open-ILS/src/templates/staff/share/t_autogrid.tt2
+
+commit 0705bc6051840c6b8783b52ea8246b0790eb79fb
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Apr 20 10:19:40 2016 -0400
+
+    LP#1554714: (indirectly) bump up PhantomJS version
+    
+    It turns out that PhantomJS 2 or later is required for
+    angular-mocks to succesfully inject dependencies; this patch
+    updates karma-phantomjs-launcher to a version that will
+    bring in a recent-enough version of PhantomJS.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/web/js/ui/default/staff/package.json
+
+commit d7c5cd3dcf5abca7b7c2bc46ccf808bcfd135419
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Apr 14 10:36:13 2016 -0400
+
+    LP#1554714 Ang 1.5 org unit dropdown repair
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+3	3	Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit e0c30a7bd6d05fe9b3e263095838739d5d8af8c0
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Apr 14 10:19:24 2016 -0400
+
+    LP#1554714 ng-date-input -> eg-date-input typo
+    
+    We're using eg-date-input, not ng-date-input.
+    
+    Thanks to Mike Rylander for pointing this out.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+1	1	Open-ILS/src/templates/staff/circ/share/t_hold_dates.tt2
+
+commit 0d31cec39723e90643f09d69a278a4e17350c5a9
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Mar 17 10:26:42 2016 -0400
+
+    LP#1554714 Ang. 1.5 navbar menu repairs
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+21	29	Open-ILS/src/templates/staff/navbar.tt2
+
+commit 10f15b04854296c78b35224af1784cced716916a
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Mar 16 18:10:12 2016 -0400
+
+    LP#1554714 Ang 1.5 requires service to return an object
+    
+    Return a {} from the dummy patronSvc service used by the standalone
+    patron editor.  Ang 1.5 requires services to return non-null.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+1	1	Open-ILS/web/js/ui/default/staff/circ/patron/register.js
+
+commit f9b0b5a7fd0424a5c63cfa545749134d8d91b538
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Mar 16 18:09:51 2016 -0400
+
+    LP#1554714 eg-date-input relays ng-blur
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+3	1	Open-ILS/src/templates/staff/share/t_datetime.tt2
+1	0	Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit 2c20d1ce06dd7636e0fae03f1da9faefd494e830
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Mar 10 13:08:00 2016 -0500
+
+    LP#1554714 Migrate eg-date-input to ui-datepicker-popup
+    
+    Also add support for uib-timepicker as an option secondary component of
+    the input.
+    
+    Refactor existing use of eg-date-input to use <eg-date-input/>-style
+    declaration to better differentiate between a normal <input> and the
+    more complete/stylized date input div.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+1	0	Open-ILS/src/templates/staff/base_js.tt2
+1	2	Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2
+22	11	Open-ILS/src/templates/staff/circ/patron/t_bill_history.tt2
+1	2	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+8	10	Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+3	3	Open-ILS/src/templates/staff/circ/patron/t_edit_due_date_dialog.tt2
+12	7	Open-ILS/src/templates/staff/circ/patron/t_messages.tt2
+1	2	Open-ILS/src/templates/staff/circ/patron/t_renew_with_date_dialog.tt2
+1	1	Open-ILS/src/templates/staff/circ/renew/t_renew.tt2
+1	2	Open-ILS/src/templates/staff/circ/share/t_backdate_dialog.tt2
+11	7	Open-ILS/src/templates/staff/circ/share/t_hold_dates.tt2
+3	2	Open-ILS/src/templates/staff/circ/share/t_mark_claims_returned_dialog.tt2
+38	0	Open-ILS/src/templates/staff/share/t_datetime.tt2
+20	35	Open-ILS/web/js/ui/default/staff/services/ui.js
+ create mode 100644 Open-ILS/src/templates/staff/share/t_datetime.tt2
+
+commit 9643e60d45a84a8562b8228b3d1d14ac0a93a25e
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Mar 9 14:00:27 2016 -0500
+
+    LP#1554714 Patron reg DoB via datepicker
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+4	1	Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+
+commit 636812ad7cba1f3aca1a5038485c4d4a91736844
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Mar 9 14:01:31 2016 -0500
+
+    LP#1554714 Patron reg DoB parse month bug repair
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+1	1	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit 34f53d9225556ec4553e5ddc4c5ed6fd09bd7b72
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Mar 9 08:38:41 2016 -0500
+
+    LP#1554714 Patron reg 1.5 controller consolidation
+    
+    Angular 1.4+ requires that each controller be instantiated via the
+    module.controller() function.  No more global functions.  The patron
+    reg. controller, shared by 2 different modules, was defined as a global
+    function.  Resolve this by hanging it off the core module (when loaded).
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+7	8	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+0	1	Open-ILS/web/js/ui/default/staff/circ/patron/register.js
+
+commit 31dc20a3bdc4e0debe69ff41be8bed1a2ab8d410
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Mar 8 16:12:48 2016 -0500
+
+    LP#1554714 angular-bootstrap 1.4 uibModal migration
+    
+    angular-bootstrap's $modal module is now known as $uibModal.  Ditto
+    $uibModalInstance.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+25	25	Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js
+36	36	Open-ILS/web/js/ui/default/staff/cat/bucket/record/app.js
+37	37	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+6	6	Open-ILS/web/js/ui/default/staff/cat/services/holdings.js
+19	19	Open-ILS/web/js/ui/default/staff/cat/services/marcedit.js
+7	7	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+22	22	Open-ILS/web/js/ui/default/staff/cat/z3950/app.js
+16	16	Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+2	4	Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
+2	2	Open-ILS/web/js/ui/default/staff/circ/patron/checkout.js
+12	12	Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+13	15	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+7	7	Open-ILS/web/js/ui/default/staff/circ/services/billing.js
+62	62	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+44	44	Open-ILS/web/js/ui/default/staff/circ/services/holds.js
+20	20	Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit 43e7bc4fb44f46fc6374fb626e01004fcdf2d950
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Mar 8 16:01:15 2016 -0500
+
+    LP#1554714 Browser client dependency updates note
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+20	0	Open-ILS/web/js/ui/default/staff/README.install
+
+commit 2b67c0ddf140b1667a3f0eff73af839740bd8302
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Mar 8 15:58:33 2016 -0500
+
+    LP#1554714 Angular 1.5 + deps bower.json updates
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+9	11	Open-ILS/web/js/ui/default/staff/bower.json
+
+commit 4db8e49cf355eb03f353041bc3679dab935bd9f4
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Thu Apr 21 23:29:42 2016 -0400
+
+    LP#1573372: Opt-in test broken because it uses bail-out.
+    
+    Use skip instead!
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+115	116	Open-ILS/src/perlmods/live_t/15-lp1533329-opt-in.t
+
+commit 9ed71b6bb17b9c15b700b48999d9014168deff63
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Thu Apr 21 23:00:09 2016 -0400
+
+    LP#1573364: Use a timezone in the future backdate checkin test.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	1	Open-ILS/src/perlmods/live_t/11-lp1481036-future-backdate.t
+
+commit ffd11aefdca6c119ab2bba456ef1f2fa778e2ee3
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Sat Mar 26 20:16:34 2016 -0400
+
+    LP 1562426: Renumber Perl live_t tests.
+    
+    We had some overlap in numbers at the beginning of test file names.
+    The OCD in me think this should be straightened out.  This branch
+    renumbers the duplicates starting with 10-.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+0	36	Open-ILS/src/perlmods/live_t/10-lp1481036-future-backdate.t
+0	38	Open-ILS/src/perlmods/live_t/10-lp1484989_dont_close_fined_xacts.t
+0	43	Open-ILS/src/perlmods/live_t/11-lp1240119-safe-token-activity.t
+36	0	Open-ILS/src/perlmods/live_t/11-lp1481036-future-backdate.t
+38	0	Open-ILS/src/perlmods/live_t/12-lp1484989_dont_close_fined_xacts.t
+0	252	Open-ILS/src/perlmods/live_t/12-lp1499123_csp_ignore_proximity.t
+0	174	Open-ILS/src/perlmods/live_t/12-lp1533329-opt-in.t
+0	88	Open-ILS/src/perlmods/live_t/13-acq-invoicing.t
+43	0	Open-ILS/src/perlmods/live_t/13-lp1240119-safe-token-activity.t
+252	0	Open-ILS/src/perlmods/live_t/14-lp1499123_csp_ignore_proximity.t
+174	0	Open-ILS/src/perlmods/live_t/15-lp1533329-opt-in.t
+88	0	Open-ILS/src/perlmods/live_t/16-acq-invoicing.t
+ delete mode 100644 Open-ILS/src/perlmods/live_t/10-lp1481036-future-backdate.t
+ delete mode 100644 Open-ILS/src/perlmods/live_t/10-lp1484989_dont_close_fined_xacts.t
+ delete mode 100644 Open-ILS/src/perlmods/live_t/11-lp1240119-safe-token-activity.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/11-lp1481036-future-backdate.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/12-lp1484989_dont_close_fined_xacts.t
+ delete mode 100644 Open-ILS/src/perlmods/live_t/12-lp1499123_csp_ignore_proximity.t
+ delete mode 100644 Open-ILS/src/perlmods/live_t/12-lp1533329-opt-in.t
+ delete mode 100644 Open-ILS/src/perlmods/live_t/13-acq-invoicing.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/13-lp1240119-safe-token-activity.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/14-lp1499123_csp_ignore_proximity.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/15-lp1533329-opt-in.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/16-acq-invoicing.t
+
+commit 7212b5074df1cda1af1aef2ec6a7aa600c3c6c04
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Thu Mar 31 16:50:51 2016 -0400
+
+    LP#1570091: webstaff: fix typo
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+
+commit 5435c0ec37d218ffeb59a5bc84b31d9a2f644af5
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Thu Mar 31 16:47:02 2016 -0400
+
+    LP#1570091: webstaff: fix transfer Volumes to Previously Marked Library
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+6	2	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+
+commit 15fa6be7eba1ed9f8968f99f890e8db0a517fd6c
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Mar 30 22:13:43 2016 -0400
+
+    LP#1570091: webstaff: isolate the scope of eg-status-bar
+    
+    The messages array was fighting with ngToast's
+    messages array... and winning.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	1	Open-ILS/web/js/ui/default/staff/services/statusbar.js
+
+commit 66d120bdd8f10ac907a5654f4bf5f18a1d325d82
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Mar 30 17:25:06 2016 -0400
+
+    LP#1570091: webstaff: make use of ngToast for holdings action notifications
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+14	0	Open-ILS/src/templates/staff/cat/catalog/index.tt2
+20	3	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+
+commit 05a95958d49e6b9fdbd2d817e8261d9e1a57bb58
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Mar 30 17:24:32 2016 -0400
+
+    LP#1570091: webstaff: fix deps for ngToast, and put it in place gloablly
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	0	Open-ILS/src/templates/staff/base.tt2
+2	0	Open-ILS/src/templates/staff/base_js.tt2
+6	0	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+2	1	Open-ILS/web/js/ui/default/staff/bower.json
+
+commit c309391a11a21db0b55444ddc35c4bdefbc5138f
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Mar 30 13:32:23 2016 -0400
+
+    LP#1570091: webstaff: add tree control and a simple toaster for notifications
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+4	0	Open-ILS/src/templates/staff/base.tt2
+2	0	Open-ILS/src/templates/staff/base_js.tt2
+14	2	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+3	1	Open-ILS/web/js/ui/default/staff/bower.json
+
+commit b7e42d60141bdf73d104017e6ead3509d73088a9
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Mar 25 16:30:02 2016 -0400
+
+    LP#1570091: webstaff: always check for duplciate barcodes
+    
+    ... and disallow saving if critical data is missing
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+4	4	Open-ILS/src/templates/staff/cat/volcopy/t_edit.tt2
+1	1	Open-ILS/src/templates/staff/share/t_autogrid.tt2
+31	10	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 5001213edf127746fdcc9307c5bde5ea18c82da8
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Mar 25 13:52:54 2016 -0400
+
+    LP#1539084: webstaff: sort column picker entries by class path and column labels
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    
+    Conflicts:
+    	Open-ILS/web/js/ui/default/staff/services/grid.js
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+26	12	Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit 3a1efa015770a67b5726d922611c5d8f91560414
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Mar 4 12:34:27 2016 -0500
+
+    LP#1570091: webstaff: make the vandelay page taller
+    
+    ... to support extra-large queue inspection interfaces
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/web/js/ui/default/staff/services/eframe.js
+
+commit fc007e72a960d93bac7ed514a9bc4f1b8d525240
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Mar 4 12:14:07 2016 -0500
+
+    LP#1570091: webstaff: Add Cancel Transit action to item status
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+9	7	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+9	0	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 3b311dfb1d6742880d17b479cf28552165e35d06
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Mar 3 14:12:37 2016 -0500
+
+    LP#1570091: webstaff: indicate warning/error conditions in volcopy editor
+    
+    Indicate when the user has an empty barcode, duplicate barcode,
+    or empty call number label.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+3	0	Open-ILS/src/templates/staff/cat/volcopy/t_edit.tt2
+38	2	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 84e988e9684f4a445a820afcb5f8933bb7796f5f
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Mar 3 12:13:08 2016 -0500
+
+    LP#1570091: webstaff: adding item status actions
+    
+      - add items to bucket
+      - request items
+      - Link as Conjoined to Previously Marked Bib Record
+      - Delete Copies
+      - Check In Copies
+      - Renew Copies
+      - Show Triggered Events
+      - Show Item Holds
+      - Show Record Holds
+      - Mark Item As Damaged
+      - Mark Item as Missing
+      - Add Copies
+      - Add Volumes and Copies
+      - Edit Volumes
+      - Edit Copies
+      - Edit Volumes and Copies
+      - Replace Barcodes
+      - Transfer Items to Previously Marked Library
+      - Transfer Items to Previously Marked Volume
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+20	0	Open-ILS/src/templates/staff/cat/item/index.tt2
+44	0	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+567	3	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 1f0af17da634454c59ca62af07db95db212fcbe5
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Feb 24 11:32:50 2016 -0500
+
+    LP#1570091: webstaff: fix handling of default copy status
+    
+    The status must be an int, so we cast it when coming from an YAOUS
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+3	2	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 4d4807e49c3f2f18f7ec1340182193a5c50deab3
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Feb 24 11:02:42 2016 -0500
+
+    LP#1570091: Show (index / hit count) in the Back To Results button
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    
+    Conflicts:
+    	Open-ILS/src/templates/opac/parts/record/navigation.tt2
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+5	0	Open-ILS/src/templates/opac/parts/record/navigation.tt2
+1	1	Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
+19	0	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+
+commit 275d24ece6f3d722c9c8f682ab0f79566590e603
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Feb 24 09:54:29 2016 -0500
+
+    LP#1570091: webstaff: tweak display of fixed fields in MARC editor
+    
+    - Add border to FF boxes
+    - align Source mnewmonic for the day that the seed data exists
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	2	Open-ILS/src/templates/staff/cat/share/t_marcedit.tt2
+4	0	Open-ILS/src/templates/staff/css/cat.css.tt2
+2	0	Open-ILS/web/js/ui/default/staff/cat/services/marcedit.js
+
+commit 24da1cc22d4dd029b2d888d0380854ac6209ad59
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Mon Mar 21 09:44:01 2016 -0400
+
+    clear slate of RELEASE_NOTES_NEXT entries
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+0	6	docs/RELEASE_NOTES_NEXT/Acquisitions/add_cancel_reason_85.adoc
+0	6	docs/RELEASE_NOTES_NEXT/Circulation/selfcheck_printing_fines.adoc
+0	5	docs/RELEASE_NOTES_NEXT/Circulation/selfcheck_printing_holds.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Acquisitions/add_cancel_reason_85.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/selfcheck_printing_fines.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/selfcheck_printing_holds.adoc
+
+commit 3559cd95e1bdc4012c05919e586e3b78eb23d8c8
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Thu Mar 17 17:25:14 2016 -0400
+
+    forward-port 2.10.0 release notes
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+1136	0	docs/RELEASE_NOTES_2_10.adoc
+ create mode 100644 docs/RELEASE_NOTES_2_10.adoc
+
+commit 0c131c677fdd4db27f70b3f50e28b6525d888468
+Author: Terran McCanna <tmccanna at georgialibraries.org>
+Date:   Mon Feb 29 17:45:43 2016 -0500
+
+    LP#1551451 Hide OPAC footer when viewed inside staff client
+    
+    This patch hides the contents of opac/parts/footer.tt2 if being
+    viewed in a 'staff' context.
+    
+    To test, view same OPAC pages through browser and through Staff Client.
+    
+    Signed-off-by: Terran McCanna <tmccanna at georgialibraries.org>
+    Signed-off-by: Erica Rohlfs <erohfls at esilibrary.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+2	0	Open-ILS/src/templates/opac/parts/footer.tt2
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
index d750216..fcdcb6c 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
@@ -7,7 +7,7 @@ use OpenILS::Utils::Fieldmapper;
 sub ils_version {
     # version format is "x-y-z", for example "2-0-0" for Evergreen 2.0.0
     # For branches, format is "x-y"
-    return "HEAD";
+    return "2-11-rc";
 }
 
 __PACKAGE__->register_method(
diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql
index 5db1ee3..f0776e1 100644
--- a/Open-ILS/src/sql/Pg/002.schema.config.sql
+++ b/Open-ILS/src/sql/Pg/002.schema.config.sql
@@ -92,6 +92,7 @@ CREATE TRIGGER no_overlapping_deps
     FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
 
 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('1000', :eg_version); -- bshum/dbwells
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.11.rc', :eg_version);
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,
diff --git a/Open-ILS/src/sql/Pg/version-upgrade/2.10.6-2.11.rc-upgrade-db.sql b/Open-ILS/src/sql/Pg/version-upgrade/2.10.6-2.11.rc-upgrade-db.sql
new file mode 100644
index 0000000..490f278
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/version-upgrade/2.10.6-2.11.rc-upgrade-db.sql
@@ -0,0 +1,3349 @@
+--Upgrade Script for 2.10.6 to 2.11.rc
+\set eg_version '''2.11.rc'''
+BEGIN;
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.11.rc', :eg_version);
+
+SELECT evergreen.upgrade_deps_block_check('0979', :eg_version);
+
+-- Replace connectby from the tablefunc extension with CTEs
+
+
+CREATE OR REPLACE FUNCTION permission.grp_ancestors( INT ) RETURNS SETOF permission.grp_tree AS $$
+    WITH RECURSIVE grp_ancestors_distance(id, distance) AS (
+            SELECT $1, 0
+        UNION
+            SELECT ou.parent, ouad.distance+1
+            FROM permission.grp_tree ou JOIN grp_ancestors_distance ouad ON (ou.id = ouad.id)
+            WHERE ou.parent IS NOT NULL
+    )
+    SELECT ou.* FROM permission.grp_tree ou JOIN grp_ancestors_distance ouad USING (id) ORDER BY ouad.distance DESC;
+$$ LANGUAGE SQL ROWS 1;
+
+-- Add a utility function to find descendant groups.
+
+CREATE OR REPLACE FUNCTION permission.grp_descendants( INT ) RETURNS SETOF permission.grp_tree AS $$
+    WITH RECURSIVE descendant_depth AS (
+        SELECT  gr.id,
+                gr.parent
+          FROM  permission.grp_tree gr
+          WHERE gr.id = $1
+            UNION ALL
+        SELECT  gr.id,
+                gr.parent
+          FROM  permission.grp_tree gr
+                JOIN descendant_depth dd ON (dd.id = gr.parent)
+    ) SELECT gr.* FROM permission.grp_tree gr JOIN descendant_depth USING (id);
+$$ LANGUAGE SQL ROWS 1;
+
+-- Add utility functions to work with permission groups as general tree-ish sets.
+
+CREATE OR REPLACE FUNCTION permission.grp_tree_full_path ( INT ) RETURNS SETOF permission.grp_tree AS $$
+        SELECT  *
+          FROM  permission.grp_ancestors($1)
+                        UNION
+        SELECT  *
+          FROM  permission.grp_descendants($1);
+$$ LANGUAGE SQL STABLE ROWS 1;
+
+CREATE OR REPLACE FUNCTION permission.grp_tree_combined_ancestors ( INT, INT ) RETURNS SETOF permission.grp_tree AS $$
+        SELECT  *
+          FROM  permission.grp_ancestors($1)
+                        UNION
+        SELECT  *
+          FROM  permission.grp_ancestors($2);
+$$ LANGUAGE SQL STABLE ROWS 1;
+
+CREATE OR REPLACE FUNCTION permission.grp_tree_common_ancestors ( INT, INT ) RETURNS SETOF permission.grp_tree AS $$
+        SELECT  *
+          FROM  permission.grp_ancestors($1)
+                        INTERSECT
+        SELECT  *
+          FROM  permission.grp_ancestors($2);
+$$ LANGUAGE SQL STABLE ROWS 1;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0980', :eg_version);
+
+ALTER TABLE vandelay.merge_profile ADD COLUMN update_bib_source BOOLEAN NOT NULL DEFAULT false;
+UPDATE vandelay.merge_profile SET update_bib_source = true WHERE id=2;
+
+CREATE OR REPLACE FUNCTION vandelay.overlay_bib_record ( import_id BIGINT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
+DECLARE
+    editor_string   TEXT;
+    editor_id       INT;
+    v_marc          TEXT;
+    v_bib_source    INT;
+    update_fields   TEXT[];
+    update_query    TEXT;
+    update_bib      BOOL;
+BEGIN
+
+    SELECT  q.marc, q.bib_source INTO v_marc, v_bib_source
+      FROM  vandelay.queued_bib_record q
+            JOIN vandelay.bib_match m ON (m.queued_record = q.id AND q.id = import_id)
+      LIMIT 1;
+
+    IF v_marc IS NULL THEN
+        -- RAISE NOTICE 'no marc for vandelay or bib record';
+        RETURN FALSE;
+    END IF;
+
+    IF vandelay.template_overlay_bib_record( v_marc, eg_id, merge_profile_id) THEN
+        UPDATE  vandelay.queued_bib_record
+          SET   imported_as = eg_id,
+                import_time = NOW()
+          WHERE id = import_id;
+
+	  SELECT q.update_bib_source INTO update_bib FROM vandelay.merge_profile q where q.id = merge_profile_id;
+
+          IF update_bib THEN
+		editor_string := (oils_xpath('//*[@tag="905"]/*[@code="u"]/text()',v_marc))[1];
+
+		IF editor_string IS NOT NULL AND editor_string <> '' THEN
+		    SELECT usr INTO editor_id FROM actor.card WHERE barcode = editor_string;
+
+		    IF editor_id IS NULL THEN
+			SELECT id INTO editor_id FROM actor.usr WHERE usrname = editor_string;
+		    END IF;
+
+		    IF editor_id IS NOT NULL THEN
+			--only update the edit date if we have a valid editor
+			update_fields := ARRAY_APPEND(update_fields, 'editor = ' || editor_id || ', edit_date = NOW()');
+		    END IF;
+		END IF;
+
+		IF v_bib_source IS NOT NULL THEN
+		    update_fields := ARRAY_APPEND(update_fields, 'source = ' || v_bib_source);
+		END IF;
+
+		IF ARRAY_LENGTH(update_fields, 1) > 0 THEN
+		    update_query := 'UPDATE biblio.record_entry SET ' || ARRAY_TO_STRING(update_fields, ',') || ' WHERE id = ' || eg_id || ';';
+		    --RAISE NOTICE 'query: %', update_query;
+		    EXECUTE update_query;
+		END IF;
+        END IF;
+
+        RETURN TRUE;
+    END IF;
+
+    -- RAISE NOTICE 'update of biblio.record_entry failed';
+
+    RETURN FALSE;
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+
+SELECT evergreen.upgrade_deps_block_check('0982', :eg_version);
+
+CREATE OR REPLACE FUNCTION permission.usr_has_perm_at_nd(
+	user_id    IN INTEGER,
+	perm_code  IN TEXT
+)
+RETURNS SETOF INTEGER AS $$
+--
+-- Return a set of all the org units for which a given user has a given
+-- permission, granted directly (not through inheritance from a parent
+-- org unit).
+--
+-- The permissions apply to a minimum depth of the org unit hierarchy,
+-- for the org unit(s) to which the user is assigned.  (They also apply
+-- to the subordinates of those org units, but we don't report the
+-- subordinates here.)
+--
+-- For purposes of this function, the permission.usr_work_ou_map table
+-- defines which users belong to which org units.  I.e. we ignore the
+-- home_ou column of actor.usr.
+--
+-- The result set may contain duplicates, which should be eliminated
+-- by a DISTINCT clause.
+--
+DECLARE
+	b_super       BOOLEAN;
+	n_perm        INTEGER;
+	n_min_depth   INTEGER; 
+	n_work_ou     INTEGER;
+	n_curr_ou     INTEGER;
+	n_depth       INTEGER;
+	n_curr_depth  INTEGER;
+BEGIN
+	--
+	-- Check for superuser
+	--
+	SELECT INTO b_super
+		super_user
+	FROM
+		actor.usr
+	WHERE
+		id = user_id;
+	--
+	IF NOT FOUND THEN
+		return;				-- No user?  No permissions.
+	ELSIF b_super THEN
+		--
+		-- Super user has all permissions everywhere
+		--
+		FOR n_work_ou IN
+			SELECT
+				id
+			FROM
+				actor.org_unit
+			WHERE
+				parent_ou IS NULL
+		LOOP
+			RETURN NEXT n_work_ou; 
+		END LOOP;
+		RETURN;
+	END IF;
+	--
+	-- Translate the permission name
+	-- to a numeric permission id
+	--
+	SELECT INTO n_perm
+		id
+	FROM
+		permission.perm_list
+	WHERE
+		code = perm_code;
+	--
+	IF NOT FOUND THEN
+		RETURN;               -- No such permission
+	END IF;
+	--
+	-- Find the highest-level org unit (i.e. the minimum depth)
+	-- to which the permission is applied for this user
+	--
+	-- This query is modified from the one in permission.usr_perms().
+	--
+	SELECT INTO n_min_depth
+		min( depth )
+	FROM	(
+		SELECT depth 
+		  FROM permission.usr_perm_map upm
+		 WHERE upm.usr = user_id 
+		   AND (upm.perm = n_perm OR upm.perm = -1)
+       				UNION
+		SELECT	gpm.depth
+		  FROM	permission.grp_perm_map gpm
+		  WHERE	(gpm.perm = n_perm OR gpm.perm = -1)
+	        AND gpm.grp IN (
+	 		   SELECT	(permission.grp_ancestors(
+					(SELECT profile FROM actor.usr WHERE id = user_id)
+				)).id
+			)
+       				UNION
+		SELECT	p.depth
+		  FROM	permission.grp_perm_map p 
+		  WHERE (p.perm = n_perm OR p.perm = -1)
+		    AND p.grp IN (
+		  		SELECT (permission.grp_ancestors(m.grp)).id 
+				FROM   permission.usr_grp_map m
+				WHERE  m.usr = user_id
+			)
+	) AS x;
+	--
+	IF NOT FOUND THEN
+		RETURN;                -- No such permission for this user
+	END IF;
+	--
+	-- Identify the org units to which the user is assigned.  Note that
+	-- we pay no attention to the home_ou column in actor.usr.
+	--
+	FOR n_work_ou IN
+		SELECT
+			work_ou
+		FROM
+			permission.usr_work_ou_map
+		WHERE
+			usr = user_id
+	LOOP            -- For each org unit to which the user is assigned
+		--
+		-- Determine the level of the org unit by a lookup in actor.org_unit_type.
+		-- We take it on faith that this depth agrees with the actual hierarchy
+		-- defined in actor.org_unit.
+		--
+		SELECT INTO n_depth
+		    type.depth
+		FROM
+		    actor.org_unit_type type
+		        INNER JOIN actor.org_unit ou
+		            ON ( ou.ou_type = type.id )
+		WHERE
+		    ou.id = n_work_ou;
+		--
+		IF NOT FOUND THEN
+			CONTINUE;        -- Maybe raise exception?
+		END IF;
+		--
+		-- Compare the depth of the work org unit to the
+		-- minimum depth, and branch accordingly
+		--
+		IF n_depth = n_min_depth THEN
+			--
+			-- The org unit is at the right depth, so return it.
+			--
+			RETURN NEXT n_work_ou;
+		ELSIF n_depth > n_min_depth THEN
+			--
+			-- Traverse the org unit tree toward the root,
+			-- until you reach the minimum depth determined above
+			--
+			n_curr_depth := n_depth;
+			n_curr_ou := n_work_ou;
+			WHILE n_curr_depth > n_min_depth LOOP
+				SELECT INTO n_curr_ou
+					parent_ou
+				FROM
+					actor.org_unit
+				WHERE
+					id = n_curr_ou;
+				--
+				IF FOUND THEN
+					n_curr_depth := n_curr_depth - 1;
+				ELSE
+					--
+					-- This can happen only if the hierarchy defined in
+					-- actor.org_unit is corrupted, or out of sync with
+					-- the depths defined in actor.org_unit_type.
+					-- Maybe we should raise an exception here, instead
+					-- of silently ignoring the problem.
+					--
+					n_curr_ou = NULL;
+					EXIT;
+				END IF;
+			END LOOP;
+			--
+			IF n_curr_ou IS NOT NULL THEN
+				RETURN NEXT n_curr_ou;
+			END IF;
+		ELSE
+			--
+			-- The permission applies only at a depth greater than the work org unit.
+			-- Use connectby() to find all dependent org units at the specified depth.
+			--
+			FOR n_curr_ou IN
+				SELECT id
+				FROM actor.org_unit_descendants_distance(n_work_ou)
+				WHERE
+					distance = n_min_depth - n_depth
+			LOOP
+				RETURN NEXT n_curr_ou;
+			END LOOP;
+		END IF;
+		--
+	END LOOP;
+	--
+	RETURN;
+	--
+END;
+$$ LANGUAGE 'plpgsql' ROWS 1;
+
+
+CREATE OR REPLACE FUNCTION permission.usr_has_perm_at_all_nd(
+	user_id    IN INTEGER,
+	perm_code  IN TEXT
+)
+RETURNS SETOF INTEGER AS $$
+--
+-- Return a set of all the org units for which a given user has a given
+-- permission, granted either directly or through inheritance from a parent
+-- org unit.
+--
+-- The permissions apply to a minimum depth of the org unit hierarchy, and
+-- to the subordinates of those org units, for the org unit(s) to which the
+-- user is assigned.
+--
+-- For purposes of this function, the permission.usr_work_ou_map table
+-- assigns users to org units.  I.e. we ignore the home_ou column of actor.usr.
+--
+-- The result set may contain duplicates, which should be eliminated
+-- by a DISTINCT clause.
+--
+DECLARE
+	n_head_ou     INTEGER;
+	n_child_ou    INTEGER;
+BEGIN
+	FOR n_head_ou IN
+		SELECT DISTINCT * FROM permission.usr_has_perm_at_nd( user_id, perm_code )
+	LOOP
+		--
+		-- The permission applies only at a depth greater than the work org unit.
+		--
+		FOR n_child_ou IN
+            SELECT id
+            FROM actor.org_unit_descendants(n_head_ou)
+		LOOP
+			RETURN NEXT n_child_ou;
+		END LOOP;
+	END LOOP;
+	--
+	RETURN;
+	--
+END;
+$$ LANGUAGE 'plpgsql' ROWS 1;
+
+
+\qecho The tablefunc database extension is no longer necessary for Evergreen.
+\qecho Unless you use some of its functions in your own scripts, you may
+\qecho want to run the following command in the database to drop it:
+\qecho DROP EXTENSION tablefunc;
+
+
+SELECT evergreen.upgrade_deps_block_check('0983', :eg_version);
+
+-- Create these so that the queries in the UDFs will validate
+CREATE TEMP TABLE precalc_filter_bib_list (
+    id  BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_bib_filter_bib_list (
+    id  BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_src_filter_bib_list (
+    id  BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_copy_filter_bib_list (
+    id  BIGINT,
+    copy  BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_circ_mod_filter_bib_list (
+    id  BIGINT,
+    copy  BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_location_filter_bib_list (
+    id  BIGINT,
+    copy  BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_attr_filter_bib_list (
+    id  BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_bibs_by_copy_list (
+    id  BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_bibs_by_uri_list (
+    id  BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_bibs_by_copy_or_uri_list (
+    id  BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_bib_list (
+    id  BIGINT
+) ON COMMIT DROP;
+
+-- rhrr needs to be a real table, so it can be fast. To that end, we use
+-- a materialized view updated via a trigger.
+
+DROP VIEW reporter.hold_request_record;
+
+CREATE TABLE reporter.hold_request_record  AS
+SELECT  id,
+        target,
+        hold_type,
+        CASE
+                WHEN hold_type = 'T'
+                        THEN target
+                WHEN hold_type = 'I'
+                        THEN (SELECT ssub.record_entry FROM serial.subscription ssub JOIN serial.issuance si ON (si.subscription = ssub.id) WHERE si.id = ahr.target)
+                WHEN hold_type = 'V'
+                        THEN (SELECT cn.record FROM asset.call_number cn WHERE cn.id = ahr.target)
+                WHEN hold_type IN ('C','R','F')
+                        THEN (SELECT cn.record FROM asset.call_number cn JOIN asset.copy cp ON (cn.id = cp.call_number) WHERE cp.id = ahr.target)
+                WHEN hold_type = 'M'
+                        THEN (SELECT mr.master_record FROM metabib.metarecord mr WHERE mr.id = ahr.target)
+                WHEN hold_type = 'P'
+                        THEN (SELECT bmp.record FROM biblio.monograph_part bmp WHERE bmp.id = ahr.target)
+        END AS bib_record
+  FROM  action.hold_request ahr;
+
+CREATE UNIQUE INDEX reporter_hold_request_record_pkey_idx ON reporter.hold_request_record (id);
+CREATE INDEX reporter_hold_request_record_bib_record_idx ON reporter.hold_request_record (bib_record);
+
+ALTER TABLE reporter.hold_request_record ADD PRIMARY KEY USING INDEX reporter_hold_request_record_pkey_idx;
+
+CREATE FUNCTION reporter.hold_request_record_mapper () RETURNS TRIGGER AS $$
+BEGIN
+    IF TG_OP = 'INSERT' THEN
+        INSERT INTO reporter.hold_request_record (id, target, hold_type, bib_record)
+        SELECT  NEW.id,
+                NEW.target,
+                NEW.hold_type,
+                CASE
+                    WHEN NEW.hold_type = 'T'
+                        THEN NEW.target
+                    WHEN NEW.hold_type = 'I'
+                        THEN (SELECT ssub.record_entry FROM serial.subscription ssub JOIN serial.issuance si ON (si.subscription = ssub.id) WHERE si.id = NEW.target)
+                    WHEN NEW.hold_type = 'V'
+                        THEN (SELECT cn.record FROM asset.call_number cn WHERE cn.id = NEW.target)
+                    WHEN NEW.hold_type IN ('C','R','F')
+                        THEN (SELECT cn.record FROM asset.call_number cn JOIN asset.copy cp ON (cn.id = cp.call_number) WHERE cp.id = NEW.target)
+                    WHEN NEW.hold_type = 'M'
+                        THEN (SELECT mr.master_record FROM metabib.metarecord mr WHERE mr.id = NEW.target)
+                    WHEN NEW.hold_type = 'P'
+                        THEN (SELECT bmp.record FROM biblio.monograph_part bmp WHERE bmp.id = NEW.target)
+                END AS bib_record;
+    ELSIF TG_OP = 'UPDATE' AND (OLD.target <> NEW.target OR OLD.hold_type <> NEW.hold_type) THEN
+        UPDATE  reporter.hold_request_record
+          SET   target = NEW.target,
+                hold_type = NEW.hold_type,
+                bib_record = CASE
+                    WHEN NEW.hold_type = 'T'
+                        THEN NEW.target
+                    WHEN NEW.hold_type = 'I'
+                        THEN (SELECT ssub.record_entry FROM serial.subscription ssub JOIN serial.issuance si ON (si.subscription = ssub.id) WHERE si.id = NEW.target)
+                    WHEN NEW.hold_type = 'V'
+                        THEN (SELECT cn.record FROM asset.call_number cn WHERE cn.id = NEW.target)
+                    WHEN NEW.hold_type IN ('C','R','F')
+                        THEN (SELECT cn.record FROM asset.call_number cn JOIN asset.copy cp ON (cn.id = cp.call_number) WHERE cp.id = NEW.target)
+                    WHEN NEW.hold_type = 'M'
+                        THEN (SELECT mr.master_record FROM metabib.metarecord mr WHERE mr.id = NEW.target)
+                    WHEN NEW.hold_type = 'P'
+                        THEN (SELECT bmp.record FROM biblio.monograph_part bmp WHERE bmp.id = NEW.target)
+                END;
+    END IF;
+    RETURN NEW;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER reporter_hold_request_record_trigger AFTER INSERT OR UPDATE ON action.hold_request
+    FOR EACH ROW EXECUTE PROCEDURE reporter.hold_request_record_mapper();
+
+CREATE SCHEMA rating;
+
+INSERT INTO config.global_flag (name, label, value, enabled) VALUES (
+    'opac.default_sort',
+    'OPAC Default Sort (titlesort, authorsort, pubdate, popularity, poprel, or empty for relevance)',
+    '',
+    TRUE
+);
+
+INSERT INTO config.global_flag (name, label, value, enabled) VALUES (
+    'search.max_popularity_importance_multiplier',
+    oils_i18n_gettext(
+        'search.max_popularity_importance_multiplier',
+        'Maximum popularity importance multiplier for popularity-adjusted relevance searches (decimal value between 1.0 and 2.0)',
+        'cgf',
+        'label'
+    ),
+    '1.1',
+    TRUE
+);
+
+CREATE TABLE rating.popularity_parameter (
+    id          INT     PRIMARY KEY,
+    name        TEXT    NOT NULL UNIQUE, -- i18n
+    description TEXT,
+    func        TEXT,
+    require_horizon     BOOL    NOT NULL DEFAULT FALSE,
+    require_importance  BOOL    NOT NULL DEFAULT FALSE,
+    require_percentile  BOOL    NOT NULL DEFAULT FALSE
+);
+
+INSERT INTO rating.popularity_parameter (id,name,func,require_horizon,require_importance,require_percentile) VALUES
+    (1,'Holds Filled Over Time','rating.holds_filled_over_time',TRUE,FALSE,TRUE),
+    (2,'Holds Requested Over Time','rating.holds_placed_over_time',TRUE,FALSE,TRUE),
+    (3,'Current Hold Count','rating.current_hold_count',FALSE,FALSE,TRUE),
+    (4,'Circulations Over Time','rating.circs_over_time',TRUE,FALSE,TRUE),
+    (5,'Current Circulation Count','rating.current_circ_count',FALSE,FALSE,TRUE),
+    (6,'Out/Total Ratio','rating.checked_out_total_ratio',FALSE,FALSE,TRUE),
+    (7,'Holds/Total Ratio','rating.holds_total_ratio',FALSE,FALSE,TRUE),
+    (8,'Holds/Holdable Ratio','rating.holds_holdable_ratio',FALSE,FALSE,TRUE),
+    (9,'Percent of Time Circulating','rating.percent_time_circulating',FALSE,FALSE,TRUE),
+    (10,'Bibliographic Record Age (days, newer is better)','rating.bib_record_age',FALSE,FALSE,TRUE),
+    (11,'Publication Age (days, newer is better)','rating.bib_pub_age',FALSE,FALSE,TRUE),
+    (12,'On-line Bib has attributes','rating.generic_fixed_rating_by_uri',FALSE,FALSE,FALSE),
+    (13,'Bib has attributes and copies','rating.generic_fixed_rating_by_copy',FALSE,FALSE,FALSE),
+    (14,'Bib has attributes and copies or URIs','rating.generic_fixed_rating_by_copy_or_uri',FALSE,FALSE,FALSE),
+    (15,'Bib has attributes','rating.generic_fixed_rating_global',FALSE,FALSE,FALSE);
+
+CREATE TABLE rating.badge (
+    id                      SERIAL      PRIMARY KEY,
+    name                    TEXT        NOT NULL,
+    description             TEXT,
+    scope                   INT         NOT NULL REFERENCES actor.org_unit (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    weight                  INT         NOT NULL DEFAULT 1,
+    horizon_age             INTERVAL,
+    importance_age          INTERVAL,
+    importance_interval     INTERVAL    NOT NULL DEFAULT '1 day',
+    importance_scale        NUMERIC     CHECK (importance_scale IS NULL OR importance_scale > 0.0),
+    recalc_interval         INTERVAL    NOT NULL DEFAULT '1 month',
+    attr_filter             TEXT,
+    src_filter              INT         REFERENCES config.bib_source (id) ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+    circ_mod_filter         TEXT        REFERENCES config.circ_modifier (code) ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+    loc_grp_filter          INT         REFERENCES asset.copy_location_group (id) ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+    popularity_parameter    INT         NOT NULL REFERENCES rating.popularity_parameter (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    fixed_rating            INT         CHECK (fixed_rating IS NULL OR fixed_rating BETWEEN -5 AND 5),
+    percentile              NUMERIC     CHECK (percentile IS NULL OR (percentile >= 50.0 AND percentile < 100.0)),
+    discard                 INT         NOT NULL DEFAULT 0, 
+    last_calc               TIMESTAMPTZ,
+    CONSTRAINT unique_name_scope UNIQUE (name,scope)
+);
+
+CREATE TABLE rating.record_badge_score (
+    id          BIGSERIAL   PRIMARY KEY,
+    record      BIGINT      NOT NULL REFERENCES biblio.record_entry (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    badge       INT         NOT NULL REFERENCES rating.badge (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    score       INT         NOT NULL CHECK (score BETWEEN -5 AND 5),
+    CONSTRAINT unique_record_badge UNIQUE (record,badge)
+);
+CREATE INDEX record_badge_score_badge_idx ON rating.record_badge_score (badge);
+CREATE INDEX record_badge_score_record_idx ON rating.record_badge_score (record);
+
+CREATE OR REPLACE VIEW rating.badge_with_orgs AS
+    WITH    org_scope AS (
+                SELECT  id,
+                        array_agg(tree) AS orgs
+                  FROM  (SELECT id,
+                                (actor.org_unit_descendants(id)).id AS tree
+                          FROM  actor.org_unit
+                        ) x
+                  GROUP BY 1
+            )
+    SELECT  b.*,
+            s.orgs
+      FROM  rating.badge b
+            JOIN org_scope s ON (b.scope = s.id);
+
+CREATE OR REPLACE FUNCTION rating.precalc_src_filter(src INT)
+    RETURNS INT AS $f$
+DECLARE
+    cnt     INT     := 0;
+BEGIN
+
+    SET LOCAL client_min_messages = error;
+    DROP TABLE IF EXISTS precalc_src_filter_bib_list;
+    IF src IS NOT NULL THEN
+        CREATE TEMP TABLE precalc_src_filter_bib_list ON COMMIT DROP AS
+            SELECT id FROM biblio.record_entry
+            WHERE source = src AND NOT deleted;
+    ELSE
+        CREATE TEMP TABLE precalc_src_filter_bib_list ON COMMIT DROP AS
+            SELECT id FROM biblio.record_entry
+            WHERE id > 0 AND NOT deleted;
+    END IF;
+
+    SELECT count(*) INTO cnt FROM precalc_src_filter_bib_list;
+    RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION rating.precalc_circ_mod_filter(cm TEXT)
+    RETURNS INT AS $f$
+DECLARE
+    cnt     INT     := 0;
+BEGIN
+
+    SET LOCAL client_min_messages = error;
+    DROP TABLE IF EXISTS precalc_circ_mod_filter_bib_list;
+    IF cm IS NOT NULL THEN
+        CREATE TEMP TABLE precalc_circ_mod_filter_bib_list ON COMMIT DROP AS
+            SELECT  cn.record AS id,
+                    cp.id AS copy
+              FROM  asset.call_number cn
+                    JOIN asset.copy cp ON (cn.id = cp.call_number)
+              WHERE cp.circ_modifier = cm
+                    AND NOT cp.deleted;
+    ELSE
+        CREATE TEMP TABLE precalc_circ_mod_filter_bib_list ON COMMIT DROP AS
+            SELECT  cn.record AS id,
+                    cp.id AS copy
+              FROM  asset.call_number cn
+                    JOIN asset.copy cp ON (cn.id = cp.call_number)
+              WHERE NOT cp.deleted;
+    END IF;
+
+    SELECT count(*) INTO cnt FROM precalc_circ_mod_filter_bib_list;
+    RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION rating.precalc_location_filter(loc INT)
+    RETURNS INT AS $f$
+DECLARE
+    cnt     INT     := 0;
+BEGIN
+
+    SET LOCAL client_min_messages = error;
+    DROP TABLE IF EXISTS precalc_location_filter_bib_list;
+    IF loc IS NOT NULL THEN
+        CREATE TEMP TABLE precalc_location_filter_bib_list ON COMMIT DROP AS
+            SELECT  cn.record AS id,
+                    cp.id AS copy
+              FROM  asset.call_number cn
+                    JOIN asset.copy cp ON (cn.id = cp.call_number)
+                    JOIN asset.copy_location_group_map lg ON (cp.location = lg.location)
+              WHERE lg.lgroup = loc
+                    AND NOT cp.deleted;
+    ELSE
+        CREATE TEMP TABLE precalc_location_filter_bib_list ON COMMIT DROP AS
+            SELECT  cn.record AS id,
+                    cp.id AS copy
+              FROM  asset.call_number cn
+                    JOIN asset.copy cp ON (cn.id = cp.call_number)
+              WHERE NOT cp.deleted;
+    END IF;
+
+    SELECT count(*) INTO cnt FROM precalc_location_filter_bib_list;
+    RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+-- all or limited...
+CREATE OR REPLACE FUNCTION rating.precalc_attr_filter(attr_filter TEXT)
+    RETURNS INT AS $f$
+DECLARE
+    cnt     INT := 0;
+    afilter TEXT;
+BEGIN
+
+    SET LOCAL client_min_messages = error;
+    DROP TABLE IF EXISTS precalc_attr_filter_bib_list;
+    IF attr_filter IS NOT NULL THEN
+        afilter := metabib.compile_composite_attr(attr_filter);
+        CREATE TEMP TABLE precalc_attr_filter_bib_list ON COMMIT DROP AS
+            SELECT source AS id FROM metabib.record_attr_vector_list
+            WHERE vlist @@ metabib.compile_composite_attr(attr_filter);
+    ELSE
+        CREATE TEMP TABLE precalc_attr_filter_bib_list ON COMMIT DROP AS
+            SELECT source AS id FROM metabib.record_attr_vector_list;
+    END IF;
+
+    SELECT count(*) INTO cnt FROM precalc_attr_filter_bib_list;
+    RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION rating.precalc_bibs_by_copy(badge_id INT)
+    RETURNS INT AS $f$
+DECLARE
+    cnt         INT     := 0;
+    badge_row   rating.badge_with_orgs%ROWTYPE;
+    base        TEXT;
+    whr         TEXT;
+BEGIN
+
+    SELECT * INTO badge_row FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    SET LOCAL client_min_messages = error;
+    DROP TABLE IF EXISTS precalc_bibs_by_copy_list;
+    CREATE TEMP TABLE precalc_bibs_by_copy_list ON COMMIT DROP AS
+        SELECT  DISTINCT cn.record AS id
+          FROM  asset.call_number cn
+                JOIN asset.copy cp ON (cp.call_number = cn.id AND NOT cp.deleted)
+                JOIN precalc_copy_filter_bib_list f ON (cp.id = f.copy)
+          WHERE cn.owning_lib = ANY (badge_row.orgs)
+                AND NOT cn.deleted;
+
+    SELECT count(*) INTO cnt FROM precalc_bibs_by_copy_list;
+    RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION rating.precalc_bibs_by_uri(badge_id INT)
+    RETURNS INT AS $f$
+DECLARE
+    cnt         INT     := 0;
+    badge_row   rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+    SELECT * INTO badge_row FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    SET LOCAL client_min_messages = error;
+    DROP TABLE IF EXISTS precalc_bibs_by_uri_list;
+    CREATE TEMP TABLE precalc_bibs_by_uri_list ON COMMIT DROP AS
+        SELECT  DISTINCT record AS id
+          FROM  asset.call_number cn
+                JOIN asset.uri_call_number_map urim ON (urim.call_number = cn.id)
+                JOIN asset.uri uri ON (urim.uri = uri.id AND uri.active)
+          WHERE cn.owning_lib = ANY (badge_row.orgs)
+                AND cn.label = '##URI##'
+                AND NOT cn.deleted;
+
+    SELECT count(*) INTO cnt FROM precalc_bibs_by_uri_list;
+    RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION rating.precalc_bibs_by_copy_or_uri(badge_id INT)
+    RETURNS INT AS $f$
+DECLARE
+    cnt         INT     := 0;
+BEGIN
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+    PERFORM rating.precalc_bibs_by_uri(badge_id);
+
+    SET LOCAL client_min_messages = error;
+    DROP TABLE IF EXISTS precalc_bibs_by_copy_or_uri_list;
+    CREATE TEMP TABLE precalc_bibs_by_copy_or_uri_list ON COMMIT DROP AS
+        SELECT id FROM precalc_bibs_by_copy_list
+            UNION
+        SELECT id FROM precalc_bibs_by_uri_list;
+
+    SELECT count(*) INTO cnt FROM precalc_bibs_by_copy_or_uri_list;
+    RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+
+CREATE OR REPLACE FUNCTION rating.recalculate_badge_score ( badge_id INT, setup_only BOOL DEFAULT FALSE ) RETURNS VOID AS $f$
+DECLARE
+    badge_row           rating.badge%ROWTYPE;
+    param           rating.popularity_parameter%ROWTYPE;
+BEGIN
+    SET LOCAL client_min_messages = error;
+
+    -- Find what we're doing    
+    SELECT * INTO badge_row FROM rating.badge WHERE id = badge_id;
+    SELECT * INTO param FROM rating.popularity_parameter WHERE id = badge_row.popularity_parameter;
+
+    -- Calculate the filtered bib set, or all bibs if none
+    PERFORM rating.precalc_attr_filter(badge_row.attr_filter);
+    PERFORM rating.precalc_src_filter(badge_row.src_filter);
+    PERFORM rating.precalc_circ_mod_filter(badge_row.circ_mod_filter);
+    PERFORM rating.precalc_location_filter(badge_row.loc_grp_filter);
+
+    -- Bring the bib-level filter lists together
+    DROP TABLE IF EXISTS precalc_bib_filter_bib_list;
+    CREATE TEMP TABLE precalc_bib_filter_bib_list ON COMMIT DROP AS
+        SELECT id FROM precalc_attr_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_src_filter_bib_list;
+
+    -- Bring the copy-level filter lists together. We're keeping this for bib_by_copy filtering later.
+    DROP TABLE IF EXISTS precalc_copy_filter_bib_list;
+    CREATE TEMP TABLE precalc_copy_filter_bib_list ON COMMIT DROP AS
+        SELECT id, copy FROM precalc_circ_mod_filter_bib_list
+            INTERSECT
+        SELECT id, copy FROM precalc_location_filter_bib_list;
+
+    -- Bring the collapsed filter lists together
+    DROP TABLE IF EXISTS precalc_filter_bib_list;
+    CREATE TEMP TABLE precalc_filter_bib_list ON COMMIT DROP AS
+        SELECT id FROM precalc_bib_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_copy_filter_bib_list;
+
+    CREATE INDEX precalc_filter_bib_list_idx
+        ON precalc_filter_bib_list (id);
+
+    IF setup_only THEN
+        RETURN;
+    END IF;
+
+    -- If it's a fixed-rating badge, just do it ...
+    IF badge_row.fixed_rating IS NOT NULL THEN
+        DELETE FROM rating.record_badge_score WHERE badge = badge_id;
+        EXECUTE $e$
+            INSERT INTO rating.record_badge_score (record, badge, score)
+                SELECT record, $1, $2 FROM $e$ || param.func || $e$($1)$e$
+        USING badge_id, badge_row.fixed_rating;
+
+        UPDATE rating.badge SET last_calc = NOW() WHERE id = badge_id;
+
+        RETURN;
+    END IF;
+    -- else, calculate!
+
+    -- Make a session-local scratchpad for calculating scores
+    CREATE TEMP TABLE record_score_scratchpad (
+        bib     BIGINT,
+        value   NUMERIC
+    ) ON COMMIT DROP;
+
+    -- Gather raw values
+    EXECUTE $e$
+        INSERT INTO record_score_scratchpad (bib, value)
+            SELECT * FROM $e$ || param.func || $e$($1)$e$
+    USING badge_id;
+
+    IF badge_row.discard > 0 OR badge_row.percentile IS NOT NULL THEN
+        -- To speed up discard-common
+        CREATE INDEX record_score_scratchpad_score_idx ON record_score_scratchpad (value);
+        ANALYZE record_score_scratchpad;
+    END IF;
+
+    IF badge_row.discard > 0 THEN -- Remove common low values (trim the long tail)
+        DELETE FROM record_score_scratchpad WHERE value IN (
+            SELECT DISTINCT value FROM record_score_scratchpad ORDER BY value LIMIT badge_row.discard
+        );
+    END IF;
+
+    IF badge_row.percentile IS NOT NULL THEN -- Cut population down to exceptional records
+        DELETE FROM record_score_scratchpad WHERE value <= (
+            SELECT value FROM (
+                SELECT  value,
+                        CUME_DIST() OVER (ORDER BY value) AS p
+                  FROM  record_score_scratchpad
+            ) x WHERE p < badge_row.percentile / 100.0 ORDER BY p DESC LIMIT 1
+        );
+    END IF;
+
+
+    -- And, finally, push new data in
+    DELETE FROM rating.record_badge_score WHERE badge = badge_id;
+    INSERT INTO rating.record_badge_score (badge, record, score)
+        SELECT  badge_id,
+                bib,
+                GREATEST(ROUND((CUME_DIST() OVER (ORDER BY value)) * 5), 1) AS value
+          FROM  record_score_scratchpad;
+
+    DROP TABLE record_score_scratchpad;
+
+    -- Now, finally-finally, mark the badge as recalculated
+    UPDATE rating.badge SET last_calc = NOW() WHERE id = badge_id;
+
+    RETURN;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION rating.holds_filled_over_time(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+    iage    INT     := 1;
+    iint    INT     := NULL;
+    iscale  NUMERIC := NULL;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    IF badge.horizon_age IS NULL THEN
+        RAISE EXCEPTION 'Badge "%" with id % requires a horizon age but has none.',
+            badge.name,
+            badge.id;
+    END IF;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    SET LOCAL client_min_messages = error;
+    DROP TABLE IF EXISTS precalc_bib_list;
+    CREATE TEMP TABLE precalc_bib_list ON COMMIT DROP AS
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list;
+
+    iint := EXTRACT(EPOCH FROM badge.importance_interval);
+    IF badge.importance_age IS NOT NULL THEN
+        iage := (EXTRACT(EPOCH FROM badge.importance_age) / iint)::INT;
+    END IF;
+
+    -- if iscale is smaller than 1, scaling slope will be shallow ... BEWARE!
+    iscale := COALESCE(badge.importance_scale, 1.0);
+
+    RETURN QUERY
+     SELECT bib,
+            SUM( holds * GREATEST( iscale * (iage - hage), 1.0 ))
+      FROM (
+         SELECT f.id AS bib,
+                (1 + EXTRACT(EPOCH FROM AGE(h.fulfillment_time)) / iint)::INT AS hage,
+                COUNT(h.id)::INT AS holds
+          FROM  action.hold_request h
+                JOIN reporter.hold_request_record rhrr ON (rhrr.id = h.id)
+                JOIN precalc_bib_list f ON (f.id = rhrr.bib_record)
+          WHERE h.fulfillment_time >= NOW() - badge.horizon_age
+                AND h.request_lib = ANY (badge.orgs)
+          GROUP BY 1, 2
+      ) x
+      GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.holds_placed_over_time(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+    iage    INT     := 1;
+    iint    INT     := NULL;
+    iscale  NUMERIC := NULL;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    IF badge.horizon_age IS NULL THEN
+        RAISE EXCEPTION 'Badge "%" with id % requires a horizon age but has none.',
+            badge.name,
+            badge.id;
+    END IF;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    SET LOCAL client_min_messages = error;
+    DROP TABLE IF EXISTS precalc_bib_list;
+    CREATE TEMP TABLE precalc_bib_list ON COMMIT DROP AS
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list;
+
+    iint := EXTRACT(EPOCH FROM badge.importance_interval);
+    IF badge.importance_age IS NOT NULL THEN
+        iage := (EXTRACT(EPOCH FROM badge.importance_age) / iint)::INT;
+    END IF;
+
+    -- if iscale is smaller than 1, scaling slope will be shallow ... BEWARE!
+    iscale := COALESCE(badge.importance_scale, 1.0);
+
+    RETURN QUERY
+     SELECT bib,
+            SUM( holds * GREATEST( iscale * (iage - hage), 1.0 ))
+      FROM (
+         SELECT f.id AS bib,
+                (1 + EXTRACT(EPOCH FROM AGE(h.request_time)) / iint)::INT AS hage,
+                COUNT(h.id)::INT AS holds
+          FROM  action.hold_request h
+                JOIN reporter.hold_request_record rhrr ON (rhrr.id = h.id)
+                JOIN precalc_bib_list f ON (f.id = rhrr.bib_record)
+          WHERE h.request_time >= NOW() - badge.horizon_age
+                AND h.request_lib = ANY (badge.orgs)
+          GROUP BY 1, 2
+      ) x
+      GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.current_hold_count(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list
+    );
+
+    ANALYZE precalc_copy_filter_bib_list;
+
+    RETURN QUERY
+     SELECT rhrr.bib_record AS bib,
+            COUNT(DISTINCT h.id)::NUMERIC AS holds
+      FROM  action.hold_request h
+            JOIN reporter.hold_request_record rhrr ON (rhrr.id = h.id)
+            JOIN action.hold_copy_map m ON (m.hold = h.id)
+            JOIN precalc_copy_filter_bib_list cf ON (rhrr.bib_record = cf.id AND m.target_copy = cf.copy)
+      WHERE h.fulfillment_time IS NULL
+            AND h.request_lib = ANY (badge.orgs)
+      GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.circs_over_time(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+    iage    INT     := 1;
+    iint    INT     := NULL;
+    iscale  NUMERIC := NULL;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    IF badge.horizon_age IS NULL THEN
+        RAISE EXCEPTION 'Badge "%" with id % requires a horizon age but has none.',
+            badge.name,
+            badge.id;
+    END IF;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list
+    );
+
+    ANALYZE precalc_copy_filter_bib_list;
+
+    iint := EXTRACT(EPOCH FROM badge.importance_interval);
+    IF badge.importance_age IS NOT NULL THEN
+        iage := (EXTRACT(EPOCH FROM badge.importance_age) / iint)::INT;
+    END IF;
+
+    -- if iscale is smaller than 1, scaling slope will be shallow ... BEWARE!
+    iscale := COALESCE(badge.importance_scale, 1.0);
+
+    RETURN QUERY
+     SELECT bib,
+            SUM( circs * GREATEST( iscale * (iage - cage), 1.0 ))
+      FROM (
+         SELECT cn.record AS bib,
+                (1 + EXTRACT(EPOCH FROM AGE(c.xact_start)) / iint)::INT AS cage,
+                COUNT(c.id)::INT AS circs
+          FROM  action.circulation c
+                JOIN precalc_copy_filter_bib_list cf ON (c.target_copy = cf.copy)
+                JOIN asset.copy cp ON (cp.id = c.target_copy)
+                JOIN asset.call_number cn ON (cn.id = cp.call_number)
+          WHERE c.xact_start >= NOW() - badge.horizon_age
+                AND cn.owning_lib = ANY (badge.orgs)
+                AND c.phone_renewal IS FALSE  -- we don't count renewals
+                AND c.desk_renewal IS FALSE
+                AND c.opac_renewal IS FALSE
+          GROUP BY 1, 2
+      ) x
+      GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.current_circ_count(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list
+    );
+
+    ANALYZE precalc_copy_filter_bib_list;
+
+    RETURN QUERY
+     SELECT cn.record AS bib,
+            COUNT(c.id)::NUMERIC AS circs
+      FROM  action.circulation c
+            JOIN precalc_copy_filter_bib_list cf ON (c.target_copy = cf.copy)
+            JOIN asset.copy cp ON (cp.id = c.target_copy)
+            JOIN asset.call_number cn ON (cn.id = cp.call_number)
+      WHERE c.checkin_time IS NULL
+            AND cn.owning_lib = ANY (badge.orgs)
+      GROUP BY 1;
+
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.checked_out_total_ratio(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list
+    );
+
+    ANALYZE precalc_copy_filter_bib_list;
+
+    RETURN QUERY
+     SELECT bib,
+            SUM(checked_out)::NUMERIC / SUM(total)::NUMERIC
+      FROM  (SELECT cn.record AS bib,
+                    (cp.status = 1)::INT AS checked_out,
+                    1 AS total
+              FROM  asset.copy cp
+                    JOIN precalc_copy_filter_bib_list c ON (cp.id = c.copy)
+                    JOIN asset.call_number cn ON (cn.id = cp.call_number)
+              WHERE cn.owning_lib = ANY (badge.orgs)
+            ) x
+      GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.holds_total_ratio(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list
+    );
+
+    ANALYZE precalc_copy_filter_bib_list;
+
+    RETURN QUERY
+     SELECT cn.record AS bib,
+            COUNT(DISTINCT m.hold)::NUMERIC / COUNT(DISTINCT cp.id)::NUMERIC
+      FROM  asset.copy cp
+            JOIN precalc_copy_filter_bib_list c ON (cp.id = c.copy)
+            JOIN asset.call_number cn ON (cn.id = cp.call_number)
+            JOIN action.hold_copy_map m ON (m.target_copy = cp.id)
+      WHERE cn.owning_lib = ANY (badge.orgs)
+      GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.holds_holdable_ratio(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list
+    );
+
+    ANALYZE precalc_copy_filter_bib_list;
+
+    RETURN QUERY
+     SELECT cn.record AS bib,
+            COUNT(DISTINCT m.hold)::NUMERIC / COUNT(DISTINCT cp.id)::NUMERIC
+      FROM  asset.copy cp
+            JOIN precalc_copy_filter_bib_list c ON (cp.id = c.copy)
+            JOIN asset.copy_location cl ON (cl.id = cp.location)
+            JOIN config.copy_status cs ON (cs.id = cp.status)
+            JOIN asset.call_number cn ON (cn.id = cp.call_number)
+            JOIN action.hold_copy_map m ON (m.target_copy = cp.id)
+      WHERE cn.owning_lib = ANY (badge.orgs)
+            AND cp.holdable IS TRUE
+            AND cl.holdable IS TRUE
+            AND cs.holdable IS TRUE
+      GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.bib_record_age(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    PERFORM rating.precalc_bibs_by_copy_or_uri(badge_id);
+
+    SET LOCAL client_min_messages = error;
+    DROP TABLE IF EXISTS precalc_bib_list;
+    CREATE TEMP TABLE precalc_bib_list ON COMMIT DROP AS
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_or_uri_list;
+
+    RETURN QUERY
+     SELECT b.id,
+            1.0 / EXTRACT(EPOCH FROM AGE(b.create_date))::NUMERIC + 1.0
+      FROM  precalc_bib_list pop
+            JOIN biblio.record_entry b ON (b.id = pop.id);
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.bib_pub_age(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    PERFORM rating.precalc_bibs_by_copy_or_uri(badge_id);
+
+    SET LOCAL client_min_messages = error;
+    DROP TABLE IF EXISTS precalc_bib_list;
+    CREATE TEMP TABLE precalc_bib_list ON COMMIT DROP AS
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_or_uri_list;
+
+    RETURN QUERY
+     SELECT pop.id AS bib,
+            s.value::NUMERIC
+      FROM  precalc_bib_list pop
+            JOIN metabib.record_sorter s ON (
+                s.source = pop.id
+                AND s.attr = 'pubdate'
+                AND s.value ~ '^\d+$'
+            )
+      WHERE s.value::INT <= EXTRACT(YEAR FROM NOW())::INT;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.percent_time_circulating(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list
+    );
+
+    ANALYZE precalc_copy_filter_bib_list;
+
+    RETURN QUERY
+     SELECT bib,
+            SUM(COALESCE(circ_time,0))::NUMERIC / SUM(age)::NUMERIC
+      FROM  (SELECT cn.record AS bib,
+                    cp.id,
+                    EXTRACT( EPOCH FROM AGE(cp.active_date) ) + 1 AS age,
+                    SUM(  -- time copy spent circulating
+                        EXTRACT(
+                            EPOCH FROM
+                            AGE(
+                                COALESCE(circ.checkin_time, circ.stop_fines_time, NOW()),
+                                circ.xact_start
+                            )
+                        )
+                    )::NUMERIC AS circ_time
+              FROM  asset.copy cp
+                    JOIN precalc_copy_filter_bib_list c ON (cp.id = c.copy)
+                    JOIN asset.call_number cn ON (cn.id = cp.call_number)
+                    LEFT JOIN action.all_circulation circ ON (
+                        circ.target_copy = cp.id
+                        AND stop_fines NOT IN (
+                            'LOST',
+                            'LONGOVERDUE',
+                            'CLAIMSRETURNED',
+                            'LONGOVERDUE'
+                        )
+                        AND NOT (
+                            checkin_time IS NULL AND
+                            stop_fines = 'MAXFINES'
+                        )
+                    )
+              WHERE cn.owning_lib = ANY (badge.orgs)
+                    AND cp.active_date IS NOT NULL
+                    -- Next line requires that copies with no circs (circ.id IS NULL) also not be deleted
+                    AND ((circ.id IS NULL AND NOT cp.deleted) OR circ.id IS NOT NULL)
+              GROUP BY 1,2,3
+            ) x
+      GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.generic_fixed_rating_by_copy(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+BEGIN
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+    RETURN QUERY
+        SELECT id, 1.0 FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id, 1.0 FROM precalc_bibs_by_copy_list;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.generic_fixed_rating_by_uri(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+BEGIN
+    PERFORM rating.precalc_bibs_by_uri(badge_id);
+    RETURN QUERY
+        SELECT id, 1.0 FROM precalc_bib_filter_bib_list
+            INTERSECT
+        SELECT id, 1.0 FROM precalc_bibs_by_uri_list;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.generic_fixed_rating_by_copy_or_uri(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+BEGIN
+    PERFORM rating.precalc_bibs_by_copy_or_uri(badge_id);
+    RETURN QUERY
+        (SELECT id, 1.0 FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id, 1.0 FROM precalc_bibs_by_copy_list)
+            UNION
+        (SELECT id, 1.0 FROM precalc_bib_filter_bib_list
+            INTERSECT
+        SELECT id, 1.0 FROM precalc_bibs_by_uri_list);
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.generic_fixed_rating_global(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+BEGIN
+    RETURN QUERY
+        SELECT id, 1.0 FROM precalc_bib_filter_bib_list;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE INDEX hold_fulfillment_time_idx ON action.hold_request (fulfillment_time) WHERE fulfillment_time IS NOT NULL;
+CREATE INDEX hold_request_time_idx ON action.hold_request (request_time);
+
+
+/*
+ * Copyright (C) 2016 Equinox Software, Inc.
+ * Mike Rylander <miker at esilibrary.com> 
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0984', :eg_version);
+
+ALTER TYPE search.search_result ADD ATTRIBUTE badges TEXT, ADD ATTRIBUTE popularity NUMERIC;
+
+CREATE OR REPLACE FUNCTION search.query_parser_fts (
+
+    param_search_ou INT,
+    param_depth     INT,
+    param_query     TEXT,
+    param_statuses  INT[],
+    param_locations INT[],
+    param_offset    INT,
+    param_check     INT,
+    param_limit     INT,
+    metarecord      BOOL,
+    staff           BOOL,
+    deleted_search  BOOL,
+    param_pref_ou   INT DEFAULT NULL
+) RETURNS SETOF search.search_result AS $func$
+DECLARE
+
+    current_res         search.search_result%ROWTYPE;
+    search_org_list     INT[];
+    luri_org_list       INT[];
+    tmp_int_list        INT[];
+
+    check_limit         INT;
+    core_limit          INT;
+    core_offset         INT;
+    tmp_int             INT;
+
+    core_result         RECORD;
+    core_cursor         REFCURSOR;
+    core_rel_query      TEXT;
+
+    total_count         INT := 0;
+    check_count         INT := 0;
+    deleted_count       INT := 0;
+    visible_count       INT := 0;
+    excluded_count      INT := 0;
+
+    luri_as_copy        BOOL;
+BEGIN
+
+    check_limit := COALESCE( param_check, 1000 );
+    core_limit  := COALESCE( param_limit, 25000 );
+    core_offset := COALESCE( param_offset, 0 );
+
+    SELECT COALESCE( enabled, FALSE ) INTO luri_as_copy FROM config.global_flag WHERE name = 'opac.located_uri.act_as_copy';
+
+    -- core_skip_chk := COALESCE( param_skip_chk, 1 );
+
+    IF param_search_ou > 0 THEN
+        IF param_depth IS NOT NULL THEN
+            SELECT ARRAY_AGG(distinct id) INTO search_org_list FROM actor.org_unit_descendants( param_search_ou, param_depth );
+        ELSE
+            SELECT ARRAY_AGG(distinct id) INTO search_org_list FROM actor.org_unit_descendants( param_search_ou );
+        END IF;
+
+        IF luri_as_copy THEN
+            SELECT ARRAY_AGG(distinct id) INTO luri_org_list FROM actor.org_unit_full_path( param_search_ou );
+        ELSE
+            SELECT ARRAY_AGG(distinct id) INTO luri_org_list FROM actor.org_unit_ancestors( param_search_ou );
+        END IF;
+
+    ELSIF param_search_ou < 0 THEN
+        SELECT ARRAY_AGG(distinct org_unit) INTO search_org_list FROM actor.org_lasso_map WHERE lasso = -param_search_ou;
+
+        FOR tmp_int IN SELECT * FROM UNNEST(search_org_list) LOOP
+
+            IF luri_as_copy THEN
+                SELECT ARRAY_AGG(distinct id) INTO tmp_int_list FROM actor.org_unit_full_path( tmp_int );
+            ELSE
+                SELECT ARRAY_AGG(distinct id) INTO tmp_int_list FROM actor.org_unit_ancestors( tmp_int );
+            END IF;
+
+            luri_org_list := luri_org_list || tmp_int_list;
+        END LOOP;
+
+        SELECT ARRAY_AGG(DISTINCT x.id) INTO luri_org_list FROM UNNEST(luri_org_list) x(id);
+
+    ELSIF param_search_ou = 0 THEN
+        -- reserved for user lassos (ou_buckets/type='lasso') with ID passed in depth ... hack? sure.
+    END IF;
+
+    IF param_pref_ou IS NOT NULL THEN
+            IF luri_as_copy THEN
+                SELECT ARRAY_AGG(distinct id) INTO tmp_int_list FROM actor.org_unit_full_path( param_pref_ou );
+            ELSE
+                SELECT ARRAY_AGG(distinct id) INTO tmp_int_list FROM actor.org_unit_ancestors( param_pref_ou );
+            END IF;
+
+        luri_org_list := luri_org_list || tmp_int_list;
+    END IF;
+
+    OPEN core_cursor FOR EXECUTE param_query;
+
+    LOOP
+
+        FETCH core_cursor INTO core_result;
+        EXIT WHEN NOT FOUND;
+        EXIT WHEN total_count >= core_limit;
+
+        total_count := total_count + 1;
+
+        CONTINUE WHEN total_count NOT BETWEEN  core_offset + 1 AND check_limit + core_offset;
+
+        check_count := check_count + 1;
+
+        IF NOT deleted_search THEN
+
+            PERFORM 1 FROM biblio.record_entry b WHERE NOT b.deleted AND b.id IN ( SELECT * FROM unnest( core_result.records ) );
+            IF NOT FOUND THEN
+                -- RAISE NOTICE ' % were all deleted ... ', core_result.records;
+                deleted_count := deleted_count + 1;
+                CONTINUE;
+            END IF;
+
+            PERFORM 1
+              FROM  biblio.record_entry b
+                    JOIN config.bib_source s ON (b.source = s.id)
+              WHERE s.transcendant
+                    AND b.id IN ( SELECT * FROM unnest( core_result.records ) );
+
+            IF FOUND THEN
+                -- RAISE NOTICE ' % were all transcendant ... ', core_result.records;
+                visible_count := visible_count + 1;
+
+                current_res.id = core_result.id;
+                current_res.rel = core_result.rel;
+                current_res.badges = core_result.badges;
+                current_res.popularity = core_result.popularity;
+
+                tmp_int := 1;
+                IF metarecord THEN
+                    SELECT COUNT(DISTINCT s.source) INTO tmp_int FROM metabib.metarecord_source_map s WHERE s.metarecord = core_result.id;
+                END IF;
+
+                IF tmp_int = 1 THEN
+                    current_res.record = core_result.records[1];
+                ELSE
+                    current_res.record = NULL;
+                END IF;
+
+                RETURN NEXT current_res;
+
+                CONTINUE;
+            END IF;
+
+            PERFORM 1
+              FROM  asset.call_number cn
+                    JOIN asset.uri_call_number_map map ON (map.call_number = cn.id)
+                    JOIN asset.uri uri ON (map.uri = uri.id)
+              WHERE NOT cn.deleted
+                    AND cn.label = '##URI##'
+                    AND uri.active
+                    AND ( param_locations IS NULL OR array_upper(param_locations, 1) IS NULL )
+                    AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
+                    AND cn.owning_lib IN ( SELECT * FROM unnest( luri_org_list ) )
+              LIMIT 1;
+
+            IF FOUND THEN
+                -- RAISE NOTICE ' % have at least one URI ... ', core_result.records;
+                visible_count := visible_count + 1;
+
+                current_res.id = core_result.id;
+                current_res.rel = core_result.rel;
+                current_res.badges = core_result.badges;
+                current_res.popularity = core_result.popularity;
+
+                tmp_int := 1;
+                IF metarecord THEN
+                    SELECT COUNT(DISTINCT s.source) INTO tmp_int FROM metabib.metarecord_source_map s WHERE s.metarecord = core_result.id;
+                END IF;
+
+                IF tmp_int = 1 THEN
+                    current_res.record = core_result.records[1];
+                ELSE
+                    current_res.record = NULL;
+                END IF;
+
+                RETURN NEXT current_res;
+
+                CONTINUE;
+            END IF;
+
+            IF param_statuses IS NOT NULL AND array_upper(param_statuses, 1) > 0 THEN
+
+                PERFORM 1
+                  FROM  asset.call_number cn
+                        JOIN asset.copy cp ON (cp.call_number = cn.id)
+                  WHERE NOT cn.deleted
+                        AND NOT cp.deleted
+                        AND cp.status IN ( SELECT * FROM unnest( param_statuses ) )
+                        AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
+                        AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+                  LIMIT 1;
+
+                IF NOT FOUND THEN
+                    PERFORM 1
+                      FROM  biblio.peer_bib_copy_map pr
+                            JOIN asset.copy cp ON (cp.id = pr.target_copy)
+                      WHERE NOT cp.deleted
+                            AND cp.status IN ( SELECT * FROM unnest( param_statuses ) )
+                            AND pr.peer_record IN ( SELECT * FROM unnest( core_result.records ) )
+                            AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+                      LIMIT 1;
+
+                    IF NOT FOUND THEN
+                    -- RAISE NOTICE ' % and multi-home linked records were all status-excluded ... ', core_result.records;
+                        excluded_count := excluded_count + 1;
+                        CONTINUE;
+                    END IF;
+                END IF;
+
+            END IF;
+
+            IF param_locations IS NOT NULL AND array_upper(param_locations, 1) > 0 THEN
+
+                PERFORM 1
+                  FROM  asset.call_number cn
+                        JOIN asset.copy cp ON (cp.call_number = cn.id)
+                  WHERE NOT cn.deleted
+                        AND NOT cp.deleted
+                        AND cp.location IN ( SELECT * FROM unnest( param_locations ) )
+                        AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
+                        AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+                  LIMIT 1;
+
+                IF NOT FOUND THEN
+                    PERFORM 1
+                      FROM  biblio.peer_bib_copy_map pr
+                            JOIN asset.copy cp ON (cp.id = pr.target_copy)
+                      WHERE NOT cp.deleted
+                            AND cp.location IN ( SELECT * FROM unnest( param_locations ) )
+                            AND pr.peer_record IN ( SELECT * FROM unnest( core_result.records ) )
+                            AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+                      LIMIT 1;
+
+                    IF NOT FOUND THEN
+                        -- RAISE NOTICE ' % and multi-home linked records were all copy_location-excluded ... ', core_result.records;
+                        excluded_count := excluded_count + 1;
+                        CONTINUE;
+                    END IF;
+                END IF;
+
+            END IF;
+
+            IF staff IS NULL OR NOT staff THEN
+
+                PERFORM 1
+                  FROM  asset.opac_visible_copies
+                  WHERE circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+                        AND record IN ( SELECT * FROM unnest( core_result.records ) )
+                  LIMIT 1;
+
+                IF NOT FOUND THEN
+                    PERFORM 1
+                      FROM  biblio.peer_bib_copy_map pr
+                            JOIN asset.opac_visible_copies cp ON (cp.copy_id = pr.target_copy)
+                      WHERE cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+                            AND pr.peer_record IN ( SELECT * FROM unnest( core_result.records ) )
+                      LIMIT 1;
+
+                    IF NOT FOUND THEN
+
+                        -- RAISE NOTICE ' % and multi-home linked records were all visibility-excluded ... ', core_result.records;
+                        excluded_count := excluded_count + 1;
+                        CONTINUE;
+                    END IF;
+                END IF;
+
+            ELSE
+
+                PERFORM 1
+                  FROM  asset.call_number cn
+                        JOIN asset.copy cp ON (cp.call_number = cn.id)
+                  WHERE NOT cn.deleted
+                        AND NOT cp.deleted
+                        AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+                        AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
+                  LIMIT 1;
+
+                IF NOT FOUND THEN
+
+                    PERFORM 1
+                      FROM  biblio.peer_bib_copy_map pr
+                            JOIN asset.copy cp ON (cp.id = pr.target_copy)
+                      WHERE NOT cp.deleted
+                            AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+                            AND pr.peer_record IN ( SELECT * FROM unnest( core_result.records ) )
+                      LIMIT 1;
+
+                    IF NOT FOUND THEN
+
+                        PERFORM 1
+                          FROM  asset.call_number cn
+                                JOIN asset.copy cp ON (cp.call_number = cn.id)
+                          WHERE cn.record IN ( SELECT * FROM unnest( core_result.records ) )
+                                AND NOT cp.deleted
+                          LIMIT 1;
+
+                        IF NOT FOUND THEN
+                            -- Recheck Located URI visibility in the case of no "foreign" copies
+                            PERFORM 1
+                              FROM  asset.call_number cn
+                                    JOIN asset.uri_call_number_map map ON (map.call_number = cn.id)
+                                    JOIN asset.uri uri ON (map.uri = uri.id)
+                              WHERE NOT cn.deleted
+                                    AND cn.label = '##URI##'
+                                    AND uri.active
+                                    AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
+                                    AND cn.owning_lib NOT IN ( SELECT * FROM unnest( luri_org_list ) )
+                              LIMIT 1;
+
+                            IF FOUND THEN
+                                -- RAISE NOTICE ' % were excluded for foreign located URIs... ', core_result.records;
+                                excluded_count := excluded_count + 1;
+                                CONTINUE;
+                            END IF;
+                        ELSE
+                            -- RAISE NOTICE ' % and multi-home linked records were all visibility-excluded ... ', core_result.records;
+                            excluded_count := excluded_count + 1;
+                            CONTINUE;
+                        END IF;
+                    END IF;
+
+                END IF;
+
+            END IF;
+
+        END IF;
+
+        visible_count := visible_count + 1;
+
+        current_res.id = core_result.id;
+        current_res.rel = core_result.rel;
+        current_res.badges = core_result.badges;
+        current_res.popularity = core_result.popularity;
+
+        tmp_int := 1;
+        IF metarecord THEN
+            SELECT COUNT(DISTINCT s.source) INTO tmp_int FROM metabib.metarecord_source_map s WHERE s.metarecord = core_result.id;
+        END IF;
+
+        IF tmp_int = 1 THEN
+            current_res.record = core_result.records[1];
+        ELSE
+            current_res.record = NULL;
+        END IF;
+
+        RETURN NEXT current_res;
+
+        IF visible_count % 1000 = 0 THEN
+            -- RAISE NOTICE ' % visible so far ... ', visible_count;
+        END IF;
+
+    END LOOP;
+
+    current_res.id = NULL;
+    current_res.rel = NULL;
+    current_res.record = NULL;
+    current_res.badges = NULL;
+    current_res.popularity = NULL;
+    current_res.total = total_count;
+    current_res.checked = check_count;
+    current_res.deleted = deleted_count;
+    current_res.visible = visible_count;
+    current_res.excluded = excluded_count;
+
+    CLOSE core_cursor;
+
+    RETURN NEXT current_res;
+
+END;
+$func$ LANGUAGE PLPGSQL;
+ 
+CREATE OR REPLACE FUNCTION metabib.staged_browse(
+    query                   TEXT,
+    fields                  INT[],
+    context_org             INT,
+    context_locations       INT[],
+    staff                   BOOL,
+    browse_superpage_size   INT,
+    count_up_from_zero      BOOL,   -- if false, count down from -1
+    result_limit            INT,
+    next_pivot_pos          INT
+) RETURNS SETOF metabib.flat_browse_entry_appearance AS $p$
+DECLARE
+    curs                    REFCURSOR;
+    rec                     RECORD;
+    qpfts_query             TEXT;
+    aqpfts_query            TEXT;
+    afields                 INT[];
+    bfields                 INT[];
+    result_row              metabib.flat_browse_entry_appearance%ROWTYPE;
+    results_skipped         INT := 0;
+    row_counter             INT := 0;
+    row_number              INT;
+    slice_start             INT;
+    slice_end               INT;
+    full_end                INT;
+    all_records             BIGINT[];
+    all_brecords             BIGINT[];
+    all_arecords            BIGINT[];
+    superpage_of_records    BIGINT[];
+    superpage_size          INT;
+BEGIN
+    IF count_up_from_zero THEN
+        row_number := 0;
+    ELSE
+        row_number := -1;
+    END IF;
+
+    OPEN curs FOR EXECUTE query;
+
+    LOOP
+        FETCH curs INTO rec;
+        IF NOT FOUND THEN
+            IF result_row.pivot_point IS NOT NULL THEN
+                RETURN NEXT result_row;
+            END IF;
+            RETURN;
+        END IF;
+
+
+        -- Gather aggregate data based on the MBE row we're looking at now, authority axis
+        SELECT INTO all_arecords, result_row.sees, afields
+                ARRAY_AGG(DISTINCT abl.bib), -- bibs to check for visibility
+                STRING_AGG(DISTINCT aal.source::TEXT, $$,$$), -- authority record ids
+                ARRAY_AGG(DISTINCT map.metabib_field) -- authority-tag-linked CMF rows
+
+          FROM  metabib.browse_entry_simple_heading_map mbeshm
+                JOIN authority.simple_heading ash ON ( mbeshm.simple_heading = ash.id )
+                JOIN authority.authority_linking aal ON ( ash.record = aal.source )
+                JOIN authority.bib_linking abl ON ( aal.target = abl.authority )
+                JOIN authority.control_set_auth_field_metabib_field_map_refs map ON (
+                    ash.atag = map.authority_field
+                    AND map.metabib_field = ANY(fields)
+                )
+          WHERE mbeshm.entry = rec.id;
+
+
+        -- Gather aggregate data based on the MBE row we're looking at now, bib axis
+        SELECT INTO all_brecords, result_row.authorities, bfields
+                ARRAY_AGG(DISTINCT source),
+                STRING_AGG(DISTINCT authority::TEXT, $$,$$),
+                ARRAY_AGG(DISTINCT def)
+          FROM  metabib.browse_entry_def_map
+          WHERE entry = rec.id
+                AND def = ANY(fields);
+
+        SELECT INTO result_row.fields STRING_AGG(DISTINCT x::TEXT, $$,$$) FROM UNNEST(afields || bfields) x;
+
+        result_row.sources := 0;
+        result_row.asources := 0;
+
+        -- Bib-linked vis checking
+        IF ARRAY_UPPER(all_brecords,1) IS NOT NULL THEN
+
+            full_end := ARRAY_LENGTH(all_brecords, 1);
+            superpage_size := COALESCE(browse_superpage_size, full_end);
+            slice_start := 1;
+            slice_end := superpage_size;
+
+            WHILE result_row.sources = 0 AND slice_start <= full_end LOOP
+                superpage_of_records := all_brecords[slice_start:slice_end];
+                qpfts_query :=
+                    'SELECT NULL::BIGINT AS id, ARRAY[r] AS records, ' ||
+                    'NULL AS badges, NULL::NUMERIC AS popularity, ' ||
+                    '1::NUMERIC AS rel FROM (SELECT UNNEST(' ||
+                    quote_literal(superpage_of_records) || '::BIGINT[]) AS r) rr';
+
+                -- We use search.query_parser_fts() for visibility testing.
+                -- We're calling it once per browse-superpage worth of records
+                -- out of the set of records related to a given mbe, until we've
+                -- either exhausted that set of records or found at least 1
+                -- visible record.
+
+                SELECT INTO result_row.sources visible
+                    FROM search.query_parser_fts(
+                        context_org, NULL, qpfts_query, NULL,
+                        context_locations, 0, NULL, NULL, FALSE, staff, FALSE
+                    ) qpfts
+                    WHERE qpfts.rel IS NULL;
+
+                slice_start := slice_start + superpage_size;
+                slice_end := slice_end + superpage_size;
+            END LOOP;
+
+            -- Accurate?  Well, probably.
+            result_row.accurate := browse_superpage_size IS NULL OR
+                browse_superpage_size >= full_end;
+
+        END IF;
+
+        -- Authority-linked vis checking
+        IF ARRAY_UPPER(all_arecords,1) IS NOT NULL THEN
+
+            full_end := ARRAY_LENGTH(all_arecords, 1);
+            superpage_size := COALESCE(browse_superpage_size, full_end);
+            slice_start := 1;
+            slice_end := superpage_size;
+
+            WHILE result_row.asources = 0 AND slice_start <= full_end LOOP
+                superpage_of_records := all_arecords[slice_start:slice_end];
+                qpfts_query :=
+                    'SELECT NULL::BIGINT AS id, ARRAY[r] AS records, ' ||
+                    'NULL AS badges, NULL::NUMERIC AS popularity, ' ||
+                    '1::NUMERIC AS rel FROM (SELECT UNNEST(' ||
+                    quote_literal(superpage_of_records) || '::BIGINT[]) AS r) rr';
+
+                -- We use search.query_parser_fts() for visibility testing.
+                -- We're calling it once per browse-superpage worth of records
+                -- out of the set of records related to a given mbe, via
+                -- authority until we've either exhausted that set of records
+                -- or found at least 1 visible record.
+
+                SELECT INTO result_row.asources visible
+                    FROM search.query_parser_fts(
+                        context_org, NULL, qpfts_query, NULL,
+                        context_locations, 0, NULL, NULL, FALSE, staff, FALSE
+                    ) qpfts
+                    WHERE qpfts.rel IS NULL;
+
+                slice_start := slice_start + superpage_size;
+                slice_end := slice_end + superpage_size;
+            END LOOP;
+
+
+            -- Accurate?  Well, probably.
+            result_row.aaccurate := browse_superpage_size IS NULL OR
+                browse_superpage_size >= full_end;
+
+        END IF;
+
+        IF result_row.sources > 0 OR result_row.asources > 0 THEN
+
+            -- The function that calls this function needs row_number in order
+            -- to correctly order results from two different runs of this
+            -- functions.
+            result_row.row_number := row_number;
+
+            -- Now, if row_counter is still less than limit, return a row.  If
+            -- not, but it is less than next_pivot_pos, continue on without
+            -- returning actual result rows until we find
+            -- that next pivot, and return it.
+
+            IF row_counter < result_limit THEN
+                result_row.browse_entry := rec.id;
+                result_row.value := rec.value;
+
+                RETURN NEXT result_row;
+            ELSE
+                result_row.browse_entry := NULL;
+                result_row.authorities := NULL;
+                result_row.fields := NULL;
+                result_row.value := NULL;
+                result_row.sources := NULL;
+                result_row.sees := NULL;
+                result_row.accurate := NULL;
+                result_row.aaccurate := NULL;
+                result_row.pivot_point := rec.id;
+
+                IF row_counter >= next_pivot_pos THEN
+                    RETURN NEXT result_row;
+                    RETURN;
+                END IF;
+            END IF;
+
+            IF count_up_from_zero THEN
+                row_number := row_number + 1;
+            ELSE
+                row_number := row_number - 1;
+            END IF;
+
+            -- row_counter is different from row_number.
+            -- It simply counts up from zero so that we know when
+            -- we've reached our limit.
+            row_counter := row_counter + 1;
+        END IF;
+    END LOOP;
+END;
+$p$ LANGUAGE PLPGSQL;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0985', :eg_version);
+
+CREATE OR REPLACE FUNCTION metabib.reingest_record_attributes (rid BIGINT, pattr_list TEXT[] DEFAULT NULL, prmarc TEXT DEFAULT NULL, rdeleted BOOL DEFAULT TRUE) RETURNS VOID AS $func$
+DECLARE
+    transformed_xml TEXT;
+    rmarc           TEXT := prmarc;
+    tmp_val         TEXT;
+    prev_xfrm       TEXT;
+    normalizer      RECORD;
+    xfrm            config.xml_transform%ROWTYPE;
+    attr_vector     INT[] := '{}'::INT[];
+    attr_vector_tmp INT[];
+    attr_list       TEXT[] := pattr_list;
+    attr_value      TEXT[];
+    norm_attr_value TEXT[];
+    tmp_xml         TEXT;
+    attr_def        config.record_attr_definition%ROWTYPE;
+    ccvm_row        config.coded_value_map%ROWTYPE;
+BEGIN
+
+    IF attr_list IS NULL OR rdeleted THEN -- need to do the full dance on INSERT or undelete
+        SELECT ARRAY_AGG(name) INTO attr_list FROM config.record_attr_definition
+        WHERE (
+            tag IS NOT NULL OR
+            fixed_field IS NOT NULL OR
+            xpath IS NOT NULL OR
+            phys_char_sf IS NOT NULL OR
+            composite
+        ) AND (
+            filter OR sorter
+        );
+    END IF;
+
+    IF rmarc IS NULL THEN
+        SELECT marc INTO rmarc FROM biblio.record_entry WHERE id = rid;
+    END IF;
+
+    FOR attr_def IN SELECT * FROM config.record_attr_definition WHERE NOT composite AND name = ANY( attr_list ) ORDER BY format LOOP
+
+        attr_value := '{}'::TEXT[];
+        norm_attr_value := '{}'::TEXT[];
+        attr_vector_tmp := '{}'::INT[];
+
+        SELECT * INTO ccvm_row FROM config.coded_value_map c WHERE c.ctype = attr_def.name LIMIT 1; 
+
+        -- tag+sf attrs only support SVF
+        IF attr_def.tag IS NOT NULL THEN -- tag (and optional subfield list) selection
+            SELECT  ARRAY[ARRAY_TO_STRING(ARRAY_AGG(value), COALESCE(attr_def.joiner,' '))] INTO attr_value
+              FROM  (SELECT * FROM metabib.full_rec ORDER BY tag, subfield) AS x
+              WHERE record = rid
+                    AND tag LIKE attr_def.tag
+                    AND CASE
+                        WHEN attr_def.sf_list IS NOT NULL 
+                            THEN POSITION(subfield IN attr_def.sf_list) > 0
+                        ELSE TRUE
+                    END
+              GROUP BY tag
+              ORDER BY tag
+              LIMIT 1;
+
+        ELSIF attr_def.fixed_field IS NOT NULL THEN -- a named fixed field, see config.marc21_ff_pos_map.fixed_field
+            attr_value := vandelay.marc21_extract_fixed_field_list(rmarc, attr_def.fixed_field);
+
+            IF NOT attr_def.multi THEN
+                attr_value := ARRAY[attr_value[1]];
+            END IF;
+
+        ELSIF attr_def.xpath IS NOT NULL THEN -- and xpath expression
+
+            SELECT INTO xfrm * FROM config.xml_transform WHERE name = attr_def.format;
+        
+            -- See if we can skip the XSLT ... it's expensive
+            IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
+                -- Can't skip the transform
+                IF xfrm.xslt <> '---' THEN
+                    transformed_xml := oils_xslt_process(rmarc,xfrm.xslt);
+                ELSE
+                    transformed_xml := rmarc;
+                END IF;
+    
+                prev_xfrm := xfrm.name;
+            END IF;
+
+            IF xfrm.name IS NULL THEN
+                -- just grab the marcxml (empty) transform
+                SELECT INTO xfrm * FROM config.xml_transform WHERE xslt = '---' LIMIT 1;
+                prev_xfrm := xfrm.name;
+            END IF;
+
+            FOR tmp_xml IN SELECT UNNEST(oils_xpath(attr_def.xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]])) LOOP
+                tmp_val := oils_xpath_string(
+                                '//*',
+                                tmp_xml,
+                                COALESCE(attr_def.joiner,' '),
+                                ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]
+                            );
+                IF tmp_val IS NOT NULL AND BTRIM(tmp_val) <> '' THEN
+                    attr_value := attr_value || tmp_val;
+                    EXIT WHEN NOT attr_def.multi;
+                END IF;
+            END LOOP;
+
+        ELSIF attr_def.phys_char_sf IS NOT NULL THEN -- a named Physical Characteristic, see config.marc21_physical_characteristic_*_map
+            SELECT  ARRAY_AGG(m.value) INTO attr_value
+              FROM  vandelay.marc21_physical_characteristics(rmarc) v
+                    LEFT JOIN config.marc21_physical_characteristic_value_map m ON (m.id = v.value)
+              WHERE v.subfield = attr_def.phys_char_sf AND (m.value IS NOT NULL AND BTRIM(m.value) <> '')
+                    AND ( ccvm_row.id IS NULL OR ( ccvm_row.id IS NOT NULL AND v.id IS NOT NULL) );
+
+            IF NOT attr_def.multi THEN
+                attr_value := ARRAY[attr_value[1]];
+            END IF;
+
+        END IF;
+
+                -- apply index normalizers to attr_value
+        FOR tmp_val IN SELECT value FROM UNNEST(attr_value) x(value) LOOP
+            FOR normalizer IN
+                SELECT  n.func AS func,
+                        n.param_count AS param_count,
+                        m.params AS params
+                  FROM  config.index_normalizer n
+                        JOIN config.record_attr_index_norm_map m ON (m.norm = n.id)
+                  WHERE attr = attr_def.name
+                  ORDER BY m.pos LOOP
+                    EXECUTE 'SELECT ' || normalizer.func || '(' ||
+                    COALESCE( quote_literal( tmp_val ), 'NULL' ) ||
+                        CASE
+                            WHEN normalizer.param_count > 0
+                                THEN ',' || REPLACE(REPLACE(BTRIM(normalizer.params,'[]'),E'\'',E'\\\''),E'"',E'\'')
+                                ELSE ''
+                            END ||
+                    ')' INTO tmp_val;
+
+            END LOOP;
+            IF tmp_val IS NOT NULL AND tmp_val <> '' THEN
+                -- note that a string that contains only blanks
+                -- is a valid value for some attributes
+                norm_attr_value := norm_attr_value || tmp_val;
+            END IF;
+        END LOOP;
+        
+        IF attr_def.filter THEN
+            -- Create unknown uncontrolled values and find the IDs of the values
+            IF ccvm_row.id IS NULL THEN
+                FOR tmp_val IN SELECT value FROM UNNEST(norm_attr_value) x(value) LOOP
+                    IF tmp_val IS NOT NULL AND BTRIM(tmp_val) <> '' THEN
+                        BEGIN -- use subtransaction to isolate unique constraint violations
+                            INSERT INTO metabib.uncontrolled_record_attr_value ( attr, value ) VALUES ( attr_def.name, tmp_val );
+                        EXCEPTION WHEN unique_violation THEN END;
+                    END IF;
+                END LOOP;
+
+                SELECT ARRAY_AGG(id) INTO attr_vector_tmp FROM metabib.uncontrolled_record_attr_value WHERE attr = attr_def.name AND value = ANY( norm_attr_value );
+            ELSE
+                SELECT ARRAY_AGG(id) INTO attr_vector_tmp FROM config.coded_value_map WHERE ctype = attr_def.name AND code = ANY( norm_attr_value );
+            END IF;
+
+            -- Add the new value to the vector
+            attr_vector := attr_vector || attr_vector_tmp;
+        END IF;
+
+        IF attr_def.sorter THEN
+            DELETE FROM metabib.record_sorter WHERE source = rid AND attr = attr_def.name;
+            IF norm_attr_value[1] IS NOT NULL THEN
+                INSERT INTO metabib.record_sorter (source, attr, value) VALUES (rid, attr_def.name, norm_attr_value[1]);
+            END IF;
+        END IF;
+
+    END LOOP;
+
+/* We may need to rewrite the vlist to contain
+   the intersection of new values for requested
+   attrs and old values for ignored attrs. To
+   do this, we take the old attr vlist and
+   subtract any values that are valid for the
+   requested attrs, and then add back the new
+   set of attr values. */
+
+    IF ARRAY_LENGTH(pattr_list, 1) > 0 THEN 
+        SELECT vlist INTO attr_vector_tmp FROM metabib.record_attr_vector_list WHERE source = rid;
+        SELECT attr_vector_tmp - ARRAY_AGG(id::INT) INTO attr_vector_tmp FROM metabib.full_attr_id_map WHERE attr = ANY (pattr_list);
+        attr_vector := attr_vector || attr_vector_tmp;
+    END IF;
+
+    -- On to composite attributes, now that the record attrs have been pulled.  Processed in name order, so later composite
+    -- attributes can depend on earlier ones.
+    PERFORM metabib.compile_composite_attr_cache_init();
+    FOR attr_def IN SELECT * FROM config.record_attr_definition WHERE composite AND name = ANY( attr_list ) ORDER BY name LOOP
+
+        FOR ccvm_row IN SELECT * FROM config.coded_value_map c WHERE c.ctype = attr_def.name ORDER BY value LOOP
+
+            tmp_val := metabib.compile_composite_attr( ccvm_row.id );
+            CONTINUE WHEN tmp_val IS NULL OR tmp_val = ''; -- nothing to do
+
+            IF attr_def.filter THEN
+                IF attr_vector @@ tmp_val::query_int THEN
+                    attr_vector = attr_vector + intset(ccvm_row.id);
+                    EXIT WHEN NOT attr_def.multi;
+                END IF;
+            END IF;
+
+            IF attr_def.sorter THEN
+                IF attr_vector @@ tmp_val THEN
+                    DELETE FROM metabib.record_sorter WHERE source = rid AND attr = attr_def.name;
+                    INSERT INTO metabib.record_sorter (source, attr, value) VALUES (rid, attr_def.name, ccvm_row.code);
+                END IF;
+            END IF;
+
+        END LOOP;
+
+    END LOOP;
+
+    IF ARRAY_LENGTH(attr_vector, 1) > 0 THEN
+        IF rdeleted THEN -- initial insert OR revivication
+            DELETE FROM metabib.record_attr_vector_list WHERE source = rid;
+            INSERT INTO metabib.record_attr_vector_list (source, vlist) VALUES (rid, attr_vector);
+        ELSE
+            UPDATE metabib.record_attr_vector_list SET vlist = attr_vector WHERE source = rid;
+        END IF;
+    END IF;
+
+END;
+
+$func$ LANGUAGE PLPGSQL;
+
+CREATE INDEX config_coded_value_map_ctype_idx ON config.coded_value_map (ctype);
+
+
+SELECT evergreen.upgrade_deps_block_check('0986', :eg_version);
+
+CREATE EXTENSION IF NOT EXISTS unaccent SCHEMA public;
+
+CREATE OR REPLACE FUNCTION evergreen.unaccent_and_squash ( IN arg text) RETURNS text
+    IMMUTABLE STRICT AS $$
+	BEGIN
+	RETURN evergreen.lowercase(unaccent(regexp_replace(arg, '\s','','g')));
+	END;
+$$ LANGUAGE PLPGSQL;
+
+-- The unaccented indices for patron name fields
+CREATE INDEX actor_usr_first_given_name_unaccent_idx ON actor.usr (evergreen.unaccent_and_squash(first_given_name));
+CREATE INDEX actor_usr_second_given_name_unaccent_idx ON actor.usr (evergreen.unaccent_and_squash(second_given_name));
+CREATE INDEX actor_usr_family_name_unaccent_idx ON actor.usr (evergreen.unaccent_and_squash(family_name));
+
+-- DB setting to control behavior; true by default
+INSERT INTO config.org_unit_setting_type
+( name, grp, label, description, datatype )
+VALUES
+('circ.patron_search.diacritic_insensitive',
+ 'circ',
+ oils_i18n_gettext('circ.patron_search.diacritic_insensitive',
+     'Patron search diacritic insensitive',
+     'coust', 'label'),
+ oils_i18n_gettext('circ.patron_search.diacritic_insensitive',
+     'Match patron last, first, and middle names irrespective of usage of diacritical marks or spaces. (e.g., Ines will match Inés; de la Cruz will match Delacruz)',
+     'coust', 'description'),
+  'bool');
+
+INSERT INTO actor.org_unit_setting (
+    org_unit, name, value
+) VALUES (
+    (SELECT id FROM actor.org_unit WHERE parent_ou IS NULL),
+    'circ.patron_search.diacritic_insensitive',
+    'true'
+);
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0987', :eg_version);
+
+INSERT INTO config.org_unit_setting_type ( name, grp, label, description, datatype )
+    VALUES (
+        'ui.circ.billing.amount_limit', 'gui',
+        oils_i18n_gettext(
+            'ui.circ.billing.amount_limit',
+            'Maximum payment amount allowed.',
+            'coust', 'label'),
+        oils_i18n_gettext(
+            'ui.circ.billing.amount_limit',
+            'The payment amount in the Patron Bills interface may not exceed the value of this setting.',
+            'coust', 'description'),
+        'currency'
+    );
+
+INSERT INTO config.org_unit_setting_type ( name, grp, label, description, datatype )
+    VALUES (
+        'ui.circ.billing.amount_warn', 'gui',
+        oils_i18n_gettext(
+            'ui.circ.billing.amount_warn',
+            'Payment amount threshold for Are You Sure? dialog.',
+            'coust', 'label'),
+        oils_i18n_gettext(
+            'ui.circ.billing.amount_warn',
+            'In the Patron Bills interface, a payment attempt will warn if the amount exceeds the value of this setting.',
+            'coust', 'description'),
+        'currency'
+    );
+
+
+SELECT evergreen.upgrade_deps_block_check('0988', :eg_version);
+
+CREATE OR REPLACE FUNCTION evergreen.maintain_901 () RETURNS TRIGGER AS $func$
+use strict;
+use MARC::Record;
+use MARC::File::XML (BinaryEncoding => 'UTF-8');
+use MARC::Charset;
+use Encode;
+use Unicode::Normalize;
+
+MARC::Charset->assume_unicode(1);
+
+my $schema = $_TD->{table_schema};
+my $marc = MARC::Record->new_from_xml($_TD->{new}{marc});
+
+my @old901s = $marc->field('901');
+$marc->delete_fields(@old901s);
+
+if ($schema eq 'biblio') {
+    my $tcn_value = $_TD->{new}{tcn_value};
+
+    # Set TCN value to record ID?
+    my $id_as_tcn = spi_exec_query("
+        SELECT enabled
+        FROM config.global_flag
+        WHERE name = 'cat.bib.use_id_for_tcn'
+    ");
+    if (($id_as_tcn->{processed}) && $id_as_tcn->{rows}[0]->{enabled} eq 't') {
+        $tcn_value = $_TD->{new}{id}; 
+        $_TD->{new}{tcn_value} = $tcn_value;
+    }
+
+    my $new_901 = MARC::Field->new("901", " ", " ",
+        "a" => $tcn_value,
+        "b" => $_TD->{new}{tcn_source},
+        "c" => $_TD->{new}{id},
+        "t" => $schema
+    );
+
+    if ($_TD->{new}{owner}) {
+        $new_901->add_subfields("o" => $_TD->{new}{owner});
+    }
+
+    if ($_TD->{new}{share_depth}) {
+        $new_901->add_subfields("d" => $_TD->{new}{share_depth});
+    }
+
+    if ($_TD->{new}{source}) {
+        my $plan = spi_prepare('
+            SELECT source
+            FROM config.bib_source
+            WHERE id = $1
+        ', 'INTEGER');
+        my $source_name =
+            spi_exec_prepared($plan, {limit => 1}, $_TD->{new}{source})->{rows}[0]{source};
+        spi_freeplan($plan);
+        $new_901->add_subfields("s" => $source_name) if $source_name;
+    }
+
+    $marc->append_fields($new_901);
+} elsif ($schema eq 'authority') {
+    my $new_901 = MARC::Field->new("901", " ", " ",
+        "c" => $_TD->{new}{id},
+        "t" => $schema,
+    );
+    $marc->append_fields($new_901);
+} elsif ($schema eq 'serial') {
+    my $new_901 = MARC::Field->new("901", " ", " ",
+        "c" => $_TD->{new}{id},
+        "t" => $schema,
+        "o" => $_TD->{new}{owning_lib},
+    );
+
+    if ($_TD->{new}{record}) {
+        $new_901->add_subfields("r" => $_TD->{new}{record});
+    }
+
+    $marc->append_fields($new_901);
+} else {
+    my $new_901 = MARC::Field->new("901", " ", " ",
+        "c" => $_TD->{new}{id},
+        "t" => $schema,
+    );
+    $marc->append_fields($new_901);
+}
+
+my $xml = $marc->as_xml_record();
+$xml =~ s/\n//sgo;
+$xml =~ s/^<\?xml.+\?\s*>//go;
+$xml =~ s/>\s+</></go;
+$xml =~ s/\p{Cc}//go;
+
+# Embed a version of OpenILS::Application::AppUtils->entityize()
+# to avoid having to set PERL5LIB for PostgreSQL as well
+
+$xml = NFC($xml);
+
+# Convert raw ampersands to entities
+$xml =~ s/&(?!\S+;)/&/gso;
+
+# Convert Unicode characters to entities
+$xml =~ s/([\x{0080}-\x{fffd}])/sprintf('&#x%X;',ord($1))/sgoe;
+
+$xml =~ s/[\x00-\x1f]//go;
+$_TD->{new}{marc} = $xml;
+
+return "MODIFY";
+$func$ LANGUAGE PLPERLU;
+
+
+SELECT evergreen.upgrade_deps_block_check('0989', :eg_version); -- berick/miker/gmcharlt
+
+CREATE OR REPLACE FUNCTION vandelay.overlay_authority_record ( import_id BIGINT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
+DECLARE
+    merge_profile   vandelay.merge_profile%ROWTYPE;
+    dyn_profile     vandelay.compile_profile%ROWTYPE;
+    editor_string   TEXT;
+    new_editor      INT;
+    new_edit_date   TIMESTAMPTZ;
+    source_marc     TEXT;
+    target_marc     TEXT;
+    eg_marc_row     authority.record_entry%ROWTYPE;
+    eg_marc         TEXT;
+    v_marc          TEXT;
+    replace_rule    TEXT;
+    match_count     INT;
+    update_query    TEXT;
+BEGIN
+
+    SELECT  * INTO eg_marc_row
+      FROM  authority.record_entry b
+            JOIN vandelay.authority_match m ON (m.eg_record = b.id AND m.queued_record = import_id)
+      LIMIT 1;
+
+    SELECT  q.marc INTO v_marc
+      FROM  vandelay.queued_record q
+            JOIN vandelay.authority_match m ON (m.queued_record = q.id AND q.id = import_id)
+      LIMIT 1;
+
+    eg_marc := eg_marc_row.marc;
+
+    IF eg_marc IS NULL OR v_marc IS NULL THEN
+        -- RAISE NOTICE 'no marc for vandelay or authority record';
+        RETURN FALSE;
+    END IF;
+
+    -- Extract the editor string before any modification to the vandelay
+    -- MARC occur.
+    editor_string := 
+        (oils_xpath('//*[@tag="905"]/*[@code="u"]/text()',v_marc))[1];
+
+    -- If an editor value can be found, update the authority record
+    -- editor and edit_date values.
+    IF editor_string IS NOT NULL AND editor_string <> '' THEN
+
+        -- Vandelay.pm sets the value to 'usrname' when needed.  
+        SELECT id INTO new_editor
+            FROM actor.usr WHERE usrname = editor_string;
+
+        IF new_editor IS NULL THEN
+            SELECT usr INTO new_editor
+                FROM actor.card WHERE barcode = editor_string;
+        END IF;
+
+        IF new_editor IS NOT NULL THEN
+            new_edit_date := NOW();
+        ELSE -- No valid editor, use current values
+            new_editor = eg_marc_row.editor;
+            new_edit_date = eg_marc_row.edit_date;
+        END IF;
+    ELSE
+        new_editor = eg_marc_row.editor;
+        new_edit_date = eg_marc_row.edit_date;
+    END IF;
+
+    dyn_profile := vandelay.compile_profile( v_marc );
+
+    IF merge_profile_id IS NOT NULL THEN
+        SELECT * INTO merge_profile FROM vandelay.merge_profile WHERE id = merge_profile_id;
+        IF FOUND THEN
+            dyn_profile.add_rule := BTRIM( dyn_profile.add_rule || ',' || COALESCE(merge_profile.add_spec,''), ',');
+            dyn_profile.strip_rule := BTRIM( dyn_profile.strip_rule || ',' || COALESCE(merge_profile.strip_spec,''), ',');
+            dyn_profile.replace_rule := BTRIM( dyn_profile.replace_rule || ',' || COALESCE(merge_profile.replace_spec,''), ',');
+            dyn_profile.preserve_rule := BTRIM( dyn_profile.preserve_rule || ',' || COALESCE(merge_profile.preserve_spec,''), ',');
+        END IF;
+    END IF;
+
+    IF dyn_profile.replace_rule <> '' AND dyn_profile.preserve_rule <> '' THEN
+        -- RAISE NOTICE 'both replace [%] and preserve [%] specified', dyn_profile.replace_rule, dyn_profile.preserve_rule;
+        RETURN FALSE;
+    END IF;
+
+    IF dyn_profile.replace_rule = '' AND dyn_profile.preserve_rule = '' AND dyn_profile.add_rule = '' AND dyn_profile.strip_rule = '' THEN
+        --Since we have nothing to do, just return a NOOP "we did it"
+        RETURN TRUE;
+    ELSIF dyn_profile.replace_rule <> '' THEN
+        source_marc = v_marc;
+        target_marc = eg_marc;
+        replace_rule = dyn_profile.replace_rule;
+    ELSE
+        source_marc = eg_marc;
+        target_marc = v_marc;
+        replace_rule = dyn_profile.preserve_rule;
+    END IF;
+
+    UPDATE  authority.record_entry
+      SET   marc = vandelay.merge_record_xml( target_marc, source_marc, dyn_profile.add_rule, replace_rule, dyn_profile.strip_rule ),
+            editor = new_editor,
+            edit_date = new_edit_date
+      WHERE id = eg_id;
+
+    IF NOT FOUND THEN 
+        -- Import/merge failed.  Nothing left to do.
+        RETURN FALSE;
+    END IF;
+
+    -- Authority record successfully merged / imported.
+
+    -- Update the vandelay record to show the successful import.
+    UPDATE  vandelay.queued_authority_record
+      SET   imported_as = eg_id,
+            import_time = NOW()
+      WHERE id = import_id;
+
+    RETURN TRUE;
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0990', :eg_version);
+
+CREATE OR REPLACE FUNCTION rating.copy_count(badge_id INT)
+    RETURNS TABLE (record INT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list
+    );
+    ANALYZE precalc_copy_filter_bib_list;
+
+    RETURN QUERY
+     SELECT f.id::INT AS bib,
+            COUNT(f.copy)::NUMERIC
+      FROM  precalc_copy_filter_bib_list f
+            JOIN asset.copy cp ON (f.copy = cp.id)
+            JOIN asset.call_number cn ON (cn.id = cp.call_number)
+      WHERE cn.owning_lib = ANY (badge.orgs) GROUP BY 1;
+
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+INSERT INTO rating.popularity_parameter (id, name, func, require_percentile) VALUES (16, 'Copy Count', 'rating.copy_count', TRUE);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0991', :eg_version);
+
+CREATE OR REPLACE FUNCTION evergreen.ranked_volumes(
+    bibid BIGINT[], 
+    ouid INT,
+    depth INT DEFAULT NULL,
+    slimit HSTORE DEFAULT NULL,
+    soffset HSTORE DEFAULT NULL,
+    pref_lib INT DEFAULT NULL,
+    includes TEXT[] DEFAULT NULL::TEXT[]
+) RETURNS TABLE(id BIGINT, name TEXT, label_sortkey TEXT, rank BIGINT) AS $$
+    WITH RECURSIVE ou_depth AS (
+        SELECT COALESCE(
+            $3,
+            (
+                SELECT depth
+                FROM actor.org_unit_type aout
+                    INNER JOIN actor.org_unit ou ON ou_type = aout.id
+                WHERE ou.id = $2
+            )
+        ) AS depth
+    ), descendant_depth AS (
+        SELECT  ou.id,
+                ou.parent_ou,
+                out.depth
+        FROM  actor.org_unit ou
+                JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+                JOIN anscestor_depth ad ON (ad.id = ou.id),
+                ou_depth
+        WHERE ad.depth = ou_depth.depth
+            UNION ALL
+        SELECT  ou.id,
+                ou.parent_ou,
+                out.depth
+        FROM  actor.org_unit ou
+                JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+                JOIN descendant_depth ot ON (ot.id = ou.parent_ou)
+    ), anscestor_depth AS (
+        SELECT  ou.id,
+                ou.parent_ou,
+                out.depth
+        FROM  actor.org_unit ou
+                JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+        WHERE ou.id = $2
+            UNION ALL
+        SELECT  ou.id,
+                ou.parent_ou,
+                out.depth
+        FROM  actor.org_unit ou
+                JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+                JOIN anscestor_depth ot ON (ot.parent_ou = ou.id)
+    ), descendants as (
+        SELECT ou.* FROM actor.org_unit ou JOIN descendant_depth USING (id)
+    )
+
+    SELECT ua.id, ua.name, ua.label_sortkey, MIN(ua.rank) AS rank FROM (
+        SELECT acn.id, owning_lib.name, acn.label_sortkey,
+            evergreen.rank_cp(acp),
+            RANK() OVER w
+        FROM asset.call_number acn
+            JOIN asset.copy acp ON (acn.id = acp.call_number)
+            JOIN descendants AS aou ON (acp.circ_lib = aou.id)
+            JOIN actor.org_unit AS owning_lib ON (acn.owning_lib = owning_lib.id)
+        WHERE acn.record = ANY ($1)
+            AND acn.deleted IS FALSE
+            AND acp.deleted IS FALSE
+            AND CASE WHEN ('exclude_invisible_acn' = ANY($7)) THEN 
+                EXISTS (
+                    SELECT 1 
+                    FROM asset.opac_visible_copies 
+                    WHERE copy_id = acp.id AND record = acn.record
+                ) ELSE TRUE END
+        GROUP BY acn.id, evergreen.rank_cp(acp), owning_lib.name, acn.label_sortkey, aou.id
+        WINDOW w AS (
+            ORDER BY 
+                COALESCE(
+                    CASE WHEN aou.id = $2 THEN -20000 END,
+                    CASE WHEN aou.id = $6 THEN -10000 END,
+                    (SELECT distance - 5000
+                        FROM actor.org_unit_descendants_distance($6) as x
+                        WHERE x.id = aou.id AND $6 IN (
+                            SELECT q.id FROM actor.org_unit_descendants($2) as q)),
+                    (SELECT e.distance FROM actor.org_unit_descendants_distance($2) as e WHERE e.id = aou.id),
+                    1000
+                ),
+                evergreen.rank_cp(acp)
+        )
+    ) AS ua
+    GROUP BY ua.id, ua.name, ua.label_sortkey
+    ORDER BY rank, ua.name, ua.label_sortkey
+    LIMIT ($4 -> 'acn')::INT
+    OFFSET ($5 -> 'acn')::INT;
+$$ LANGUAGE SQL STABLE ROWS 10;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0992', :eg_version);
+
+ALTER TABLE config.copy_status
+    ADD COLUMN is_available BOOL NOT NULL DEFAULT FALSE;
+
+UPDATE config.copy_status SET is_available = TRUE
+    WHERE id IN (0, 7); -- available, reshelving.
+
+CREATE OR REPLACE FUNCTION action.item_user_circ_test( circ_ou INT, match_item BIGINT, match_user INT, renewal BOOL ) RETURNS SETOF action.circ_matrix_test_result AS $func$
+DECLARE
+    user_object             actor.usr%ROWTYPE;
+    standing_penalty        config.standing_penalty%ROWTYPE;
+    item_object             asset.copy%ROWTYPE;
+    item_status_object      config.copy_status%ROWTYPE;
+    item_location_object    asset.copy_location%ROWTYPE;
+    result                  action.circ_matrix_test_result;
+    circ_test               action.found_circ_matrix_matchpoint;
+    circ_matchpoint         config.circ_matrix_matchpoint%ROWTYPE;
+    circ_limit_set          config.circ_limit_set%ROWTYPE;
+    hold_ratio              action.hold_stats%ROWTYPE;
+    penalty_type            TEXT;
+    items_out               INT;
+    context_org_list        INT[];
+    done                    BOOL := FALSE;
+BEGIN
+    -- Assume success unless we hit a failure condition
+    result.success := TRUE;
+
+    -- Need user info to look up matchpoints
+    SELECT INTO user_object * FROM actor.usr WHERE id = match_user AND NOT deleted;
+
+    -- (Insta)Fail if we couldn't find the user
+    IF user_object.id IS NULL THEN
+        result.fail_part := 'no_user';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+        RETURN;
+    END IF;
+
+    -- Need item info to look up matchpoints
+    SELECT INTO item_object * FROM asset.copy WHERE id = match_item AND NOT deleted;
+
+    -- (Insta)Fail if we couldn't find the item 
+    IF item_object.id IS NULL THEN
+        result.fail_part := 'no_item';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+        RETURN;
+    END IF;
+
+    SELECT INTO circ_test * FROM action.find_circ_matrix_matchpoint(circ_ou, item_object, user_object, renewal);
+
+    circ_matchpoint             := circ_test.matchpoint;
+    result.matchpoint           := circ_matchpoint.id;
+    result.circulate            := circ_matchpoint.circulate;
+    result.duration_rule        := circ_matchpoint.duration_rule;
+    result.recurring_fine_rule  := circ_matchpoint.recurring_fine_rule;
+    result.max_fine_rule        := circ_matchpoint.max_fine_rule;
+    result.hard_due_date        := circ_matchpoint.hard_due_date;
+    result.renewals             := circ_matchpoint.renewals;
+    result.grace_period         := circ_matchpoint.grace_period;
+    result.buildrows            := circ_test.buildrows;
+
+    -- (Insta)Fail if we couldn't find a matchpoint
+    IF circ_test.success = false THEN
+        result.fail_part := 'no_matchpoint';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+        RETURN;
+    END IF;
+
+    -- All failures before this point are non-recoverable
+    -- Below this point are possibly overridable failures
+
+    -- Fail if the user is barred
+    IF user_object.barred IS TRUE THEN
+        result.fail_part := 'actor.usr.barred';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END IF;
+
+    -- Fail if the item can't circulate
+    IF item_object.circulate IS FALSE THEN
+        result.fail_part := 'asset.copy.circulate';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END IF;
+
+    -- Fail if the item isn't in a circulateable status on a non-renewal
+    IF NOT renewal AND item_object.status <> 8 AND item_object.status NOT IN (
+        (SELECT id FROM config.copy_status WHERE is_available) ) THEN 
+        result.fail_part := 'asset.copy.status';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    -- Alternately, fail if the item isn't checked out on a renewal
+    ELSIF renewal AND item_object.status <> 1 THEN
+        result.fail_part := 'asset.copy.status';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END IF;
+
+    -- Fail if the item can't circulate because of the shelving location
+    SELECT INTO item_location_object * FROM asset.copy_location WHERE id = item_object.location;
+    IF item_location_object.circulate IS FALSE THEN
+        result.fail_part := 'asset.copy_location.circulate';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END IF;
+
+    -- Use Circ OU for penalties and such
+    SELECT INTO context_org_list ARRAY_AGG(id) FROM actor.org_unit_full_path( circ_ou );
+
+    IF renewal THEN
+        penalty_type = '%RENEW%';
+    ELSE
+        penalty_type = '%CIRC%';
+    END IF;
+
+    FOR standing_penalty IN
+        SELECT  DISTINCT csp.*
+          FROM  actor.usr_standing_penalty usp
+                JOIN config.standing_penalty csp ON (csp.id = usp.standing_penalty)
+          WHERE usr = match_user
+                AND usp.org_unit IN ( SELECT * FROM unnest(context_org_list) )
+                AND (usp.stop_date IS NULL or usp.stop_date > NOW())
+                AND csp.block_list LIKE penalty_type LOOP
+
+        result.fail_part := standing_penalty.name;
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END LOOP;
+
+    -- Fail if the test is set to hard non-circulating
+    IF circ_matchpoint.circulate IS FALSE THEN
+        result.fail_part := 'config.circ_matrix_test.circulate';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END IF;
+
+    -- Fail if the total copy-hold ratio is too low
+    IF circ_matchpoint.total_copy_hold_ratio IS NOT NULL THEN
+        SELECT INTO hold_ratio * FROM action.copy_related_hold_stats(match_item);
+        IF hold_ratio.total_copy_ratio IS NOT NULL AND hold_ratio.total_copy_ratio < circ_matchpoint.total_copy_hold_ratio THEN
+            result.fail_part := 'config.circ_matrix_test.total_copy_hold_ratio';
+            result.success := FALSE;
+            done := TRUE;
+            RETURN NEXT result;
+        END IF;
+    END IF;
+
+    -- Fail if the available copy-hold ratio is too low
+    IF circ_matchpoint.available_copy_hold_ratio IS NOT NULL THEN
+        IF hold_ratio.hold_count IS NULL THEN
+            SELECT INTO hold_ratio * FROM action.copy_related_hold_stats(match_item);
+        END IF;
+        IF hold_ratio.available_copy_ratio IS NOT NULL AND hold_ratio.available_copy_ratio < circ_matchpoint.available_copy_hold_ratio THEN
+            result.fail_part := 'config.circ_matrix_test.available_copy_hold_ratio';
+            result.success := FALSE;
+            done := TRUE;
+            RETURN NEXT result;
+        END IF;
+    END IF;
+
+    -- Fail if the user has too many items out by defined limit sets
+    FOR circ_limit_set IN SELECT ccls.* FROM config.circ_limit_set ccls
+      JOIN config.circ_matrix_limit_set_map ccmlsm ON ccmlsm.limit_set = ccls.id
+      WHERE ccmlsm.active AND ( ccmlsm.matchpoint = circ_matchpoint.id OR
+        ( ccmlsm.matchpoint IN (SELECT * FROM unnest(result.buildrows)) AND ccmlsm.fallthrough )
+        ) LOOP
+            IF circ_limit_set.items_out > 0 AND NOT renewal THEN
+                SELECT INTO context_org_list ARRAY_AGG(aou.id)
+                  FROM actor.org_unit_full_path( circ_ou ) aou
+                    JOIN actor.org_unit_type aout ON aou.ou_type = aout.id
+                  WHERE aout.depth >= circ_limit_set.depth;
+                IF circ_limit_set.global THEN
+                    WITH RECURSIVE descendant_depth AS (
+                        SELECT  ou.id,
+                            ou.parent_ou
+                        FROM  actor.org_unit ou
+                        WHERE ou.id IN (SELECT * FROM unnest(context_org_list))
+                            UNION
+                        SELECT  ou.id,
+                            ou.parent_ou
+                        FROM  actor.org_unit ou
+                            JOIN descendant_depth ot ON (ot.id = ou.parent_ou)
+                    ) SELECT INTO context_org_list ARRAY_AGG(ou.id) FROM actor.org_unit ou JOIN descendant_depth USING (id);
+                END IF;
+                SELECT INTO items_out COUNT(DISTINCT circ.id)
+                  FROM action.circulation circ
+                    JOIN asset.copy copy ON (copy.id = circ.target_copy)
+                    LEFT JOIN action.circulation_limit_group_map aclgm ON (circ.id = aclgm.circ)
+                  WHERE circ.usr = match_user
+                    AND circ.circ_lib IN (SELECT * FROM unnest(context_org_list))
+                    AND circ.checkin_time IS NULL
+                    AND (circ.stop_fines IN ('MAXFINES','LONGOVERDUE') OR circ.stop_fines IS NULL)
+                    AND (copy.circ_modifier IN (SELECT circ_mod FROM config.circ_limit_set_circ_mod_map WHERE limit_set = circ_limit_set.id)
+                        OR copy.location IN (SELECT copy_loc FROM config.circ_limit_set_copy_loc_map WHERE limit_set = circ_limit_set.id)
+                        OR aclgm.limit_group IN (SELECT limit_group FROM config.circ_limit_set_group_map WHERE limit_set = circ_limit_set.id)
+                    );
+                IF items_out >= circ_limit_set.items_out THEN
+                    result.fail_part := 'config.circ_matrix_circ_mod_test';
+                    result.success := FALSE;
+                    done := TRUE;
+                    RETURN NEXT result;
+                END IF;
+            END IF;
+            SELECT INTO result.limit_groups result.limit_groups || ARRAY_AGG(limit_group) FROM config.circ_limit_set_group_map WHERE limit_set = circ_limit_set.id AND NOT check_only;
+    END LOOP;
+
+    -- If we passed everything, return the successful matchpoint
+    IF NOT done THEN
+        RETURN NEXT result;
+    END IF;
+
+    RETURN;
+END;
+$func$ LANGUAGE plpgsql;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0993', :eg_version);
+
+ALTER TABLE config.usr_activity_type 
+    ALTER COLUMN transient SET DEFAULT TRUE;
+
+-- Utility function for removing all activity entries by activity type,
+-- except for the most recent entry per user.  This is primarily useful
+-- when cleaning up rows prior to setting the transient flag on an
+-- activity type to true.  It allows for immediate cleanup of data (e.g.
+-- for patron privacy) and lets admins control when the data is deleted,
+-- which could be useful for huge activity tables.
+
+CREATE OR REPLACE FUNCTION 
+    actor.purge_usr_activity_by_type(act_type INTEGER) 
+    RETURNS VOID AS $$
+DECLARE
+    cur_usr INTEGER;
+BEGIN
+    FOR cur_usr IN SELECT DISTINCT(usr) 
+        FROM actor.usr_activity WHERE etype = act_type LOOP
+        DELETE FROM actor.usr_activity WHERE id IN (
+            SELECT id 
+            FROM actor.usr_activity 
+            WHERE usr = cur_usr AND etype = act_type
+            ORDER BY event_time DESC OFFSET 1
+        );
+
+    END LOOP;
+END $$ LANGUAGE PLPGSQL;
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0994', :eg_version);
+
+CREATE OR REPLACE FUNCTION authority.propagate_changes 
+    (aid BIGINT, bid BIGINT) RETURNS BIGINT AS $func$
+DECLARE
+    bib_rec biblio.record_entry%ROWTYPE;
+    new_marc TEXT;
+BEGIN
+
+    SELECT INTO bib_rec * FROM biblio.record_entry WHERE id = bid;
+
+    new_marc := vandelay.merge_record_xml(
+        bib_rec.marc, authority.generate_overlay_template(aid));
+
+    IF new_marc = bib_rec.marc THEN
+        -- Authority record change had no impact on this bib record.
+        -- Nothing left to do.
+        RETURN aid;
+    END IF;
+
+    PERFORM 1 FROM config.global_flag 
+        WHERE name = 'ingest.disable_authority_auto_update_bib_meta' 
+            AND enabled;
+
+    IF NOT FOUND THEN 
+        -- update the bib record editor and edit_date
+        bib_rec.editor := (
+            SELECT editor FROM authority.record_entry WHERE id = aid);
+        bib_rec.edit_date = NOW();
+    END IF;
+
+    UPDATE biblio.record_entry SET
+        marc = new_marc,
+        editor = bib_rec.editor,
+        edit_date = bib_rec.edit_date
+    WHERE id = bid;
+
+    RETURN aid;
+
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+-- DATA
+-- Disabled by default
+INSERT INTO config.global_flag (name, enabled, label) VALUES (
+    'ingest.disable_authority_auto_update_bib_meta',  FALSE, 
+    oils_i18n_gettext(
+        'ingest.disable_authority_auto_update_bib_meta',
+        'Authority Automation: Disable automatic authority updates ' ||
+            'from modifying bib record editor and edit_date',
+        'cgf',
+        'label'
+    )
+);
+
+
+CREATE OR REPLACE FUNCTION authority.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$
+DECLARE
+    ashs    authority.simple_heading%ROWTYPE;
+    mbe_row metabib.browse_entry%ROWTYPE;
+    mbe_id  BIGINT;
+    ash_id  BIGINT;
+BEGIN
+
+    IF NEW.deleted IS TRUE THEN -- If this authority is deleted
+        DELETE FROM authority.bib_linking WHERE authority = NEW.id; -- Avoid updating fields in bibs that are no longer visible
+        DELETE FROM authority.full_rec WHERE record = NEW.id; -- Avoid validating fields against deleted authority records
+        DELETE FROM authority.simple_heading WHERE record = NEW.id;
+          -- Should remove matching $0 from controlled fields at the same time?
+
+        -- XXX What do we about the actual linking subfields present in
+        -- authority records that target this one when this happens?
+        DELETE FROM authority.authority_linking
+            WHERE source = NEW.id OR target = NEW.id;
+
+        RETURN NEW; -- and we're done
+    END IF;
+
+    IF TG_OP = 'UPDATE' THEN -- re-ingest?
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled;
+
+        IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change
+            RETURN NEW;
+        END IF;
+
+        -- Unless there's a setting stopping us, propagate these updates to any linked bib records when the heading changes
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_auto_update' AND enabled;
+
+        IF NOT FOUND AND NEW.heading <> OLD.heading THEN
+            PERFORM authority.propagate_changes(NEW.id);
+        END IF;
+	
+        DELETE FROM authority.simple_heading WHERE record = NEW.id;
+        DELETE FROM authority.authority_linking WHERE source = NEW.id;
+    END IF;
+
+    INSERT INTO authority.authority_linking (source, target, field)
+        SELECT source, target, field FROM authority.calculate_authority_linking(
+            NEW.id, NEW.control_set, NEW.marc::XML
+        );
+
+    FOR ashs IN SELECT * FROM authority.simple_heading_set(NEW.marc) LOOP
+
+        INSERT INTO authority.simple_heading (record,atag,value,sort_value,thesaurus)
+            VALUES (ashs.record, ashs.atag, ashs.value, ashs.sort_value, ashs.thesaurus);
+            ash_id := CURRVAL('authority.simple_heading_id_seq'::REGCLASS);
+
+        SELECT INTO mbe_row * FROM metabib.browse_entry
+            WHERE value = ashs.value AND sort_value = ashs.sort_value;
+
+        IF FOUND THEN
+            mbe_id := mbe_row.id;
+        ELSE
+            INSERT INTO metabib.browse_entry
+                ( value, sort_value ) VALUES
+                ( ashs.value, ashs.sort_value );
+
+            mbe_id := CURRVAL('metabib.browse_entry_id_seq'::REGCLASS);
+        END IF;
+
+        INSERT INTO metabib.browse_entry_simple_heading_map (entry,simple_heading) VALUES (mbe_id,ash_id);
+
+    END LOOP;
+
+    -- Flatten and insert the afr data
+    PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_full_rec' AND enabled;
+    IF NOT FOUND THEN
+        PERFORM authority.reingest_authority_full_rec(NEW.id);
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_rec_descriptor' AND enabled;
+        IF NOT FOUND THEN
+            PERFORM authority.reingest_authority_rec_descriptor(NEW.id);
+        END IF;
+    END IF;
+
+    RETURN NEW;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0995', :eg_version);
+
+INSERT INTO rating.badge (name, description, scope, weight, horizon_age, importance_age, importance_interval, importance_scale, recalc_interval, popularity_parameter, percentile)
+   VALUES('Top Holds Over Last 5 Years', 'The top 97th percentile for holds requested over the past five years on all materials. More weight is given to holds requested over the last year, with importance decreasing for every year after that.', 1, 3, '5 years', '5 years', '1 year', 2, '1 day', 2, 97);
+
+
+SELECT evergreen.upgrade_deps_block_check('0996', :eg_version);
+
+INSERT INTO config.usr_setting_type (
+    name,
+    opac_visible,
+    label,
+    description,
+    datatype
+) VALUES (
+    'circ.send_email_checkout_receipts',
+    TRUE,
+    oils_i18n_gettext('circ.send_email_checkout_receipts', 'Email checkout receipts by default?', 'cust', 'label'),
+    oils_i18n_gettext('circ.send_email_checkout_receipts', 'Email checkout receipts by default?', 'cust', 'description'),
+    'bool'
+);
+
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+VALUES (
+    'circ.checkout.batch_notify',
+    'circ',
+    oils_i18n_gettext(
+        'circ.checkout.batch_notify',
+        'Notification of a group of circs',
+        'ath',
+        'description'
+    ),
+    FALSE
+);
+
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+VALUES (
+    'circ.checkout.batch_notify.session',
+    'circ',
+    oils_i18n_gettext(
+        'circ.checkout.batch_notify.session',
+        'Notification of a group of circs at the end of a checkout session',
+        'ath',
+        'description'
+    ),
+    FALSE
+);
+
+INSERT INTO action_trigger.event_definition (
+    active,
+    owner,
+    name,
+    hook,
+    validator,
+    reactor,
+    usr_field,
+    opt_in_setting,
+    group_field,
+    template
+) VALUES (
+    TRUE,
+    1,
+    'Email Checkout Receipt',
+    'circ.checkout.batch_notify.session',
+    'NOOP_True',
+    'SendEmail',
+    'usr',
+    'circ.send_email_checkout_receipts',
+    'usr',
+    $$[%- USE date -%]
+[%- user = target.0.usr -%]
+To: [%- params.recipient_email || user.email %]
+From: [%- helpers.get_org_setting(target.0.circ_lib.id, 'org.bounced_emails') || params.sender_email || default_sender %]
+Subject: Checkout Receipt
+Auto-Submitted: auto-generated
+
+You checked out the following items:
+
+[% FOR circ IN target %]
+    [%- copy_details = helpers.get_copy_bib_basics(circ.target_copy.id) -%]
+    Title: [% copy_details.title %]
+    Author: [% copy_details.author %]
+    Call Number: [% circ.target_copy.call_number.label %]
+    Barcode: [% circ.target_copy.barcode %]
+    Due: [% date.format(helpers.format_date(circ.due_date), '%Y-%m-%d') %]
+    Library: [% circ.circ_lib.name %]
+
+[% END %]
+$$);
+
+INSERT INTO action_trigger.environment (
+    event_def,
+    path
+) VALUES (
+    currval('action_trigger.event_definition_id_seq'),
+    'target_copy.call_number'
+), (
+    currval('action_trigger.event_definition_id_seq'),
+    'target_copy.location'
+), (
+    currval('action_trigger.event_definition_id_seq'),
+    'usr'
+), (
+    currval('action_trigger.event_definition_id_seq'),
+    'circ_lib'
+);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0997', :eg_version);
+
+INSERT INTO config.copy_status (id, name, holdable, opac_visible) VALUES (18,oils_i18n_gettext(18, 'Canceled Transit', 'ccs', 'name'), 't', 't');
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0998', :eg_version);
+
+DROP VIEW IF EXISTS action.all_circulation;
+CREATE VIEW action.all_circulation AS
+     SELECT aged_circulation.id, aged_circulation.usr_post_code,
+        aged_circulation.usr_home_ou, aged_circulation.usr_profile,
+        aged_circulation.usr_birth_year, aged_circulation.copy_call_number,
+        aged_circulation.copy_location, aged_circulation.copy_owning_lib,
+        aged_circulation.copy_circ_lib, aged_circulation.copy_bib_record,
+        aged_circulation.xact_start, aged_circulation.xact_finish,
+        aged_circulation.target_copy, aged_circulation.circ_lib,
+        aged_circulation.circ_staff, aged_circulation.checkin_staff,
+        aged_circulation.checkin_lib, aged_circulation.renewal_remaining,
+        aged_circulation.grace_period, aged_circulation.due_date,
+        aged_circulation.stop_fines_time, aged_circulation.checkin_time,
+        aged_circulation.create_time, aged_circulation.duration,
+        aged_circulation.fine_interval, aged_circulation.recurring_fine,
+        aged_circulation.max_fine, aged_circulation.phone_renewal,
+        aged_circulation.desk_renewal, aged_circulation.opac_renewal,
+        aged_circulation.duration_rule,
+        aged_circulation.recurring_fine_rule,
+        aged_circulation.max_fine_rule, aged_circulation.stop_fines,
+        aged_circulation.workstation, aged_circulation.checkin_workstation,
+        aged_circulation.checkin_scan_time, aged_circulation.parent_circ,
+        NULL AS usr
+       FROM action.aged_circulation
+UNION ALL
+     SELECT DISTINCT circ.id,
+        COALESCE(a.post_code, b.post_code) AS usr_post_code,
+        p.home_ou AS usr_home_ou, p.profile AS usr_profile,
+        date_part('year'::text, p.dob)::integer AS usr_birth_year,
+        cp.call_number AS copy_call_number, circ.copy_location,
+        cn.owning_lib AS copy_owning_lib, cp.circ_lib AS copy_circ_lib,
+        cn.record AS copy_bib_record, circ.xact_start, circ.xact_finish,
+        circ.target_copy, circ.circ_lib, circ.circ_staff,
+        circ.checkin_staff, circ.checkin_lib, circ.renewal_remaining,
+        circ.grace_period, circ.due_date, circ.stop_fines_time,
+        circ.checkin_time, circ.create_time, circ.duration,
+        circ.fine_interval, circ.recurring_fine, circ.max_fine,
+        circ.phone_renewal, circ.desk_renewal, circ.opac_renewal,
+        circ.duration_rule, circ.recurring_fine_rule, circ.max_fine_rule,
+        circ.stop_fines, circ.workstation, circ.checkin_workstation,
+        circ.checkin_scan_time, circ.parent_circ, circ.usr
+       FROM action.circulation circ
+  JOIN asset.copy cp ON circ.target_copy = cp.id
+JOIN asset.call_number cn ON cp.call_number = cn.id
+JOIN actor.usr p ON circ.usr = p.id
+LEFT JOIN actor.usr_address a ON p.mailing_address = a.id
+LEFT JOIN actor.usr_address b ON p.billing_address = b.id;
+
+
+CREATE OR REPLACE FUNCTION action.all_circ_chain (ctx_circ_id INTEGER) 
+    RETURNS SETOF action.all_circulation AS $$
+DECLARE
+    tmp_circ action.all_circulation%ROWTYPE;
+    circ_0 action.all_circulation%ROWTYPE;
+BEGIN
+
+    SELECT INTO tmp_circ * FROM action.all_circulation WHERE id = ctx_circ_id;
+
+    IF tmp_circ IS NULL THEN
+        RETURN NEXT tmp_circ;
+    END IF;
+    circ_0 := tmp_circ;
+
+    -- find the front of the chain
+    WHILE TRUE LOOP
+        SELECT INTO tmp_circ * FROM action.all_circulation 
+            WHERE id = tmp_circ.parent_circ;
+        IF tmp_circ IS NULL THEN
+            EXIT;
+        END IF;
+        circ_0 := tmp_circ;
+    END LOOP;
+
+    -- now send the circs to the caller, oldest to newest
+    tmp_circ := circ_0;
+    WHILE TRUE LOOP
+        IF tmp_circ IS NULL THEN
+            EXIT;
+        END IF;
+        RETURN NEXT tmp_circ;
+        SELECT INTO tmp_circ * FROM action.all_circulation 
+            WHERE parent_circ = tmp_circ.id;
+    END LOOP;
+
+END;
+$$ LANGUAGE 'plpgsql';
+
+CREATE OR REPLACE FUNCTION action.summarize_all_circ_chain 
+    (ctx_circ_id INTEGER) RETURNS action.circ_chain_summary AS $$
+
+DECLARE
+
+    -- first circ in the chain
+    circ_0 action.all_circulation%ROWTYPE;
+
+    -- last circ in the chain
+    circ_n action.all_circulation%ROWTYPE;
+
+    -- circ chain under construction
+    chain action.circ_chain_summary;
+    tmp_circ action.all_circulation%ROWTYPE;
+
+BEGIN
+    
+    chain.num_circs := 0;
+    FOR tmp_circ IN SELECT * FROM action.all_circ_chain(ctx_circ_id) LOOP
+
+        IF chain.num_circs = 0 THEN
+            circ_0 := tmp_circ;
+        END IF;
+
+        chain.num_circs := chain.num_circs + 1;
+        circ_n := tmp_circ;
+    END LOOP;
+
+    chain.start_time := circ_0.xact_start;
+    chain.last_stop_fines := circ_n.stop_fines;
+    chain.last_stop_fines_time := circ_n.stop_fines_time;
+    chain.last_checkin_time := circ_n.checkin_time;
+    chain.last_checkin_scan_time := circ_n.checkin_scan_time;
+    SELECT INTO chain.checkout_workstation name FROM actor.workstation WHERE id = circ_0.workstation;
+    SELECT INTO chain.last_checkin_workstation name FROM actor.workstation WHERE id = circ_n.checkin_workstation;
+
+    IF chain.num_circs > 1 THEN
+        chain.last_renewal_time := circ_n.xact_start;
+        SELECT INTO chain.last_renewal_workstation name FROM actor.workstation WHERE id = circ_n.workstation;
+    END IF;
+
+    RETURN chain;
+
+END;
+$$ LANGUAGE 'plpgsql';
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0999', :eg_version);
+
+CREATE TABLE staging.setting_stage (
+        row_id          BIGSERIAL PRIMARY KEY,
+        row_date        TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
+        usrname         TEXT NOT NULL,
+        setting         TEXT NOT NULL,
+        value           TEXT NOT NULL,
+        complete        BOOL DEFAULT FALSE
+);
+
+-- Add Spanish to config.i18n_locale table
+
+
+SELECT evergreen.upgrade_deps_block_check('1000', :eg_version);
+
+INSERT INTO config.i18n_locale (code,marc_code,name,description)
+    VALUES ('es-ES', 'spa', oils_i18n_gettext('es-ES', 'Spanish', 'i18n_l', 'name'),
+        oils_i18n_gettext('es-ES', 'Spanish', 'i18n_l', 'description'));
+
+COMMIT;
+
+\qecho Now running an update to set the 901$s for bibliographic
+\qecho records that have a source set. This may take a while.
+\qecho
+\qecho The update can be cancelled now and run later
+\qecho using the following SQL statement:
+\qecho
+\qecho UPDATE biblio.record_entry SET id = id WHERE source IS NOT NULL;
+\qecho
+UPDATE biblio.record_entry SET id = id WHERE source IS NOT NULL;
diff --git a/Open-ILS/xul/staff_client/chrome/content/main/about.html b/Open-ILS/xul/staff_client/chrome/content/main/about.html
index 7b2b3f5..7beea6d 100644
--- a/Open-ILS/xul/staff_client/chrome/content/main/about.html
+++ b/Open-ILS/xul/staff_client/chrome/content/main/about.html
@@ -1,7 +1,7 @@
 <html><head><script></script></head><body onload="var x = document.getElementById('version'); var version ='/xul/server/'.split(/\//)[2]; if (version == 'server') { version = 'versionless debug build'; } x.appendChild(document.createTextNode(version));">
 <h1 style="text-decoration: underline">Evergreen</h1>
 <p>Target Server ID: <span id="version"></span></p>
-<p>$HeadURL$</p>
+<p>http://git.evergreen-ils.org/?p=Evergreen.git;a=shortlog;h=refs/heads/tags/rel_2_11_rc</p>
 <h2>What is Evergreen?</h2>
 <blockquote>
 <p>
diff --git a/Open-ILS/xul/staff_client/defaults/preferences/prefs.js b/Open-ILS/xul/staff_client/defaults/preferences/prefs.js
index 0613a13..a5b50f0 100644
--- a/Open-ILS/xul/staff_client/defaults/preferences/prefs.js
+++ b/Open-ILS/xul/staff_client/defaults/preferences/prefs.js
@@ -11,7 +11,7 @@ pref("toolkit.singletonWindowType", "eg_main");
 pref("open-ils.enable_join_tabs", true);
 
 // We'll use this one to help brand some build information into the client, and rely on subversion keywords
-pref("open-ils.repository.headURL","$HeadURL$");
+pref("open-ils.repository.headURL","http://git.evergreen-ils.org/?p=Evergreen.git;a=shortlog;h=refs/heads/tags/rel_2_11_rc");
 pref("open-ils.repository.author","$Author$");
 pref("open-ils.repository.revision","$Revision$");
 pref("open-ils.repository.date","$Date$");
diff --git a/Open-ILS/xul/staff_client/windowssetup.nsi b/Open-ILS/xul/staff_client/windowssetup.nsi
index a954357..5ebcd7a 100644
--- a/Open-ILS/xul/staff_client/windowssetup.nsi
+++ b/Open-ILS/xul/staff_client/windowssetup.nsi
@@ -3,7 +3,7 @@
 ; HM NIS Edit Wizard helper defines
 ; Old versions of makensis don't like this, moved to Makefile
 ;!define /file PRODUCT_VERSION "client/VERSION"
-!define PRODUCT_TAG "Master"
+!define PRODUCT_TAG "2.11"
 !define PRODUCT_INSTALL_TAG "${PRODUCT_TAG}"
 !define UI_IMAGESET "beta"
 ;!define UI_IMAGESET "release"
diff --git a/README b/README
deleted file mode 120000
index b57451a..0000000
--- a/README
+++ /dev/null
@@ -1 +0,0 @@
-docs/installation/server_installation.txt
\ No newline at end of file
diff --git a/README b/README
new file mode 100644
index 0000000..8f7d874
--- /dev/null
+++ b/README
@@ -0,0 +1,706 @@
+Installing the Evergreen server
+===============================
+:toc:
+:numbered:
+
+Preamble: referenced user accounts
+----------------------------------
+
+In subsequent sections, we will refer to a number of different accounts, as
+follows:
+
+  * Linux user accounts:
+    ** The *user* Linux account is the account that you use to log onto the
+       Linux system as a regular user.
+    ** The *root* Linux account is an account that has system administrator
+       privileges. On Debian and Fedora you can switch to this account from
+       your *user* account by issuing the `su -` command and entering the
+       password for the *root* account when prompted. On Ubuntu you can switch
+       to this account from your *user* account using the `sudo su -` command
+       and entering the password for your *user* account when prompted.
+    ** The *opensrf* Linux account is an account that you create when installing
+       OpenSRF. You can switch to this account from the *root* account by
+       issuing the `su - opensrf` command.
+    ** The *postgres* Linux account is created automatically when you install
+       the PostgreSQL database server. You can switch to this account from the
+       *root* account by issuing the `su - postgres` command.
+  * PostgreSQL user accounts:
+    ** The *evergreen* PostgreSQL account is a superuser account that you will
+       create to connect to the PostgreSQL database server.
+  * Evergreen administrator account:
+    ** The *egadmin* Evergreen account is an administrator account for
+       Evergreen that you will use to test connectivity and configure your
+       Evergreen instance.
+
+Preamble: developer instructions
+--------------------------------
+
+[NOTE]
+Skip this section if you are using an official release tarball downloaded
+from http://evergreen-ils.org/egdownloads
+
+Developers working directly with the source code from the Git repository,
+rather than an official release tarball, must perform one step before they 
+can proceed with the `./configure` step.
+
+As the *user* Linux account, issue the following command in the Evergreen
+source directory to generate the configure script and Makefiles:
+
+[source, bash]
+------------------------------------------------------------------------------
+autoreconf -i
+------------------------------------------------------------------------------
+
+Installing prerequisites
+------------------------
+
+  * **PostgreSQL**: Version 9.3 is recommended. The minimum supported version
+    is 9.1.
+  * **Linux**: Evergreen 2.8 has been tested on Debian Jessie (8.0), 
+    Debian Wheezy (7.0), Ubuntu Xenial Xerus (16.04), 
+    Ubuntu Trusty Tahr (14.04), and Fedora. 
+    If you are running an older version of these distributions, you may want 
+    to upgrade before upgrading Evergreen. For instructions on upgrading these
+    distributions, visit the Debian, Ubuntu or Fedora websites.
+  * **OpenSRF**: The minimum supported version of OpenSRF is 2.4.0.
+
+
+Evergreen has a number of prerequisite packages that must be installed
+before you can successfully configure, compile, and install Evergreen.
+
+1. Begin by installing the most recent version of OpenSRF (2.4.0 or later).
+   You can download OpenSRF releases from http://evergreen-ils.org/opensrf-downloads/
+2. On some distributions, it is necessary to install PostgreSQL 9.1+ from external
+   repositories.
++
+  * Debian (Wheezy and Jessie) and Ubuntu (Trusty and Xenial) comes with
+    PostgreSQL 9.1+, so no additional steps are required.
+  * Fedora 19 and 20 come with PostgreSQL 9.2+, so no additional steps are required.
++
+3. On Debian and Ubuntu, run `aptitude update` as the *root* Linux account to
+   retrieve the new packages from the backports repository.
+4. Issue the following commands as the *root* Linux account to install
+   prerequisites using the `Makefile.install` prerequisite installer,
+   substituting `debian-jessie`, `debian-wheezy`, `fedora`, 
+   `ubuntu-xenial`, or `ubuntu-trusty` for <osname> below:
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>
+------------------------------------------------------------------------------
++
+5. Add the libdbi-libdbd libraries to the system dynamic library path by
+   issuing the following commands as the *root* Linux account:
++
+[NOTE]
+You should skip this step if installing on Ubuntu Trusty, Ubuntu Xenial or Debian Jessie. The Ubuntu
+and Debian Jessie targets use libdbd-pgsql from packages.
++
+.Debian Wheezy
+[source, bash]
+------------------------------------------------------------------------------
+echo "/usr/local/lib/dbd" > /etc/ld.so.conf.d/eg.conf
+ldconfig
+------------------------------------------------------------------------------
++
+.Fedora
+[source, bash]
+------------------------------------------------------------------------------
+echo "/usr/lib64/dbd" > /etc/ld.so.conf.d/eg.conf
+ldconfig
+------------------------------------------------------------------------------
+
+6. OPTIONAL: Developer additions
++
+To perform certain developer tasks from a Git source code checkout, 
+additional packages may be required.  As the *root* Linux account:
++
+ * To install packages needed for retriving and managing web dependencies,
+   use the <osname>-developer Makefile.install target.  Currently, 
+   this is only needed for building and installing the (preview) browser 
+   staff client.
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>-developer
+------------------------------------------------------------------------------
++
+ * To install packages required for building Evergreen release bundles, use
+   the <osname>-packager Makefile.install target.
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>-packager
+------------------------------------------------------------------------------
+
+Optional: Extra steps for browser-based staff client
+----------------------------------------------------
+
+[NOTE]
+Skip this entire section if you are using an official release tarball downloaded
+from http://evergreen-ils.org/downloads
+
+[NOTE]
+You make skip the subsection `Install dependencies for browser-based staff client'
+if you are installing on either Debian Jessie, Ubuntu Trusty, or Ubuntu Xenial and you have
+installed the `Optional: Developer Additions' described above.  You will still
+need to do the steps in `Install files for browser-based staff client' below.
+
+Install dependencies for browser-based staff client
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1. Install Node.js.  For more information see also:
+   https://github.com/joyent/node/wiki/installation[Node.js Installation]
++
+[source,sh]
+------------------------------------------------------------------------------
+# Go to a temporary directory
+cd /tmp
+
+# Clone the code and checkout the necessary version
+git clone https://github.com/joyent/node.git
+cd node
+git checkout -b v0.10.28 v0.10.28
+
+# set -j to the number of CPU cores on the server + 1
+./configure && make -j2 && sudo make install
+
+# update packages
+% sudo npm update
+------------------------------------------------------------------------------
++
+2. Install Grunt CLI
++
+[source,sh]
+------------------------------------------------------------------------------
+% sudo npm install -g grunt-cli
+------------------------------------------------------------------------------
++
+3. Install Bower
++
+[source,sh]
+------------------------------------------------------------------------------
+% sudo npm install -g bower
+------------------------------------------------------------------------------
+
+Install files for browser-based staff client
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1. Building, Testing, Minification: The remaining steps all take place within
+   the staff JS web root:
++
+[source,sh]
+------------------------------------------------------------------------------
+cd $EVERGREEN_ROOT/Open-ILS/web/js/ui/default/staff/
+------------------------------------------------------------------------------
++
+2. Install Project-local Dependencies. npm inspects the 'package.json' file
+   for dependencies and fetches them from the Node package network.
++
+[source,sh]
+------------------------------------------------------------------------------
+npm install   # fetch Grunt dependencies
+bower install # fetch JS dependencies
+------------------------------------------------------------------------------
++
+3. Run the build script.
++
+[source,sh]
+------------------------------------------------------------------------------
+# build, run tests, concat+minify
+grunt all
+------------------------------------------------------------------------------
+
+
+Configuration and compilation instructions
+------------------------------------------
+
+For the time being, we are still installing everything in the `/openils/`
+directory. From the Evergreen source directory, issue the following commands as
+the *user* Linux account to configure and build Evergreen:
+
+[source, bash]
+------------------------------------------------------------------------------
+PATH=/openils/bin:$PATH ./configure --prefix=/openils --sysconfdir=/openils/conf
+make
+------------------------------------------------------------------------------
+
+These instructions assume that you have also installed OpenSRF under `/openils/`.
+If not, please adjust PATH as needed so that the Evergreen `configure` script
+can find `osrf_config`.
+
+Installation instructions
+-------------------------
+
+1. Once you have configured and compiled Evergreen, issue the following
+   command as the *root* Linux account to install Evergreen, build the server
+   portion of the staff client, and copy example configuration files to
+   `/openils/conf`.
+   Change the value of the `STAFF_CLIENT_STAMP_ID` variable to match the version
+   of the staff client that you will use to connect to the Evergreen server.
++
+[source, bash]
+------------------------------------------------------------------------------
+make STAFF_CLIENT_STAMP_ID=rel_2_11_rc install
+------------------------------------------------------------------------------
++
+2. The server portion of the staff client expects `http://hostname/xul/server`
+   to resolve. Issue the following commands as the *root* Linux account to
+   create a symbolic link pointing to the `server` subdirectory of the server
+   portion of the staff client that we just built using the staff client ID
+   'rel_name':
++
+[source, bash]
+------------------------------------------------------------------------------
+cd /openils/var/web/xul
+ln -sf rel_name/server server
+------------------------------------------------------------------------------
+
+Change ownership of the Evergreen files
+---------------------------------------
+
+All files in the `/openils/` directory and subdirectories must be owned by the
+`opensrf` user. Issue the following command as the *root* Linux account to
+change the ownership on the files:
+
+[source, bash]
+------------------------------------------------------------------------------
+chown -R opensrf:opensrf /openils
+------------------------------------------------------------------------------
+
+Additional Instructions for Developers
+--------------------------------------
+
+[NOTE]
+Skip this section if you are using an official release tarball downloaded
+from http://evergreen-ils.org/egdownloads
+
+Developers working directly with the source code from the Git repository,
+rather than an official release tarball, need to install the Dojo Toolkit
+set of JavaScript libraries. The appropriate version of Dojo is included in
+Evergreen release tarballs. Developers should install the Dojo 1.3.3 version
+of Dojo by issuing the following commands as the *opensrf* Linux account:
+
+[source, bash]
+------------------------------------------------------------------------------
+wget http://download.dojotoolkit.org/release-1.3.3/dojo-release-1.3.3.tar.gz
+tar -C /openils/var/web/js -xzf dojo-release-1.3.3.tar.gz
+cp -r /openils/var/web/js/dojo-release-1.3.3/* /openils/var/web/js/dojo/.
+------------------------------------------------------------------------------
+
+
+Configure the Apache Web server
+-------------------------------
+
+1. Use the example configuration files in `Open-ILS/examples/apache/` (for
+Apache versions below 2.4) or `Open-ILS/examples/apache_24/` (for Apache
+versions 2.4 or greater) to configure your Web server for the Evergreen
+catalog, staff client, Web services, and administration interfaces. Issue the
+following commands as the *root* Linux account:
++
+.Debian Wheezy
+[source,bash]
+------------------------------------------------------------------------------
+cp Open-ILS/examples/apache/eg.conf       /etc/apache2/sites-available/
+cp Open-ILS/examples/apache/eg_vhost.conf /etc/apache2/
+cp Open-ILS/examples/apache/eg_startup    /etc/apache2/
+# Now set up SSL
+mkdir /etc/apache2/ssl
+cd /etc/apache2/ssl
+------------------------------------------------------------------------------
++
+.Ubuntu Trusty, Ubuntu Xenial, and Debian Jessie
+[source,bash]
+------------------------------------------------------------------------------------
+cp Open-ILS/examples/apache_24/eg_24.conf       /etc/apache2/sites-available/eg.conf
+cp Open-ILS/examples/apache_24/eg_vhost_24.conf /etc/apache2/eg_vhost.conf
+cp Open-ILS/examples/apache/eg_startup    	/etc/apache2/
+# Now set up SSL
+mkdir /etc/apache2/ssl
+cd /etc/apache2/ssl
+------------------------------------------------------------------------------------
++
+.Fedora
+[source,bash]
+------------------------------------------------------------------------------
+cp Open-ILS/examples/apache_24/eg_24.conf       /etc/httpd/conf.d/
+cp Open-ILS/examples/apache_24/eg_vhost_24.conf /etc/httpd/eg_vhost.conf
+cp Open-ILS/examples/apache/eg_startup          /etc/httpd/
+# Now set up SSL
+mkdir /etc/httpd/ssl
+cd /etc/httpd/ssl
+------------------------------------------------------------------------------
++
+2. The `openssl` command cuts a new SSL key for your Apache server. For a
+production server, you should purchase a signed SSL certificate, but you can
+just use a self-signed certificate and accept the warnings in the staff client
+and browser during testing and development. Create an SSL key for the Apache
+server by issuing the following command as the *root* Linux account:
++
+[source,bash]
+------------------------------------------------------------------------------
+openssl req -new -x509 -days 365 -nodes -out server.crt -keyout server.key
+------------------------------------------------------------------------------
++
+3. As the *root* Linux account, edit the `eg.conf` file that you copied into
+place.
+  a. To enable access to the offline upload / execute interface from any
+     workstation on any network, make the following change (and note that
+     you *must* secure this for a production instance):
+     * (Apache 2.2): Replace `Allow from 10.0.0.0/8` with `Allow from all`
+     * (Apache 2.4): Replace `Require host 10.0.0.0/8` with `Require all granted`
+  b. (Fedora): Change references from the non-existent `/etc/apache2/` directory
+     to `/etc/httpd/`.
+4. Change the user for the Apache server.
+  * (Debian and Ubuntu): As the *root* Linux account, edit
+    `/etc/apache2/envvars`.  Change `export APACHE_RUN_USER=www-data` to 
+    `export APACHE_RUN_USER=opensrf`.
+  * (Fedora): As the *root* Linux account , edit `/etc/httpd/conf/httpd.conf`.
+    Change `User apache` to `User opensrf`.
+5. Configure Apache with performance settings appropriate for Evergreen:
+  * (Debian and Ubuntu): As the *root* Linux account, edit
+    `/etc/apache2/apache2.conf`:
+  * (Fedora): As the *root* Linux account, edit `/etc/httpd/conf/httpd.conf`:
+    a. Change `KeepAliveTimeout` to `1`. Higher values reduce the chance of
+       a request timing out unexpectedly, but increase the risk of using up
+       all available Apache child processes.
+    b. 'Optional': Change `MaxKeepAliveRequests` to `100`
+    c. (Debian Wheezy and Fedora) Update the prefork configuration 
+       section to suit your environment. The following settings apply to a busy 
+       system:
++
+[source,bash]
+------------------------------------------------------------------------------
+<IfModule mpm_prefork_module>
+   StartServers           20
+   MinSpareServers         5
+   MaxSpareServers        15
+   MaxClients            150
+   MaxRequestsPerChild 10000
+</IfModule>
+------------------------------------------------------------------------------
+    d. (Ubuntu Trusty, Ubuntu Xenial, Debian Jessie) As the *root* user, edit 
+       /etc/apache2/mods-available/mpm_prefork.conf to match the above values.  
+       Then, also as the *root* user, enable the mpm_prefork module by doing:
++
+[source,bash]
+------------------------------------------------------------------------------
+a2dismod mpm_event
+a2enmod mpm_prefork
+------------------------------------------------------------------------------
++
+6. (Fedora): As the *root* Linux account, edit the `/etc/httpd/eg_vhost.conf`
+   file to change references from the non-existent `/etc/apache2/` directory
+   to `/etc/httpd/`.
+7. (Debian Wheezy): As the *root* Linux account, enable the Evergreen site:
++
+[source,bash]
+------------------------------------------------------------------------------
+a2dissite default  # OPTIONAL: disable the default site (the "It Works" page)
+a2ensite eg.conf
+------------------------------------------------------------------------------
++
+(Ubuntu Trusty, Ubuntu Xenial, Debian Jessie):
++
+[source,bash]
+------------------------------------------------------------------------------
+a2dissite 000-default  # OPTIONAL: disable the default site (the "It Works" page)
+a2ensite eg.conf
+------------------------------------------------------------------------------
++
+8. (Ubuntu): As the *root* Linux account, enable Apache to write
+   to the lock directory; this is currently necessary because Apache
+   is running as the `opensrf` user:
++
+[source,bash]
+------------------------------------------------------------------------------
+chown opensrf /var/lock/apache2
+------------------------------------------------------------------------------
++
+9. Learn more about additional Apache options in the following sections:
+  * <<_apache_rewrite_tricks,Apache Rewrite Tricks>>
+  * <<_apache_access_handler_perl_module,Apache Access Handler Perl Module>>
+
+Configure OpenSRF for the Evergreen application
+-----------------------------------------------
+There are a number of example OpenSRF configuration files in `/openils/conf/`
+that you can use as a template for your Evergreen installation. Issue the
+following commands as the *opensrf* Linux account:
+
+[source, bash]
+------------------------------------------------------------------------------
+cp -b /openils/conf/opensrf_core.xml.example /openils/conf/opensrf_core.xml
+cp -b /openils/conf/opensrf.xml.example /openils/conf/opensrf.xml
+------------------------------------------------------------------------------
+
+When you installed OpenSRF, you created four Jabber users on two
+separate domains and edited the `opensrf_core.xml` file accordingly. Please
+refer back to the OpenSRF README and, as the *opensrf* Linux account, edit the
+Evergreen version of the `opensrf_core.xml` file using the same Jabber users
+and domains as you used while installing and testing OpenSRF.
+
+[NOTE]
+The `-b` flag tells the `cp` command to create a backup version of the
+destination file. The backup version of the destination file has a tilde (`~`)
+appended to the file name, so if you have forgotten the Jabber users and
+domains, you can retrieve the settings from the backup version of the files.
+
+`eg_db_config`, described in the following section, sets the database
+connection information in `opensrf.xml` for you.
+
+Creating the Evergreen database
+-------------------------------
+
+Setting up the PostgreSQL server
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For production use, most libraries install the PostgreSQL database server on a
+dedicated machine. Therefore, by default, the `Makefile.install` prerequisite
+installer does *not* install the PostgreSQL 9 database server that is required
+by every Evergreen system. You can install the packages required by Debian or
+Ubuntu on the machine of your choice using the following commands as the
+*root* Linux account:
+
+.(Debian / Ubuntu / Fedora) Installing PostgreSQL server packages
+
+Each OS build target provides the postgres server installation packages
+required for each operating system.  To install Postgres server packages, 
+use the make target 'postgres-server-<OSTYPE>'.  Choose the most appropriate 
+command below based on your operating system.
+
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-jessie
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-wheezy
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-trusty
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-xenial
+make -f Open-ILS/src/extras/Makefile.install postgres-server-fedora
+------------------------------------------------------------------------------
+
+.(Fedora) Postgres initialization
+
+Installing Postgres on Fedora also requires you to initialize the PostgreSQL
+cluster and start the service. Issue the following commands as the *root* user:
+
+[source, bash]
+------------------------------------------------------------------------------
+postgresql-setup initdb
+systemctl start postgresql
+------------------------------------------------------------------------------
+
+For a standalone PostgreSQL server, install the following Perl modules for your
+distribution as the *root* Linux account:
+
+.(Debian Wheezy, Ubuntu Trusty, and Ubuntu Xenial) 
+No extra modules required for these distributions.
+
+.(Fedora)
+[source, bash]
+------------------------------------------------------------------------------
+cpan Rose::URI
+------------------------------------------------------------------------------
+
+You need to create a PostgreSQL superuser to create and access the database.
+Issue the following command as the *postgres* Linux account to create a new
+PostgreSQL superuser named `evergreen`. When prompted, enter the new user's
+password:
+
+[source, bash]
+------------------------------------------------------------------------------
+createuser -s -P evergreen
+------------------------------------------------------------------------------
+
+.Enabling connections to the PostgreSQL database
+
+Your PostgreSQL database may be configured by default to prevent connections,
+for example, it might reject attempts to connect via TCP/IP or from other
+servers. To enable TCP/IP connections from localhost, check your `pg_hba.conf`
+file, found in the `/etc/postgresql/` directory on Debian and Ubuntu, and in
+the `/var/lib/pgsql/data/` directory on Fedora. A simple way to enable TCP/IP
+connections from localhost to all databases with password authentication, which
+would be suitable for a test install of Evergreen on a single server, is to
+ensure the file contains the following entries _before_ any "host ... ident"
+entries:
+
+------------------------------------------------------------------------------
+host    all             all             ::1/128                 md5
+host    all             all             127.0.0.1/32            md5
+------------------------------------------------------------------------------
+
+When you change the `pg_hba.conf` file, you will need to reload PostgreSQL to
+make the changes take effect.  For more information on configuring connectivity
+to PostgreSQL, see
+http://www.postgresql.org/docs/devel/static/auth-pg-hba-conf.html
+
+Creating the Evergreen database and schema
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Once you have created the *evergreen* PostgreSQL account, you also need to
+create the database and schema, and configure your configuration files to point
+at the database server. Issue the following command as the *root* Linux account
+from inside the Evergreen source directory, replacing <user>, <password>,
+<hostname>, <port>, and <dbname> with the appropriate values for your
+PostgreSQL database (where <user> and <password> are for the *evergreen*
+PostgreSQL account you just created), and replace <admin-user> and <admin-pass>
+with the values you want for the *egadmin* Evergreen administrator account:
+
+[source, bash]
+------------------------------------------------------------------------------
+perl Open-ILS/src/support-scripts/eg_db_config --update-config \
+       --service all --create-database --create-schema --create-offline \
+       --user <user> --password <password> --hostname <hostname> --port <port> \
+       --database <dbname> --admin-user <admin-user> --admin-pass <admin-pass>
+------------------------------------------------------------------------------
+
+This creates the database and schema and configures all of the services in
+your `/openils/conf/opensrf.xml` configuration file to point to that database.
+It also creates the configuration files required by the Evergreen `cgi-bin`
+administration scripts, and sets the user name and password for the *egadmin*
+Evergreen administrator account to your requested values.
+
+You can get a complete set of options for `eg_db_config` by passing the
+`--help` parameter.
+
+Loading sample data
+~~~~~~~~~~~~~~~~~~~
+If you add the `--load-all-sample` parameter to the `eg_db_config` command,
+a set of authority and bibliographic records, call numbers, copies, staff
+and regular users, and transactions will be loaded into your target
+database. This sample dataset is commonly referred to as the _concerto_
+sample data, and can be useful for testing out Evergreen functionality and
+for creating problem reports that developers can easily recreate with their
+own copy of the _concerto_ sample data.
+
+Creating the database on a remote server
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+In a production instance of Evergreen, your PostgreSQL server should be
+installed on a dedicated server.
+
+PostgreSQL 9.1 and later
+^^^^^^^^^^^^^^^^^^^^^^^^
+To create the database instance on a remote database server running PostgreSQL
+9.1 or later, simply use the `--create-database` flag on `eg_db_config`.
+
+Starting Evergreen
+------------------
+1. As the *root* Linux account, start the `memcached` and `ejabberd` services
+(if they aren't already running):
++
+[source, bash]
+------------------------------------------------------------------------------
+/etc/init.d/ejabberd start
+/etc/init.d/memcached start
+------------------------------------------------------------------------------
++
+2. As the *opensrf* Linux account, start Evergreen. The `-l` flag in the
+following command is only necessary if you want to force Evergreen to treat the
+hostname as `localhost`; if you configured `opensrf.xml` using the real
+hostname of your machine as returned by `perl -ENet::Domain 'print
+Net::Domain::hostfqdn() . "\n";'`, you should not use the `-l` flag.
++
+[source, bash]
+------------------------------------------------------------------------------
+osrf_control -l --start-all
+------------------------------------------------------------------------------
++
+  ** If you receive the error message `bash: osrf_control: command not found`,
+     then your environment variable `PATH` does not include the `/openils/bin`
+     directory; this should have been set in the *opensrf* Linux account's
+     `.bashrc` configuration file. To manually set the `PATH` variable, edit the
+     configuration file `~/.bashrc` as the *opensrf* Linux account and add the
+     following line:
++
+[source, bash]
+------------------------------------------------------------------------------
+export PATH=$PATH:/openils/bin
+------------------------------------------------------------------------------
++
+3. As the *opensrf* Linux account, generate the Web files needed by the staff
+   client and catalogue and update the organization unit proximity (you need to do
+   this the first time you start Evergreen, and after that each time you change the library org unit configuration.
+):
++
+[source, bash]
+------------------------------------------------------------------------------
+autogen.sh
+------------------------------------------------------------------------------
++
+4. As the *root* Linux account, restart the Apache Web server:
++
+[source, bash]
+------------------------------------------------------------------------------
+/etc/init.d/apache2 restart
+------------------------------------------------------------------------------
++
+If the Apache Web server was running when you started the OpenSRF services, you
+might not be able to successfully log in to the OPAC or staff client until the
+Apache Web server is restarted.
+
+Testing connections to Evergreen
+--------------------------------
+
+Once you have installed and started Evergreen, test your connection to
+Evergreen via `srfsh`. As the *opensrf* Linux account, issue the following
+commands to start `srfsh` and try to log onto the Evergreen server using the
+*egadmin* Evergreen administrator user name and password that you set using the
+`eg_db_config` command:
+
+[source, bash]
+------------------------------------------------------------------------------
+/openils/bin/srfsh
+srfsh% login <admin-user> <admin-pass>
+------------------------------------------------------------------------------
+
+You should see a result like:
+
+    Received Data: "250bf1518c7527a03249858687714376"
+    ------------------------------------
+    Request Completed Successfully
+    Request Time in seconds: 0.045286
+    ------------------------------------
+
+    Received Data: {
+       "ilsevent":0,
+       "textcode":"SUCCESS",
+       "desc":" ",
+       "pid":21616,
+       "stacktrace":"oils_auth.c:304",
+       "payload":{
+          "authtoken":"e5f9827cc0f93b503a1cc66bee6bdd1a",
+          "authtime":420
+       }
+
+    }
+
+    ------------------------------------
+    Request Completed Successfully
+    Request Time in seconds: 1.336568
+    ------------------------------------
+[[install-troubleshooting-1]]
+If this does not work, it's time to do some troubleshooting.
+
+  * As the *opensrf* Linux account, run the `settings-tester.pl` script to see
+    if it finds any system configuration problems. The script is found at
+    `Open-ILS/src/support-scripts/settings-tester.pl` in the Evergreen source
+    tree.
+  * Follow the steps in the http://evergreen-ils.org/dokuwiki/doku.php?id=troubleshooting:checking_for_errors[troubleshooting guide].
+  * If you have faithfully followed the entire set of installation steps
+    listed here, you are probably extremely close to a working system.
+    Gather your configuration files and log files and contact the
+    http://evergreen-ils.org/communicate/mailing-lists/[Evergreen development 
+mailing list] for assistance before making any drastic changes to your system
+    configuration.
+
+Getting help
+------------
+
+Need help installing or using Evergreen? Join the mailing lists at
+http://evergreen-ils.org/communicate/mailing-lists/ or contact us on the Freenode
+IRC network on the #evergreen channel.
+
+License
+-------
+This work is licensed under the Creative Commons Attribution-ShareAlike 3.0
+Unported License. To view a copy of this license, visit
+http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative
+Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
diff --git a/configure.ac b/configure.ac
index 74e6b3b..d0b0d29 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,8 +20,8 @@
 
 export PATH=${PATH}:/usr/sbin
 AC_PREREQ(2.61)
-AC_INIT(Open-ILS, trunk, open-ils-dev at list.georgialibraries.org)
-AM_INIT_AUTOMAKE([OpenILS], [trunk])
+AC_INIT(Open-ILS, 2.11.rc, open-ils-dev at list.georgialibraries.org)
+AM_INIT_AUTOMAKE([OpenILS], [2.11.rc])
 AC_REVISION($Revision: 0.1 $)
 AC_CONFIG_SRCDIR([configure.ac])
 AC_CONFIG_SUBDIRS([Open-ILS/xul/staff_client/external/libmar])

commit e8717537d36741b38dd92d613f722a10e4e56a33
Author: Dan Wells <dbw2 at calvin.edu>
Date:   Thu Aug 25 18:08:07 2016 -0400

    Update release notes
    
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>

diff --git a/docs/RELEASE_NOTES_2_11.adoc b/docs/RELEASE_NOTES_2_11.adoc
new file mode 100644
index 0000000..2df24b1
--- /dev/null
+++ b/docs/RELEASE_NOTES_2_11.adoc
@@ -0,0 +1,522 @@
+Evergreen 2.11.rc Release Notes
+===============================
+:toc:
+:numbered:
+
+Upgrade notes
+-------------
+
+New Features
+------------
+
+
+
+Administration
+~~~~~~~~~~~~~~
+
+
+
+Add Date Header to Action Trigger Email/SMS Templates
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The Date: header specified in RFC 2822 has been added to the seed data
+for the example Action Trigger email and SMS templates, but no attempt
+has been made to automatically modify existing templates. To add this
+header (and end any "Why are my library emails from 1969/70?" questions
+you may have heard) make sure the following lines are in all templates
+that use the SendEmail or SendSMS reactors:
+
+The first is already in most sample templates, but you may need to add
+it to the top of any custom templates:
+`[%- USE date -%]`
+
+And this line should be inserted into the header block of each template:
+`Date: [%- date.format(date.now, '%a, %d %b %Y %T -0000', gmt => 1) %]`
+
+
+
+
+
+Tablefunc Extension No Longer Required
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Changes in the behavior of the connectby function in PostgreSQL 9.5
+have prompted its removal from the database.  It is easier for
+Evergreen to maintain compatibility with previous versions of
+PostgreSQL without this function.
+
+By eliminating the use of the connectby function, we eliminate the
+requirement for the tablefunc database extension.  It is no longer
+installed when the database is created.  If you are upgrading and wish
+to remove it from your database, you may run the following statement
+in the database to drop it:
+
+ DROP EXTENSION tablefunc;
+
+
+
+
+
+Purge User Activity
+^^^^^^^^^^^^^^^^^^^
+
+User activity types are now set to transient by default for new
+Evergreen installs..  This means only the most recent activity entry per
+user per activity type is retained in the database.
+
+This change does not affect existing activity types, which were set to
+non-transient by default.  To make an activity type transient, modify the
+'Transient' field of the desired type in the staff client under Admin -> 
+Server Administration -> User Activity Types.
+
+Setting an activity type to transient means data for a given user will
+be cleaned up automatically if and when the user performs the activity
+in question.  However, administrators can also force an activity
+cleanup via SQL.  This is useful for ensuring that all old activity
+data is deleted and for controlling when the cleanup occurs, which 
+may be useulf on very large actor.usr_activity tables.
+
+To force clean all activity types:
+
+[source,sql]
+------------------------------------------------------------
+SELECT actor.purge_usr_activity_by_type(etype.id)
+    FROM config.usr_activity_type etype;
+------------------------------------------------------------
+
+NOTE: This could take hours to run on a very large actor.usr_activity table.
+
+
+
+
+
+Cataloging
+~~~~~~~~~~
+
+
+
+Authority Record Import Updates Editor, Edit Date.
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Importing an authority record via MARC Batch Import/Export now causes the 
+authority record's editor and edit_date fields to be updated.  The editor
+value may come from the MARC 905u field or, if none is present, the user 
+performing the import.
+
+
+
+
+Authority Propagation Updates Bib Editor / Edit Date
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+When a bib record is automatically updated as a result of the
+modification of a linked authority record, the bib record's "Last Edit
+Data/Time" and "Last Editing User" fields will be updated to match the
+time of the update and the editor of the modified authority record.
+
+A new global flag is available to control this behavior called
+'ingest.disable_authority_auto_update_bib_meta' ("Authority Automation:
+Disable automatic authority updates from modifying bib record editor
+and edit_date").  When enabled, theses fields will not be updated.  By
+default, this setting is disabled.
+
+An additional speed improvement is included in this feature.  No attempt
+will be made to update linked bib records when the normalized heading of
+the modified authority record is unchanged by the authority record update.
+
+
+
+
+Bibliographic record source now copied to 901$s
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+If a bibliographic record has a source set, the name of that source
+is now copied to the 901$s whenever the record is created or updated.
+This allows the source to be used for record matching and MARC
+field queries.
+
+
+
+
+Selectable Bibliographic Source Update
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+During vandelay, the bib source has always recorded the record source,
+the time of the update and the identity of the user associated with the 
+operation.  This is not really desired for match-only merges.
+
+This feature provides a way to control whether the bib source data 
+is updated or not.
+
+In MARC Import, select the "Merge / Overlay" tab.  Each entry in the table has 
+a value in the new "Update bib. source" column. If that value is "true", then 
+the bib source data will be updated.
+
+The two system-defined entries have been pre-set to appropriate values (Full Overlay = true;
+Match-Only Merge = false).
+
+
+
+
+Circulation
+~~~~~~~~~~~
+
+
+
+Staff Client Honors Aged Circulations
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The browser and XUL clients now better represent copy checkout history 
+by honoring and displaying information from aged circulations.  
+
+ * Browser client 'Recent Circ History' and the analogous XUL client 
+   'Circulation History' tabs show summary data for aged circulations
+   as well as regular/active circulations.  When aged circulation data
+   is displayed, any references to patron names are replaced by the string
+   "<Aged Circulation>".
+
+ * Browser client 'Circ History List' and the analogous XUL client 
+   'Last Few Circulations' tabs behave as above, plus their 'Add 
+   Billing' buttons are disabled when displaying aged circulation data.
+
+ * XUL client 'Retrieve Last Patron' actions from various UI's report, 
+   "Item XXX circulation is an aged circulation and has no linked user".
+   Browser client analog uses 'Circ History List' instead, no additional
+   changes required.
+
+
+
+
+
+"Canceled Transit" Item Status
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Previously, when a transit was aborted, the transited item would either go into
+"Reshelving" status or would return to whatever status it was in when it went
+into transit, even when the item itself was in a different status (including
+"Checked out").  Now, for most transits that get aborted, the item is put into a 
+new status, "Canceled Transit", which signals to staff the actual state of the
+item.  This feature only affects items with a status of "In transit" and does
+not affect items that were in the following statuses at the time they were sent
+into transit:
+
+* Bindery
+* Lost
+* Missing
+* On order
+* ILL
+* Damaged
+* Long Overdue
+* Lost and Paid
+* Any custom statuses
+
+This change should help clear up confusing situations caused by the previous
+"abort transit" behavior, such as items showing "Available" when they are actually
+en route, and patrons' items mysteriously disappearing from their accounts and
+showing "Available" at the item-owning library without evidence of check-in.
+
+
+
+
+Copy Status "Is Available" Flag
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Adds a new boolean field for copy statuses to indicate when copies having
+a given status should be considered available.  The field has 2 main effects:
+
+1. Checking out an "available" copy will no longer result in an override-able
+   "COPY_NOT_AVAILABLE" alert for staff.  The copy will checkout without 
+   status warnings.
+
+2. "Available" copies will appear in catalog searches where "limit to
+   available" is selected as a search filter.
+
+By default, the "Available" and "Reshelving" statuses have the "Is Available" 
+flag set.  The flag may be applied to local/custom statues via the copy
+status admin interface.
+
+
+
+
+
+Email Checkout Receipts
+^^^^^^^^^^^^^^^^^^^^^^^
+This feature allows patrons to receive checkout receipts through email
+at the circulation desk and in the Evergreen self-checkout interface.
+Patrons need to opt in to receive email receipts by default and must
+have an email address associated with their account. Opt in can be staff
+mediated at the time of account creation or in existing accounts.
+Patrons can also opt in directly in their OPAC account or through patron
+self-registration. This feature does not affect the behavior of
+checkouts from SIP2 devices.
+
+Patrons can opt in to receipt email checkout receipts by default via
+a new "Email checkout reciepts by default" patron setting.
+
+This feature also enhances the patron staging tables so that patron
+settings can be chosen during self-registration.
+
+The web staff interface's checkout screen now includes a "Quick
+Receipt" button that allows staff members to generate a receipt
+at any time.
+
+
+
+
+Set Per-OU Limits on Allowed Payment Amounts
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Two new OU Settings have been added to prevent clerks
+from accidentally clearing all patron bills by scanning
+a barcode into the Payment Amount field, or accidentally
+entering the amount without a decimal point (such as you
+would when using a cash register).
+
+The first setting is the amount above which staff will
+be asked if they're sure they want to apply the payment,
+the second is the maximum amount of money that can be
+accepted through the staff client.
+
+These settings only effect the staff client, not credit
+cards accepted through the OPAC, or direct API calls
+from third party tools.
+
+
+
+
+Client
+~~~~~~
+
+
+
+Additional Fields Available for Display in Some Interfaces
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The holds age protection field will now be available for display in the
+following interfaces:
+
+* Item status list view column picker
+* Item status alternate view
+* Holdings maintenance column picker
+
+The asset.copy.cost field, which records the amount paid for an item when
+an invoice is processed, will be available for display in the following
+interfaces:
+
+* Items status list view column picker
+* Item status alternate view
+* Copy editor
+
+
+
+
+
+OPAC
+~~~~
+
+
+
+Merge Notification Preferences Tables in TPAC
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The patron notification preference page in the public catalog
+used to have two tables, separating notification settings
+based on their source. Since that distinction does not matter
+to patrons, and since the two tables aren't styled consistently,
+they are merged together.
+
+
+
+
+Improved Holds Screens in My Account
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The grids in the My Account _Items on Hold_ and _Holds History_ interfaces are
+simplified. Data previously contained in their own Activate, Active, and Date
+Fulfilled columns are now incorporated into the Status columns. To further
+declutter the interface, the holds queue position will only show when the user
+most needs the information - before the hold has been captured. 
+
+Distinct CSS classes have also been added for each hold status and each date
+that could potentially display in these holds interfaces. A new default style
+highlights the *Available* status in green and the *Suspended* status
+in red.
+
+
+
+
+
+
+Statistically generated Record Ratings (Popularity)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Summary 
++++++++
+
+For the purpose of supplying non-bibliographic popularity adjustment to the ranking of search results, this feature implements a set of statistical modelling algorithms which will identify bibliographic records of particular note based on derivable parameters.
+
+Generally, factors such as to circulation and hold activity, record and item age, and item ownership counts will available for statistical consideration. Each factor will embody a "popularity badge" that the bibliographic record can earn, and each badge will have a 5-point scale, where more points indicates a more popular record.  The average of the badge points earned by each record will constitute a "popularity rating". The number and types of badges will break ties for average popularity, and relevance will sort items with like popularity. 
+
+A new sort axis of *Popularity* is created to sort first on the weighted average popularity of each record, followed by the query-specific relevance available today.  A new option is created in the dropdown that sorts on the combination of "activity metric" (aka badge ranking, aka popularity) first and the existing, stock relevance ranking when those are equal.  For instance, given two records that both have a badge ranking of "4.5", they will be sorted in the order of the query relevance ranking that is calculated today as a tie breaker.  Those two records will sort above other records with lower badge rankings regardless of what today's relevance ranking says about them.
+
+In addition, a new sort axis of *Popularity and Relevance* is created that augments the normal Relevance sort with a normalized popularity value by multiplying the base relevance by a value controlled by a new global flag, generally set to a decimal number between 1 and 2.
+
+Finally, there will continue to be a pure *Relevance* sort option, which is the version that exists today.
+
+A global flag will allow the selection of the default sort axis.
+
+
+The basics
+++++++++++
+
+There will exist two classes of non-bibliographic popularity badge: point-in-time popularity, such as the number of items held or the number of open hold requests; and temporal popularity, such as circulations over the past two years or hold requests placed over the last six months.
+
+Each popularity badge will have a definition.  The badge's value are calculated for each bibliographic record within the definition's bibliographic population.  The population circumscribes the bibliographic records that are eligible to receive the badge.  Each record within the population of a badge definition will receive a ranking adjustment, based on its "popularity rating" if the appropriate thresholds are met.
+
+The set of existing popularity badges is displayed as a grid.  A library selector defaulting to the workstation location will allow scoping the grid contents to specific organizational units.  Creating or editing a badge is performed within a dedicated modal popup interface that will float above the grid, disabling access to the underlying interface until the action is completed or canceled.
+
+All popularity badge definitions will describe a set of configuration, population criteria, and statistical constraints:
+
+* *Badge Name:* The administrator-assigned name of the popularity badge definition.  This is presented as a text input box, and the value is used in the OPAC.
+* *Scope:* The owning org unit of the badge.  Badges are cumulative, and are included in ranking when the Scope is equal to, or an ancestor of, the search location.  Therefore branch-specific searches will include branch, system and consortium badges, but consortium-wide searches will only make use of consortium-scoped badges.  For item-specific metrics, this also limits the population of the statistical group to those records having items whose owning library is at or below the Scope in the org tree.  This is presented as a standard Library selector.
+* *Weight:* A multiplier defining the importance of this particular badge in relation to any other badges that might be earned by a record.  This is presented as a number spinner with a default and minimum value of 1.
+* *Recalculation Interval:* How often to recalculate the badge's popularity value for each record.  For temporal popularity badges that may change quickly, such as in-house use or short-duration circulation-over-time, this may be nightly.  For slowly changing metrics such as count of items held, this may be monthly or quarterly. This is presented as a text input that will accept an interval string such as "2 years", "30 days", or "6 weeks, 2 days".  Numeric values without a timespan qualifier are considered to be a number of seconds.  For newer items that may have rapidly changing metrics, a mechanism is created to adjust the "last calculated date" so that library staff can clear the date and force a recalculation overnight. However, because the badge value each record receives is relative to all the other records in the population, the badge as a whole will need to be recalculated. This feature stores individual record raw stats, where possible and reasonable, to speed up r
 ecalculation.
+* *Population Filters:* Optional, and any combination may be used.
+** *Attribute Filter:* Filter bibliographic record population based on record attributes.  This will use an interface similar to the Composite Attribute editor.
+** *Bibliographic Source:* Filter bibliographic records to those with a specific source.  This is presented as a dropdown of sources.
+** *Circulation Modifier Filter:* Include only those items that make use of certain Circulation Modifiers in statistical calculations. This is only applicable to item-related badges.  This is presented as a dropdown of modifiers.
+** *Copy Location Group:* Include only those items that are assigned to shelving locations within specific location groups. This is only applicable to item-related badges.  This is presented as a dropdown of location groups available within the Scope for the badge.
+* *Popularity Parameter:* One of a set of predefined types of popularity measure.  This is presented as a dropdown.  These will include, but may not be limited to:
+** Holds Filled Over Time
+** Holds Requested Over Time
+** Current Hold Count
+** Circulations Over Time
+** Current Circulation Count
+** Out/Total Ratio
+** Holds/Total Ratio
+** Holds/Holdable Ratio
+** Percent of Time Circulating -- Of the time between the active date of the copies on the record and the badge calculation time, the percentage of that time during which the items have been checked out.  This is meant to be an indicator of high-demand over the lifetime of the title, and not just a temporary spike in circ count for, say, a book club or school report.  Recent temporary spikes can be represented by circs over time with a time horizon.  It's the difference between an "always popular" title and a "just recently popular" title.
+** Bibliographic Record Age (days)
+** Publication Age (days)
+** Available On-Line (for e-books, etc)
+** Copy Count
+* *Fixed Rating:* An optional override supplying a fixed popularity value for all records earning this badge.  For some popularity types, such as "Available On-Line", it is preferable to specify, rather than calculate, the popularity value for a badge.  This is presented as a number spinner with a value ranging from 1 to 5.
+* *Inclusion Threshold Percentile:* Cumulative distribution percentile.  This is presented as a number spinner of "percentile" values ranging from 50 to 100, indicating the number of how much of the population a record's score must be better than in order to earn the badge.  Leaving this value unset will allow the entire population to earn the badge.
+* *Discard most common:* A value that, if greater than 0, will ignore records with extremely common values so that outliers are more readily identified, and the distribution of values can be assumed to be more normal.  Many popularity parameters, such as those for circulation counts, benefit from this input filter.  This is presented as a number spinner initially set to 0 that indicates the number of distinct, low values -- but not the values themselves -- to exclude from the population.
+
+This new feature comes with a starter badge based on the top 97th percentile of holds requested over the past five years.
+
+A word about Inclusion Threshold Percentile
++++++++++++++++++++++++++++++++++++++++++++
+
+In order to limit the amount of data that must be retained and queried during normal search operations, to allow limiting the popular population to truly exceptional records when appropriate, and to limit the speed cost of popularity ranking, many popularity types will provide thresholds that must be passed in order to store a record's badge-specific popularity value.
+
+The administrator will be presented with a choice of "percentile" that defines the threshold which must be crossed before the value of the variable for any given record is considered statistically significant, and therefore scaled and included in ranking.  For instance, a record may need to be in the 95th percentile for Holds/Total Items before it is considered "popular" and the badge is earned.
+
+Additionally, in order to normalize populations that exhibit a "long tail" effect, such as for circulation counts were most records will have a very low number of events, the administrator will be able to instruct the algorithm to ignore the most common low values.
+
+Type-specific input modifications
++++++++++++++++++++++++++++++++++
+
+For temporal popularity badges, two time-horizons are required.  The first is the inclusion horizon, or the age at which events are no longer considered.  This will allow, for instance, limiting circulation calculations to only the past two years.  The second is the importance aging horizon, which will allow recent events to be considered more important than those further in the past.   A value of zero for this horizon will mean that all events are seen to be of equal importance.  These are presented as text inputs that will accept interval strings such as "2 years", "30 days", or "6 weeks, 2 days".  Numeric values without a timespan qualifier are considered to be a number of seconds.
+
+For those badges that have the Fixed Rating flag set, no statistical input is gathered for records in the population of the badge definition.  Instead, all records in the population are assigned this fixed value for the badge.
+
+Rating process
+++++++++++++++
+
+For badges other than those with the Fixed Rating set, the collected statistical input parameters are used to derive the mean, median, mode, min, max, and standard deviation values for the bibliographic record population. Each record passing the requisite thresholds are assigned a badge-specific value based on the quintile into which the value falls.  This value, interpreted as a one-to-five rating, is stored for static application, instead of being calculated on the fly, when the badge is in scope and the record is part of a search result set.  Thus records with values in the bottom quintile will have a rating of one, and records with values in the top quintile will have a rating of five.
+
+All badge values for all records are calculated by a secondary process that runs in the background on the server on a regular basis.
+
+Display in the OPAC
++++++++++++++++++++
+
+Ratings are displayed in two places within the OPAC.  Like the rest of the TPAC, this is templated and display can be modified or disabled through customization.
+
+First, on the record result page, the overall average popularity rating is displayed with a label of "Popularity" below the record-specific data such as call number and publisher, and above the holdings counts.
+
+Second, on the record detail page, the list of badge names earned by the record that are in scope for the search location, and the 1-5 rating value of each badge, is displayed in a horizontal list above the copy detail table.
+
+Future possibilities
+++++++++++++++++++++
+
+This infrastructure will directly support future work such as Patron and Staff ratings, and even allow search and browse filtering based  on specific badges and ratings.  Additionally, bibliographic information could be leveraged to create metadata badges that would affect the ranking of record, in addition to the non-bibliographic badges described here.
+
+Performance
++++++++++++
+
+It is expected that there may be some very small speed impact, but all attempts have been made to mitigate this by precalculating the adjustment values and by keeping the search-required data as compact as possible.  By doing this, the aggregate cost per search should be extremely small.  In addition, the development will include a setting to define the amount of database resources to dedicate to the job of badge value calculation and reduce its run time.
+
+
+
+
+
+Removal of Advanced Hold Options link when part holds are expected
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+If a user attempts to place a metarecord hold when all eligible copies
+contain parts, the hold will fail. To help prevent the user from reaching
+a dead end while placing holds, the _Advanced Hold Options_ link is removed
+from the Place Hold page in cases where all copies on the record contain
+parts. The _Advanced Hold Options_ link will remain for records that have
+a mix of parted and non-parted copies.
+
+
+
+
+
+SIP
+~~~
+
+
+
+SIP Renewals
+^^^^^^^^^^^^^
+Renewals attempted via SIP will now consider whether a penalty is configured
+to block renewals before blocking the renewal. Previously, any penalty, even
+if it wasn't set to block renewals, would prevent a renewal from succeeding
+via SIP. 
+
+
+
+
+
+Treat SIP Location Field as Login Workstation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+When using a version of SIPServer that supports the feature,
+the Location (CP) field of the Login (93) message will be
+used as the workstation name if supplied. Blank or missing
+location fields will be ignored. This allows users or reports
+to determine which selfcheck performed a circulation.
+
+
+
+
+
+Translations
+~~~~~~~~~~~~
+
+
+
+Translation Updates
+^^^^^^^^^^^^^^^^^^^
+Translations in this release have been significantly increased.  In
+particular, Spanish has received a huge update with over 9,000 new
+translations, Czech has received a sizeable update of over 800
+translations, and additional smaller updates have been added for
+Arabic, French (Canada), and Armenian.
+
+
+
+Acknowledgments
+---------------
+The Evergreen project would like to acknowledge the following
+organizations who commissioned developments in this release of
+Evergreen:
+
+ * **TO DO**
+
+We would also like to thank the following individuals who contributed
+code, documentations patche and tests to this release of Evergreen:
+
+ * ** TO DO**
+
+We also thank the following organizations whose employees contributed
+patches:
+
+ * **TO DO** 
+
+We regret any omissions.  If a contributor has been inadvertantly
+missed, please open a bug at http://bugs.launchpad.net/evergreen/
+with a correction.
+
diff --git a/docs/RELEASE_NOTES_NEXT/Administration/Action_Trigger_Email_Headers.adoc b/docs/RELEASE_NOTES_NEXT/Administration/Action_Trigger_Email_Headers.adoc
deleted file mode 100644
index a38fdc4..0000000
--- a/docs/RELEASE_NOTES_NEXT/Administration/Action_Trigger_Email_Headers.adoc
+++ /dev/null
@@ -1,16 +0,0 @@
-Add Date Header to Action Trigger Email/SMS Templates
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-The Date: header specified in RFC 2822 has been added to the seed data
-for the example Action Trigger email and SMS templates, but no attempt
-has been made to automatically modify existing templates. To add this
-header (and end any "Why are my library emails from 1969/70?" questions
-you may have heard) make sure the following lines are in all templates
-that use the SendEmail or SendSMS reactors:
-
-The first is already in most sample templates, but you may need to add
-it to the top of any custom templates:
-`[%- USE date -%]`
-
-And this line should be inserted into the header block of each template:
-`Date: [%- date.format(date.now, '%a, %d %b %Y %T -0000', gmt => 1) %]`
-
diff --git a/docs/RELEASE_NOTES_NEXT/Administration/lp1568046-tablefunc-extension-removed.adoc b/docs/RELEASE_NOTES_NEXT/Administration/lp1568046-tablefunc-extension-removed.adoc
deleted file mode 100644
index c7fe7a1..0000000
--- a/docs/RELEASE_NOTES_NEXT/Administration/lp1568046-tablefunc-extension-removed.adoc
+++ /dev/null
@@ -1,15 +0,0 @@
-Tablefunc Extension No Longer Required
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Changes in the behavior of the connectby function in PostgreSQL 9.5
-have prompted its removal from the database.  It is easier for
-Evergreen to maintain compatibility with previous versions of
-PostgreSQL without this function.
-
-By eliminating the use of the connectby function, we eliminate the
-requirement for the tablefunc database extension.  It is no longer
-installed when the database is created.  If you are upgrading and wish
-to remove it from your database, you may run the following statement
-in the database to drop it:
-
- DROP EXTENSION tablefunc;
-
diff --git a/docs/RELEASE_NOTES_NEXT/Administration/user-activity-purge.adoc b/docs/RELEASE_NOTES_NEXT/Administration/user-activity-purge.adoc
deleted file mode 100644
index 03522cb..0000000
--- a/docs/RELEASE_NOTES_NEXT/Administration/user-activity-purge.adoc
+++ /dev/null
@@ -1,29 +0,0 @@
-Purge User Activity
-^^^^^^^^^^^^^^^^^^^
-
-User activity types are now set to transient by default for new
-Evergreen installs..  This means only the most recent activity entry per
-user per activity type is retained in the database.
-
-This change does not affect existing activity types, which were set to
-non-transient by default.  To make an activity type transient, modify the
-'Transient' field of the desired type in the staff client under Admin -> 
-Server Administration -> User Activity Types.
-
-Setting an activity type to transient means data for a given user will
-be cleaned up automatically if and when the user performs the activity
-in question.  However, administrators can also force an activity
-cleanup via SQL.  This is useful for ensuring that all old activity
-data is deleted and for controlling when the cleanup occurs, which 
-may be useulf on very large actor.usr_activity tables.
-
-To force clean all activity types:
-
-[source,sql]
-------------------------------------------------------------
-SELECT actor.purge_usr_activity_by_type(etype.id)
-    FROM config.usr_activity_type etype;
-------------------------------------------------------------
-
-NOTE: This could take hours to run on a very large actor.usr_activity table.
-
diff --git a/docs/RELEASE_NOTES_NEXT/Cataloging/auth_bib_update.adoc b/docs/RELEASE_NOTES_NEXT/Cataloging/auth_bib_update.adoc
deleted file mode 100644
index 72af4b8..0000000
--- a/docs/RELEASE_NOTES_NEXT/Cataloging/auth_bib_update.adoc
+++ /dev/null
@@ -1,6 +0,0 @@
-Authority Record Import Updates Editor, Edit Date.
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Importing an authority record via MARC Batch Import/Export now causes the 
-authority record's editor and edit_date fields to be updated.  The editor
-value may come from the MARC 905u field or, if none is present, the user 
-performing the import.
diff --git a/docs/RELEASE_NOTES_NEXT/Cataloging/auth_prop_bib_update.adoc b/docs/RELEASE_NOTES_NEXT/Cataloging/auth_prop_bib_update.adoc
deleted file mode 100644
index 6116040..0000000
--- a/docs/RELEASE_NOTES_NEXT/Cataloging/auth_prop_bib_update.adoc
+++ /dev/null
@@ -1,16 +0,0 @@
-Authority Propagation Updates Bib Editor / Edit Date
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-When a bib record is automatically updated as a result of the
-modification of a linked authority record, the bib record's "Last Edit
-Data/Time" and "Last Editing User" fields will be updated to match the
-time of the update and the editor of the modified authority record.
-
-A new global flag is available to control this behavior called
-'ingest.disable_authority_auto_update_bib_meta' ("Authority Automation:
-Disable automatic authority updates from modifying bib record editor
-and edit_date").  When enabled, theses fields will not be updated.  By
-default, this setting is disabled.
-
-An additional speed improvement is included in this feature.  No attempt
-will be made to update linked bib records when the normalized heading of
-the modified authority record is unchanged by the authority record update.
diff --git a/docs/RELEASE_NOTES_NEXT/Cataloging/bib_source_in_901s.txt b/docs/RELEASE_NOTES_NEXT/Cataloging/bib_source_in_901s.txt
deleted file mode 100644
index 2199605..0000000
--- a/docs/RELEASE_NOTES_NEXT/Cataloging/bib_source_in_901s.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Bibliographic record source now copied to 901$s
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-If a bibliographic record has a source set, the name of that source
-is now copied to the 901$s whenever the record is created or updated.
-This allows the source to be used for record matching and MARC
-field queries.
diff --git a/docs/RELEASE_NOTES_NEXT/Cataloging/marc_bib_update.adoc b/docs/RELEASE_NOTES_NEXT/Cataloging/marc_bib_update.adoc
deleted file mode 100644
index fb67cb4..0000000
--- a/docs/RELEASE_NOTES_NEXT/Cataloging/marc_bib_update.adoc
+++ /dev/null
@@ -1,15 +0,0 @@
-Selectable Bibliographic Source Update
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-During vandelay, the bib source has always recorded the record source,
-the time of the update and the identity of the user associated with the 
-operation.  This is not really desired for match-only merges.
-
-This feature provides a way to control whether the bib source data 
-is updated or not.
-
-In MARC Import, select the "Merge / Overlay" tab.  Each entry in the table has 
-a value in the new "Update bib. source" column. If that value is "true", then 
-the bib source data will be updated.
-
-The two system-defined entries have been pre-set to appropriate values (Full Overlay = true;
-Match-Only Merge = false).
diff --git a/docs/RELEASE_NOTES_NEXT/Circulation/aged-circs-see-light-of-day.adoc b/docs/RELEASE_NOTES_NEXT/Circulation/aged-circs-see-light-of-day.adoc
deleted file mode 100644
index b5f9157..0000000
--- a/docs/RELEASE_NOTES_NEXT/Circulation/aged-circs-see-light-of-day.adoc
+++ /dev/null
@@ -1,21 +0,0 @@
-Staff Client Honors Aged Circulations
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-The browser and XUL clients now better represent copy checkout history 
-by honoring and displaying information from aged circulations.  
-
- * Browser client 'Recent Circ History' and the analogous XUL client 
-   'Circulation History' tabs show summary data for aged circulations
-   as well as regular/active circulations.  When aged circulation data
-   is displayed, any references to patron names are replaced by the string
-   "<Aged Circulation>".
-
- * Browser client 'Circ History List' and the analogous XUL client 
-   'Last Few Circulations' tabs behave as above, plus their 'Add 
-   Billing' buttons are disabled when displaying aged circulation data.
-
- * XUL client 'Retrieve Last Patron' actions from various UI's report, 
-   "Item XXX circulation is an aged circulation and has no linked user".
-   Browser client analog uses 'Circ History List' instead, no additional
-   changes required.
-
diff --git a/docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc b/docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc
deleted file mode 100644
index 465f4dc..0000000
--- a/docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc
+++ /dev/null
@@ -1,26 +0,0 @@
-"Canceled Transit" Item Status
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Previously, when a transit was aborted, the transited item would either go into
-"Reshelving" status or would return to whatever status it was in when it went
-into transit, even when the item itself was in a different status (including
-"Checked out").  Now, for most transits that get aborted, the item is put into a 
-new status, "Canceled Transit", which signals to staff the actual state of the
-item.  This feature only affects items with a status of "In transit" and does
-not affect items that were in the following statuses at the time they were sent
-into transit:
-
-* Bindery
-* Lost
-* Missing
-* On order
-* ILL
-* Damaged
-* Long Overdue
-* Lost and Paid
-* Any custom statuses
-
-This change should help clear up confusing situations caused by the previous
-"abort transit" behavior, such as items showing "Available" when they are actually
-en route, and patrons' items mysteriously disappearing from their accounts and
-showing "Available" at the item-owning library without evidence of check-in.
diff --git a/docs/RELEASE_NOTES_NEXT/Circulation/copy-status-is-avail.adoc b/docs/RELEASE_NOTES_NEXT/Circulation/copy-status-is-avail.adoc
deleted file mode 100644
index 7b5df08..0000000
--- a/docs/RELEASE_NOTES_NEXT/Circulation/copy-status-is-avail.adoc
+++ /dev/null
@@ -1,17 +0,0 @@
-Copy Status "Is Available" Flag
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Adds a new boolean field for copy statuses to indicate when copies having
-a given status should be considered available.  The field has 2 main effects:
-
-1. Checking out an "available" copy will no longer result in an override-able
-   "COPY_NOT_AVAILABLE" alert for staff.  The copy will checkout without 
-   status warnings.
-
-2. "Available" copies will appear in catalog searches where "limit to
-   available" is selected as a search filter.
-
-By default, the "Available" and "Reshelving" statuses have the "Is Available" 
-flag set.  The flag may be applied to local/custom statues via the copy
-status admin interface.
-
diff --git a/docs/RELEASE_NOTES_NEXT/Circulation/email_cko_receipts.adoc b/docs/RELEASE_NOTES_NEXT/Circulation/email_cko_receipts.adoc
deleted file mode 100644
index 5383bfc..0000000
--- a/docs/RELEASE_NOTES_NEXT/Circulation/email_cko_receipts.adoc
+++ /dev/null
@@ -1,20 +0,0 @@
-Email Checkout Receipts
-^^^^^^^^^^^^^^^^^^^^^^^
-This feature allows patrons to receive checkout receipts through email
-at the circulation desk and in the Evergreen self-checkout interface.
-Patrons need to opt in to receive email receipts by default and must
-have an email address associated with their account. Opt in can be staff
-mediated at the time of account creation or in existing accounts.
-Patrons can also opt in directly in their OPAC account or through patron
-self-registration. This feature does not affect the behavior of
-checkouts from SIP2 devices.
-
-Patrons can opt in to receipt email checkout receipts by default via
-a new "Email checkout reciepts by default" patron setting.
-
-This feature also enhances the patron staging tables so that patron
-settings can be chosen during self-registration.
-
-The web staff interface's checkout screen now includes a "Quick
-Receipt" button that allows staff members to generate a receipt
-at any time.
diff --git a/docs/RELEASE_NOTES_NEXT/Circulation/limit_payment_amounts_accepted.txt b/docs/RELEASE_NOTES_NEXT/Circulation/limit_payment_amounts_accepted.txt
deleted file mode 100644
index 4b8328f..0000000
--- a/docs/RELEASE_NOTES_NEXT/Circulation/limit_payment_amounts_accepted.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-Set Per-OU Limits on Allowed Payment Amounts
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Two new OU Settings have been added to prevent clerks
-from accidentally clearing all patron bills by scanning
-a barcode into the Payment Amount field, or accidentally
-entering the amount without a decimal point (such as you
-would when using a cash register).
-
-The first setting is the amount above which staff will
-be asked if they're sure they want to apply the payment,
-the second is the maximum amount of money that can be
-accepted through the staff client.
-
-These settings only effect the staff client, not credit
-cards accepted through the OPAC, or direct API calls
-from third party tools.
diff --git a/docs/RELEASE_NOTES_NEXT/Client/added-fields-for-client-interfaces.adoc b/docs/RELEASE_NOTES_NEXT/Client/added-fields-for-client-interfaces.adoc
deleted file mode 100644
index 3861ab2..0000000
--- a/docs/RELEASE_NOTES_NEXT/Client/added-fields-for-client-interfaces.adoc
+++ /dev/null
@@ -1,17 +0,0 @@
-Additional Fields Available for Display in Some Interfaces
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-The holds age protection field will now be available for display in the
-following interfaces:
-
-* Item status list view column picker
-* Item status alternate view
-* Holdings maintenance column picker
-
-The asset.copy.cost field, which records the amount paid for an item when
-an invoice is processed, will be available for display in the following
-interfaces:
-
-* Items status list view column picker
-* Item status alternate view
-* Copy editor
-
diff --git a/docs/RELEASE_NOTES_NEXT/OPAC/combine_notice_prefs_tables.adoc b/docs/RELEASE_NOTES_NEXT/OPAC/combine_notice_prefs_tables.adoc
deleted file mode 100644
index d9e4b29..0000000
--- a/docs/RELEASE_NOTES_NEXT/OPAC/combine_notice_prefs_tables.adoc
+++ /dev/null
@@ -1,7 +0,0 @@
-Merge Notification Preferences Tables in TPAC
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-The patron notification preference page in the public catalog
-used to have two tables, separating notification settings
-based on their source. Since that distinction does not matter
-to patrons, and since the two tables aren't styled consistently,
-they are merged together.
diff --git a/docs/RELEASE_NOTES_NEXT/OPAC/improved-myopac-holds-screens.adoc b/docs/RELEASE_NOTES_NEXT/OPAC/improved-myopac-holds-screens.adoc
deleted file mode 100644
index 2ba992c..0000000
--- a/docs/RELEASE_NOTES_NEXT/OPAC/improved-myopac-holds-screens.adoc
+++ /dev/null
@@ -1,14 +0,0 @@
-Improved Holds Screens in My Account
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-The grids in the My Account _Items on Hold_ and _Holds History_ interfaces are
-simplified. Data previously contained in their own Activate, Active, and Date
-Fulfilled columns are now incorporated into the Status columns. To further
-declutter the interface, the holds queue position will only show when the user
-most needs the information - before the hold has been captured. 
-
-Distinct CSS classes have also been added for each hold status and each date
-that could potentially display in these holds interfaces. A new default style
-highlights the *Available* status in green and the *Suspended* status
-in red.
-
-
diff --git a/docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt b/docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
deleted file mode 100644
index bd88ac8..0000000
--- a/docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
+++ /dev/null
@@ -1,101 +0,0 @@
-Statistically generated Record Ratings (Popularity)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Summary 
-+++++++
-
-For the purpose of supplying non-bibliographic popularity adjustment to the ranking of search results, this feature implements a set of statistical modelling algorithms which will identify bibliographic records of particular note based on derivable parameters.
-
-Generally, factors such as to circulation and hold activity, record and item age, and item ownership counts will available for statistical consideration. Each factor will embody a "popularity badge" that the bibliographic record can earn, and each badge will have a 5-point scale, where more points indicates a more popular record.  The average of the badge points earned by each record will constitute a "popularity rating". The number and types of badges will break ties for average popularity, and relevance will sort items with like popularity. 
-
-A new sort axis of *Popularity* is created to sort first on the weighted average popularity of each record, followed by the query-specific relevance available today.  A new option is created in the dropdown that sorts on the combination of "activity metric" (aka badge ranking, aka popularity) first and the existing, stock relevance ranking when those are equal.  For instance, given two records that both have a badge ranking of "4.5", they will be sorted in the order of the query relevance ranking that is calculated today as a tie breaker.  Those two records will sort above other records with lower badge rankings regardless of what today's relevance ranking says about them.
-
-In addition, a new sort axis of *Popularity and Relevance* is created that augments the normal Relevance sort with a normalized popularity value by multiplying the base relevance by a value controlled by a new global flag, generally set to a decimal number between 1 and 2.
-
-Finally, there will continue to be a pure *Relevance* sort option, which is the version that exists today.
-
-A global flag will allow the selection of the default sort axis.
-
-
-The basics
-++++++++++
-
-There will exist two classes of non-bibliographic popularity badge: point-in-time popularity, such as the number of items held or the number of open hold requests; and temporal popularity, such as circulations over the past two years or hold requests placed over the last six months.
-
-Each popularity badge will have a definition.  The badge's value are calculated for each bibliographic record within the definition's bibliographic population.  The population circumscribes the bibliographic records that are eligible to receive the badge.  Each record within the population of a badge definition will receive a ranking adjustment, based on its "popularity rating" if the appropriate thresholds are met.
-
-The set of existing popularity badges is displayed as a grid.  A library selector defaulting to the workstation location will allow scoping the grid contents to specific organizational units.  Creating or editing a badge is performed within a dedicated modal popup interface that will float above the grid, disabling access to the underlying interface until the action is completed or canceled.
-
-All popularity badge definitions will describe a set of configuration, population criteria, and statistical constraints:
-
-* *Badge Name:* The administrator-assigned name of the popularity badge definition.  This is presented as a text input box, and the value is used in the OPAC.
-* *Scope:* The owning org unit of the badge.  Badges are cumulative, and are included in ranking when the Scope is equal to, or an ancestor of, the search location.  Therefore branch-specific searches will include branch, system and consortium badges, but consortium-wide searches will only make use of consortium-scoped badges.  For item-specific metrics, this also limits the population of the statistical group to those records having items whose owning library is at or below the Scope in the org tree.  This is presented as a standard Library selector.
-* *Weight:* A multiplier defining the importance of this particular badge in relation to any other badges that might be earned by a record.  This is presented as a number spinner with a default and minimum value of 1.
-* *Recalculation Interval:* How often to recalculate the badge's popularity value for each record.  For temporal popularity badges that may change quickly, such as in-house use or short-duration circulation-over-time, this may be nightly.  For slowly changing metrics such as count of items held, this may be monthly or quarterly. This is presented as a text input that will accept an interval string such as "2 years", "30 days", or "6 weeks, 2 days".  Numeric values without a timespan qualifier are considered to be a number of seconds.  For newer items that may have rapidly changing metrics, a mechanism is created to adjust the "last calculated date" so that library staff can clear the date and force a recalculation overnight. However, because the badge value each record receives is relative to all the other records in the population, the badge as a whole will need to be recalculated. This feature stores individual record raw stats, where possible and reasonable, to speed up r
 ecalculation.
-* *Population Filters:* Optional, and any combination may be used.
-** *Attribute Filter:* Filter bibliographic record population based on record attributes.  This will use an interface similar to the Composite Attribute editor.
-** *Bibliographic Source:* Filter bibliographic records to those with a specific source.  This is presented as a dropdown of sources.
-** *Circulation Modifier Filter:* Include only those items that make use of certain Circulation Modifiers in statistical calculations. This is only applicable to item-related badges.  This is presented as a dropdown of modifiers.
-** *Copy Location Group:* Include only those items that are assigned to shelving locations within specific location groups. This is only applicable to item-related badges.  This is presented as a dropdown of location groups available within the Scope for the badge.
-* *Popularity Parameter:* One of a set of predefined types of popularity measure.  This is presented as a dropdown.  These will include, but may not be limited to:
-** Holds Filled Over Time
-** Holds Requested Over Time
-** Current Hold Count
-** Circulations Over Time
-** Current Circulation Count
-** Out/Total Ratio
-** Holds/Total Ratio
-** Holds/Holdable Ratio
-** Percent of Time Circulating -- Of the time between the active date of the copies on the record and the badge calculation time, the percentage of that time during which the items have been checked out.  This is meant to be an indicator of high-demand over the lifetime of the title, and not just a temporary spike in circ count for, say, a book club or school report.  Recent temporary spikes can be represented by circs over time with a time horizon.  It's the difference between an "always popular" title and a "just recently popular" title.
-** Bibliographic Record Age (days)
-** Publication Age (days)
-** Available On-Line (for e-books, etc)
-** Copy Count
-* *Fixed Rating:* An optional override supplying a fixed popularity value for all records earning this badge.  For some popularity types, such as "Available On-Line", it is preferable to specify, rather than calculate, the popularity value for a badge.  This is presented as a number spinner with a value ranging from 1 to 5.
-* *Inclusion Threshold Percentile:* Cumulative distribution percentile.  This is presented as a number spinner of "percentile" values ranging from 50 to 100, indicating the number of how much of the population a record's score must be better than in order to earn the badge.  Leaving this value unset will allow the entire population to earn the badge.
-* *Discard most common:* A value that, if greater than 0, will ignore records with extremely common values so that outliers are more readily identified, and the distribution of values can be assumed to be more normal.  Many popularity parameters, such as those for circulation counts, benefit from this input filter.  This is presented as a number spinner initially set to 0 that indicates the number of distinct, low values -- but not the values themselves -- to exclude from the population.
-
-This new feature comes with a starter badge based on the top 97th percentile of holds requested over the past five years.
-
-A word about Inclusion Threshold Percentile
-+++++++++++++++++++++++++++++++++++++++++++
-
-In order to limit the amount of data that must be retained and queried during normal search operations, to allow limiting the popular population to truly exceptional records when appropriate, and to limit the speed cost of popularity ranking, many popularity types will provide thresholds that must be passed in order to store a record's badge-specific popularity value.
-
-The administrator will be presented with a choice of "percentile" that defines the threshold which must be crossed before the value of the variable for any given record is considered statistically significant, and therefore scaled and included in ranking.  For instance, a record may need to be in the 95th percentile for Holds/Total Items before it is considered "popular" and the badge is earned.
-
-Additionally, in order to normalize populations that exhibit a "long tail" effect, such as for circulation counts were most records will have a very low number of events, the administrator will be able to instruct the algorithm to ignore the most common low values.
-
-Type-specific input modifications
-+++++++++++++++++++++++++++++++++
-
-For temporal popularity badges, two time-horizons are required.  The first is the inclusion horizon, or the age at which events are no longer considered.  This will allow, for instance, limiting circulation calculations to only the past two years.  The second is the importance aging horizon, which will allow recent events to be considered more important than those further in the past.   A value of zero for this horizon will mean that all events are seen to be of equal importance.  These are presented as text inputs that will accept interval strings such as "2 years", "30 days", or "6 weeks, 2 days".  Numeric values without a timespan qualifier are considered to be a number of seconds.
-
-For those badges that have the Fixed Rating flag set, no statistical input is gathered for records in the population of the badge definition.  Instead, all records in the population are assigned this fixed value for the badge.
-
-Rating process
-++++++++++++++
-
-For badges other than those with the Fixed Rating set, the collected statistical input parameters are used to derive the mean, median, mode, min, max, and standard deviation values for the bibliographic record population. Each record passing the requisite thresholds are assigned a badge-specific value based on the quintile into which the value falls.  This value, interpreted as a one-to-five rating, is stored for static application, instead of being calculated on the fly, when the badge is in scope and the record is part of a search result set.  Thus records with values in the bottom quintile will have a rating of one, and records with values in the top quintile will have a rating of five.
-
-All badge values for all records are calculated by a secondary process that runs in the background on the server on a regular basis.
-
-Display in the OPAC
-+++++++++++++++++++
-
-Ratings are displayed in two places within the OPAC.  Like the rest of the TPAC, this is templated and display can be modified or disabled through customization.
-
-First, on the record result page, the overall average popularity rating is displayed with a label of "Popularity" below the record-specific data such as call number and publisher, and above the holdings counts.
-
-Second, on the record detail page, the list of badge names earned by the record that are in scope for the search location, and the 1-5 rating value of each badge, is displayed in a horizontal list above the copy detail table.
-
-Future possibilities
-++++++++++++++++++++
-
-This infrastructure will directly support future work such as Patron and Staff ratings, and even allow search and browse filtering based  on specific badges and ratings.  Additionally, bibliographic information could be leveraged to create metadata badges that would affect the ranking of record, in addition to the non-bibliographic badges described here.
-
-Performance
-+++++++++++
-
-It is expected that there may be some very small speed impact, but all attempts have been made to mitigate this by precalculating the adjustment values and by keeping the search-required data as compact as possible.  By doing this, the aggregate cost per search should be extremely small.  In addition, the development will include a setting to define the amount of database resources to dedicate to the job of badge value calculation and reduce its run time.
-
diff --git a/docs/RELEASE_NOTES_NEXT/OPAC/remove_advanced_hold_options_for_parts.adoc b/docs/RELEASE_NOTES_NEXT/OPAC/remove_advanced_hold_options_for_parts.adoc
deleted file mode 100644
index 3f2f642..0000000
--- a/docs/RELEASE_NOTES_NEXT/OPAC/remove_advanced_hold_options_for_parts.adoc
+++ /dev/null
@@ -1,9 +0,0 @@
-Removal of Advanced Hold Options link when part holds are expected
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-If a user attempts to place a metarecord hold when all eligible copies
-contain parts, the hold will fail. To help prevent the user from reaching
-a dead end while placing holds, the _Advanced Hold Options_ link is removed
-from the Place Hold page in cases where all copies on the record contain
-parts. The _Advanced Hold Options_ link will remain for records that have
-a mix of parted and non-parted copies.
-
diff --git a/docs/RELEASE_NOTES_NEXT/SIP/SIP_Workstation_Name.adoc b/docs/RELEASE_NOTES_NEXT/SIP/SIP_Workstation_Name.adoc
deleted file mode 100644
index ad834e6..0000000
--- a/docs/RELEASE_NOTES_NEXT/SIP/SIP_Workstation_Name.adoc
+++ /dev/null
@@ -1,8 +0,0 @@
-Treat SIP Location Field as Login Workstation
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-When using a version of SIPServer that supports the feature,
-the Location (CP) field of the Login (93) message will be
-used as the workstation name if supplied. Blank or missing
-location fields will be ignored. This allows users or reports
-to determine which selfcheck performed a circulation.
-
diff --git a/docs/RELEASE_NOTES_NEXT/SIP/SIP_renewal_blocks.adoc b/docs/RELEASE_NOTES_NEXT/SIP/SIP_renewal_blocks.adoc
deleted file mode 100644
index 5613a30..0000000
--- a/docs/RELEASE_NOTES_NEXT/SIP/SIP_renewal_blocks.adoc
+++ /dev/null
@@ -1,7 +0,0 @@
-SIP Renewals
-^^^^^^^^^^^^^
-Renewals attempted via SIP will now consider whether a penalty is configured
-to block renewals before blocking the renewal. Previously, any penalty, even
-if it wasn't set to block renewals, would prevent a renewal from succeeding
-via SIP. 
-
diff --git a/docs/RELEASE_NOTES_NEXT/Translations/Updates.adoc b/docs/RELEASE_NOTES_NEXT/Translations/Updates.adoc
deleted file mode 100644
index a9fabd8..0000000
--- a/docs/RELEASE_NOTES_NEXT/Translations/Updates.adoc
+++ /dev/null
@@ -1,7 +0,0 @@
-Translation Updates
-^^^^^^^^^^^^^^^^^^^
-Translations in this release have been significantly increased.  In
-particular, Spanish has received a huge update with over 9,000 new
-translations, Czech has received a sizeable update of over 800
-translations, and additional smaller updates have been added for
-Arabic, French (Canada), and Armenian.
diff --git a/docs/installation/server_upgrade.txt b/docs/installation/server_upgrade.txt
index 773c250..c3db0b3 100644
--- a/docs/installation/server_upgrade.txt
+++ b/docs/installation/server_upgrade.txt
@@ -8,7 +8,7 @@ Software Prerequisites
 
  * **PostgreSQL**: Version 9.3 is recommended. The minimum supported version
     is 9.1.
-  * **Linux**: Evergreen 2.10.1 has been tested on Debian Jessie (8.0),
+  * **Linux**: Evergreen 2.11.rc has been tested on Debian Jessie (8.0),
     Debian Wheezy (7.0), Ubuntu Xenial Xerus (16.04), Ubuntu Trusty Tahr (14.04),
     and Fedora.
     If you are running an older version of these distributions, you may want
@@ -44,12 +44,12 @@ osrf_control --localhost --stop-all
  .. Back up the /openils directory.
 . Upgrade OpenSRF. Download and install the latest version of OpenSRF from
 the https://evergreen-ils.org/opensrf-downloads/[OpenSRF download page].
-. As the *opensrf* user, download and extract Evergreen 2.10.1:
+. As the *opensrf* user, download and extract Evergreen 2.11.rc:
 +
 [source, bash]
 -----------------------------------------------
-wget https://evergreen-ils.org/downloads/Evergreen-ILS-2.10.1.tar.gz
-tar xzf Evergreen-ILS-2.10.1.tar.gz
+wget https://evergreen-ils.org/downloads/Evergreen-ILS-2.11.rc.tar.gz
+tar xzf Evergreen-ILS-2.11.rc.tar.gz
 -----------------------------------------------
 +
 [NOTE]
@@ -59,7 +59,7 @@ For the latest edition of Evergreen, check the https://evergreen-ils.org/egdownl
 +
 [source, bash]
 ---------------------------------------------
-cd /home/opensrf/Evergreen-ILS-2.10.1
+cd /home/opensrf/Evergreen-ILS-2.11.rc
 ---------------------------------------------
 +
 On the next command, replace `[distribution]` with one of these values for your
@@ -84,7 +84,7 @@ make -f Open-ILS/src/extras/Makefile.install [distribution]
 +
 [source, bash]
 ------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-2.10.1
+cd /home/opensrf/Evergreen-ILS-2.11.rc
 PATH=/openils/bin:$PATH ./configure --prefix=/openils --sysconfdir=/openils/conf
 make
 ------------------------------------------------------------
@@ -95,8 +95,8 @@ These instructions assume that you have also installed OpenSRF under /openils/.
 +
 [source, bash]
 ------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-2.10.1
-make STAFF_CLIENT_STAMP_ID=rel_2_10_1 install
+cd /home/opensrf/Evergreen-ILS-2.11.rc
+make STAFF_CLIENT_STAMP_ID=rel_2_11_rc install
 ------------------------------------------------------------
 +
 . As the *root* user, change all files to be owned by the opensrf user and group:
@@ -112,7 +112,7 @@ chown -R opensrf:opensrf /openils
 -----------------------------------------------------------
 cd /openils/var/web/xul/
 rm server
-ln -sf rel_2_10_1/server server
+ln -sf rel_2_11_rc/server server
 ----------------------------------------------------------
 +
 . As the *opensrf* user, update opensrf_core.xml and opensrf.xml by copying the
@@ -132,7 +132,7 @@ Copying these configuration files will remove any customizations you have made t
 +
 [source, bash]
 -------------------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-2.10.1
+cd /home/opensrf/Evergreen-ILS-2.11.rc
 perl Open-ILS/src/support-scripts/eg_db_config --update-config --service all \
 --create-offline --database evergreen --host localhost --user evergreen --password evergreen
 -------------------------------------------------------------------------
@@ -156,21 +156,21 @@ The diff command can be used to show the differences between the distribution ve
 +
 [source, bash]
 ----------------------------------------------------------
-cp /home/opensrf/Evergreen-ILS-2.10.1/Open-ILS/examples/apache/eg_startup /etc/apache2/eg_startup
+cp /home/opensrf/Evergreen-ILS-2.11.rc/Open-ILS/examples/apache/eg_startup /etc/apache2/eg_startup
 ----------------------------------------------------------
 +
 .. Update /etc/apache2/eg_vhost.conf by copying the example from Open-ILS/examples/apache/eg_vhost.conf.
 +
 [source, bash]
 ----------------------------------------------------------
-cp /home/opensrf/Evergreen-ILS-2.10.1/Open-ILS/examples/apache/eg_vhost.conf /etc/apache2/eg_vhost.conf
+cp /home/opensrf/Evergreen-ILS-2.11.rc/Open-ILS/examples/apache/eg_vhost.conf /etc/apache2/eg_vhost.conf
 ----------------------------------------------------------
 +
 .. Update /etc/apache2/sites-available/eg.conf by copying the example from Open-ILS/examples/apache/eg.conf.
 +
 [source, bash]
 ----------------------------------------------------------
-cp /home/opensrf/Evergreen-ILS-2.10.1/Open-ILS/examples/apache/eg.conf /etc/apache2/sites-available/eg.conf
+cp /home/opensrf/Evergreen-ILS-2.11.rc/Open-ILS/examples/apache/eg.conf /etc/apache2/sites-available/eg.conf
 ----------------------------------------------------------
 
 Upgrade the Evergreen database schema
@@ -193,36 +193,22 @@ anything goes wrong during the upgrade.
 =============
 Evergreen provides incremental upgrade scripts that allow you to upgrade
 from one minor version to the next until you have the current version of
-the schema. For example, if you want to upgrade from 2.5.1 to 2.10.1, you
+the schema. For example, if you want to upgrade from 2.5.1 to 2.6.3, you
 would run the following upgrade scripts:
 
 - 2.5.1-2.5.2-upgrade-db.sql
 - 2.5.2-2.5.3-upgrade-db.sql
 - 2.5.3-2.6.0-upgrade-db.sql (this is a major version upgrade)
+- 2.6.0-2.6.1-upgrade-db.sql
+- 2.6.1-2.6.2-upgrade-db.sql
 - 2.6.2-2.6.3-upgrade-db.sql
-- 2.6.3-2.7.0-upgrade-db.sql (this is a major version upgrade)
-- 2.7.0-2.7.1-upgrade-db.sql
-- 2.7.1-2.7.2-upgrade-db.sql
-- 2.7.2-2.7.3-upgrade-db.sql
-- 2.7.3-2.7.4-upgrade-db.sql
-- 2.7.4-2.8.0-upgrade-db.sql (this is a major version upgrade)
-- 2.8.0-2.8.1-upgrade-db.sql
-- 2.8.1-2.8.2-upgrade-db.sql
-- 2.8.2-2.8.3-upgrade-db.sql
-- 2.8.3-2.8.4-upgrade-db.sql
-- 2.8.4-2.9.0-upgrade-db.sql (this is a major version upgrade)
-- 2.9.0-2.9.1-upgrade-db.sql
-- 2.9.1-2.9.2-upgrade-db.sql
-- 2.9.2-2.9.3-upgrade-db.sql
-- 2.9.3-2.10.0-upgrade-db.sql
-- 2.10.0-2.10.1-upgrade-db.sql
 
 Note that you do *not* want to run additional 2.5 scripts to upgrade to the
 newest version of 2.5, since currently there is no automated way to upgrade
 from 2.5.4+ to 2.6. Only upgrade as far as necessary to reach the major
 version upgrade script (in this example, as far as 2.5.3).
 
-To upgrade across multiple major versions (e.g. from 2.3.0 to 2.10.1), use
+To upgrade across multiple major versions (e.g. from 2.3.0 to 2.7.4), use
 the same logic to utilize the provided major version upgrade scripts. For
 example:
 
@@ -235,12 +221,6 @@ example:
 - (run all incremental scripts from 2.6.0 to 2.6.3)
 - 2.6.3-2.7.0-upgrade-db.sql
 - (run all incremental scripts from 2.7.0 to 2.7.4)
-- 2.7.4-2.8.0-upgrade-db.sql
-- (run all incremental scripts from 2.8.0 to 2.8.4)
-- 2.8.4-2.9.0-upgrade-db.sql
-- (run all incremental scripts from 2.9.0 to 2.9.3)
-- 2.9.3-2.10.0-upgrade-db.sql
-- (run all incremental scripts from 2.10.0 to 2.10.1)
 =============
 
 [CAUTION]
@@ -249,13 +229,13 @@ that you cannot resolve yourself through additional troubleshooting, please
 report the errors to the https://evergreen-ils.org/communicate/mailing-lists/[Evergreen
 Technical Discussion List].
 
-Run the following steps (including other upgrade scripts, as noted above)
+Run the following steps (using appropriate upgrade scripts, as noted above)
 as a user with the ability to connect to the database server.
 
 [source, bash]
 ----------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-2.10.0/Open-ILS/src/sql/Pg
-psql -U evergreen -h localhost -f version-upgrade/2.10.0-2.10.1-upgrade-db.sql evergreen
+cd /home/opensrf/Evergreen-ILS-2.11.rc/Open-ILS/src/sql/Pg
+psql -U evergreen -h localhost -f version-upgrade/[appropriate versions here]-upgrade-db.sql evergreen
 ----------------------------------------------------------
 
 [TIP]
@@ -336,6 +316,6 @@ from the Evergreen community.
 Review Release Notes
 ~~~~~~~~~~~~~~~~~~~~
 
-Review the <<_evergreen_2_10_release_notes,2.10 release notes>> for other tasks
+Review the <<_evergreen_2_11_release_notes,2.11 release notes>> for other tasks
 that need to be done after upgrading.  If you have upgraded over several 
 major versions, you will need to review the release notes for each version also.

commit 6c0ab72596821d89d5c460f0826f422c118905f2
Author: Dan Wells <dbw2 at calvin.edu>
Date:   Thu Jul 28 18:51:35 2016 -0400

    Bumping Perl version string for 2.11.0
    
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS.pm b/Open-ILS/src/perlmods/lib/OpenILS.pm
index d7235ce..01a573b 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS.pm
@@ -6,6 +6,6 @@ OpenILS - Client and server support for the Evergreen open source library system
 
 =cut
 
-our $VERSION = '2.4';
+our $VERSION = '2.1100';
 
 1;

-----------------------------------------------------------------------


hooks/post-receive
-- 
Evergreen ILS


More information about the open-ils-commits mailing list