[open-ils-commits] [GIT] Evergreen ILS branch tags/rel_3_2_0 created. aa0ae67977b3727dd9b37b6103fcfc7aa60e5f39

Evergreen Git git at git.evergreen-ils.org
Wed Oct 3 15:07:25 EDT 2018


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_3_2_0 has been created
        at  aa0ae67977b3727dd9b37b6103fcfc7aa60e5f39 (commit)

- Log -----------------------------------------------------------------
commit aa0ae67977b3727dd9b37b6103fcfc7aa60e5f39
Author: Dan Wells <dbw2 at calvin.edu>
Date:   Tue Sep 25 15:12:53 2018 -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..c3a1a29 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,5225 @@
-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 d34df02951bd08670687d22e43d350b39a14347f
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Aug 27 12:08:37 2018 -0400
+
+    LP#1786987: Locale-less org tree cache object becomes stale
+    
+    The autogen.sh script calls a function that flushes all org tree objects
+    cached by locale, but does not flush the one used when the locale is
+    unkown.  This commit forces that flushing to occur.
+    
+    berick: Definition of my $cache pushed up above first use.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+4	1	Open-ILS/src/perlmods/lib/OpenILS/Utils/Configure.pm
+
+commit 7df3d1640938c01ee28b5f692db13d8a3fbfbbd3
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Mon Sep 24 17:47:24 2018 -0400
+
+    Update upgrade doc version numbers
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+16	16	docs/installation/server_upgrade.adoc
+
+commit a199c376e4082f8eab0332b989c5217d91ad9242
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Mon Sep 24 17:38:19 2018 -0400
+
+    Bumping Perl version string for 3.2
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS.pm
+
+commit 44cce14902dd778865f092344f168ddceaacb3fa
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Tue Sep 25 14:54:20 2018 -0400
+
+    Docs: Clean up installation docs
+    
+    - Remove redundant NodeJS section
+    - Relabel sections to distinguish between AngularJS and Angular steps
+    - Fix a few typos
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+
+1	1	docs/admin_initial_setup/migrating_patron_data.adoc
+7	19	docs/installation/server_installation.adoc
+1	1	docs/installation/server_upgrade.adoc
+
+commit 72f0af174801ec6252641e57030ba40ef840122f
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Tue Sep 25 13:04:11 2018 -0400
+
+    Translation updates - newpot
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+140	87	build/i18n/po/webstaff/webstaff.pot
+
+commit 468e6f0330da5b6922b65cc8461753c5b1aba87b
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Mon Sep 24 17:33:12 2018 -0400
+
+    Translation updates - po files
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+31	19	build/i18n/po/conify/ar-JO.po
+37	25	build/i18n/po/conify/cs-CZ.po
+31	19	build/i18n/po/conify/es-ES.po
+31	19	build/i18n/po/conify/hy-AM.po
+90	78	build/i18n/po/db.seed/ar-JO.po
+160	141	build/i18n/po/db.seed/cs-CZ.po
+68	61	build/i18n/po/db.seed/de-DE.po
+69	62	build/i18n/po/db.seed/en-CA.po
+69	62	build/i18n/po/db.seed/en-GB.po
+90	78	build/i18n/po/db.seed/es-ES.po
+71	64	build/i18n/po/db.seed/fi-FI.po
+68	61	build/i18n/po/db.seed/fr-CA.po
+68	61	build/i18n/po/db.seed/he-IL.po
+68	61	build/i18n/po/db.seed/hu-HU.po
+91	79	build/i18n/po/db.seed/hy-AM.po
+68	61	build/i18n/po/db.seed/oc-FR.po
+69	62	build/i18n/po/db.seed/pt-BR.po
+68	61	build/i18n/po/db.seed/ru-RU.po
+68	61	build/i18n/po/db.seed/sv-SE.po
+68	61	build/i18n/po/db.seed/tr-TR.po
+43	43	build/i18n/po/fm_IDL.dtd/ar-JO.po
+90	90	build/i18n/po/fm_IDL.dtd/cs-CZ.po
+32	32	build/i18n/po/fm_IDL.dtd/de-DE.po
+43	43	build/i18n/po/fm_IDL.dtd/en-CA.po
+43	43	build/i18n/po/fm_IDL.dtd/en-GB.po
+43	43	build/i18n/po/fm_IDL.dtd/es-ES.po
+43	43	build/i18n/po/fm_IDL.dtd/fi-FI.po
+34	34	build/i18n/po/fm_IDL.dtd/fr-CA.po
+32	32	build/i18n/po/fm_IDL.dtd/he-IL.po
+32	32	build/i18n/po/fm_IDL.dtd/hu-HU.po
+43	43	build/i18n/po/fm_IDL.dtd/hy-AM.po
+32	32	build/i18n/po/fm_IDL.dtd/oc-FR.po
+43	43	build/i18n/po/fm_IDL.dtd/pt-BR.po
+43	43	build/i18n/po/fm_IDL.dtd/ru-RU.po
+32	32	build/i18n/po/fm_IDL.dtd/sv-SE.po
+32	32	build/i18n/po/fm_IDL.dtd/tr-TR.po
+23	23	build/i18n/po/ils_events.xml/ar-JO.po
+24	24	build/i18n/po/ils_events.xml/cs-CZ.po
+21	21	build/i18n/po/ils_events.xml/de-DE.po
+23	23	build/i18n/po/ils_events.xml/en-CA.po
+23	23	build/i18n/po/ils_events.xml/en-GB.po
+24	24	build/i18n/po/ils_events.xml/es-ES.po
+23	23	build/i18n/po/ils_events.xml/fi-FI.po
+21	21	build/i18n/po/ils_events.xml/fr-CA.po
+21	21	build/i18n/po/ils_events.xml/he-IL.po
+21	21	build/i18n/po/ils_events.xml/hu-HU.po
+23	23	build/i18n/po/ils_events.xml/hy-AM.po
+21	21	build/i18n/po/ils_events.xml/oc-FR.po
+21	21	build/i18n/po/ils_events.xml/pt-BR.po
+21	21	build/i18n/po/ils_events.xml/ru-RU.po
+21	21	build/i18n/po/ils_events.xml/sv-SE.po
+21	21	build/i18n/po/ils_events.xml/tr-TR.po
+13	7	build/i18n/po/lang.dtd/ar-JO.po
+13	7	build/i18n/po/lang.dtd/cs-CZ.po
+5	5	build/i18n/po/lang.dtd/de-DE.po
+13	7	build/i18n/po/lang.dtd/en-CA.po
+13	7	build/i18n/po/lang.dtd/en-GB.po
+13	7	build/i18n/po/lang.dtd/es-ES.po
+13	7	build/i18n/po/lang.dtd/fi-FI.po
+13	7	build/i18n/po/lang.dtd/fr-CA.po
+5	5	build/i18n/po/lang.dtd/he-IL.po
+5	5	build/i18n/po/lang.dtd/hu-HU.po
+13	7	build/i18n/po/lang.dtd/hy-AM.po
+5	5	build/i18n/po/lang.dtd/oc-FR.po
+13	7	build/i18n/po/lang.dtd/pt-BR.po
+13	7	build/i18n/po/lang.dtd/ru-RU.po
+5	5	build/i18n/po/lang.dtd/sv-SE.po
+5	5	build/i18n/po/lang.dtd/tr-TR.po
+50	46	build/i18n/po/tpac/ar-JO.po
+87	82	build/i18n/po/tpac/cs-CZ.po
+39	35	build/i18n/po/tpac/de-DE.po
+39	35	build/i18n/po/tpac/en-CA.po
+87	82	build/i18n/po/tpac/en-GB.po
+84	79	build/i18n/po/tpac/es-ES.po
+39	35	build/i18n/po/tpac/fi-FI.po
+477	388	build/i18n/po/tpac/fr-CA.po
+39	35	build/i18n/po/tpac/he-IL.po
+39	35	build/i18n/po/tpac/hu-HU.po
+39	35	build/i18n/po/tpac/hy-AM.po
+39	35	build/i18n/po/tpac/oc-FR.po
+39	35	build/i18n/po/tpac/pt-BR.po
+39	35	build/i18n/po/tpac/ru-RU.po
+39	35	build/i18n/po/tpac/sv-SE.po
+39	35	build/i18n/po/tpac/tr-TR.po
+836	584	build/i18n/po/webstaff/ar-JO.po
+1119	790	build/i18n/po/webstaff/cs-CZ.po
+549	547	build/i18n/po/webstaff/en-GB.po
+857	621	build/i18n/po/webstaff/es-ES.po
+706	562	build/i18n/po/webstaff/hy-AM.po
+533	541	build/i18n/po/webstaff/ru-RU.po
+
+commit 898d355d07608a55122949571643446774f1109a
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Mon Sep 24 17:23:45 2018 -0400
+
+    Docs: Remove old release notes files
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+
+0	22	docs/RELEASE_NOTES_NEXT/Administration/new_hold_targeter.adoc
+0	16	docs/RELEASE_NOTES_NEXT/Client/consistent-terminology.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Administration/new_hold_targeter.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Client/consistent-terminology.adoc
+
+commit d8080c3df085ef97b11deb23a9c67f2a2cf82a59
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Mon Sep 24 17:14:39 2018 -0400
+
+    Docs: Add Upgrade Notes to release notes
+    
+    This commit copies relevant sections of the release notes into the
+    Upgrade Notes section.
+    
+    A few paragraphs are also reformatted into lines of appropriate length.
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+
+161	16	docs/RELEASE_NOTES_3_2.adoc
+
+commit 1830cf6b7a2dc83f2f2a2b027f1e35cb4cd986a2
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Mon Sep 24 15:53:04 2018 -0400
+
+    Update Release Notes for 3.2-rc
+    
+    Add new release notes. Also, slight reorganization to the
+    acknowledgements section (move organizations to appropriate section, fix
+    sorting of COOL, use consistent name for BC Libraries).
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+
+49	5	docs/RELEASE_NOTES_3_2.adoc
+
+commit 861a750946844bb8642addeba7ca1832c0f98639
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Mon Sep 24 15:15:46 2018 -0400
+
+    Docs: Fix two minor errors in docs
+    
+      - Fix an AsciiDoc heading syntax error
+      - Fix a grammatical error (repeated "the")
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+
+1	1	docs/RELEASE_NOTES_3_2.adoc
+1	1	docs/acquisitions/selection_lists_po.adoc
+
+commit 25f60b4e7d9ba78cb96cd177659c8f82493287e2
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Sep 24 16:19:33 2018 -0400
+
+    LP#1794176 Avoid capturing grid cell tooltip/display values
+    
+    Remove the grid-tooltip logic that captured the cell content into a
+    template-level variable so the content only needed to be generated once
+    for both the tooltip and cell display.  This logic fails to handle cases
+    where the cell content is dynamic, typically the result of row
+    attributes being modified via external process.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	7	Open-ILS/src/templates/staff/share/t_autogrid.tt2
+7	0	Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit 6c0e0d5efaa90dd22468127d6e7d5bf87bdff6c1
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Sep 24 13:56:09 2018 -0400
+
+    LP#1789442: turn of Perl taint-checking on 14-OpenILS-Utils.t
+    
+    This works around a bug in DateTime::TimeZone 1.63
+    <https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=737265> that
+    causes one of the new tests to spuriously fail on Ubuntu 14.04 LTS.
+    
+    As the comment indicates, taint checking is not typically enabled
+    when running Evergreen, but we may want to consider changing
+    that should tuits arise.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+15	1	Open-ILS/src/perlmods/t/14-OpenILS-Utils.t
+
+commit 110624bac23fcd0e53fef11d2af091c942e6d9aa
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Sep 24 13:55:39 2018 -0400
+
+    LP#1789442: restore column allocation for barcode input
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+
+commit 867da55cd97a0973b20ce0df26a6f4edfa7645eb
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 21 15:23:11 2018 -0400
+
+    LP#1789442: fix editing due date of hourly loans in web staff
+    
+    This patch fixes a bug where editing the due date of an hourly
+    loan would result in the time portion always getting set to 00:00.
+    
+    To test
+    -------
+    [1] Set up some daily and hourly loans in your database.
+    [2] Apply the patch.
+    [3] From the items out page, edit the due date for one or
+        more hourly loans. Verify that the resulting due date
+        is set correctly.
+    [4] From the items out page, edit the due date for some
+        daily loans and verify correctness. In particular,
+        verify that the resulting due date is /not/ the
+        following day if testing in time zones in the Americas.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+5	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+1	7	Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+
+commit 6fbbcca096402e099f90702e5f79a98b80bc69a2
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 21 14:58:47 2018 -0400
+
+    LP#1552778: add timepicker to webstaff checkout page
+    
+    This patch adds a timepicker to go along with the datepicker
+    if the operator invokes the option to set a specific due
+    date.
+    
+    To test
+    -------
+    [1] Arrange circ policies to have both hourly and daily loans.
+    [2] Apply the patch.
+    [3] Check out an item for an hourly loan. Verify that the
+        due date and time is per policy.
+    [4] Check out an item for a daily loan. Verify that the
+        due date is per policy.
+    [5] Check out an item for an hourly loan, but set a specific
+        due date and time. Verify that the due date and time matches
+        the selected value.
+    [6] Check out an item for a daily loan, but set a specific
+        due date. Verify that the due date matches the selected
+        value; note that any time component is ignored since
+        for daily loans the time gets normalized to 23:59.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+5	7	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+
+commit b1c3b925764f6d8bf7cfe8b9f9c9a4ebe4c09d04
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 21 14:30:01 2018 -0400
+
+    LP#1552778: make clean_ISO8601 recognize 'Z' as a timezone specifier
+    
+    Prior to this patch, clean_ISO8601 would ignore 'Z' as a timezone
+    specifier (e.g., '2018-09-21T15:34:21Z') and treat it as if the
+    timestamp were in the server's time zone, leading to incorrect
+    results (e.g., '2018-09-21T15:34:21-04:00') unless user, client,
+    and server all happen to be in UTC+0.  In particular, this allows
+    date strings emitted by the JavaScript Date object's toISOString()
+    method to be correctly parsed, as those strings invariably use
+    'Z' as the timezone specifier.
+    
+    To test
+    -------
+    [1] Apply patch.
+    [2] Verify that regression test in t/14-OpenILS-Utils.t passes.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	0	Open-ILS/src/perlmods/lib/OpenILS/Utils/DateTime.pm
+17	8	Open-ILS/src/perlmods/t/14-OpenILS-Utils.t
+
+commit 401fb4cc1a5a065d0b82692dae4f64a449d820f7
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 21 14:04:24 2018 -0400
+
+    LP#1552778: add perldoc and unit tests for clean_ISO8601
+    
+    To test
+    -------
+    [1] Apply patch.
+    [2] Verify new tests in t/14-OpenILS-Utils.t pass.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+35	0	Open-ILS/src/perlmods/lib/OpenILS/Utils/DateTime.pm
+15	1	Open-ILS/src/perlmods/t/14-OpenILS-Utils.t
+
+commit 8fa7940b570fbb22c478e31735959ce88fdce30d
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 21 11:00:25 2018 -0400
+
+    LP#1552778: copy some date/time utils from OpenSRF
+    
+    As preparation for subsequent bugfixes, this patch
+    copies several date/time routines from OpenSRF::Utils
+    to a new module, OpenILS::Utils::DateTime. Specifically,
+    the routines copied over are:
+    
+    * clean_ISO8601() (renaming of the OpenSRF cleanse_ISO8601)
+    * gmtime_ISO8601()
+    * interval_to_seconds()
+    * seconds_to_interval()
+    
+    This move will allow us to fix bugs in this core routines
+    without requiring a mandatory OpenSRF upgrade. Furthermore,
+    with the exception of interval_to_seconds() (and in only one
+    place), none of those routines are used by OpenSRF itself.
+    
+    To test
+    -------
+    [1] Apply the patch.
+    [2] Verify that unit tests pass.
+    [3] Verify that all Perl services start correctly.
+    [4] Verify that date/time and interval calculations continue
+        to work as expected, particularly in circulation.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+6	5	Open-ILS/src/offline/offline.pl
+1	0	Open-ILS/src/perlmods/MANIFEST
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/ClosedDates.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Booking.pm
+11	11	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+11	11	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm
+23	23	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+11	11	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Money.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Collections.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
+6	6	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+2	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher.pm
+6	6	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+20	20	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm
+3	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Reactor.pm
+3	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Validator.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/SIP.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/SIP/Item.pm
+5	5	Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm
+246	0	Open-ILS/src/perlmods/lib/OpenILS/Utils/DateTime.pm
+7	7	Open-ILS/src/perlmods/lib/OpenILS/Utils/HoldTargeter.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Utils/Penalty.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/Exporter.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/WWW/SuperCat.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/SuperCat/Feed.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/TemplateBatchBibUpdate.pm
+3	3	Open-ILS/src/perlmods/live_t/03-overdue_circ.t
+3	3	Open-ILS/src/perlmods/live_t/04-overdue_with_closed_dates.t
+1	1	Open-ILS/src/perlmods/live_t/05-pay_bills.t
+1	1	Open-ILS/src/perlmods/live_t/09-lp1198465_neg_balances.t
+10	1	Open-ILS/src/perlmods/t/14-OpenILS-Utils.t
+7	7	Open-ILS/src/support-scripts/generate_circ_notices.pl
+2	2	Open-ILS/src/support-scripts/set_pbx_holidays.pl
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/Utils/DateTime.pm
+
+commit 72152af78b20dee043b865f4471c0e066538e1a6
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Sat Sep 22 23:08:28 2018 -0400
+
+    LP#1793857: Restore Copy Current Row
+    
+    In our effort to consistently call items/copies items, we accidentally replaced
+    the action "Copy Current Row" with "Item Current Row." This branch restores
+    the correct language.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+2	2	Open-ILS/src/templates/staff/cat/share/t_marcedit.tt2
+
+commit 8cdf97e8c608d10d41287d5f32f500badad9e2a4
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Sep 19 11:16:39 2018 -0400
+
+    LP#1791335: Retain stat cats on item transfer
+    
+    For some reason, parts were protected during item transfer, but stat cats were
+    not.  This commit protects them by fleshing stat cat entries in the outer
+    item transfer method.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm
+
+commit f6cea03d0d017e2a1581aacdba096286f4002aa4
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 21 16:46:17 2018 -0400
+
+    LP#1791340: expand on comment about backdated checkin times
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	0	Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+
+commit c09dd9af04f4ac68307c953f623a930afe107e6d
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Sep 21 10:45:59 2018 -0400
+
+    LP#1791340 Webstaff: Don't backdate when we're not
+    
+    There was code in the webstaff checkin interface which attempted to
+    remove the backdate parameter when it wasn't needed, as its mere
+    presence has a negative effect on the checkin process.  This fail-safe
+    was not working, however.
+    
+    Instead, let's build on the same check function used for the display,
+    so we can be more sure that if the user doesn't see that they are
+    backdating, the interface will not treat it as a backdate, and
+    vice-versa.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	4	Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+
+commit 1c3b4a9fac28e1e49234837debb275a8665abb40
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Sep 20 18:26:47 2018 -0400
+
+    LP#1745427: account for change in prediction patterns
+    
+    This patch fixes a bug in the web staff client where changing
+    the active prediction pattern for a subscription would not
+    reset the base issue when predicting the next run of issues.
+    
+    To test
+    -------
+    1. Set up a subscription in the web staff client with a prediction
+       pattern (e.g., monthly).  Predict some issues.
+    2. Create/select a new prediction pattern for a new publishing schedule,
+       e.g., quarterly.
+    3. Activate the new pattern and deactivate the old pattern.
+    4. Click Predict New Issues.
+    5. Enter in the new publication date/enumerations/chronology as needed.
+    6. Enter a prediction count and select Save. Note that new issues
+       appear to be based on the previous pattern.
+    7. Apply the patch, delete the issues created in step 6, then repeat
+       steps 4-6.  This time, new issues should be created using the new
+       prediction pattern.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+16	7	Open-ILS/web/js/ui/default/staff/serials/services/core.js
+
+commit 437e7f826a9a36be2db65f96ad6862c9bea1094d
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Sep 19 10:26:04 2018 -0400
+
+    LP#1781480: Include group owner ancestor badges
+    
+    This commit lightly refactors the badge org logic and includes the ancestors
+    of location group owners in the list of badge orgs, instead of only the direct
+    owners.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Jeanette Lundgren <jlundgren at cwmars.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+5	12	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+
+commit a0a885fe5e7e4d1da89cf1da54df7feaac7cf524
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Sep 17 11:33:29 2018 -0400
+
+    LP#1781480: Closures remeber values in subtle ways...
+    
+    ... and we must take care to avoid that.  This commit forces a state variable
+    to be statically assigned an empty list rather than depending on the idiomatic
+    undef to vivicate an empty list.  This is important for all OpenSRF methods,
+    and manifests here as a search "remembering" a previously chosen location
+    group.  A comment to that point is included for our future selves.
+    
+    The core probably arises from the fact that, in the end, OpenSRF methods are
+    generated closures.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Jeanette Lundgren <jlundgren at cwmars.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+10	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+
+commit 140ff94d566acf262486152bad8395b32429ed4b
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Aug 3 17:25:33 2018 -0400
+
+    LP#1732761: Chain the promises to avoid races
+    
+    It looks like there's a race condition gathering locations for larger copy
+    sets.  Here we chain the promises to remove the race by serialization.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+32	32	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 443ed531a19fdea611a01f931252316cffbbce47
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Jul 9 16:31:50 2018 -0400
+
+    LP#1732761: Fetch locations immediately for display
+    
+    This commit closes a race condition where location labels cannot be rendered
+    for the "multiple locations" widget because fetching them takes longer than
+    the initial render of the attribute editor.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+25	3	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit b98f8efea5a1937704c94b3de534d9028fd09d40
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Jul 3 16:57:27 2018 -0400
+
+    LP#1732761: Batch item edit and multiple values per field
+    
+    Previous to this commit, the display of multiple different values for a field
+    in the item attribute editor was simply to display no value.  Here we add a UI
+    component that presents the list of unique values, the number of selected
+    copies that use each value, and the ability to select just those copies using
+    a particular value by clicking on the desired value.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+    	Open-ILS/src/templates/staff/cat/volcopy/index.tt2
+    	Open-ILS/src/templates/staff/cat/volcopy/t_attr_edit.tt2
+
+8	0	Open-ILS/src/templates/staff/cat/volcopy/index.tt2
+54	0	Open-ILS/src/templates/staff/cat/volcopy/t_attr_edit.tt2
+11	0	Open-ILS/src/templates/staff/share/t_listcounts.tt2
+89	0	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+19	0	Open-ILS/web/js/ui/default/staff/services/grid.js
+44	0	Open-ILS/web/js/ui/default/staff/services/ui.js
+ create mode 100644 Open-ILS/src/templates/staff/share/t_listcounts.tt2
+
+commit 5f4b487477d6504b91991c042441209e28c8c30b
+Author: Jason Boyer <jboyer at library.in.gov>
+Date:   Thu Sep 13 07:39:06 2018 -0400
+
+    LP1792371: Fix De-select Whole Page Action
+    
+    When using the checkbox to select or de-select the
+    entire page of results, the de-select action changes
+    the check and highlight states of the items on page
+    but doesn't actually remove the records from the
+    basket. This branch corrects that so that you can
+    select and de-select the entire page of results
+    and your basket contents are what you would expect.
+    
+    Signed-off-by: Jason Boyer <jboyer at library.in.gov>
+    Signed-off-by: Terran McCanna <tmccanna at georgialibraries.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+5	0	Open-ILS/web/js/ui/default/opac/record_selectors.js
+
+commit 5876118b87d38fc2a48af176473fd14e2208c2ed
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Thu Sep 20 10:05:28 2018 -0400
+
+    LP#1783345: Make one more change in case
+    
+    One button was missed when normalizing case in the add to bucket modal.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/templates/staff/cat/catalog/t_add_to_bucket.tt2
+
+commit 9157e87540ab6fbd4f7e19ddd6a8151f6b00cadb
+Author: Sam Link <slink at LIBPC002>
+Date:   Tue Jul 31 10:35:34 2018 -0400
+
+    Bug #1783345 - Normalized add to bucket modal
+    
+    The text cases in the add to bucket modal have been normalized to
+    sentence case.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+4	4	Open-ILS/src/templates/staff/cat/catalog/t_add_to_bucket.tt2
+
+commit 1c1bc36222e90f34a94e6ba38c8daf7f90775283
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Sun Sep 16 18:48:59 2018 -0400
+
+    LP#1792484 Patron preferred name in hold shelf dialog
+    
+    Display the patron preferred name in addition to the primary name in the
+    route-to-holds-shelf dialog.  As with primary name, preferred name is
+    hidden when an alias is applied.
+    
+    To test
+    [1] Add a primary first, middle, and/or last name value to a patron.
+    [2] Place a hold for the patron with the pickup library matching the
+        login library.
+    [2] Capgture the hold via the Checkin interface (instead of the hold
+        capture interface) and note the preferred name display.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+9	0	Open-ILS/src/templates/staff/circ/share/t_hold_shelf_dialog.tt2
+
+commit 870cecad0ac527b5ceaf4d5b893f6612fce2867c
+Author: Library Tech <libsysadmin at calvin.edu>
+Date:   Tue Sep 18 16:12:57 2018 -0400
+
+    Translation updates - newpot
+    
+    Signed-off-by: Library Tech <libsysadmin at calvin.edu>
+
+16	16	build/i18n/po/conify/conify.pot
+85	78	build/i18n/po/db.seed/db.seed.pot
+30	30	build/i18n/po/fm_IDL.dtd/fm_IDL.dtd.pot
+19	19	build/i18n/po/ils_events.xml/ils_events.xml.pot
+3	3	build/i18n/po/lang.dtd/lang.dtd.pot
+36	32	build/i18n/po/tpac/tpac.pot
+530	538	build/i18n/po/webstaff/webstaff.pot
+
+commit 03df8c998d896dea76901cc86ad37176d642b83b
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Aug 22 19:46:10 2018 -0400
+
+    LP#1538691: Release notes entry for consistent terminology
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+16	0	docs/RELEASE_NOTES_NEXT/Client/consistent-terminology.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/consistent-terminology.adoc
+
+commit 5f90b07e588fffa5428ae8bcd9d4445e3150b01b
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Aug 22 16:48:43 2018 -0400
+
+    LP#1538691: More changes to terminology
+    
+    For more consistency: Changing all staff client instances of Copy Location to
+    Shelving Location. We also replace Volume with Call Number and use Holdings
+    for a combination of copies/volumes. Also replacing the 'Add Copies' option
+    on the bib record page with 'Add Holdings' as was previously discussed on
+    the open-ils-general list.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+3	3	Open-ILS/src/templates/conify/global/asset/copy_location_group.tt2
+2	2	Open-ILS/src/templates/conify/global/asset/copy_location_order.tt2
+4	4	Open-ILS/src/templates/staff/admin/local/t_splash.tt2
+1	1	Open-ILS/src/templates/staff/cat/bucket/copy/index.tt2
+1	1	Open-ILS/src/templates/staff/cat/bucket/copy/t_view.tt2
+4	4	Open-ILS/src/templates/staff/cat/catalog/index.tt2
+1	1	Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
+1	1	Open-ILS/src/templates/staff/cat/catalog/t_choose_vol_target_lib.tt2
+11	11	Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+9	9	Open-ILS/src/templates/staff/cat/item/index.tt2
+1	1	Open-ILS/src/templates/staff/cat/share/t_embedded_volcopy.tt2
+2	2	Open-ILS/src/templates/staff/cat/share/t_volume_list.tt2
+3	3	Open-ILS/src/templates/staff/cat/volcopy/index.tt2
+1	1	Open-ILS/src/templates/staff/cat/volcopy/t_attr_edit.tt2
+2	2	Open-ILS/src/templates/staff/cat/volcopy/t_defaults.tt2
+5	5	Open-ILS/src/templates/staff/cat/volcopy/t_edit.tt2
+1	1	Open-ILS/src/templates/staff/cat/volcopy/t_view.tt2
+1	1	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+1	1	Open-ILS/src/templates/staff/circ/holds/t_pull_list.tt2
+1	1	Open-ILS/src/templates/staff/circ/share/t_hold_details.tt2
+1	1	Open-ILS/src/templates/staff/circ/transits/t_list.tt2
+1	1	Open-ILS/src/templates/staff/css/cat.css.tt2
+1	1	Open-ILS/src/templates/staff/serials/t_batch_receive.tt2
+2	2	Open-ILS/web/opac/locale/en-US/lang.dtd
+
+commit 5d28b84c87d11cac205ec3b74f758e8824d77536
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Aug 1 13:14:32 2018 -0400
+
+    LP#1538691: Use items instead of copies
+    
+    For better consistency for the terms used in the client, let's use items instead
+    of copies, which was the preference of most people who provided feedback on bug
+    1538691.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+            Open-ILS/src/templates/staff/cat/catalog/t_holds.tt2
+            Open-ILS/src/templates/staff/cat/item/t_list.tt2
+            Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+            Open-ILS/src/templates/staff/circ/holds/t_shelf_list.tt2
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	2	Open-ILS/src/templates/staff/admin/local/asset/copy_tag.tt2
+3	3	Open-ILS/src/templates/staff/admin/local/autoGridEditor/acas.tt2
+3	3	Open-ILS/src/templates/staff/admin/local/autoGridEditor/ccat.tt2
+4	4	Open-ILS/src/templates/staff/admin/local/t_splash.tt2
+1	1	Open-ILS/src/templates/staff/admin/serials/t_splash.tt2
+2	2	Open-ILS/src/templates/staff/admin/server/config/copy_tag_type.tt2
+2	2	Open-ILS/src/templates/staff/admin/server/t_splash.tt2
+1	1	Open-ILS/src/templates/staff/admin/workstation/t_print_config.tt2
+2	2	Open-ILS/src/templates/staff/cat/bucket/copy/index.tt2
+1	1	Open-ILS/src/templates/staff/cat/bucket/copy/t_apply_tags.tt2
+5	5	Open-ILS/src/templates/staff/cat/bucket/copy/t_view.tt2
+4	4	Open-ILS/src/templates/staff/cat/catalog/index.tt2
+1	1	Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
+1	1	Open-ILS/src/templates/staff/cat/catalog/t_conjoined_items.tt2
+11	11	Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+7	7	Open-ILS/src/templates/staff/cat/catalog/t_holds.tt2
+9	9	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+3	3	Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+2	2	Open-ILS/src/templates/staff/cat/share/t_marcedit.tt2
+2	2	Open-ILS/src/templates/staff/cat/share/t_replace_barcode.tt2
+2	2	Open-ILS/src/templates/staff/cat/share/t_volume_list.tt2
+1	1	Open-ILS/src/templates/staff/cat/volcopy/index.tt2
+4	4	Open-ILS/src/templates/staff/cat/volcopy/t_attr_edit.tt2
+2	2	Open-ILS/src/templates/staff/cat/volcopy/t_copy_alerts.tt2
+2	2	Open-ILS/src/templates/staff/cat/volcopy/t_copy_notes.tt2
+1	1	Open-ILS/src/templates/staff/cat/volcopy/t_copy_tags.tt2
+10	10	Open-ILS/src/templates/staff/cat/volcopy/t_defaults.tt2
+10	10	Open-ILS/src/templates/staff/cat/volcopy/t_edit.tt2
+2	2	Open-ILS/src/templates/staff/cat/volcopy/t_view.tt2
+2	2	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+6	6	Open-ILS/src/templates/staff/circ/holds/t_pull_list.tt2
+4	4	Open-ILS/src/templates/staff/circ/holds/t_shelf_list.tt2
+2	2	Open-ILS/src/templates/staff/circ/in_house_use/index.tt2
+1	1	Open-ILS/src/templates/staff/circ/patron/t_bills.tt2
+3	3	Open-ILS/src/templates/staff/circ/patron/t_bills_list.tt2
+2	2	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+3	3	Open-ILS/src/templates/staff/circ/patron/t_holds_list.tt2
+1	1	Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2
+2	2	Open-ILS/src/templates/staff/circ/renew/t_renew.tt2
+18	18	Open-ILS/src/templates/staff/circ/share/circ_strings.tt2
+1	1	Open-ILS/src/templates/staff/circ/share/hold_strings.tt2
+1	1	Open-ILS/src/templates/staff/circ/share/t_circ_exists_dialog.tt2
+2	2	Open-ILS/src/templates/staff/circ/share/t_copy_in_transit_dialog.tt2
+2	2	Open-ILS/src/templates/staff/circ/share/t_copy_not_avail_dialog.tt2
+2	2	Open-ILS/src/templates/staff/circ/share/t_hold_details.tt2
+1	1	Open-ILS/src/templates/staff/css/cat.css.tt2
+1	1	Open-ILS/src/templates/staff/css/style.css.tt2
+2	2	Open-ILS/src/templates/staff/navbar.tt2
+3	3	Open-ILS/src/templates/staff/serials/t_subscription_manager.tt2
+2	2	Open-ILS/src/templates/staff/share/print_templates/t_bill_payment.tt2
+2	2	Open-ILS/src/templates/staff/share/print_templates/t_bills_current.tt2
+4	4	Open-ILS/src/templates/staff/share/print_templates/t_bills_historical.tt2
+1	1	Open-ILS/src/templates/staff/share/print_templates/t_holds_for_bib.tt2
+2	2	Open-ILS/src/templates/staff/share/print_templates/t_in_house_use_list.tt2
+1	1	Open-ILS/src/templates/staff/share/print_templates/t_item_status.tt2
+1	1	Open-ILS/src/templates/staff/share/t_add_copy_alert_dialog.tt2
+1	1	Open-ILS/src/templates/staff/share/t_copy_alert_editor_dialog.tt2
+4	4	Open-ILS/src/templates/staff/share/t_copy_alert_manager_dialog.tt2
+1	1	Open-ILS/src/templates/staff/t_splash.tt2
+
+commit 664d4cde5a21191a88f05dd1751f45fb61703efb
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Sun Sep 16 19:28:11 2018 -0400
+
+    LP#1792482 My OPAC settings preferred name field
+    
+    Adds a new row to the patron account preferences page for Preferred
+    Name.  The field only displays when a preferred first, middle, or last
+    value is present and follows the same display logic as preferred names
+    in the staff client, where first and last fall-through to the primary
+    name.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+20	3	Open-ILS/src/templates/opac/myopac/prefs.tt2
+
+commit 86f732b4eade6a22b66979cb8258168ebbf1cbb2
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Sun Sep 16 19:25:44 2018 -0400
+
+    LP#1792482 Only require first/last in pref name display
+    
+    When displaying a patrons preferred name, always show a value for first
+    and last name, starting with the preferred name and defaulting to the
+    primary name, but only show values for prefix, middle name, and suffix
+    when a preferred variant is applied.
+    
+    This avoids scenarios where patrons use their middle name as their first
+    name, with no preferred middle name applied, resulting duplicate
+    first/middle names displaying.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/templates/staff/circ/patron/t_summary.tt2
+
+commit af72b32e28e1bca2ca22d0b23050c0874d4e7eb4
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Sep 18 14:53:47 2018 -0400
+
+    LP#1787274: Stamping upgrade script for no dupe transits
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+73	0	Open-ILS/src/sql/Pg/upgrade/1133.schema.no-dupe-transits.sql
+0	73	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.no-dupe-transits.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1133.schema.no-dupe-transits.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.no-dupe-transits.sql
+
+commit 2b721198d9947d6fd0d6940ac042a9cdd87a95bf
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Sep 18 11:21:26 2018 -0400
+
+    LP#1787274 One active transit pgtap tests
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+39	0	Open-ILS/src/sql/Pg/live_t/lp1787274-no-dupe-transits.pg
+ create mode 100644 Open-ILS/src/sql/Pg/live_t/lp1787274-no-dupe-transits.pg
+
+commit 87bc5e52e2958a1904bebd43747c31a24951e981
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Sep 17 18:16:42 2018 -0400
+
+    LP#1787274 Active copy transit unique constraint
+    
+    Adds constraint triggers to action.*transit_copy tables to prevent
+    creation of new transits for a copies when an existing transit of any
+    type exists for the copy with a NULL dest_recv_time and cancel_time
+    values (i.e. an open transit).
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+25	0	Open-ILS/src/sql/Pg/090.schema.action.sql
+4	0	Open-ILS/src/sql/Pg/095.schema.booking.sql
+73	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.no-dupe-transits.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.no-dupe-transits.sql
+
+commit a03994fe3ba4b6cf0d18f9fa6b6c0f245ead67ef
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Sep 17 18:16:28 2018 -0400
+
+    LP#1787274 Prevent multiple active copy checkins
+    
+    In the staff client checkin service, track which copies are currently
+    in-flight to the checkin API call and prevent additional checkin API
+    calls for any copy that is currently in flight.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+13	2	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+
+commit cbdc7768e1e7026312f62e83fb8057cb47f193f2
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Tue Sep 18 11:28:55 2018 -0700
+
+    Docs: LP1793184 adding to the 3.2 release notes
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+3	2	docs/RELEASE_NOTES_3_2.adoc
+
+commit 9f8afc49756e7511aad843cc9f9f9cf2dc072b61
+Author: Jason Boyer <jboyer at library.in.gov>
+Date:   Thu Jun 21 15:57:41 2018 -0400
+
+    LP1735816: Delete Copy Notes in the Web Client
+    
+    A combination of calling convention errors and
+    template picky-ness prevented the deletion of
+    copy notes in the web client. This patch returns
+    that ability.
+    
+    Signed-off-by: Jason Boyer <jboyer at library.in.gov>
+    Signed-off-by: Amy Constantino <aconstantino at cwmars.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/AssetCommon.pm
+5	8	Open-ILS/src/templates/staff/cat/volcopy/t_copy_notes.tt2
+29	20	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 56aa1445c8f209d2c516cdb01969433bd05be8d1
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Thu Sep 13 15:26:46 2018 -0400
+
+    LP#1745610 - Add release notes for hold targeter script change.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+22	0	docs/RELEASE_NOTES_NEXT/Administration/new_hold_targeter.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/new_hold_targeter.adoc
+
+commit 48397200fc137e25515d067333e9a81f4728533e
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Thu Sep 13 15:25:21 2018 -0400
+
+    LP#1745610 - Update Makefile.am to reflect filename changes.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/Makefile.am
+
+commit 1873334054549b2c53b3aa2afd483d6bcda758aa
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Fri Jan 26 07:58:58 2018 -0500
+
+    LP#1745610 - Deprecate original hold_targeter.pl
+    
+    With the new hold targeter battle-tested for over a year,
+    it's now time to promote it to default, deprecating the
+    older version.  This commit renames the old targeter to
+    "hold_targeter_legacy.pl" and the new to "hold_targeter.pl",
+    and adapts the example crontab to use the new targeter's
+    parameter syntax.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/examples/crontab.example
+190	80	Open-ILS/src/support-scripts/hold_targeter.pl
+99	0	Open-ILS/src/support-scripts/hold_targeter_legacy.pl
+0	209	Open-ILS/src/support-scripts/hold_targeter_v2.pl
+ create mode 100755 Open-ILS/src/support-scripts/hold_targeter_legacy.pl
+ delete mode 100755 Open-ILS/src/support-scripts/hold_targeter_v2.pl
+
+commit 25ee42bb2453c1d540b93bae206b28b1a53feb4b
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Jun 29 14:45:27 2018 -0400
+
+    LP#1642344: XUL report cloning
+    
+    This patch allows report templates of version 4 and earlier
+    (which would have been created by the XUL staff client) to
+    be upgraded to template version 5 (used by the web staff
+    client) when the user clones a report. This closes a limitation
+    introduced in the reporter module for the web staff client.
+    
+    Note that during the conversion, inner joins are used by
+    default when IDL classes have a 'has_a' relation rather than
+    defaulting to left outer joins, improving correctness of the
+    generated SQL query.
+    
+    To test
+    -------
+    [0] Apply the patch.
+    [1] In a test database that has reporter templates created
+        by (or for) the XUL staff client, create clones of
+        those templates.
+    [2] Verify that the output of reports created using the new
+        templates matches output of reports from the original
+        templates.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Terran McCanna <tmccanna at georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+114	15	Open-ILS/web/js/ui/default/staff/reporter/template/app.js
+24	0	Open-ILS/web/js/ui/default/staff/test/unit/egReporter.js
+2	3	Open-ILS/web/reports/oils_rpt_folder_window.js
+
+commit 49837dc3010755342a04c08527e4aa28d24e3832
+Author: Kyle Huckins <khuckins at catalyte.io>
+Date:   Tue Sep 11 17:13:11 2018 +0000
+
+    lp1511742 Additional Scaffolding Fixes
+    
+    - Apply scaffolding fixes to Aquisition Patron Requests,
+    Circ Age to Lost, and Auto Print settings UIs, preventing
+    Org Selector from taking up entire width of screen.
+    
+    Signed-off-by: Kyle Huckins <khuckins at catalyte.io>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	3	Open-ILS/src/templates/staff/acq/requests/t_list.tt2
+6	6	Open-ILS/src/templates/staff/admin/local/circ/age_to_lost.tt2
+14	14	Open-ILS/src/templates/staff/admin/local/config/auto_print.tt2
+
+commit 3436eccbd9e1407cb564b7250e87ef9d5c5093d4
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Sep 7 16:36:17 2018 -0400
+
+    LP#1511742 Org selector typeahead UI formatting
+    
+    The display behavior of the org selector changed when migrating to a
+    typeahead.  In some cases, the boundaries of the input need to be more
+    clearly defined or it will fill the page horizontally.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kyle Huckins <khuckins at catalyte.io>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+8	8	Open-ILS/src/templates/staff/admin/workstation/t_workstations.tt2
+5	2	Open-ILS/src/templates/staff/circ/patron/t_pending_list.tt2
+
+commit b0ed643b8efef834da6d9689be6c5c74047abaf6
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Sep 7 15:59:35 2018 -0400
+
+    LP#1511742 Org unit selector typeahead
+    
+    Reimplements <eg-org-selector> as an ngbTypeahead:
+    
+    https://angular-ui.github.io/bootstrap/#!#typeahead
+    
+    This allows for type-to-entry of the org selector.  A few additional
+    bits of logic are added to support click-to-open of the selector
+    regardless of the selected value.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kyle Huckins <khuckins at catalyte.io>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+19	0	Open-ILS/src/templates/staff/share/t_org_select.tt2
+131	39	Open-ILS/web/js/ui/default/staff/services/ui.js
+ create mode 100644 Open-ILS/src/templates/staff/share/t_org_select.tt2
+
+commit 88072d56f1a55e3f03f28cd2f552595419193c55
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Sep 14 10:06:33 2018 -0400
+
+    LP#1739286: Belt and suspenders on radio button flags
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	0	Open-ILS/web/js/ui/default/staff/cat/services/z3950.js
+
+commit 8b0e06fd7c87a20750e51fc0df5ce3e7818d59e1
+Author: Jason Etheridge <jason at EquinoxInitiative.org>
+Date:   Tue Jul 10 19:46:04 2018 -0400
+
+    lp1739286 default search box in Z39.50
+    
+    This change tweaks the layout of search fields in the web client Z39.50
+    interface and adds radio buttons for the default search field to auto-focus.
+    The behavior is "sticky" without the need for an explicit Save action.  If the
+    current default field is not present due to a given combination of selected
+    services, then no field will be focused by default.
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+15	5	Open-ILS/src/templates/staff/cat/z3950/t_search_fields.tt2
+20	0	Open-ILS/web/js/ui/default/staff/cat/services/z3950.js
+
+commit 95378e51bed521eb991a4e25f38185e3ccba23af
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Mon Sep 10 10:07:54 2018 -0700
+
+    LP1727464: Adding record ID to the title link in the checkout interface
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+    Signed-off-by: Garry Collum <gcollum at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+
+commit 65f5afc47e9ed0d3006eeba963c6c7057479cdae
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Sep 13 14:25:05 2018 -0400
+
+    LP#1792429: calculate queue position in correct order
+    
+    This patch ensures that the relative hold queue position
+    displayed in the webstaff Hold Shelf and Record -> View Holds
+    interfaces is calculated in the correct order, i.e., (cut-in-line aside)
+    with holds requested earlier having a lower queue position than
+    holds requested later.
+    
+    To test
+    -------
+    [1] Set up a bib with a number of hold requests.
+    [2] Under Record -> Viwe Holds, note that the queue
+        positions are reversed, with later holds having lower
+        queue positions.
+    [3] Apply the patch and repeat step #2. This time, the queue
+        positions should be correct.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+
+commit f594e2854a172ad61a5a27eaf3804d42a4a07020
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Thu Sep 13 11:47:55 2018 -0400
+
+    LP#1774724 - stamp upgrade script
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+26	0	Open-ILS/src/sql/Pg/upgrade/1132.data.yaous_longoverdue_descrip_typos.sql
+0	26	Open-ILS/src/sql/Pg/upgrade/XXXX.data.yaous_longoverdue_descrip_typos.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1132.data.yaous_longoverdue_descrip_typos.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.yaous_longoverdue_descrip_typos.sql
+
+commit 564ba9f18ebace573dc2ec4ef7c09a085adffe99
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Mon Apr 30 23:34:30 2018 -0400
+
+    LP#1774724: Fix copy-pasto's in Library Settings
+    
+    Two long-overdue org unit settings made reference to "lost", being
+    apparently copied from the similar settings about lost items. This fixes
+    the wording, both in the settings database table and in the docs.
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+3	3	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+26	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.yaous_longoverdue_descrip_typos.sql
+1	1	docs/admin/librarysettings.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.yaous_longoverdue_descrip_typos.sql
+
+commit 8a1a43b57baf4036fe5ccf485caa0ed29e2fe2a2
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Aug 29 10:58:20 2018 -0400
+
+    LP#1738688: Add cancel time to Most Recent Transits
+    
+    Adds the transit cancel time to the Most Recent Transits section of
+    the Item Status Holds / Transit tab.
+    
+    Test plan:
+    Place an item in transit and then cancel the transit. Retrieve the item in
+    Item Status / Detail View. In the Holds / Transit tab, there is no indication
+    the transit has been canceled before loading the patch. Post-patch, the
+    cancel time will display.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: John Amundson <jamundson at cwmars.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+6	0	Open-ILS/src/templates/staff/cat/item/t_holds_pane.tt2
+
+commit fab90985f34028b203a8de46c0f681b310fcb857
+Author: a. bellenir <ab at grpl.org>
+Date:   Tue Jun 12 14:54:18 2018 -0400
+
+    LP#1773434: show in catalog
+    
+    open a new staff client tab to the record's opac view, not a new opac tab
+    
+    Signed-off-by: a. bellenir <ab at grpl.org>
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+1	1	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit b19a728dbc515dde495174a5c4fb306c42af0291
+Author: a. bellenir <ab at grpl.org>
+Date:   Mon Jun 4 19:41:55 2018 -0400
+
+    LP#1773434 missing option to "Show in Catalog"
+    
+    Signed-off-by: a. bellenir <ab at grpl.org>
+    Signed-off-by: Garry Collum <gcollum at gmail.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+2	0	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+4	0	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+6	0	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit 4894212ed19a4ab6d90b9afd8505d71043fc6e93
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Sep 13 10:25:20 2018 -0400
+
+    LP#1786534: ensure that changes don't regress
+    
+    This patch ensures that somebody who installs a maintenance
+    release of 3.0 or 3.1 that includes update 1130, then subsequently
+    upgrades to 3.2 *and* applies the schema update scripts piecemeal
+    doesn't suffer a regression on actor.usr_merge not updating
+    Vandelay session ownership or patron name keywords.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+361	0	Open-ILS/src/sql/Pg/upgrade/1131.schema.keep_usr_merge_up_to_date.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1131.schema.keep_usr_merge_up_to_date.sql
+
+commit 6129d529f4456fe9c19c4e9fcf4f727eb2e612e6
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Sep 13 10:16:04 2018 -0400
+
+    LP#1786534: stamp schema update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+361	0	Open-ILS/src/sql/Pg/upgrade/1130.schema.actor_usr_merge-bail-on-same-user.sql
+0	361	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.actor_usr_merge-bail-on-same-user.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1130.schema.actor_usr_merge-bail-on-same-user.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.actor_usr_merge-bail-on-same-user.sql
+
+commit 7c580671be47cb2ea800b3e005f6a281acee4829
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Sep 13 10:12:17 2018 -0400
+
+    LP#1786534: make update script reflect other recent changes in actor.usr_merge
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+35	1	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.actor_usr_merge-bail-on-same-user.sql
+
+commit ecae2ccba6ef760ea1ad90e1e7cac2fa60fe3dd7
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Fri Aug 10 15:10:04 2018 -0400
+
+    LP 1786534: Don't merge a user with itself.
+    
+    It's possible to merge a user with itself using the actor.usr_merge
+    database function.  This does not produce a useful result.  One ends
+    up with a user that is flagged deleted, has a null card field, and is
+    likely to have their addresses and other cards deleted from the
+    database.
+    
+    A simple check at the top of the database function to bail if the
+    src_usr and dest_usr are the same prevents this from happening.  That
+    is the change that this commit makes.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+6	0	Open-ILS/src/sql/Pg/999.functions.global.sql
+327	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.actor_usr_merge-bail-on-same-user.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.actor_usr_merge-bail-on-same-user.sql
+
+commit 868904789b1be09470fc1deca68cc4789248719a
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Tue Nov 7 16:49:37 2017 -0500
+
+    LP#1269574 - Exclude backordered copies from deletion.
+    
+    When canceling a lineitem with a cancel reason that
+    keep debits = true, make sure we don't delete those copies.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: John Amundson <jamundson at cwmars.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+3	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm
+
+commit cf2298b38273697e14381a442968e9e2097dbf79
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Mon Aug 27 16:07:48 2018 -0400
+
+    LP#1776917 - fix patron bill grid lacking bill ID
+    
+    Without the required attribute in the grid template
+    declaration, the Bill# column *had* to be enabled for
+    bill payments to work. This adds required attribute to
+    the Bill #, so that it's fetched regardless of whether
+    displayed or not, so posting payments work correctly.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: John Amundson <jamundson at cwmars.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+1	1	Open-ILS/src/templates/staff/circ/patron/t_bills_list.tt2
+
+commit be9f2cccfe464d1fb99f686e1f09e4c2ba70d953
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Mon Sep 10 11:23:12 2018 -0700
+
+    LP 1743654: Removing a duplicate flesh_fields array entry
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+    Signed-off-by: John Amundson <jamundson at cwmars.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+1	1	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit 5eaa1710418e237cd6ec9745b9c77e978b5fba5d
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Mon Sep 10 11:16:51 2018 -0700
+
+    LP1743654: Fleshing out the Created By column in Item Status
+    
+    To test:
+    1) Scan an item into Item Status.
+    2) Turn on the Created By column.
+    3) Note that the Created By column shows the ID of the user
+    that created the record.
+    4) Apply this commit and repeat steps 1-2.
+    5) Note that the Created By column now shows the creator's
+    user name as a link, which opens the creator's record in
+    a new tab.
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+    Signed-off-by: John Amundson <jamundson at cwmars.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+8	1	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+1	1	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit bacd986156c1551bd5f9cbfca44aa49c66f2ec20
+Author: Ben Shum <ben at evergreener.net>
+Date:   Wed Sep 12 14:26:25 2018 -0400
+
+    LP#1718459: Remove apache 2.2 language from README
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+3	5	docs/installation/server_installation.adoc
+
+commit c6437c29fdeb0a922eac46aa1d4f2190e43e9307
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Fri Sep 22 00:29:37 2017 -0400
+
+    Lp#1718459: Remove Debian 7 Wheezy Installation Support
+    
+    Remove references to Debian 7 Wheezy in the installation and upgrade
+    documentation.
+    
+    Remove debian-wheezy* targets from
+    Open-ILS/src/extras/Makefile.install and the supporting Makefiles.
+    
+    Remove the example Apache 2.2 configuration files, since the supported
+    distributions all ship with Apache 2.4.
+    
+    Move the eg_startup.in file from Open-ILS/example/apache to
+    Open-ILS/examples/apache_24.
+    
+    Remove references to eg_wheezy_installer.sh in Perl live test
+    comments.
+    
+    Remove Open-ILS/web/js/ui/default/staff/README.install, which is out
+    of date and entirely aimed at Debian 7 Wheezy.
+    
+    To test: Simply install on a supported distribution other than Debian
+    7 Wheezy and do the usual tests.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+0	154	Open-ILS/examples/apache/eg.conf.in
+0	29	Open-ILS/examples/apache/eg_startup.in
+0	859	Open-ILS/examples/apache/eg_vhost.conf.in
+29	0	Open-ILS/examples/apache_24/eg_startup.in
+3	11	Open-ILS/src/Makefile.am
+1	13	Open-ILS/src/extras/Makefile.install
+1	1	Open-ILS/src/extras/install/Makefile.debian-jessie
+0	159	Open-ILS/src/extras/install/Makefile.debian-wheezy
+1	2	Open-ILS/src/perlmods/live_t/01-auth.t
+1	2	Open-ILS/src/perlmods/live_t/02-simple_circ.t
+1	2	Open-ILS/src/perlmods/live_t/03-overdue_circ.t
+1	2	Open-ILS/src/perlmods/live_t/04-overdue_with_closed_dates.t
+1	2	Open-ILS/src/perlmods/live_t/05-pay_bills.t
+1	2	Open-ILS/src/perlmods/live_t/09-lp1198465_neg_balances.t
+17	67	docs/installation/server_installation.adoc
+2	3	docs/installation/server_upgrade.adoc
+ delete mode 100644 Open-ILS/examples/apache/eg.conf.in
+ delete mode 100755 Open-ILS/examples/apache/eg_startup.in
+ delete mode 100644 Open-ILS/examples/apache/eg_vhost.conf.in
+ create mode 100755 Open-ILS/examples/apache_24/eg_startup.in
+ delete mode 100644 Open-ILS/src/extras/install/Makefile.debian-wheezy
+
+commit 7567914437d0c0508d845f96c2677b29f9d411af
+Author: Steven Callender <stevecallender at esilibrary.com>
+Date:   Tue Sep 11 15:20:55 2018 -0400
+
+    LP1792014: KPAC fix for opac.holds.org_unit_not_pickup_lib in org_selector.
+    
+    Signed-off-by: Steven Callender <stevecallender at esilibrary.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	1	Open-ILS/src/templates/kpac/getit.tt2
+
+commit f3e7a335a930842cc5129f6334eed8f285208c38
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Mon Sep 10 11:42:34 2018 -0700
+
+    LP1775640: Adds deposit columns to Item Status and Holdings View grids
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+    Signed-off-by: Beth Willis <willis at noblenet.org>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+2	0	Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+2	0	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+
+commit b549d593f6d294c7a7f526e97d159182f33e32e9
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Mon Sep 10 16:39:45 2018 -0400
+
+    Lp 1746251: Fix Circulation Modifier typos.
+    
+    Change "Circulation Modifer" to "Circulation Modifier" in two files.
+    This commit only addresses the obvious typos.  I leave the Circ
+    Modifier versus Circulation Modifier debate as an open question.  One
+    of my concerns is changing them all to one string may require some
+    reorganization of interfaces to avoid clunkiness.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	1	Open-ILS/src/templates/staff/admin/serials/t_attr_edit.tt2
+1	1	Open-ILS/src/templates/staff/cat/volcopy/t_attr_edit.tt2
+
+commit 6de97f9b7bf3588b901421682757146dbff3af40
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Mon Sep 10 09:23:29 2018 -0700
+
+    LP1665052: Fix checkin workstation display on recent circs view
+    
+    To test:
+    1) Go to Item Status > Detail View > Recent Circ History for
+    an item that is currently checked out.
+    2) Note that the Checkin Workstation field says
+    "{{circ.checkin_workstation.name()}}"
+    3) Apply this commit.
+    4) Note that the Checkin Workstation field is empty if an
+    item is an item hasn't been checked in, but is filled with
+    the appropriate workstation name after it has been checked
+    in.
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	1	Open-ILS/src/templates/staff/cat/item/t_circs_pane.tt2
+
+commit ef3fa1488e4a84f998a4ba2671d796a553f7c07c
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Mon Aug 20 15:09:56 2018 -0400
+
+    LP#1739087 - enable vol to be zeroed
+    
+    Allow user to "blank" or "zero out" a volume row by using the new "x"
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+5	1	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 7417b395d9b790cbcd66914a3884b6a3d248d2e0
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Thu Aug 16 17:40:56 2018 -0400
+
+    LP#1739087 - add [x] to volcopy editor volume rows-FollowUp
+    
+    Since we're programmatically changing the Volume counter,
+    must manually trigger the change event, to prevent sync issues.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+4	2	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit ad1d99ce712afef42c099b935d377f97a8ffb385
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Fri Jul 27 11:21:25 2018 -0400
+
+    LP#1739087 - add [x] to volcopy editor volume rows
+    
+    Enable newly created call numbers to be removable in
+    VolCopyEditor.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+41	4	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 6fb3aaba241eee24be54751b63e923436c38d047
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Aug 7 16:26:27 2018 -0400
+
+    LP#1785887 edi_order_pusher.pl sets message account
+    
+    Apply the edi_message.account value when sending EDI order messages via
+    edi_order_pusher.pl.  This solves a problem where EDI ORDERS message
+    were not visible in the interface, because there was no way to complete
+    the permission check.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+16	0	Open-ILS/src/support-scripts/edi_order_pusher.pl
+
+commit 8310bfccaaa30d0a8171a1050b42cbb280b93653
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Sun Jun 3 15:50:40 2018 -0700
+
+    LP1010635: Make bre dates populate in Item Status grid
+    
+    To test:
+    1) Enable the Date Record Created and Date Record Last Edited columns
+    in Item Status.
+    2) Scan an item barcode into Item Status.  Note that the two columns
+    you enabled are empty.
+    3) Apply this commit.
+    4) Reload the Item Status screen, and scan your barcode again.  The
+    dates should now be populated.
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+    Signed-off-by: Garry Collum <gcollum at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit e763bd684550bf44093734f14fb93ce05cddd458
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Jul 30 17:23:49 2018 -0400
+
+    LP#1724083 Webstaff approve pending patron address
+    
+    Add support for approving pending patron addresses in the webstaff
+    patron edit interface.
+    
+    To test:
+    [1] Enable the pending address org unit setting.
+    [2] Log into the catalog and "edit" an address.
+    [3] Edit same user in staff client and use the Approve action.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Garry Collum <gcollum at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+29	0	Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+7	0	Open-ILS/src/templates/staff/css/circ.css.tt2
+41	0	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit 1d38620f4f01444d1bf9b9485f38a9bf3f9589d1
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Sun Jun 3 14:34:04 2018 -0400
+
+    LP#1774886 Distinguish Phys Char Wizard with an edit icon
+    
+    As both authority fields and the Physical Characteristics Wizard for 007 use
+    the same glyphicons-link class, it's not obvious to new users of the MARC
+    editor that the icons result in radically different actions.
+    
+    Change the 007 icon to glyphicons-edit to reflect that it opens an editor
+    interface.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/web/js/ui/default/staff/cat/services/marcedit.js
+
+commit f58e975bb6ddeacef05ee84b6ba58323f98f8ca4
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Tue Sep 11 09:15:19 2018 -0700
+
+    Docs: Adding info about supercat filters
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+14	0	docs/development/data_supercat.adoc
+
+commit 8bedbe0f06719418be323fe9c8e7b4e37cf0148d
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Sep 7 11:21:00 2018 -0400
+
+    Translation updates - po files
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+3	3	build/i18n/po/cat.properties/ar-JO.po
+3	3	build/i18n/po/cat.properties/cs-CZ.po
+3	3	build/i18n/po/cat.properties/de-DE.po
+3	3	build/i18n/po/cat.properties/en-CA.po
+3	3	build/i18n/po/cat.properties/en-GB.po
+3	3	build/i18n/po/cat.properties/es-ES.po
+3	3	build/i18n/po/cat.properties/fi-FI.po
+3	3	build/i18n/po/cat.properties/fr-CA.po
+3	3	build/i18n/po/cat.properties/he-IL.po
+3	3	build/i18n/po/cat.properties/hu-HU.po
+3	3	build/i18n/po/cat.properties/hy-AM.po
+3	3	build/i18n/po/cat.properties/oc-FR.po
+3	3	build/i18n/po/cat.properties/pt-BR.po
+3	3	build/i18n/po/cat.properties/ru-RU.po
+3	3	build/i18n/po/cat.properties/sv-SE.po
+3	3	build/i18n/po/cat.properties/tr-TR.po
+7	7	build/i18n/po/circ.properties/cs-CZ.po
+20	15	build/i18n/po/circ.properties/en-GB.po
+3	3	build/i18n/po/common.properties/ar-JO.po
+3	3	build/i18n/po/common.properties/cs-CZ.po
+3	3	build/i18n/po/common.properties/de-DE.po
+3	3	build/i18n/po/common.properties/en-CA.po
+3	3	build/i18n/po/common.properties/en-GB.po
+3	3	build/i18n/po/common.properties/es-ES.po
+3	3	build/i18n/po/common.properties/fi-FI.po
+3	3	build/i18n/po/common.properties/fr-CA.po
+3	3	build/i18n/po/common.properties/he-IL.po
+3	3	build/i18n/po/common.properties/hu-HU.po
+3	3	build/i18n/po/common.properties/hy-AM.po
+3	3	build/i18n/po/common.properties/oc-FR.po
+3	3	build/i18n/po/common.properties/pt-BR.po
+3	3	build/i18n/po/common.properties/ru-RU.po
+3	3	build/i18n/po/common.properties/sv-SE.po
+3	3	build/i18n/po/common.properties/tr-TR.po
+12	12	build/i18n/po/conify/cs-CZ.po
+4019	3393	build/i18n/po/db.seed/ar-JO.po
+4124	3478	build/i18n/po/db.seed/cs-CZ.po
+3973	3365	build/i18n/po/db.seed/de-DE.po
+3982	3374	build/i18n/po/db.seed/en-CA.po
+3982	3374	build/i18n/po/db.seed/en-GB.po
+4024	3398	build/i18n/po/db.seed/es-ES.po
+3991	3383	build/i18n/po/db.seed/fi-FI.po
+3990	3382	build/i18n/po/db.seed/fr-CA.po
+3970	3362	build/i18n/po/db.seed/he-IL.po
+3970	3362	build/i18n/po/db.seed/hu-HU.po
+4033	3407	build/i18n/po/db.seed/hy-AM.po
+3974	3366	build/i18n/po/db.seed/oc-FR.po
+3988	3380	build/i18n/po/db.seed/pt-BR.po
+3983	3375	build/i18n/po/db.seed/ru-RU.po
+3970	3362	build/i18n/po/db.seed/sv-SE.po
+3970	3362	build/i18n/po/db.seed/tr-TR.po
+2943	2781	build/i18n/po/fm_IDL.dtd/ar-JO.po
+2945	2783	build/i18n/po/fm_IDL.dtd/cs-CZ.po
+2936	2774	build/i18n/po/fm_IDL.dtd/de-DE.po
+2943	2781	build/i18n/po/fm_IDL.dtd/en-CA.po
+2942	2780	build/i18n/po/fm_IDL.dtd/en-GB.po
+2952	2790	build/i18n/po/fm_IDL.dtd/es-ES.po
+2943	2781	build/i18n/po/fm_IDL.dtd/fi-FI.po
+2934	2772	build/i18n/po/fm_IDL.dtd/fr-CA.po
+2934	2772	build/i18n/po/fm_IDL.dtd/he-IL.po
+2934	2772	build/i18n/po/fm_IDL.dtd/hu-HU.po
+2943	2781	build/i18n/po/fm_IDL.dtd/hy-AM.po
+2934	2772	build/i18n/po/fm_IDL.dtd/oc-FR.po
+2942	2780	build/i18n/po/fm_IDL.dtd/pt-BR.po
+2942	2780	build/i18n/po/fm_IDL.dtd/ru-RU.po
+2934	2772	build/i18n/po/fm_IDL.dtd/sv-SE.po
+2934	2772	build/i18n/po/fm_IDL.dtd/tr-TR.po
+39	35	build/i18n/po/ils_events.xml/ar-JO.po
+39	35	build/i18n/po/ils_events.xml/cs-CZ.po
+39	35	build/i18n/po/ils_events.xml/de-DE.po
+39	35	build/i18n/po/ils_events.xml/en-CA.po
+39	35	build/i18n/po/ils_events.xml/en-GB.po
+39	35	build/i18n/po/ils_events.xml/es-ES.po
+39	35	build/i18n/po/ils_events.xml/fi-FI.po
+39	35	build/i18n/po/ils_events.xml/fr-CA.po
+39	35	build/i18n/po/ils_events.xml/he-IL.po
+39	35	build/i18n/po/ils_events.xml/hu-HU.po
+39	35	build/i18n/po/ils_events.xml/hy-AM.po
+39	35	build/i18n/po/ils_events.xml/oc-FR.po
+39	35	build/i18n/po/ils_events.xml/pt-BR.po
+39	35	build/i18n/po/ils_events.xml/ru-RU.po
+39	35	build/i18n/po/ils_events.xml/sv-SE.po
+39	35	build/i18n/po/ils_events.xml/tr-TR.po
+52	36	build/i18n/po/lang.dtd/ar-JO.po
+104	92	build/i18n/po/lang.dtd/cs-CZ.po
+25	26	build/i18n/po/lang.dtd/de-DE.po
+54	38	build/i18n/po/lang.dtd/en-CA.po
+54	38	build/i18n/po/lang.dtd/en-GB.po
+55	39	build/i18n/po/lang.dtd/es-ES.po
+55	39	build/i18n/po/lang.dtd/fi-FI.po
+25	26	build/i18n/po/lang.dtd/fr-CA.po
+25	26	build/i18n/po/lang.dtd/he-IL.po
+25	26	build/i18n/po/lang.dtd/hu-HU.po
+73	89	build/i18n/po/lang.dtd/hy-AM.po
+25	26	build/i18n/po/lang.dtd/oc-FR.po
+25	26	build/i18n/po/lang.dtd/pt-BR.po
+25	26	build/i18n/po/lang.dtd/ru-RU.po
+25	26	build/i18n/po/lang.dtd/sv-SE.po
+25	26	build/i18n/po/lang.dtd/tr-TR.po
+17	15	build/i18n/po/selfcheck.js/fr-CA.po
+461	282	build/i18n/po/tpac/ar-JO.po
+464	285	build/i18n/po/tpac/cs-CZ.po
+419	276	build/i18n/po/tpac/de-DE.po
+435	277	build/i18n/po/tpac/en-CA.po
+1264	1012	build/i18n/po/tpac/en-GB.po
+534	353	build/i18n/po/tpac/es-ES.po
+439	278	build/i18n/po/tpac/fi-FI.po
+447	286	build/i18n/po/tpac/fr-CA.po
+415	275	build/i18n/po/tpac/he-IL.po
+415	275	build/i18n/po/tpac/hu-HU.po
+461	282	build/i18n/po/tpac/hy-AM.po
+416	276	build/i18n/po/tpac/oc-FR.po
+428	276	build/i18n/po/tpac/pt-BR.po
+415	275	build/i18n/po/tpac/ru-RU.po
+415	275	build/i18n/po/tpac/sv-SE.po
+415	275	build/i18n/po/tpac/tr-TR.po
+1729	698	build/i18n/po/webstaff/ar-JO.po
+1778	738	build/i18n/po/webstaff/cs-CZ.po
+1681	695	build/i18n/po/webstaff/en-GB.po
+1855	805	build/i18n/po/webstaff/es-ES.po
+1691	696	build/i18n/po/webstaff/hy-AM.po
+1681	695	build/i18n/po/webstaff/ru-RU.po
+
+commit 40995f7f6b938c72094d4644d9782da563af2cbb
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Fri Sep 7 07:34:36 2018 -0700
+
+    Docs: finalizing acknowledgments section for 3.2 release notes
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+5	0	docs/RELEASE_NOTES_3_2.adoc
+
+commit 296b81441b3157fecf2509270e0ff0c638047659
+Author: Andrea Buntz Neiman <abneiman at equinoxinitiative.org>
+Date:   Fri Sep 7 07:27:02 2018 -0700
+
+    Docs: Adding Equinox Open Library Initiative's acknowledgments
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+13	0	docs/RELEASE_NOTES_3_2.adoc
+
+commit bb466cd966fa3a2677e886d0c12364856b66c46a
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Thu Sep 6 21:01:17 2018 -0700
+
+    Docs: documenting new 3.2 features based on release notes
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+11	36	docs/RELEASE_NOTES_3_2.adoc
+15	0	docs/acquisitions/selection_lists_po.adoc
+18	0	docs/cataloging/authorities.adoc
+61	0	docs/development/support_scripts.adoc
+
+commit 832c606ce9fec181757e8dfdb430819cbdd140c9
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Thu Sep 6 17:24:06 2018 -0700
+
+    Docs: spellchecking 3.2 release notes
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+1212	1184	docs/.aspell.en.pws
+6	6	docs/RELEASE_NOTES_3_2.adoc
+
+commit b7abce6cbd5e74e2456a3f52424f16031b20740d
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Thu Sep 6 17:09:53 2018 -0700
+
+    Docs: adding more contributor info to 3.2 release notes
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+22	1	docs/RELEASE_NOTES_3_2.adoc
+
+commit bb8c14f0afdf8660d8f0fc701dadbe60f44f79a6
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Sep 6 18:57:05 2018 -0400
+
+    LP#1791184: ensure that 'make clean' doesn't delete pingest.pl
+    
+    This patch corrects an issue where pingest.pl was treated as if
+    it were generated from a pingest.pl.in source file during the configure
+    step, meaning that it got deleted by 'make clean'.  This patch also
+    adds a couple helpful comments.
+    
+    To test
+    -------
+    [1] Apply the patch.
+    [2] From a git checkout, run the configure and make steps, followed
+        by a 'make clean'. Verify that pingest.pl is not deleted from
+        the source tree.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+7	3	Open-ILS/src/Makefile.am
+
+commit 43e0db09a9c784619b5adfb6caaf8af21197bfb9
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Thu Sep 6 15:00:26 2018 -0700
+
+    Docs: Adding two more entries to 3.2 release notes
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+88	0	docs/RELEASE_NOTES_3_2.adoc
+
+commit 0469a1cb06a6adcaf80e04325618be9fca3895c7
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Sep 5 16:44:08 2018 -0400
+
+    LP#1790923: add release notes
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+13	0	docs/RELEASE_NOTES_NEXT/Client/Disabling_Legacy_Staff_client.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/Disabling_Legacy_Staff_client.adoc
+
+commit 9d2ddf6d75b674cbf905817fa637b28397e1e354
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Sep 5 16:39:13 2018 -0400
+
+    LP#1790923: adjust or remove references to old staff client in install doc
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+7	8	docs/installation/server_installation.adoc
+
+commit e3032ad3cd1fe2e684c949613b82841efd401867
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Sep 5 16:36:53 2018 -0400
+
+    LP#1790923: make_release no longer munges STAMP_ID in the README
+    
+    (As that text no longer exists; the installation instructions simply
+     will not mention the old staff client.)
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+0	2	build/tools/make_release
+
+commit 23fd5ef82afefa0732df9f4f386888ccffad8b1a
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Sep 5 16:29:22 2018 -0400
+
+    LP#1790923: disable XUL staff client by default
+    
+    This patch discourages use of the legacy XUL staff client
+    by adjusting the installation process so that a versioned XUL
+    server directory is not created. Instead, by default XUL
+    server files (which is still needed by a few web staff client
+    interfaces) end up in /openils/var/web/xul/legacy. During installation
+    and upgrade, the /openils/var/web/xul/server symbolic link is
+    set to point to /openils/var/web/xul/legacy/server if possible.
+    
+    If for some reason a given installation of Evergreen 3.2.x does not
+    wish to stop using the XUL staff client, STAFF_CLIENT_STAMP_ID
+    can still be provided during the 'make install' step, and the
+    make_release script can still create the XUL client installers
+    if given the -x switch.
+    
+    Note, however, that use of the XUL staff client in 3.2.x is
+    NOT RECOMMENDED and no longer under any guarantee of community
+    support.
+    
+    To test
+    -------
+    [1] Perform a fresh installation and verify that /openils/var/web/xul/legacy
+        is created and that /openils/var/web/xul/server is a symlink
+        pointing to /openils/var/web/xul/legacy/server.
+    [2] Verify that the web staff client works and that the
+        user permissions editor in particular continues to work.
+    [3] Perform an upgrade; verify that /openils/var/web/xul/legacy exists
+        and that if /openils/var/web/xul/server started out as a symlink,
+        it has been repointed.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+21	1	Open-ILS/xul/staff_client/Makefile.am
+1	15	docs/installation/server_installation.adoc
+13	1	docs/installation/server_upgrade.adoc
+
+commit 81324a87efcaa46b2d4bf289d04280eacf7be625
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Sep 6 17:07:35 2018 -0400
+
+    LP#1775466 Stamping DB upgrade for Ang6 app
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+106	0	Open-ILS/src/sql/Pg/upgrade/1129.data.acq-grid-settings.sql
+0	106	Open-ILS/src/sql/Pg/upgrade/XXXX.data.acq-grid-settings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1129.data.acq-grid-settings.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.acq-grid-settings.sql
+
+commit 03d94e21e5052156efecefb1ac87de11206c9954
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Sep 6 17:03:58 2018 -0400
+
+    LP#1775466: tweak how make_release prunes eg2/node_modules
+    
+    Need the -f since some stuff under eg2/node_modules/.cache
+    ends up as 0444 for some reason, meaning that 'rm -r' doesn't
+    remove those files and complains about it.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	build/tools/make_release
+
+commit 52f83fe0fd7b5765dd541d597def27040eceee35
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Sep 6 16:27:27 2018 -0400
+
+    LP#1775466: add a newly-added entry to the ang6 navbar
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+4	0	Open-ILS/src/eg2/src/app/staff/nav.component.html
+
+commit c37f7ba9e3cfbf7ff0feeb9c77710d706d63697d
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Sep 6 16:26:45 2018 -0400
+
+    LP#1775466: improve release notes for the Angular6 app
+    
+    More needs to be added to eg_vhost.conf when upgrading an
+    existing installation.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+4	0	docs/RELEASE_NOTES_NEXT/Architecture/angular6-app.adoc
+
+commit d28eeddfd5dda73db0b017a94c37573f68057f33
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Sep 5 15:53:28 2018 -0400
+
+    LP#1775466 Angular6 base app release notes
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+66	0	docs/RELEASE_NOTES_NEXT/Architecture/angular6-app.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Architecture/angular6-app.adoc
+
+commit 48055f0527c77b71fb402d2af15c47b4d8db40e0
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Sep 5 15:55:11 2018 -0400
+
+    LP#1775466 make_release builds Angular app
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+12	2	build/tools/make_release
+
+commit 060af9b3739033bc276b692b45c118b6eb4ba83b
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Sep 5 15:57:51 2018 -0400
+
+    LP#1775466 Add Angular building to install docs
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+43	2	docs/installation/server_installation.adoc
+
+commit 9a79de4aa33b52f55397bcbcd6cd9f84c3dff149
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Sep 5 15:56:41 2018 -0400
+
+    LP#1775466 developer prereqs update Node / add angular/cli
+    
+    NodeJS version updated from v6 to v8.
+    Install angular/cli globally, needed for building the Angular app.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/extras/Makefile.install
+1	1	Open-ILS/src/extras/install/Makefile.common
+
+commit e8cf82d0ddb13dfbcbf96bf7528ce34e9574c0d1
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Sep 5 15:58:23 2018 -0400
+
+    LP#1775466 Angular Apache configuration updates
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+31	0	Open-ILS/examples/apache/eg_vhost.conf.in
+30	0	Open-ILS/examples/apache_24/eg_vhost.conf.in
+
+commit a29408d79df4b5240bd206fcd2158cadc9547bae
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Sep 5 15:54:21 2018 -0400
+
+    LP#1775466 Acq admin grid workstation settings
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+101	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+106	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.acq-grid-settings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.acq-grid-settings.sql
+
+commit 038cd40207c5f63001bae2b68defdf44163c352d
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Sep 5 16:04:19 2018 -0400
+
+    LP#1775466 AngularJS updates for Angular integration
+    
+    Changes include:
+    
+    * Navbar links to Angular acquisitions admin page.
+    * Auth cookie migration tool for moving AngularJS cookies from /eg/staff
+      to /.
+    * Store last printed receipt (etc) in its final compiled form so it can
+      be directly reprinted without having to recompile (via AngularJS).
+      This allows the reprint-last action to work in the Angular app.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+13	1	Open-ILS/src/templates/staff/navbar.tt2
+4	0	Open-ILS/web/js/ui/default/staff/services/auth.js
+20	2	Open-ILS/web/js/ui/default/staff/services/hatch.js
+22	15	Open-ILS/web/js/ui/default/staff/services/print.js
+
+commit 6c706f454b2b9cdf2d46df3c60e53a0d3cb531d7
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Sep 5 16:11:41 2018 -0400
+
+    LP#1775466 Angular(6) base application
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	0	.gitignore
+13	0	Open-ILS/src/eg2/.editorconfig
+49	0	Open-ILS/src/eg2/.gitignore
+31	0	Open-ILS/src/eg2/CHEAT_SHEET.adoc
+155	0	Open-ILS/src/eg2/angular.json
+14	0	Open-ILS/src/eg2/e2e/app.e2e-spec.ts
+11	0	Open-ILS/src/eg2/e2e/app.po.ts
+14	0	Open-ILS/src/eg2/e2e/tsconfig.e2e.json
+43	0	Open-ILS/src/eg2/karma.conf.js
+10689	0	Open-ILS/src/eg2/package-lock.json
+84	0	Open-ILS/src/eg2/package.json
+28	0	Open-ILS/src/eg2/protractor.conf.js
+11	0	Open-ILS/src/eg2/src/app/app.component.ts
+33	0	Open-ILS/src/eg2/src/app/app.module.ts
+71	0	Open-ILS/src/eg2/src/app/common.module.ts
+9	0	Open-ILS/src/eg2/src/app/core/README
+341	0	Open-ILS/src/eg2/src/app/core/auth.service.ts
+55	0	Open-ILS/src/eg2/src/app/core/event.service.ts
+47	0	Open-ILS/src/eg2/src/app/core/event.spec.ts
+103	0	Open-ILS/src/eg2/src/app/core/format.service.ts
+90	0	Open-ILS/src/eg2/src/app/core/format.spec.ts
+137	0	Open-ILS/src/eg2/src/app/core/idl.service.ts
+28	0	Open-ILS/src/eg2/src/app/core/idl.spec.ts
+69	0	Open-ILS/src/eg2/src/app/core/locale.service.ts
+187	0	Open-ILS/src/eg2/src/app/core/net.service.ts
+278	0	Open-ILS/src/eg2/src/app/core/org.service.ts
+66	0	Open-ILS/src/eg2/src/app/core/org.spec.ts
+305	0	Open-ILS/src/eg2/src/app/core/pcrud.service.ts
+59	0	Open-ILS/src/eg2/src/app/core/perm.service.ts
+114	0	Open-ILS/src/eg2/src/app/core/server-store.service.ts
+107	0	Open-ILS/src/eg2/src/app/core/store.service.ts
+22	0	Open-ILS/src/eg2/src/app/core/store.spec.ts
+36	0	Open-ILS/src/eg2/src/app/resolver.service.ts
+29	0	Open-ILS/src/eg2/src/app/routing.module.ts
+6	0	Open-ILS/src/eg2/src/app/share/README
+26	0	Open-ILS/src/eg2/src/app/share/accesskey/accesskey-info.component.html
+25	0	Open-ILS/src/eg2/src/app/share/accesskey/accesskey-info.component.ts
+56	0	Open-ILS/src/eg2/src/app/share/accesskey/accesskey.directive.ts
+67	0	Open-ILS/src/eg2/src/app/share/accesskey/accesskey.service.ts
+249	0	Open-ILS/src/eg2/src/app/share/catalog/bib-record.service.ts
+28	0	Open-ILS/src/eg2/src/app/share/catalog/catalog-common.module.ts
+143	0	Open-ILS/src/eg2/src/app/share/catalog/catalog-url.service.ts
+210	0	Open-ILS/src/eg2/src/app/share/catalog/catalog.service.ts
+90	0	Open-ILS/src/eg2/src/app/share/catalog/marc-html.component.ts
+266	0	Open-ILS/src/eg2/src/app/share/catalog/search-context.ts
+54	0	Open-ILS/src/eg2/src/app/share/catalog/unapi.service.ts
+25	0	Open-ILS/src/eg2/src/app/share/combobox/combobox-entry.component.ts
+27	0	Open-ILS/src/eg2/src/app/share/combobox/combobox.component.html
+241	0	Open-ILS/src/eg2/src/app/share/combobox/combobox.component.ts
+21	0	Open-ILS/src/eg2/src/app/share/date-select/date-select.component.html
+70	0	Open-ILS/src/eg2/src/app/share/date-select/date-select.component.ts
+17	0	Open-ILS/src/eg2/src/app/share/dialog/confirm.component.html
+17	0	Open-ILS/src/eg2/src/app/share/dialog/confirm.component.ts
+80	0	Open-ILS/src/eg2/src/app/share/dialog/dialog.component.ts
+5	0	Open-ILS/src/eg2/src/app/share/dialog/progress-inline.component.css
+28	0	Open-ILS/src/eg2/src/app/share/dialog/progress-inline.component.html
+92	0	Open-ILS/src/eg2/src/app/share/dialog/progress-inline.component.ts
+5	0	Open-ILS/src/eg2/src/app/share/dialog/progress.component.css
+33	0	Open-ILS/src/eg2/src/app/share/dialog/progress.component.html
+108	0	Open-ILS/src/eg2/src/app/share/dialog/progress.component.ts
+22	0	Open-ILS/src/eg2/src/app/share/dialog/prompt.component.html
+19	0	Open-ILS/src/eg2/src/app/share/dialog/prompt.component.ts
+146	0	Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html
+302	0	Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts
+20	0	Open-ILS/src/eg2/src/app/share/grid/grid-body-cell.component.html
+57	0	Open-ILS/src/eg2/src/app/share/grid/grid-body-cell.component.ts
+39	0	Open-ILS/src/eg2/src/app/share/grid/grid-body.component.html
+77	0	Open-ILS/src/eg2/src/app/share/grid/grid-body.component.ts
+69	0	Open-ILS/src/eg2/src/app/share/grid/grid-column-config.component.html
+16	0	Open-ILS/src/eg2/src/app/share/grid/grid-column-config.component.ts
+20	0	Open-ILS/src/eg2/src/app/share/grid/grid-column-width.component.html
+32	0	Open-ILS/src/eg2/src/app/share/grid/grid-column-width.component.ts
+57	0	Open-ILS/src/eg2/src/app/share/grid/grid-column.component.ts
+32	0	Open-ILS/src/eg2/src/app/share/grid/grid-header.component.html
+85	0	Open-ILS/src/eg2/src/app/share/grid/grid-header.component.ts
+30	0	Open-ILS/src/eg2/src/app/share/grid/grid-print.component.html
+45	0	Open-ILS/src/eg2/src/app/share/grid/grid-print.component.ts
+33	0	Open-ILS/src/eg2/src/app/share/grid/grid-toolbar-action.component.ts
+43	0	Open-ILS/src/eg2/src/app/share/grid/grid-toolbar-button.component.ts
+37	0	Open-ILS/src/eg2/src/app/share/grid/grid-toolbar-checkbox.component.ts
+152	0	Open-ILS/src/eg2/src/app/share/grid/grid-toolbar.component.html
+86	0	Open-ILS/src/eg2/src/app/share/grid/grid-toolbar.component.ts
+142	0	Open-ILS/src/eg2/src/app/share/grid/grid.component.css
+27	0	Open-ILS/src/eg2/src/app/share/grid/grid.component.html
+149	0	Open-ILS/src/eg2/src/app/share/grid/grid.component.ts
+50	0	Open-ILS/src/eg2/src/app/share/grid/grid.module.ts
+972	0	Open-ILS/src/eg2/src/app/share/grid/grid.ts
+17	0	Open-ILS/src/eg2/src/app/share/org-select/org-select.component.html
+212	0	Open-ILS/src/eg2/src/app/share/org-select/org-select.component.ts
+16	0	Open-ILS/src/eg2/src/app/share/print/print.component.html
+133	0	Open-ILS/src/eg2/src/app/share/print/print.component.ts
+41	0	Open-ILS/src/eg2/src/app/share/print/print.service.ts
+74	0	Open-ILS/src/eg2/src/app/share/string/string.component.ts
+78	0	Open-ILS/src/eg2/src/app/share/string/string.service.ts
+11	0	Open-ILS/src/eg2/src/app/share/toast/toast.component.css
+3	0	Open-ILS/src/eg2/src/app/share/toast/toast.component.html
+43	0	Open-ILS/src/eg2/src/app/share/toast/toast.component.ts
+39	0	Open-ILS/src/eg2/src/app/share/toast/toast.service.ts
+19	0	Open-ILS/src/eg2/src/app/share/tree/tree.component.css
+20	0	Open-ILS/src/eg2/src/app/share/tree/tree.component.html
+60	0	Open-ILS/src/eg2/src/app/share/tree/tree.component.ts
+20	0	Open-ILS/src/eg2/src/app/share/tree/tree.module.ts
+133	0	Open-ILS/src/eg2/src/app/share/tree/tree.ts
+78	0	Open-ILS/src/eg2/src/app/share/util/audio.service.ts
+111	0	Open-ILS/src/eg2/src/app/share/util/pager.ts
+57	0	Open-ILS/src/eg2/src/app/staff/about.component.html
+25	0	Open-ILS/src/eg2/src/app/staff/about.component.ts
+60	0	Open-ILS/src/eg2/src/app/staff/admin/acq/admin-acq-splash.component.html
+11	0	Open-ILS/src/eg2/src/app/staff/admin/acq/admin-acq-splash.component.ts
+24	0	Open-ILS/src/eg2/src/app/staff/admin/acq/admin-acq.module.ts
+22	0	Open-ILS/src/eg2/src/app/staff/admin/acq/routing.module.ts
+61	0	Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts
+28	0	Open-ILS/src/eg2/src/app/staff/admin/common.module.ts
+23	0	Open-ILS/src/eg2/src/app/staff/admin/routing.module.ts
+99	0	Open-ILS/src/eg2/src/app/staff/admin/server/admin-server-splash.component.html
+11	0	Open-ILS/src/eg2/src/app/staff/admin/server/admin-server-splash.component.ts
+24	0	Open-ILS/src/eg2/src/app/staff/admin/server/admin-server.module.ts
+19	0	Open-ILS/src/eg2/src/app/staff/admin/server/routing.module.ts
+14	0	Open-ILS/src/eg2/src/app/staff/admin/workstation/routing.module.ts
+25	0	Open-ILS/src/eg2/src/app/staff/admin/workstation/workstations/routing.module.ts
+92	0	Open-ILS/src/eg2/src/app/staff/admin/workstation/workstations/workstations.component.html
+186	0	Open-ILS/src/eg2/src/app/staff/admin/workstation/workstations/workstations.component.ts
+18	0	Open-ILS/src/eg2/src/app/staff/admin/workstation/workstations/workstations.module.ts
+6	0	Open-ILS/src/eg2/src/app/staff/catalog/catalog.component.html
+18	0	Open-ILS/src/eg2/src/app/staff/catalog/catalog.component.ts
+44	0	Open-ILS/src/eg2/src/app/staff/catalog/catalog.module.ts
+87	0	Open-ILS/src/eg2/src/app/staff/catalog/catalog.service.ts
+70	0	Open-ILS/src/eg2/src/app/staff/catalog/record/actions.component.html
+96	0	Open-ILS/src/eg2/src/app/staff/catalog/record/actions.component.ts
+53	0	Open-ILS/src/eg2/src/app/staff/catalog/record/copies.component.html
+91	0	Open-ILS/src/eg2/src/app/staff/catalog/record/copies.component.ts
+36	0	Open-ILS/src/eg2/src/app/staff/catalog/record/pagination.component.html
+164	0	Open-ILS/src/eg2/src/app/staff/catalog/record/pagination.component.ts
+37	0	Open-ILS/src/eg2/src/app/staff/catalog/record/record.component.html
+84	0	Open-ILS/src/eg2/src/app/staff/catalog/record/record.component.ts
+59	0	Open-ILS/src/eg2/src/app/staff/catalog/resolver.service.ts
+43	0	Open-ILS/src/eg2/src/app/staff/catalog/result/facets.component.html
+48	0	Open-ILS/src/eg2/src/app/staff/catalog/result/facets.component.ts
+8	0	Open-ILS/src/eg2/src/app/staff/catalog/result/pagination.component.css
+28	0	Open-ILS/src/eg2/src/app/staff/catalog/result/pagination.component.html
+51	0	Open-ILS/src/eg2/src/app/staff/catalog/result/pagination.component.ts
+132	0	Open-ILS/src/eg2/src/app/staff/catalog/result/record.component.html
+77	0	Open-ILS/src/eg2/src/app/staff/catalog/result/record.component.ts
+30	0	Open-ILS/src/eg2/src/app/staff/catalog/result/results.component.html
+84	0	Open-ILS/src/eg2/src/app/staff/catalog/result/results.component.ts
+30	0	Open-ILS/src/eg2/src/app/staff/catalog/routing.module.ts
+16	0	Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.css
+244	0	Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.html
+137	0	Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.ts
+19	0	Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.component.html
+36	0	Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.component.ts
+17	0	Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.module.ts
+19	0	Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/routing.module.ts
+15	0	Open-ILS/src/eg2/src/app/staff/circ/patron/routing.module.ts
+15	0	Open-ILS/src/eg2/src/app/staff/circ/routing.module.ts
+84	0	Open-ILS/src/eg2/src/app/staff/common.module.ts
+58	0	Open-ILS/src/eg2/src/app/staff/login.component.html
+96	0	Open-ILS/src/eg2/src/app/staff/login.component.ts
+72	0	Open-ILS/src/eg2/src/app/staff/nav.component.css
+432	0	Open-ILS/src/eg2/src/app/staff/nav.component.html
+72	0	Open-ILS/src/eg2/src/app/staff/nav.component.ts
+143	0	Open-ILS/src/eg2/src/app/staff/resolver.service.ts
+52	0	Open-ILS/src/eg2/src/app/staff/routing.module.ts
+1	0	Open-ILS/src/eg2/src/app/staff/sandbox/README
+16	0	Open-ILS/src/eg2/src/app/staff/sandbox/routing.module.ts
+133	0	Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.html
+188	0	Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.ts
+20	0	Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.module.ts
+1	0	Open-ILS/src/eg2/src/app/staff/share/README
+59	0	Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html
+311	0	Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts
+70	0	Open-ILS/src/eg2/src/app/staff/share/bib-summary/bib-summary.component.html
+67	0	Open-ILS/src/eg2/src/app/staff/share/bib-summary/bib-summary.component.ts
+56	0	Open-ILS/src/eg2/src/app/staff/share/buckets/record-bucket-dialog.component.html
+109	0	Open-ILS/src/eg2/src/app/staff/share/buckets/record-bucket-dialog.component.ts
+57	0	Open-ILS/src/eg2/src/app/staff/share/holdings.service.ts
+22	0	Open-ILS/src/eg2/src/app/staff/share/link-table/link-table.component.html
+73	0	Open-ILS/src/eg2/src/app/staff/share/link-table/link-table.component.ts
+65	0	Open-ILS/src/eg2/src/app/staff/share/op-change/op-change.component.html
+77	0	Open-ILS/src/eg2/src/app/staff/share/op-change/op-change.component.ts
+15	0	Open-ILS/src/eg2/src/app/staff/share/staff-banner.component.ts
+63	0	Open-ILS/src/eg2/src/app/staff/share/translate/translate.component.html
+145	0	Open-ILS/src/eg2/src/app/staff/share/translate/translate.component.ts
+128	0	Open-ILS/src/eg2/src/app/staff/splash.component.html
+40	0	Open-ILS/src/eg2/src/app/staff/splash.component.ts
+8	0	Open-ILS/src/eg2/src/app/staff/staff.component.css
+19	0	Open-ILS/src/eg2/src/app/staff/staff.component.html
+118	0	Open-ILS/src/eg2/src/app/staff/staff.component.ts
+26	0	Open-ILS/src/eg2/src/app/staff/staff.module.ts
+11	0	Open-ILS/src/eg2/src/app/welcome.component.html
+13	0	Open-ILS/src/eg2/src/app/welcome.component.ts
+0	0	Open-ILS/src/eg2/src/assets/.gitkeep
+4	0	Open-ILS/src/eg2/src/environments/environment.prod.ts
+10	0	Open-ILS/src/eg2/src/environments/environment.ts
+-	-	Open-ILS/src/eg2/src/favicon.ico
+19	0	Open-ILS/src/eg2/src/index.html
+0	0	Open-ILS/src/eg2/src/locale/.gitkeep
+12	0	Open-ILS/src/eg2/src/main.ts
+80	0	Open-ILS/src/eg2/src/polyfills.ts
+161	0	Open-ILS/src/eg2/src/styles.css
+32	0	Open-ILS/src/eg2/src/test.ts
+52	0	Open-ILS/src/eg2/src/test_data/eg_mock.js
+36	0	Open-ILS/src/eg2/src/test_data/idl2js.pl
+13	0	Open-ILS/src/eg2/src/tsconfig.app.json
+21	0	Open-ILS/src/eg2/src/tsconfig.spec.json
+5	0	Open-ILS/src/eg2/src/typings.d.ts
+24	0	Open-ILS/src/eg2/tsconfig.json
+136	0	Open-ILS/src/eg2/tslint.json
+ create mode 100644 Open-ILS/src/eg2/.editorconfig
+ create mode 100644 Open-ILS/src/eg2/.gitignore
+ create mode 100644 Open-ILS/src/eg2/CHEAT_SHEET.adoc
+ create mode 100644 Open-ILS/src/eg2/angular.json
+ create mode 100644 Open-ILS/src/eg2/e2e/app.e2e-spec.ts
+ create mode 100644 Open-ILS/src/eg2/e2e/app.po.ts
+ create mode 100644 Open-ILS/src/eg2/e2e/tsconfig.e2e.json
+ create mode 100644 Open-ILS/src/eg2/karma.conf.js
+ create mode 100644 Open-ILS/src/eg2/package-lock.json
+ create mode 100644 Open-ILS/src/eg2/package.json
+ create mode 100644 Open-ILS/src/eg2/protractor.conf.js
+ create mode 100644 Open-ILS/src/eg2/src/app/app.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/app.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/common.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/README
+ create mode 100644 Open-ILS/src/eg2/src/app/core/auth.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/event.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/event.spec.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/format.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/format.spec.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/idl.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/idl.spec.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/locale.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/net.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/org.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/org.spec.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/pcrud.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/perm.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/server-store.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/store.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/core/store.spec.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/resolver.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/README
+ create mode 100644 Open-ILS/src/eg2/src/app/share/accesskey/accesskey-info.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/accesskey/accesskey-info.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/accesskey/accesskey.directive.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/accesskey/accesskey.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/catalog/bib-record.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/catalog/catalog-common.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/catalog/catalog-url.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/catalog/catalog.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/catalog/marc-html.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/catalog/search-context.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/catalog/unapi.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/combobox/combobox-entry.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/combobox/combobox.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/combobox/combobox.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/date-select/date-select.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/date-select/date-select.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/dialog/confirm.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/dialog/confirm.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/dialog/dialog.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/dialog/progress-inline.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/share/dialog/progress-inline.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/dialog/progress-inline.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/dialog/progress.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/share/dialog/progress.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/dialog/progress.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/dialog/prompt.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/dialog/prompt.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-body-cell.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-body-cell.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-body.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-body.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-column-config.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-column-config.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-column-width.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-column-width.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-column.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-header.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-header.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-print.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-print.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-toolbar-action.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-toolbar-button.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-toolbar-checkbox.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-toolbar.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid-toolbar.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/grid/grid.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/org-select/org-select.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/org-select/org-select.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/print/print.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/print/print.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/print/print.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/string/string.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/string/string.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/toast/toast.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/share/toast/toast.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/toast/toast.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/toast/toast.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/tree/tree.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/share/tree/tree.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/tree/tree.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/tree/tree.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/tree/tree.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/util/audio.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/util/pager.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/about.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/about.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/acq/admin-acq-splash.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/acq/admin-acq-splash.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/acq/admin-acq.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/acq/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/common.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/server/admin-server-splash.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/server/admin-server-splash.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/server/admin-server.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/server/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/workstation/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/workstation/workstations/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/workstation/workstations/workstations.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/workstation/workstations/workstations.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/workstation/workstations/workstations.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/catalog.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/catalog.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/catalog.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/catalog.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/record/actions.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/record/actions.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/record/copies.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/record/copies.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/record/pagination.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/record/pagination.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/record/record.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/record/record.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/resolver.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/result/facets.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/result/facets.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/result/pagination.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/result/pagination.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/result/pagination.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/result/record.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/result/record.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/result/results.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/result/results.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/common.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/login.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/login.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/nav.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/nav.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/nav.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/resolver.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/sandbox/README
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/sandbox/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/README
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/bib-summary/bib-summary.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/bib-summary/bib-summary.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/buckets/record-bucket-dialog.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/buckets/record-bucket-dialog.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/holdings.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/link-table/link-table.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/link-table/link-table.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/op-change/op-change.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/op-change/op-change.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/staff-banner.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/translate/translate.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/translate/translate.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/splash.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/splash.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/staff.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/staff.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/staff.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/staff.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/welcome.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/welcome.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/assets/.gitkeep
+ create mode 100644 Open-ILS/src/eg2/src/environments/environment.prod.ts
+ create mode 100644 Open-ILS/src/eg2/src/environments/environment.ts
+ create mode 100644 Open-ILS/src/eg2/src/favicon.ico
+ create mode 100644 Open-ILS/src/eg2/src/index.html
+ create mode 100644 Open-ILS/src/eg2/src/locale/.gitkeep
+ create mode 100644 Open-ILS/src/eg2/src/main.ts
+ create mode 100644 Open-ILS/src/eg2/src/polyfills.ts
+ create mode 100644 Open-ILS/src/eg2/src/styles.css
+ create mode 100644 Open-ILS/src/eg2/src/test.ts
+ create mode 100644 Open-ILS/src/eg2/src/test_data/eg_mock.js
+ create mode 100644 Open-ILS/src/eg2/src/test_data/idl2js.pl
+ create mode 100644 Open-ILS/src/eg2/src/tsconfig.app.json
+ create mode 100644 Open-ILS/src/eg2/src/tsconfig.spec.json
+ create mode 100644 Open-ILS/src/eg2/src/typings.d.ts
+ create mode 100644 Open-ILS/src/eg2/tsconfig.json
+ create mode 100644 Open-ILS/src/eg2/tslint.json
+
+commit 6bcefced08f07d783b1d46bb4ee441ecde70df02
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Sep 5 16:02:56 2018 -0400
+
+    LP#1775466 Public API wrapper for mk_copy_query
+    
+    Adds 2 new APIs:
+    
+    open-ils.search.bib.copies
+    open-ils.search.bib.copies.staff
+    
+    Used by the in-progress Angular staff catalog.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+80	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit b0f99db6c9cf141fe10addccce075b95a26e6595
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Sep 5 16:00:51 2018 -0400
+
+    LP#1775466 Record entry flat display attrs link repair
+    
+    Fleshing 'mattrs' on a bib record should return an array (i.e. replace
+    might_have with has_many).
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/examples/fm_IDL.xml
+
+commit 0f68495b9fcabb3b7cd85af697f08afabf8a6657
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Thu Sep 6 12:45:46 2018 -0700
+
+    More additions to the 3.2 release notes
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+8	2	docs/RELEASE_NOTES_3_2.adoc
+
+commit 689e9af8cfe5bfa7dbfd7475a8033054a23a0de8
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Thu Sep 6 12:05:17 2018 -0700
+
+    Docs: adding translators to 3.2 release notes
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+5	2	docs/RELEASE_NOTES_3_2.adoc
+
+commit 26d975edb233bed65801703c7c9747ff825aca9d
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Thu Sep 6 11:47:21 2018 -0700
+
+    Docs: creating basic release notes for 3.2
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+606	0	docs/RELEASE_NOTES_3_2.adoc
+0	6	docs/RELEASE_NOTES_NEXT/Acquisitions/PatronRequests.adoc
+0	13	docs/RELEASE_NOTES_NEXT/Acquisitions/autocancel_lineitems_when_all_copies_are_canceled.adoc
+0	34	docs/RELEASE_NOTES_NEXT/Acquisitions/invoice-close-date.adoc
+0	4	docs/RELEASE_NOTES_NEXT/Cataloging/add-upc-to-z3950.adoc
+0	27	docs/RELEASE_NOTES_NEXT/Cataloging/async-vandelay.adoc
+0	14	docs/RELEASE_NOTES_NEXT/Cataloging/inventory_date_support.adoc
+0	70	docs/RELEASE_NOTES_NEXT/Cataloging/pingest.adoc
+0	17	docs/RELEASE_NOTES_NEXT/Cataloging/view-authority-record-by-id.adoc
+0	22	docs/RELEASE_NOTES_NEXT/Circulation/Autorenewal_Feature.adoc
+0	22	docs/RELEASE_NOTES_NEXT/Circulation/EmergencyClosingHandler.adoc
+0	36	docs/RELEASE_NOTES_NEXT/Circulation/patron-pref-name.adoc
+0	54	docs/RELEASE_NOTES_NEXT/Client/pgtde.adoc
+0	71	docs/RELEASE_NOTES_NEXT/Client/workstation-server-settings.adoc
+0	76	docs/RELEASE_NOTES_NEXT/OPAC/Batch_Actions.adoc
+0	10	docs/RELEASE_NOTES_NEXT/OPAC/different_styles_for_searchbar.adoc
+0	6	docs/RELEASE_NOTES_NEXT/OPAC/username-hint.adoc
+ create mode 100644 docs/RELEASE_NOTES_3_2.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Acquisitions/PatronRequests.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Acquisitions/autocancel_lineitems_when_all_copies_are_canceled.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Acquisitions/invoice-close-date.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/add-upc-to-z3950.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/async-vandelay.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/inventory_date_support.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/pingest.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/view-authority-record-by-id.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/Autorenewal_Feature.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/EmergencyClosingHandler.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/patron-pref-name.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Client/pgtde.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Client/workstation-server-settings.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/Batch_Actions.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/different_styles_for_searchbar.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/username-hint.adoc
+
+commit 46543fa2fb9dd628131887ea4bdd35c39366fd6a
+Author: Ben Shum <ben at evergreener.net>
+Date:   Thu Sep 6 10:57:54 2018 -0400
+
+    Translation updates - newpot
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+3531	3512	build/i18n/po/db.seed/db.seed.pot
+2911	2781	build/i18n/po/fm_IDL.dtd/fm_IDL.dtd.pot
+37	33	build/i18n/po/ils_events.xml/ils_events.xml.pot
+409	269	build/i18n/po/tpac/tpac.pot
+950	311	build/i18n/po/webstaff/webstaff.pot
+
+commit 30a064631af68e2b715c5ab3b65e30dab403703f
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Sep 6 10:24:14 2018 -0400
+
+    LP#1774277 Acq requests live test vandelay repair
+    
+    Acq requests test now logs in with a workstation since under the covers
+    vandelay (used for acq imports) requires a workstation on the new
+    tracker tables.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+21	1	Open-ILS/src/perlmods/live_t/22-acq-requests.t
+
+commit 505e46bd6d843629fbcb822abd2d6eac6036d6e0
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Sep 6 10:03:46 2018 -0400
+
+    LP#1635354 Invoice close date perl live test
+    
+    Update Perl live test script to inspect invoice close dates instead of
+    the now-defunct 'complete' field.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+5	4	Open-ILS/src/perlmods/live_t/16-acq-invoicing.t
+
+commit 19e5d9750d5132cefdd78122fd5b7f8e58d50612
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Jun 12 12:02:02 2018 -0400
+
+    LP#1755258 Browser client auth proxy login support
+    
+    Check if the auth_proxy service is enabled during login and use the
+    proxy login API when it's available, otherwise fall back to standard
+    Evergreen open-ils.auth login.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+28	2	Open-ILS/web/js/ui/default/staff/services/auth.js
+
+commit 9266a76a9f11fcc419e38d99a114216b9266aef6
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Jun 12 12:01:15 2018 -0400
+
+    LP#1755258 Improve network error handling
+    
+    Improve promise handling and logging in browser client network request
+    failure handling.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+8	5	Open-ILS/web/js/ui/default/staff/services/net.js
+
+commit 90c716e3bd4be9c449a9e5d71849abd8d4f07e4f
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Sep 5 10:56:43 2018 -0400
+
+    LP#1781235: fix changing primary user barcode in web client
+    
+    This patch fixes a bug where the patron card dialog would
+    not allow the user to change the primary barcode under certain
+    circumstances. The fix is to ensure that the radio buttons
+    controlling the selection of the primary card are bound to
+    exactly one scope variable; otherwise, the /last/ barcode in the
+    list that had a primary value set after user interaction would
+    be the winner.
+    
+    To test
+    -------
+    [1] Use the 'replace barcode' feature in the patron editor to
+        create a test patron with 3 barcodes:
+    
+        - barcode A
+        - barcode B
+        - barcode C (which as last created, would be primary)
+    
+    [2] Attempt to make barcode A the primary barcode again using
+        the 'See All' patron card dialog in the patron editor.
+    [3] Note that the change of primary barcode doesn't stick
+        upon saving the patron record.
+    [4] Apply the patch and repeat steps 1-3. This time, the
+        primary barcode should be changed as expected.
+    [5] Verify that other patron edit actions and registering a
+        new patron record continue to work as expected.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: John Amundson <jamundson at cwmars.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+3	2	Open-ILS/src/templates/staff/circ/patron/t_patron_cards_dialog.tt2
+18	8	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit 55f5d3cd9e7bffbad8856b7328280b23eae0a0b8
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Wed Aug 29 11:51:24 2018 -0700
+
+    LP#1781641: make staff-applied patron blocks overridable on web client checkout/renew
+    
+    To test
+    -------
+    [1] Apply a blocking penalty such as STAFF_CHR to a patron record.
+    [2] Attempt to check out an item; note that there is no option to
+        force the action.
+    [3] Apply the patch and repeat #2. This time, the staff user
+        should be given an option to force the action.
+    [4] Verify that forcing the checkout respects whether or not
+        the operator has (e.g.) the STAFF_CHR.override permission.
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Joan Kranich <jkranich at cwmars.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+16	2	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+
+commit 11d9725b548c609b4610de55195b40f41e1c42ee
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Sep 4 23:55:08 2018 -0400
+
+    LP#1635354: Stamping upgrade script for acqusitions invoice timestamp
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+696	0	Open-ILS/src/sql/Pg/upgrade/1128.schema.invoice-close-date.sql
+0	696	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.invoice-close-date.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1128.schema.invoice-close-date.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.invoice-close-date.sql
+
+commit ba94b6d35c97dd289bf7f33b957085a563ed34e1
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Apr 19 16:15:51 2018 -0400
+
+    LP#1635354 Support date is/not NULL ACQ searches
+    
+    Adds support for searching on 'date is NULL' in the ACQ unified search
+    interface.  To use, chose the 'is' or 'is not'  matcher and leave the
+    text input value empty.
+    
+    Update the canned completed invoices search to filter on 'close_date IS
+    NOT NULL' instead of the now-removed 'complete' field.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+3	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Search.pm
+8	4	Open-ILS/web/js/ui/default/acq/search/unified.js
+
+commit 52c11b2770af4bfe617845f9544273228fbbf371
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Mar 14 12:56:07 2018 -0400
+
+    LP#1635354 Invoice close date/by release notes
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+34	0	docs/RELEASE_NOTES_NEXT/Acquisitions/invoice-close-date.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Acquisitions/invoice-close-date.adoc
+
+commit c69f50f29a01f652bd4068e58ec5e2ac2e10d785
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Mar 13 16:02:41 2018 -0400
+
+    LP#1635354 Invoice close date/by fields
+    
+    Acquisitions invoices have 2 new fields:
+    
+    * Close Date -- This is set to the time when the ACQ user clicks the
+      "Close" button in the invoice interface.
+    
+    This field replaces the existing "Complete" field.  An invoice is now
+    considered complete if a close date value is set.
+    
+    * Closed By -- This is set to the logged in staff user who performs the
+      "Close" action.
+    
+    As with the now-defunct 'complete' field, but new fields are cleared in the
+    event an invoice is reopened.
+    
+    These new fields are visible in the invoice interface under the 'Show
+    Details' action for closed invoices.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+3	1	Open-ILS/examples/fm_IDL.xml
+15	12	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Invoice.pm
+4	1	Open-ILS/src/sql/Pg/200.schema.acq.sql
+2	0	Open-ILS/src/sql/Pg/999.functions.global.sql
+696	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.invoice-close-date.sql
+18	9	Open-ILS/web/js/ui/default/acq/invoice/view.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.invoice-close-date.sql
+
+commit 0020384a8daffa4225a22899be89e1cf7f60fb05
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Thu Feb 22 17:01:39 2018 -0500
+
+    LP#1746824 - WebStaff egGrid styling
+    
+    This allows egGrid to receive CSS selector strings via egGridField
+    declarations in templates, or else auto-generates them based on the
+    path of the field. Also, sets the DOM id of the grid to its declared
+    persistKey, unless an id is explicitly given.
+    
+    For example, due dates could be displayed in purple
+    as follows by adding the following CSS:
+    
+    grid-due_date {
+       color: purple;
+    }
+    
+    The above example uses the autog-enerated class name. One could also
+    set an explicit one in the eg-grid-field element, e.g.,
+    
+    <eg-grid-field label="[% l('Due Date') %]" path='due_date' css-selector="purple" ...
+    
+    In this case, the grid-due_date class would /not/ be generated, and the
+    developer would be expected to supply CSS for the purple class. (But
+    with semantic class names :) )
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	0	Open-ILS/src/templates/staff/share/t_autogrid.tt2
+22	2	Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit cb8a47c99b93ff479b40eeba6ac24af4e2c4157e
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Sep 4 17:37:32 2018 -0400
+
+    LP#1774277 Stamping upgrade for patron acq reqs
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+88	0	Open-ILS/src/sql/Pg/upgrade/1127.data.schema.acq.patron_requests.sql
+0	88	Open-ILS/src/sql/Pg/upgrade/XXXX.data.schema.acq.patron_requests.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1127.data.schema.acq.patron_requests.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.schema.acq.patron_requests.sql
+
+commit df507ca0fef135133221499c6c338621be16418f
+Author: Jason Etheridge <jason at EquinoxInitiative.org>
+Date:   Thu Aug 23 15:18:05 2018 -0400
+
+    lp1774277 release notes for patron acq requests
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+6	0	docs/RELEASE_NOTES_NEXT/Acquisitions/PatronRequests.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Acquisitions/PatronRequests.adoc
+
+commit e9a9875da27e85e8437c082b6e40ad39ff9a1ba6
+Author: Jason Etheridge <jason at EquinoxInitiative.org>
+Date:   Mon Mar 12 18:02:47 2018 -0400
+
+    lp1774277 Improvements to Patron Acquisition Request
+    
+    Squashed and rebased against master, this is an Angular reimplementation of the
+    Patron Acquisition Request user interface with some improvements.  It still
+    reaches into the Dojo-based Acquisition interfaces.
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    
+    toward acq requests
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    
+    4-status-not-updating-to-recieved-unless-all-items-in-order-are-recieved
+    
+    Change to acq patron request status logic, which now looks like this:
+    
+    If a cancel_reason is set on the patron request, then status = "Canceled"
+    
+    If there is an associated hold request that has fulfillment_time set,
+    then status = 'Fulfilled"
+    
+    If there is an associated lineitem has a state of "received", then status =
+    "Received"
+    
+    If there is an associated purchase order with a state of "on-order" and an
+    associated hold request, then status = "Ordered, Hold Placed"
+    
+    If there is an associated purchase order with a state of "on-order" but no
+    associated hold request (created through the automated process), then status =
+    "Ordered, Hold Not Placed"
+    
+    If there is an associated lineitem (selection list), then status = "Pending"
+    
+    If there is no associated lineitem, then status = "New"
+    
+    Any other condition, which should be impossible (I should never say that), will
+    give a status of "Error"
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    
+    6-upc-not-on-patron-request-form
+    
+    Adds a UPC column to the patron acq request table
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    
+    2-hold-request-fields-that-make-use-of-user-preferences
+    
+    For new requests (or edited requests when a user barcode is scanned), the user's
+    preferences (if any) for hold notifications and pickup library will be used to
+    set various fields in the request dialog.
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    
+    5-pick-up-library-not-defaulting-to-patrons-home-library
+    
+    when creating new requests, given a user, default to the user's pickup library
+    preference setting, or absent a preference, default to their home library.
+    
+    Absent a user, default to the pickup library selector value from the request
+    list, if it's of an org type that can have volumes.  Otherwise, default to the
+    workstation library.  Technically, the without-a-user behavior is going to be
+    mooted whenever a user is chosen.
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    
+    5-pick-up-library-not-defaulting-to-patrons-home-library
+    
+    Fix defaulting to patron home library in absense of user setting when creating
+    acq patron request from user context
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    
+    misc fixes
+    
+    to the IDL and for the email_notify checkbox.
+    
+    some refactoring to avoid using foreign fields in the request object
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    
+    7-retrieve-patron-fails-to-load-patron-record
+    
+    give the user_request.view permission some parity with VIEW_USER
+    
+    And some defensive programming if trying to create a request in
+    the user already known context without adequate permission
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    
+    handle undefined values for email/hold checkboxes
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    
+    remove acq.holds.allow_holds_from_purchase_request
+    
+    This was added a long time ago but never actually used by the code.
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    
+    match pcrud perm for aur with aurs
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    
+    live_t/ test
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+100	3	Open-ILS/examples/fm_IDL.xml
+135	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm
+340	0	Open-ILS/src/perlmods/live_t/22-acq-requests.t
+22	1	Open-ILS/src/sql/Pg/200.schema.acq.sql
+13	16	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+88	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.schema.acq.patron_requests.sql
+26	0	Open-ILS/src/templates/staff/acq/requests/index.tt2
+31	0	Open-ILS/src/templates/staff/acq/requests/t_cancel.tt2
+25	0	Open-ILS/src/templates/staff/acq/requests/t_clear.tt2
+240	0	Open-ILS/src/templates/staff/acq/requests/t_edit.tt2
+82	0	Open-ILS/src/templates/staff/acq/requests/t_list.tt2
+25	0	Open-ILS/src/templates/staff/acq/requests/t_set_no_hold.tt2
+25	0	Open-ILS/src/templates/staff/acq/requests/t_set_yes_hold.tt2
+5	0	Open-ILS/src/templates/staff/circ/patron/index.tt2
+1	1	Open-ILS/src/templates/staff/navbar.tt2
+9	3	Open-ILS/web/js/ui/default/acq/common/li_table.js
+5	1	Open-ILS/web/js/ui/default/acq/picklist/brief_record.js
+239	0	Open-ILS/web/js/ui/default/staff/acq/requests/list.js
+582	0	Open-ILS/web/js/ui/default/staff/acq/services/requests.js
+ create mode 100644 Open-ILS/src/perlmods/live_t/22-acq-requests.t
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.schema.acq.patron_requests.sql
+ create mode 100644 Open-ILS/src/templates/staff/acq/requests/index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/acq/requests/t_cancel.tt2
+ create mode 100644 Open-ILS/src/templates/staff/acq/requests/t_clear.tt2
+ create mode 100644 Open-ILS/src/templates/staff/acq/requests/t_edit.tt2
+ create mode 100644 Open-ILS/src/templates/staff/acq/requests/t_list.tt2
+ create mode 100644 Open-ILS/src/templates/staff/acq/requests/t_set_no_hold.tt2
+ create mode 100644 Open-ILS/src/templates/staff/acq/requests/t_set_yes_hold.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/acq/requests/list.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/acq/services/requests.js
+
+commit c68550260497e050307b49b0743e339f96417b53
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Sep 4 18:35:28 2018 -0400
+
+    LP#1514085: stamp schema update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+737	0	Open-ILS/src/sql/Pg/upgrade/1126.schema.vandelay-state-tracking.sql
+0	738	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.vandelay-state-tracking.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1126.schema.vandelay-state-tracking.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.vandelay-state-tracking.sql
+
+commit 32f9b0303588a571a29efb000d49b132e8bc0f7a
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Sep 4 18:33:09 2018 -0400
+
+    LP#1514085: add to release notes with a server configuration note
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+8	0	docs/RELEASE_NOTES_NEXT/Cataloging/async-vandelay.adoc
+
+commit 889898936925335c545091721b6db008148625b3
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Sep 4 17:46:49 2018 -0400
+
+    LP#1514085: sync schema update script to reflect changes in master
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+31	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.vandelay-state-tracking.sql
+
+commit 96bd60b86409c53da3238df335e1a9ad299cc29e
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Aug 23 14:17:11 2018 -0400
+
+    LP#1514085 Release notes for vandelay session tracking
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+19	0	docs/RELEASE_NOTES_NEXT/Cataloging/async-vandelay.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/async-vandelay.adoc
+
+commit 5da0ea080077816154cb5d3d9d7bb32932e996dd
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Jun 28 12:38:57 2018 -0400
+
+    LP#1514085 Vandelay in-database session tracking
+    
+    Adds a new DB table vandelay.session_tracker for monitoring progress on
+    Vandelay enqueue and import sessions.
+    
+    Enqueue and import APIs get a new option to exit early, returning the
+    newly created tracker object, so the caller can monitor the tracker
+    instead of listening to streamed responses, which are not supported in
+    browser client Dojo interfaces.
+    
+    Teach the existing Dojo Vandelay UI to exit early on enqueu & export and
+    to poll for tracker data in lieu of waiting for streamed progress data.
+    
+    On user merge / purge, trackers are migrated to the destination user.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+44	0	Open-ILS/examples/fm_IDL.xml
+161	20	Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
+52	0	Open-ILS/src/sql/Pg/012.schema.vandelay.sql
+4	0	Open-ILS/src/sql/Pg/999.functions.global.sql
+707	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.vandelay-state-tracking.sql
+81	21	Open-ILS/web/js/ui/default/vandelay/vandelay.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.vandelay-state-tracking.sql
+
+commit 1e6cbaca69712d708bf4e720e14ac78e1dc24ab6
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Tue Sep 4 16:36:09 2018 -0400
+
+    LP#1777675 Stamping upgrade script for latest inventory date support
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+39	0	Open-ILS/src/sql/Pg/upgrade/1125.schema.lp1777675_latest_inventory_date_support.sql
+0	39	Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1125.schema.lp1777675_latest_inventory_date_support.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date.sql
+
+commit ba4dcdd56abd51eda35aa51fe731cb3d362d014b
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Sep 4 14:38:33 2018 -0400
+
+    LP#1777675: Change table names to Latest Inventory
+    
+    Makes the backend code consistent with the new labels that have been added for
+    the latest inventory date.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+7	7	Open-ILS/examples/fm_IDL.xml
+8	8	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+17	17	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+2	2	Open-ILS/src/sql/Pg/040.schema.asset.sql
+4	4	Open-ILS/src/sql/Pg/800.fkeys.sql
+6	6	Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date.sql
+2	2	Open-ILS/src/templates/staff/cat/bucket/copy/t_pending.tt2
+2	2	Open-ILS/src/templates/staff/cat/bucket/copy/t_view.tt2
+2	2	Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+2	2	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+2	2	Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+2	2	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+4	4	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+1	1	Open-ILS/web/js/ui/default/staff/cat/services/holdings.js
+2	2	Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+6	6	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+4	4	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit f4c274de501f7e0c08838151b19f8ac36e5f2063
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Aug 23 14:38:50 2018 -0400
+
+    LP#1777675 Tweak IDL label for copy inventory
+    
+    "Last Copy Inventory" can be misunderstood at first reading as
+    inventory of the "last copy".  "Latest Inventory" seems easier to
+    understand, and also still goes well with a potential future "All
+    Inventories" entry in the IDL.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	2	Open-ILS/examples/fm_IDL.xml
+
+commit 1781f399b5458ac08783ba0c8e70f71abea90c6b
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Aug 23 14:34:57 2018 -0400
+
+    LP#1777675 Re-add missing columns to checkin interface
+    
+    During one iteration of the inventory code, a box was added to the
+    interface, and some room was made for it by shrinking these other
+    interface components.
+    
+    Since the box is now gone, let's get this row back up to the expected
+    twelve units of width.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	2	Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2
+
+commit cfdb4b998b8c751ea8ce60aaf47ddecae0ab4797
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Wed Aug 22 14:19:19 2018 -0400
+
+    LP#1777675: Fix code to update Item Status grid
+    
+    Testing revealed that the grid rows use a different data structure, and
+    the object member names include dots (periods). Thus, bracket notation
+    is required to access those members.
+    
+    This commit also makes a few smaller changes:
+      - Prevents an error in the Check-in app when a last_copy_inventory
+        doesn't exist yet.
+      - Removes the "refresh" parameter from the updateInventory() function,
+        which is never supplied when called, nor used by the function.
+      - Adds some brief code comments.
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+5	3	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit b7ce408d424141a5bc34d699c5bdf52274648117
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Aug 21 13:31:59 2018 -0400
+
+    LP#1777675: Release notes entry for inventory date
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+14	0	docs/RELEASE_NOTES_NEXT/Cataloging/inventory_date_support.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/inventory_date_support.adoc
+
+commit 4b6552d74cf790b6c272a80edaa7cfe5a5538d29
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Aug 21 13:04:13 2018 -0400
+
+    LP#1777675: Add inventory checkin modifier setting to server storage
+    
+    Allows the inventory checkin modifier value to be stored on the server instead
+    of the browser as is done with other checkin modifier settings.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+7	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+11	1	Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date.sql
+
+commit b3609ca4768322f735358d596eddb4135ea6e44d
+Author: Kyle Huckins <khuckins at catalyte.io>
+Date:   Mon Jul 9 18:11:05 2018 +0000
+
+    lp1777675 inventory date support
+    
+    - Add toggle for updating inventory date and workstation on checkin
+    - Create new table asset.last_copy_inventory containing inventory date and inventory workstation columns.
+    - Add code to do_checkin subroutine to update last_copy_inventory table on checkin.
+    - Update Holdings view, Checkins table, copy buckets, and item detail grid and lists to display new
+    inventory date and workstation information.
+    - Add Update Inventory action to Item Status detail and list views.
+    
+    Signed-off-by: Kyle Huckins <khuckins at catalyte.io>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+    	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+23	0	Open-ILS/examples/fm_IDL.xml
+31	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+35	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+8	0	Open-ILS/src/sql/Pg/040.schema.asset.sql
+16	0	Open-ILS/src/sql/Pg/800.fkeys.sql
+29	0	Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date.sql
+2	0	Open-ILS/src/templates/staff/cat/bucket/copy/t_pending.tt2
+2	0	Open-ILS/src/templates/staff/cat/bucket/copy/t_view.tt2
+2	0	Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+5	0	Open-ILS/src/templates/staff/cat/item/index.tt2
+4	0	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+13	0	Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+15	2	Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2
+2	0	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+10	0	Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js
+26	2	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+4	3	Open-ILS/web/js/ui/default/staff/cat/services/holdings.js
+8	2	Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+11	1	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+31	4	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date.sql
+
+commit 4dbdd7bba989fe9826a2f28d07dfd5823c4e5e2d
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Sep 4 13:37:33 2018 -0400
+
+    LP#1712854 Stamping DB upgrade for hold UIs sort/speed
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+25	0	Open-ILS/src/sql/Pg/upgrade/1124.data.wide_holds-workstation-settings.sql
+0	25	Open-ILS/src/sql/Pg/upgrade/XXXX.data.wide_holds-workstation-settings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1124.data.wide_holds-workstation-settings.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.wide_holds-workstation-settings.sql
+
+commit b63e80d18dc87f30d66fdd4914ea77bd24d6a75e
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Aug 29 17:00:39 2018 -0400
+
+    LP#1712854: Add wide_hold grid settings to server storage
+    
+    Adds the new wide_hold grid settings used in the holds shelf and record holds
+    interfaces to server storage, as is done with other grid settings. Also removes
+    the legacy eg.grid.circ.holds.shelf and eg.grid.cat.catalog.holds settings.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+6	6	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+25	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.wide_holds-workstation-settings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.wide_holds-workstation-settings.sql
+
+commit 5ef57330c9a49db91f5794e53874a47ce6432ff7
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Aug 30 16:48:23 2018 -0400
+
+    LP#1712854: Provide context-relevant default sort orders
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+1	1	Open-ILS/web/js/ui/default/staff/circ/holds/app.js
+
+commit 0c4238dfce4cf2375ff02099b6dab55b692ec8a4
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Aug 30 16:37:21 2018 -0400
+
+    LP#1712854: Include shelf-expired holds in the "clearable" set
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+
+commit 5cbc171516a9ed68bbbfa1d6058c97255e907f25
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 28 12:23:50 2018 -0400
+
+    LP#1712854: Make use of local cache when moving to All Holds list
+    
+    Clearing holds takes care of local updates to the hold data, so there is no
+    need to refetch the hold list when moving from Clearable to All.  Actions
+    that change hold state otherwise do cause a refetch, however.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+23	10	Open-ILS/web/js/ui/default/staff/circ/holds/app.js
+
+commit 3af031b4a1449d5e28bbaa15e5bdcf7a451c2c5f
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 28 11:45:11 2018 -0400
+
+    LP#1712854: Provide a "only last captured copy" option to filter holds shelf
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+18	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+1	0	Open-ILS/web/js/ui/default/staff/circ/holds/app.js
+
+commit 4b4e283e30c332f6dca9dea997e58d0e935f0808
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 28 11:09:06 2018 -0400
+
+    LP#1712854: Fix typo in function names for cancel and uncancel of wide holds
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	2	Open-ILS/src/templates/staff/circ/holds/t_shelf_list.tt2
+
+commit 14af809466039334348ba38b8417fb462d57f55b
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jul 18 20:52:25 2018 -0400
+
+    LP#1712854: Speed improvements for two hold interfaces
+    
+    The Hold Shelf and Record -> View Holds interfaces are painfully slow when
+    faced with a large set of holds.  The main reason is the 2-stage process used
+    to gather the data: 1) find hold IDs for the context 2) for each hold, fetch
+    all the requisite data using a relatively slow API.
+    
+    Here we create a new API that provides a streaming response of pre-inflated
+    hold data.  The full result set is loaded immediately, and once loaded, the
+    grid makes use of the "clientsort" feature to provide fast sorting without
+    the need to go back to the server when only changing the sort columns and
+    direction, and when paging through results.  The Hold Shelf UI now has a
+    progress indicator that appears whenever the hold list is retrieved from the
+    server, and the progress indicator for the Record -> View Holds UI is enhanced
+    to provide more granular updates.
+    
+    It is expected that other hold interfaces will be able to make use of this new
+    API for performance and functionality improvements.
+    
+    NOTE: This includes an additional change required to protect localStorage from
+    overlarge values when attempting to save the "last printed value" for future
+    reprinting.  Previously, when attempting to print a 2000+ hold list,
+    localStorage throws an error and the print fails.  Now the print will succeed,
+    but the value is not stored for reprinting and a message is logged to the JS
+    console.
+    
+    NOTE: The original development plan was base this a new API on a native
+    Postgres materialized view, and provide a LISTEN/NOTIFY daemon to monitor for
+    events that should trigger a refresh of that view.  As it happens, the use of
+    other new Postgres features (primarily the LATERAL join type) allows us to
+    avoid that maintenance and run-time complication.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+    	Open-ILS/web/js/ui/default/staff/services/hatch.js
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+43	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+310	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+154	45	Open-ILS/src/templates/staff/cat/catalog/t_holds.tt2
+141	44	Open-ILS/src/templates/staff/circ/holds/t_shelf_list.tt2
+92	63	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+106	79	Open-ILS/web/js/ui/default/staff/circ/holds/app.js
+111	0	Open-ILS/web/js/ui/default/staff/circ/services/holds.js
+10	2	Open-ILS/web/js/ui/default/staff/services/hatch.js
+
+commit c4d1f82da6bb1f3cf73974153fa60644bbfa5e18
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Sep 4 14:07:38 2018 -0400
+
+    LP#1779920: stamp database update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+261	0	Open-ILS/src/sql/Pg/upgrade/1123.schema.autorenewals.sql
+0	260	Open-ILS/src/sql/Pg/upgrade/XXXX.autorenewals_acp_and_circ_duration.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1123.schema.autorenewals.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.autorenewals_acp_and_circ_duration.sql
+
+commit ab88fed1ef564fa0398c3a883ac1f51b0d1d5796
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Sep 4 13:55:18 2018 -0400
+
+    LP#1779920: adjust release notes
+    
+    Wrap text and change the order of the paragraphs to put the
+    intent of the feature first.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+19	6	docs/RELEASE_NOTES_NEXT/Circulation/Autorenewal_Feature.adoc
+
+commit 12294ccda64e0792b43a0970217d1658e4e36824
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Sep 4 10:31:00 2018 -0400
+
+    LP#1779920 Auto-renew modify related tables/views
+    
+    Add new columns to these tables/views:
+    
+    * action.all_circulation
+    * action.all_circulation_slim
+    * action.aged_circulation
+    * action.all_circ_chain
+    * action.summarize_all_circ_chain
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+7	4	Open-ILS/src/sql/Pg/090.schema.action.sql
+201	0	Open-ILS/src/sql/Pg/upgrade/XXXX.autorenewals_acp_and_circ_duration.sql
+
+commit 0c19fd9d220a92702bf3a0ef51a1a6c78672f5de
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Tue Aug 21 18:23:14 2018 -0400
+
+    LP#1779920 - Autorenewal Feature-Release Docs
+    
+    Summary release notes for Autorenewal
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+9	0	docs/RELEASE_NOTES_NEXT/Circulation/Autorenewal_Feature.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/Autorenewal_Feature.adoc
+
+commit 7a120c31eac808708fdf58d09f1917ab915b4658
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 29 17:19:07 2018 -0400
+
+    LP#1779920 Circ auto-renewal repairs
+    
+    * Remove hard-coded granularity for auto-renewal notification event
+      generation
+    * Moved schema update changes from 950 seed file into schema files.
+    * Added CircIsOpen validator to auto-renewal reactor on the off chance
+      a circ is renewed by the patron in the middle of event processing.
+    * Notification template formatting and language updates, and removed
+      debugging content.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Reactor/Circ/AutoRenew.pm
+2	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+3	1	Open-ILS/src/sql/Pg/090.schema.action.sql
+29	32	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+31	25	Open-ILS/src/sql/Pg/upgrade/XXXX.autorenewals_acp_and_circ_duration.sql
+
+commit a9c3660f2b7a61069b445b06a4805121d3cf2cda
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Tue Aug 28 16:13:51 2018 -0400
+
+    LP#1779920 - Autorenew Feature
+    
+    This branch adds the necessary changes to allow Evergreen via the
+    Action/Trigger system to generate daily automatic renewals of
+    outstanding loans. Implemented as pair of A/T definitions: Autorenew and
+    AutorenewNotify.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+3	0	Open-ILS/examples/fm_IDL.xml
+3	0	Open-ILS/src/extras/ils_events.xml
+20	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/config.pm
+86	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Reactor/Circ/AutoRenew.pm
+32	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Validator.pm
+52	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+53	0	Open-ILS/src/sql/Pg/upgrade/XXXX.autorenewals_acp_and_circ_duration.sql
+1	1	Open-ILS/src/templates/conify/global/config/rule_circ_duration.tt2
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Reactor/Circ/AutoRenew.pm
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.autorenewals_acp_and_circ_duration.sql
+
+commit 647710dbdbd153b7d06ecfcc36ddcf97a933851a
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Sep 4 13:32:46 2018 -0400
+
+    LP#1776020: stamp database update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+431	0	Open-ILS/src/sql/Pg/upgrade/1122.schema.patron-alt-name.sql
+0	434	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-alt-name.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1122.schema.patron-alt-name.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-alt-name.sql
+
+commit 5ccc7d919ac3317d14cca34efc65cbe17c77c50e
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Aug 27 22:49:12 2018 -0400
+
+    LP#1776020 Deduplicate name keywords in patron merge
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+16	4	Open-ILS/src/sql/Pg/999.functions.global.sql
+16	4	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-alt-name.sql
+
+commit 7908f3c3eca891bd4d6319447f3a94c71ee7be49
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Aug 27 22:00:52 2018 -0400
+
+    LP#1776020 Add pref names to bills and items-out receipt templates
+    
+    Add support (with inline docs) for pref_.* name fields in Bills
+    Current/Historical/Payment templates and the patron Items Out template.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	0	Open-ILS/src/templates/staff/share/print_templates/t_bill_payment.tt2
+1	0	Open-ILS/src/templates/staff/share/print_templates/t_bills_current.tt2
+1	0	Open-ILS/src/templates/staff/share/print_templates/t_bills_historical.tt2
+1	0	Open-ILS/src/templates/staff/share/print_templates/t_items_out.tt2
+15	0	Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
+5	0	Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+
+commit ab3d64d4a611e0a4674e02e304cf633dc6c3855f
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Mon Aug 27 16:15:31 2018 -0400
+
+    LP#1776020: Tweaks to display of name keywords
+    
+    Add an icon next to the primary name to indicate the presence of name keywords,
+    which can be seen via hovering. The name keywords continue to display at the
+    bottom of the patron summary sidebar.
+    
+    Also fixes a minor bug where preferred name would display for anyone with
+    a middle name.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	0	Open-ILS/src/templates/staff/circ/patron/index.tt2
+1	6	Open-ILS/src/templates/staff/circ/patron/t_summary.tt2
+7	0	Open-ILS/src/templates/staff/css/circ.css.tt2
+
+commit f8789b3767b4eabfa68b8336804c583c8ade5f50
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Aug 21 21:31:15 2018 -0400
+
+    LP#1776020 Release notes for pref name / keywords
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+36	0	docs/RELEASE_NOTES_NEXT/Circulation/patron-pref-name.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/patron-pref-name.adoc
+
+commit 8d0f5b6f4e65a6c77f2f943b29fc2642ac85dcab
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Sun May 20 22:15:23 2018 -0400
+
+    LP#1776020 Patron preferred name & name keywords
+    
+    Preferred Name
+    
+    Adds a new set of patron preferred name fields for prefix, first,
+    middle, last, and suffix allowing patrons to provide preferred name
+    information.  Preferred names are optional and each acts as an overlay
+    to the analogous primary name field, making it possible to provide
+    preferred name values for individual fields.
+    
+    For example, a patron named William Erickson may have a preferred first
+    name (pref_first_given_name) of Bill, in which case the preferred name
+    would be Bill Erickson.  Note a preferred last name is not required in
+    this case as the code uses primary name values as defaults when not
+    replaced with a preferred version.
+    
+    * Patrons will see primary names displayed in the catalog when set.
+    * Staff will see both primary name and preferred name in the patron
+      summary side bar.
+    * Patron searches for any given name field will search both the primary
+      and preferred name data.
+    * Preferred name fields are available in Action/Trigger templates and
+      are present in various patron-focused print templates.
+    
+    Name Keywords
+    
+    Adds a new field to store miscellaneous patron name search terms.  These
+    values are only for searching and do not appear in any interfaces, apart
+    from the patron summary side bar and the patron edit UI.
+    
+    Included is a new search field in the patron search UI which searches
+    keyword values and all other name fields.  It's essentially a global patron
+    name keyword search.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+9	0	Open-ILS/examples/fm_IDL.xml
+50	16	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm
+45	0	Open-ILS/src/sql/Pg/005.schema.actors.sql
+3	0	Open-ILS/src/sql/Pg/015.schema.staging.sql
+21	0	Open-ILS/src/sql/Pg/999.functions.global.sql
+422	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-alt-name.sql
+5	3	Open-ILS/src/templates/opac/myopac/prefs.tt2
+4	1	Open-ILS/src/templates/opac/parts/topnav.tt2
+16	0	Open-ILS/src/templates/opac/register.tt2
+123	33	Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+19	0	Open-ILS/src/templates/staff/circ/patron/t_summary.tt2
+14	0	Open-ILS/src/templates/staff/css/circ.css.tt2
+6	0	Open-ILS/src/templates/staff/share/print_templates/t_checkout.tt2
+14	8	Open-ILS/src/templates/staff/share/t_patron_search_form.tt2
+3	0	Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+5	0	Open-ILS/web/js/ui/default/staff/circ/patron/checkout.js
+24	5	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+2	0	Open-ILS/web/js/ui/default/staff/services/patron_search.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-alt-name.sql
+
+commit 8dfe18454b87addd05a9cc867e7712b9f32bfbe3
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Sun Jun 3 21:09:20 2018 -0700
+
+    LP1752370: Add weight column to metabib fields grid
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	0	Open-ILS/src/templates/staff/admin/server/config/metabib_field.tt2
+
+commit 349d7e394ad943ddf1d09d1aef3c4870b29cfb70
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 29 14:05:09 2018 -0400
+
+    LP#1740412 Double grid tooltip max width
+    
+    Bump the max-width of the grid tooltip from 200 to 400px to accommodate
+    longer messages.  Shorter messages will continue using narrower
+    tooltips.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+4	0	Open-ILS/src/templates/staff/css/style.css.tt2
+2	0	Open-ILS/src/templates/staff/share/t_autogrid.tt2
+
+commit 764725a28c25adafc4a1673cd3c7c42723bfa6b8
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 24 10:30:34 2018 -0400
+
+    LP#1740412 Grid cell tooltips moved to top-left
+    
+    Avoid rendering the tooltip in the middle of a section of overflowed
+    text, since it can lead to tooltips being pushed far to the right.
+    Render at top left of cell instead.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	0	Open-ILS/src/templates/staff/share/t_autogrid.tt2
+
+commit 1e9c0ab388a0697a1f099970240f2da21bfb5e1f
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Aug 23 13:52:38 2018 -0400
+
+    LP#1740412 Grid cell tooltips limited to long content
+    
+    Only display grid cell tooltips when the content of the cell overflows
+    its container.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+5	2	Open-ILS/src/templates/staff/share/t_autogrid.tt2
+26	0	Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit 8f44a224943e85e168d8224524ad669ee68a0aa0
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Jun 25 12:19:36 2018 -0400
+
+    LP#1740412 Grid cell content tooltips
+    
+    Display a tooltip (popover), containing the full grid contents, when
+    mousing over a grid cell.  This allows users to see the full contents of
+    a cell without having to resize the grid column.
+    
+    This applies to text contents and pre-compiled HTML contents.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+8	0	Open-ILS/src/templates/staff/css/style.css.tt2
+12	4	Open-ILS/src/templates/staff/share/t_autogrid.tt2
+
+commit 03317dc6af32e23339f693592ead3e5993691277
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Thu Aug 30 12:37:45 2018 -0400
+
+    LP#1744756: Stamping upgrade script for custom perm group display
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+22	0	Open-ILS/src/sql/Pg/upgrade/1121.schema.perm-group-display.sql
+0	22	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.perm-group-display.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1121.schema.perm-group-display.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.perm-group-display.sql
+
+commit dab2a9b8b9f9092202ba53707bccb1ad6a2b68ed
+Author: Kyle Huckins <khuckins at catalyte.io>
+Date:   Wed Aug 29 15:20:17 2018 +0000
+
+    lp1744756 Utilize Parent Trees
+    
+    - Allow Patron Edit interface to make use of Parent OU trees when
+    expect tree doesn't exist.
+    
+    Signed-off-by: Kyle Huckins <khuckins at catalyte.io>
+    
+     Changes to be committed:
+    	modified:   Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+12	3	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit afaa47a266f72117d754c767317c4e159eb21142
+Author: Kyle Huckins <khuckins at catalyte.io>
+Date:   Mon Aug 27 20:21:45 2018 +0000
+
+    lp1744756 Docs fix and Permission change
+    
+    - Introduce MANAGE_CUSTOM_PERM_GRP_TREE permission.
+    
+    - Remove unnecessary references to unused "disabled"
+    field for pgtdes.
+    
+    - Update documentation to correctly explain how removing
+    and adding display entries works.
+    
+     Changes to be committed:
+    	modified:   Open-ILS/examples/fm_IDL.xml
+    	modified:   Open-ILS/src/sql/Pg/006.schema.permissions.sql
+    	modified:   Open-ILS/src/sql/Pg/950.data.seed-values.sql
+    	modified:   Open-ILS/src/sql/Pg/upgrade/XXXX.schema.perm-group-display.sql
+    	modified:   Open-ILS/web/js/ui/default/staff/admin/local/permission/app.js
+    	modified:   Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+    	modified:   docs/RELEASE_NOTES_NEXT/Client/pgtde.adoc
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+3	4	Open-ILS/examples/fm_IDL.xml
+0	1	Open-ILS/src/sql/Pg/006.schema.permissions.sql
+3	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+4	1	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.perm-group-display.sql
+1	8	Open-ILS/web/js/ui/default/staff/admin/local/permission/app.js
+3	5	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+4	3	docs/RELEASE_NOTES_NEXT/Client/pgtde.adoc
+
+commit c5e8a84e54af6fd925fe047c40e53559f6ae8d6e
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Aug 6 11:35:44 2018 -0400
+
+    LP#1744756 Grp display tree minor fixes.
+    
+    1. Fix group tree display entry IDL sequence copy/paste issue:
+    
+    permission.grp_tree_id_seq => permission.grp_tree_display_entry_id_seq
+    
+    2. Apply consistent use of tabs in the IDL.
+    
+    3. Fix thinko use of grp as a function in the no-entries-exist scenario
+       in the patron editor.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kyle Huckins <khuckins at catalyte.io>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+11	11	Open-ILS/examples/fm_IDL.xml
+1	1	Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+
+commit 9e3e576bcd6ff3c215bd14cac26bc3ce568955f3
+Author: Kyle Huckins <khuckins at catalyte.io>
+Date:   Thu Jun 14 16:11:34 2018 +0000
+
+    lp1744756 Release Notes for PGTDEs
+    
+    - Include release notes for Permission Group Tree Display
+    Entry UI and usage.
+    - Include pictures of interface for documentation.
+    
+    Signed-off-by: Kyle Huckins <khuckins at catalyte.io>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+53	0	docs/RELEASE_NOTES_NEXT/Client/pgtde.adoc
+-	-	docs/media/pgtde_01.png
+-	-	docs/media/pgtde_02.png
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/pgtde.adoc
+ create mode 100644 docs/media/pgtde_01.png
+ create mode 100644 docs/media/pgtde_02.png
+
+commit 0f43da13c5c602e0bf62b9a3154db1f5f59fbc53
+Author: Kyle Huckins <khuckins at catalyte.io>
+Date:   Thu Mar 15 18:54:13 2018 +0000
+
+    lp1744756 Profile Tree Display Entry Admin UI
+    
+    - Flesh out permission.group_tree_display_entries table.
+    - Create pgtde IDL class corresponding to new permission.group_tree_display_entries
+    table.
+    - Admin UI for Permission Group Tree Entries capable of viewing, adding, removing,
+    or changing position of entries within tree based on OU.
+    - Save functionality to persist any changes made.
+    - Persist changes in positions of permission group display
+    entries in Admin UI with the Profile Selector in the patron
+    edit interface.
+    - Make profile selector use original functionality if there are no
+    display entries.
+    
+    Signed-off-by: Kyle Huckins <khuckins at catalyte.io>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+25	0	Open-ILS/examples/fm_IDL.xml
+14	0	Open-ILS/src/sql/Pg/006.schema.permissions.sql
+19	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.perm-group-display.sql
+26	0	Open-ILS/src/templates/staff/admin/local/permission/index.tt2
+60	0	Open-ILS/src/templates/staff/admin/local/permission/t_grp_tree_display_entry.tt2
+36	0	Open-ILS/src/templates/staff/admin/local/permission/t_pgtde_add_dialog.tt2
+1	0	Open-ILS/src/templates/staff/admin/local/t_splash.tt2
+8	2	Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+443	0	Open-ILS/web/js/ui/default/staff/admin/local/permission/app.js
+85	1	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.perm-group-display.sql
+ create mode 100644 Open-ILS/src/templates/staff/admin/local/permission/index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/local/permission/t_grp_tree_display_entry.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/local/permission/t_pgtde_add_dialog.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/local/permission/app.js
+
+commit 05968579768d066280a16350cc8abb01d013265b
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Aug 29 18:18:54 2018 -0400
+
+    Forward-port 3.1.5 upgrade script
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+95	0	Open-ILS/src/sql/Pg/version-upgrade/3.1.4-3.1.5-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/3.1.4-3.1.5-upgrade-db.sql
+
+commit 79bb4ecdc65aa423a8f834bfefab88a04c6ba8d4
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Aug 29 18:18:25 2018 -0400
+
+    Forward-port 3.0.11 upgrade script
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+95	0	Open-ILS/src/sql/Pg/version-upgrade/3.0.10-3.0.11-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/3.0.10-3.0.11-upgrade-db.sql
+
+commit c8fc43ed2e4009df7291c598e96a40ab957e3b1b
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Jul 27 14:30:07 2018 -0400
+
+    LP#978095 ACQ use last-canceled copy reason if best
+    
+    Only use an alternate keep-debits cancel reason if the currently
+    canceled copy is not using a keep-debits reason.
+    
+    Also clarify in the docs that if another keep-debits reason is selected,
+    it's essentially chosen at random, not necessarily the "last" copy.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+4	5	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm
+11	1	docs/RELEASE_NOTES_NEXT/Acquisitions/autocancel_lineitems_when_all_copies_are_canceled.adoc
+
+commit 848484c3171a53a173b86af404de1658e69153a3
+Author: Jason Etheridge <jason at EquinoxInitiative.org>
+Date:   Fri Feb 2 11:30:36 2018 -0500
+
+    lp978095 auto-canceling lineitems
+    
+    "Acq: lineitems display as "on order" even after all copies have been cancelled"
+    
+    When a copy (lineitem detail) on a lineitem is canceled through the UI, all of
+    the sibling copies are examined, and if they also happen to be canceled, then a
+    cancel attempt is made on the parent lineitem.
+    
+    The cancel reason fed to the lineitem cancelation attempt will be the last
+    cancel reason on an examined sibling lineitem where Keep Debits is True, or
+    failing that, the cancel reason used wih the copy just canceled.
+    
+    The UI will refresh to the lineitem view when such an auto-cancelation happens.
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+36	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm
+3	0	Open-ILS/web/js/ui/default/acq/common/li_table.js
+3	0	docs/RELEASE_NOTES_NEXT/Acquisitions/autocancel_lineitems_when_all_copies_are_canceled.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Acquisitions/autocancel_lineitems_when_all_copies_are_canceled.adoc
+
+commit f1c3c905d3c5efded57616f67d630c801e713073
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 24 16:05:09 2018 -0400
+
+    LP#1768902 Stamping DB upgrade for Z39 UPC
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+15	0	Open-ILS/src/sql/Pg/upgrade/1120.data.add-upc-to-z3950.sql
+0	15	Open-ILS/src/sql/Pg/upgrade/XXXX.data.add-upc-to-z3950.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1120.data.add-upc-to-z3950.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.add-upc-to-z3950.sql
+
+commit 4b4b69d03eb5521b0ba16183db6fb7c94831c7f9
+Author: Ben Shum <ben at evergreener.net>
+Date:   Thu May 3 12:36:31 2018 -0500
+
+    LP#1768902: quick release note entry
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+4	0	docs/RELEASE_NOTES_NEXT/Cataloging/add-upc-to-z3950.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/add-upc-to-z3950.adoc
+
+commit 0e9ae4e247923ee56bb038c4380d928b70f75014
+Author: Ben Shum <ben at evergreener.net>
+Date:   Thu May 3 12:24:44 2018 -0500
+
+    LP#1768902: Add UPC to z3950 search for OCLC and LOC
+    
+    Based on settings provided by Jane Sandberg, add the UPC as a search
+    attribute definition for OCLC and LOC z3950 targets.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Garry Collum <gcollum at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+4	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+15	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.add-upc-to-z3950.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.add-upc-to-z3950.sql
+
+commit 26d52958c2103cb81914c17bf0d6734a42c2ff03
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Tue May 1 03:22:15 2018 -0500
+
+    Docs: adding release notes and docs for LP1760160
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+10	0	docs/RELEASE_NOTES_NEXT/OPAC/different_styles_for_searchbar.adoc
+24	0	docs/admin_initial_setup/different_styles_for_searchbar.adoc
+2	0	docs/root.adoc
+2	0	docs/root_command_line_admin.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/different_styles_for_searchbar.adoc
+ create mode 100644 docs/admin_initial_setup/different_styles_for_searchbar.adoc
+
+commit ecee476ede872cc671c8fe4887eb6194d6b9ef85
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Sat Mar 31 06:48:49 2018 -0700
+
+    LP1760160: Search bar has a different CSS class when on the home page
+    
+    To test:
+    1. In templates/opac/css/style.css, add some highly noticeable CSS that
+    applies to .searchbar-home or an element within .searchbar-home, e.g.
+      .searchbar-home .search-box {
+        background-color: purple;
+        height: 4em;
+      }
+    2. Go to the home page of your public catalog.  The .searchbar-home .search-box CSS
+    should have taken effect.
+    3. Go to another page of your public catalog, such as a search results
+    or login page.  The CSS should not have taken effect here.
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/opac/home.tt2
+2	1	Open-ILS/src/templates/opac/parts/searchbar.tt2
+
+commit 6afaf84691f593c8a48e528c4f54ef7f991a8a22
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Aug 23 12:26:11 2018 -0400
+
+    LP 1768715: pingest.pl merge conflict typo fix: skip_dispaly
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/support-scripts/pingest.pl
+
+commit 4118424b8d80dfb34f3e32c12e1f538a20f8aa92
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Sat Jun 2 20:33:23 2018 -0400
+
+    LP 1768715: pingest.pl Release Notes and Installation
+    
+    Add pingest.pl to Open-ILS/src/Makefile.am so it will be installed by
+    default.
+    
+    Add release notes for pingest.pl.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	1	Open-ILS/src/Makefile.am
+70	0	docs/RELEASE_NOTES_NEXT/Cataloging/pingest.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/pingest.adoc
+
+commit 41e6fe45422e24c1b2af4f638d7113c109d7aff2
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Sat Jun 2 19:18:40 2018 -0400
+
+    LP 1768715: Fix pingest.pl bug discovered by Dan Scott of Laurentian U.
+    
+    Reingest was not happening if all ingests were skipped, except for the
+    display field reingest.  This came down to a matter of two conditional
+    statements not including checks for the $skip_display variable being
+    true.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	2	Open-ILS/src/support-scripts/pingest.pl
+
+commit ddfa6af287dc9c7fc69f558ab8e7b99ab9df4f15
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Fri Nov 24 10:23:56 2017 -0500
+
+    LP 1768715: Use older named notation in pingest.pl
+    
+    Use older style param := 'value' named notation for PostgreSQL
+    function calls in pingest.pl to support PostgreSQL versions < 9.5.
+    
+    NOTE: This commit was modified to fit with the flow of the surrounding
+    commits from the master branch of the source repository.
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+3	3	Open-ILS/src/support-scripts/pingest.pl
+
+commit 55093af49ba1d0bd5f63a1206972703ae31d273c
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Tue Nov 21 21:23:03 2017 -0500
+
+    LP 1768715: Whitespace cleanup in Blake's commit.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/support-scripts/pingest.pl
+
+commit 7e007cc03694799d2b5a49f6c6791df706b51d4d
+Author: Blake GH <blake at mobiusconsortium.org>
+Date:   Tue Nov 21 10:41:48 2017 -0600
+
+    LP 1768715: Missing semi colon
+    
+    Add missing semi-colon in pingest.pl.
+    
+    Signed-off-by: Blake GH <blake at mobiusconsortium.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/support-scripts/pingest.pl
+
+commit d81eb554d9cc40b2b4339fe0ae68847587c8a12f
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Wed Oct 4 16:43:37 2017 -0400
+
+    LP 1768715: Handle the skip_display option of metabib.reingest_metabib_field_entries.
+    
+    pingest.pl gets a --skip-display option of its own that disables the
+    display ingest.  The display ingest is also skipped in the browse
+    ingest.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+6	2	Open-ILS/src/support-scripts/pingest.pl
+
+commit 3fc6f07190a31ff9c2c52caac10374fc5fe9b9bb
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Wed Oct 4 13:25:19 2017 -0400
+
+    LP 1768715: Add skip_browse where it was missed in pingest.pl.
+    
+    I missed the named parameter for skip_browse in reingest_field_entries
+    in pingest.pl in the earlier commit.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/support-scripts/pingest.pl
+
+commit fa3af4113a3f8cff1bc2fb43dfc62af2977db78f
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Wed Oct 4 12:55:05 2017 -0400
+
+    LP 1768715: Use named arguments in function calls in pingest.pl.
+    
+    This makes it work, more or less, with Evergreen 3.0 and the changes
+    to metabib.reingest_field_entries.  Note that the new skip_display
+    parameter is not set, so you might get collisions between the browse
+    ingest and one of the other ingest processes if they both work on the
+    same record at once.
+    
+    I will make a branch for use with Evergreen 3.0 until I upgrade to
+    Evergreen 3.0 and merge that branch into master.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+3	3	Open-ILS/src/support-scripts/pingest.pl
+
+commit bee32963d1be36b22ea1984a90262149f6330faf
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Wed Oct 4 11:18:35 2017 -0400
+
+    LP 1768715: Add database connection parameters to pingest.pl command line.
+    
+    This will serve as the model for future Perl scripts that need to
+    connect to the PostgreSQL database with DBI.  I may go back and alter
+    the existing scripts to use this method.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+18	3	Open-ILS/src/support-scripts/pingest.pl
+
+commit fe5ba7746f7ec5a1d33195160c00654a7bd869dc
+Author: Jason Stephenson <jstephenson at mvlcstaff.org>
+Date:   Mon Apr 11 12:25:57 2016 -0400
+
+    LP 1768715: Make the pingest.pl --pipe option be greedy.
+    
+    The --pipe option is used with pingest.pl now assumes that that any
+    string of digits in the input is a record id.  Instead of using just
+    the first string of digits on a line, as it did before, it now uses
+    each string of digits on a line.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlcstaff.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+3	3	Open-ILS/src/support-scripts/pingest.pl
+
+commit 1f2f392b42c5e1e10488d2034a0686c7e8768ad4
+Author: Jason Stephenson <jstephenson at mvlcstaff.org>
+Date:   Mon Apr 11 10:39:02 2016 -0400
+
+    LP 1768715: Simplify Open-ILS/src/support-scripts/pingest.pl with selectcol_arrayref.
+    
+    By switching to DBI->selectcol_arrayref in pingest.pl, we can avoid
+    having to check for references in the main loop.  This eliminates an
+    extra variable and an extra line of code that are no longer needed.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlcstaff.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	3	Open-ILS/src/support-scripts/pingest.pl
+
+commit 2da2f10b1e9f744cd57da8ced8fdb8779f1b5511
+Author: Jason Stephenson <jstephenson at mvlcstaff.org>
+Date:   Fri Apr 1 10:02:45 2016 -0400
+
+    LP 1768715: Only connect to the database when needed in pingest.pl.
+    
+    We chagne where we connect and disconnect the database in the parent
+    process in pingest.pl.  There's no point connecting at all if the
+    --pipe option is used.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlcstaff.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	2	Open-ILS/src/support-scripts/pingest.pl
+
+commit d762c9eb243eeb66f827873e602919598a1cf88d
+Author: Jason Stephenson <jstephenson at mvlcstaff.org>
+Date:   Fri Apr 1 10:00:20 2016 -0400
+
+    LP 1768715: Fix bug in pingest.pl after --pipe option was added.
+    
+    Apparently, the results of DBI->selectall_arrayref need to be cast to
+    an array and not just returned as a list.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlcstaff.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/support-scripts/pingest.pl
+
+commit 844a1fbea2b94dc34802099c5b13376f0fbfab1d
+Author: Jason Stephenson <jstephenson at mvlcstaff.org>
+Date:   Thu Mar 31 11:39:49 2016 -0400
+
+    LP 1768715: Add --pipe option to pingest.pl
+    
+    With this option, pingest.pl reads a list of record IDs from standard
+    input, instead of running a query.  This is useful if you have a
+    custom query to output only certain records to reingest and you can
+    pipe the output into pingest.pl.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlcstaff.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+27	3	Open-ILS/src/support-scripts/pingest.pl
+
+commit 28d87c24928344307fc68338aa01ca2c1d97173a
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Feb 16 12:59:55 2016 -0500
+
+    LP 1768715: pingest supports max/min ID, duration, more ops
+    
+    From the new help text:
+    
+        --batch-size
+            Number of records to process per batch
+    
+        --max-child
+            Max number of worker processes
+    
+        --skip-browse
+        --skip-attrs
+        --skip-search
+        --skip-facets
+            Skip the selected reingest component
+    
+        --start-id
+            Start processing at this record ID.
+    
+        --end-id
+            Stop processing when this record ID is reached
+    
+        --max-duration
+            Stop processing after this many total seconds have passed.
+    
+        --help
+            Show this help text.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+104	43	Open-ILS/src/support-scripts/pingest.pl
+
+commit 1ceab5e76d05e507da85302be22137f13d4a8635
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Mon Oct 26 10:32:19 2015 -0400
+
+    LP 1768715: Add pingest.pl to Evergreen.
+    
+    Add Open-ILS/src/support-script/pingest.pl to do ingests in parallel.
+    See release notes for details.
+    
+    NOTE: This and subsequent commits were added from a branch that
+    preserves the history of the repository from which pingest.pl was
+    copied.  The dates on these commits represent when the code was added
+    or modified in the source repository.  They do not reflect when the
+    code was added to Evergreen.
+    
+    Also, pingest.pl predates this commit.  The date on this commit was
+    when the source repository was split into separate directories for SQL
+    and Perl scripts.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+214	0	Open-ILS/src/support-scripts/pingest.pl
+ create mode 100755 Open-ILS/src/support-scripts/pingest.pl
+
+commit bd8912ee2d1016619ee208d513815072071fc6be
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Wed Nov 15 14:36:21 2017 -0800
+
+    LP#1732552: Move OPAC login username hint to separate template
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	2	Open-ILS/src/templates/opac/parts/login/form.tt2
+6	0	Open-ILS/src/templates/opac/parts/login/username_hint.tt2
+6	0	docs/RELEASE_NOTES_NEXT/OPAC/username-hint.adoc
+ create mode 100644 Open-ILS/src/templates/opac/parts/login/username_hint.tt2
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/username-hint.adoc
+
+commit 3100c328934dcc2b83ea90039294048d4b26c09b
+Author: a. bellenir <ab at grpl.org>
+Date:   Wed Aug 22 11:33:55 2018 -0400
+
+    LP#1788417: boolean fields should say 'Yes'/'No' instead of true/false
+    
+    boolean fields on egGrid use tt2-translated strings for "Yes" and "No"
+    instead of letting the browser translate the values 'true' and 'false'
+    (in accordance with the prophecy of XUL)
+    
+    Signed-off-by: a. bellenir <ab at grpl.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+2	0	Open-ILS/src/templates/staff/base_js.tt2
+4	5	Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit d967aac09b076d5782047357b5dfcad4b7f1fe9a
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Aug 15 18:10:08 2018 -0400
+
+    LP#1775216: Stamping upgrade script for inconsistent copy counts
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+0	88	Open-ILS/src/sql/Pg/upgrade/1112.schema.lp1775216_consistent_avail_counts.sql
+90	0	Open-ILS/src/sql/Pg/upgrade/1119.schema.lp1775216_consistent_avail_counts.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/1112.schema.lp1775216_consistent_avail_counts.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1119.schema.lp1775216_consistent_avail_counts.sql
+
+commit 4e0528b11a244734b0d2835dd8ce6c96fb28a5fd
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 15 14:08:41 2018 -0400
+
+    LP#1721575 Stamping DB upgrade: batch catalog actions
+    
+    Also replaced a remaining reference to "cart" with "basket"
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+90	0	Open-ILS/src/sql/Pg/upgrade/1118.data.bre_format_title_fix.sql
+0	86	Open-ILS/src/sql/Pg/upgrade/XXXX.data.bre_format_title_fix.sql
+1	1	Open-ILS/src/templates/opac/parts/anon_list.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1118.data.bre_format_title_fix.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.bre_format_title_fix.sql
+
+commit ba5f74d896b52b8e64093324220ceba4f5100862
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Aug 14 16:28:35 2018 -0400
+
+    LP#1721575: Changes to some strings
+    
+    We missed one instance of cart when changing everything over to baskets. Also,
+    I updated language for clearing a basket after placing a hold to make it a
+    little clearer.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/opac/parts/place_hold.tt2
+1	1	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit deab49ceef1b036c7918c3103282e0be13710980
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon May 14 15:24:59 2018 -0400
+
+    LP#1721575: Batch Actions In the Public Catalog
+    
+    The public catalog now displays checkboxes on the bibliographic and
+    metarecord constituents results pages. Selecting one or more titles
+    by using the checkboxes will dynamically add those title to the
+    temporary list, which is now renamed the basket.
+    
+    Above the results lists there is now a bar with a select-all checkbox,
+    a link to the basket management page that also indicates the number of
+    of titles in the basket, and a link to remove from the basket titles that
+    are selected on the currently displayed results page.
+    
+    The search bar now includes an icon of a basket and displays the number
+    of titles currently in the basket. Next to that icon is a menu of basket
+    actions.
+    
+    The basket actions available are Place Hold, Print Title Details,
+    Email Title Details, Add Cart to Saved List, and Clear Cart. In the
+    web staff client, the basket actions also include Add Cart to Bucket.
+    When an action is selected from this menu, the user is given an
+    opportunity to confirm the action and to optionally empty the basket
+    when the action is complete. The action is applied to all titles
+    in the basket.
+    
+    Clicking on the basket icon brings the user to a page listing the
+    titles in the basket. From there, the user can select specific records
+    to request, print, email, add to a list, or remove from the basket.
+    
+    The list of actions on the record details page now provides separate
+    links for adding the title to a basket or to a permanent list.
+    
+    The permanent list management page in the public catalog now also
+    includes batch print and email actions.
+    
+    Additional information
+    ++++++++++++++++++++++
+    * The checkboxes do not display on the metarecord results page, as
+      metarecords currently cannot be put into baskets or lists.
+    * The checkboxes are displayed only if Javascript is enabled. However,
+      users can still add items to the basket and perform batch actions on
+      the basket and on lists.
+    * A template `config.tt2` setting, `ctx.max_basket_size`, can be used to
+      set a soft limit on the number of titles that can be added to the
+      basket. If this limit is reached, checkboxes to add more records to the
+      basket are disabled unless existing titles in the basket are removed
+      first. The default value for this setting is 500.
+    
+    Developer notes
+    +++++++++++++++
+    
+    This patch adds the the public catalog two routes that return JSON
+    rather than HTML:
+    
+    * `GET /eg/opac/api/mylist/add?record=45`
+    * `GET /eg/opac/api/mylist/delete?record=45`
+    
+    The JSON response is a hash containing a mylist key pointing to the list
+    of bib IDs of contents of the basket.
+    
+    The record parameter can be repeated to allow adding or removing
+    records as an atomic operation. Note that this change also now available
+    to `/eg/opac/mylist/{add,delete}`
+    
+    More generally, this adds a way for EGWeb context loaders to specify that
+    a response should be emitted as JSON rather than rendering an HTML
+    page using `Template::Toolkit`.
+    
+    Specifically, if the context as munged by the context loader contains
+    a `json_response` key, the contents of that key will to provide a
+    JSON reponse. The `json_response_cookie` key, if present, can be used
+    to set a cookie as part of the response.
+    
+    Template Toolkit processing is bypassed entirely when emitting a JSON
+    response, so the context loader would be entirely reponsible for
+    localization of strings in the response meant for direct human
+    consumption.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+16	3	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+55	14	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+211	26	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Container.pm
+60	6	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
+13	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGWeb.pm
+4	2	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+86	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.bre_format_title_fix.sql
+1	0	Open-ILS/src/templates/opac/advanced.tt2
+1	0	Open-ILS/src/templates/opac/browse.tt2
+56	5	Open-ILS/src/templates/opac/css/style.css.tt2
+3	2	Open-ILS/src/templates/opac/mylist.tt2
+21	0	Open-ILS/src/templates/opac/mylist/clear.tt2
+29	0	Open-ILS/src/templates/opac/mylist/email.tt2
+29	0	Open-ILS/src/templates/opac/mylist/print.tt2
+25	1	Open-ILS/src/templates/opac/myopac/lists.tt2
+15	6	Open-ILS/src/templates/opac/parts/anon_list.tt2
+0	3	Open-ILS/src/templates/opac/parts/bookbag_actions.tt2
+30	0	Open-ILS/src/templates/opac/parts/cart.tt2
+5	0	Open-ILS/src/templates/opac/parts/config.tt2
+1	0	Open-ILS/src/templates/opac/parts/css/colors.tt2
+7	1	Open-ILS/src/templates/opac/parts/header.tt2
+10	0	Open-ILS/src/templates/opac/parts/js.tt2
+7	2	Open-ILS/src/templates/opac/parts/place_hold.tt2
+29	14	Open-ILS/src/templates/opac/parts/record/summary.tt2
+50	19	Open-ILS/src/templates/opac/parts/result/table.tt2
+1	0	Open-ILS/src/templates/opac/parts/searchbar.tt2
+1	1	Open-ILS/src/templates/opac/parts/topnav.tt2
+4	0	Open-ILS/src/templates/opac/record/email.tt2
+4	0	Open-ILS/src/templates/opac/record/print.tt2
+2	2	Open-ILS/src/templates/opac/results.tt2
+3	3	Open-ILS/src/templates/opac/temp_warn.tt2
+-	-	Open-ILS/web/images/add-to-cart.png
+-	-	Open-ILS/web/images/cart-md.png
+-	-	Open-ILS/web/images/cart-sm.png
+284	0	Open-ILS/web/js/ui/default/opac/record_selectors.js
+38	11	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+76	0	docs/RELEASE_NOTES_NEXT/OPAC/Batch_Actions.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.bre_format_title_fix.sql
+ create mode 100644 Open-ILS/src/templates/opac/mylist/clear.tt2
+ create mode 100644 Open-ILS/src/templates/opac/mylist/email.tt2
+ create mode 100644 Open-ILS/src/templates/opac/mylist/print.tt2
+ create mode 100644 Open-ILS/src/templates/opac/parts/cart.tt2
+ create mode 100644 Open-ILS/web/images/add-to-cart.png
+ create mode 100644 Open-ILS/web/images/cart-md.png
+ create mode 100644 Open-ILS/web/images/cart-sm.png
+ create mode 100644 Open-ILS/web/js/ui/default/opac/record_selectors.js
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/Batch_Actions.adoc
+
+commit 65baf6b58639ed883960c9b88efed54b1bc61a3b
+Author: Ben Shum <ben at evergreener.net>
+Date:   Wed Aug 15 11:31:01 2018 -0400
+
+    Translation updates - newpot
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+3	3	build/i18n/po/cat.properties/cat.properties.pot
+3	3	build/i18n/po/common.properties/common.properties.pot
+3448	2723	build/i18n/po/db.seed/db.seed.pot
+2253	2221	build/i18n/po/fm_IDL.dtd/fm_IDL.dtd.pot
+24	25	build/i18n/po/lang.dtd/lang.dtd.pot
+40	40	build/i18n/po/tpac/tpac.pot
+828	523	build/i18n/po/webstaff/webstaff.pot
+
+commit e8e766724270ee2b5cac7ef193a4e5647d5d2ad7
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Thu Jul 5 14:33:24 2018 -0700
+
+    LP1164061: Edit authority record by database ID
+    
+    Allow users to jump directly to the authority record MARC edit interface
+    by entering the authority record ID.
+    
+    Includes release notes.
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+17	0	Open-ILS/src/templates/staff/cat/catalog/t_retrieve_by_authority_id.tt2
+6	0	Open-ILS/src/templates/staff/navbar.tt2
+20	0	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+17	0	docs/RELEASE_NOTES_NEXT/Cataloging/view-authority-record-by-id.adoc
+ create mode 100644 Open-ILS/src/templates/staff/cat/catalog/t_retrieve_by_authority_id.tt2
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/view-authority-record-by-id.adoc
+
+commit 913237b92bcd9278cd3608ad4d6d1048bda1d1d0
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Sun Jul 8 14:19:10 2018 -0400
+
+    LP 1780660: Add more workstation functions to OpenILS::Utils::TestUtils.
+    
+    Add methods find_or_register_workstation($name, $lib) and
+    find_workstation($name, $lib) to OpenILS::Utils::TestUtils.  These can
+    be used when writing tests or other scripts to find or create
+    workstations.
+    
+    The following Perl live tests were updated to use the new methods
+    rather than their hand-rolled versions:
+    
+    * 14-lp1499123_csp_ignore_proximity.t
+    * 18-lp1592891_sip_standing_penalties.t
+    * 19-lp1306666-abort-transit-copy-status.t
+    * 25-lp1694058-multiple-hold-placement.t
+    
+    Testing this is very simple:
+    
+    1. Install Evergreen from this branch.
+    2. Load the Concerto dataset.
+    3. Start Evergreen services with osrf_control.
+    4. cd to the perlmods source directory.
+    5. Do 'make livecheck' and see that all tests pass, particularly the 4
+       mentioned above.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+23	0	Open-ILS/src/perlmods/lib/OpenILS/Utils/TestUtils.pm
+1	16	Open-ILS/src/perlmods/live_t/14-lp1499123_csp_ignore_proximity.t
+1	16	Open-ILS/src/perlmods/live_t/18-lp1592891_sip_standing_penalties.t
+2	19	Open-ILS/src/perlmods/live_t/19-lp1306666-abort-transit-copy-status.t
+1	23	Open-ILS/src/perlmods/live_t/25-lp1694058-multiple-hold-placement.t
+
+commit beee20c5b0a63bf8248a630686f2fb262d4789ac
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Fri Aug 3 13:29:14 2018 -0400
+
+    LP#1750894: Stamping upgrade script for workstation settings on server
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+227	0	Open-ILS/src/sql/Pg/upgrade/1116.schema.workstation-settings.sql
+930	0	Open-ILS/src/sql/Pg/upgrade/1117.data.workstation-settings.sql
+0	227	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.workstation-settings.sql
+0	928	Open-ILS/src/sql/Pg/upgrade/YYYY.data.workstation-settings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1116.schema.workstation-settings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1117.data.workstation-settings.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.workstation-settings.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.data.workstation-settings.sql
+
+commit d423090e2277daa2e69f49cef91f37235184db95
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 3 11:39:15 2018 -0400
+
+    LP#1750894 Remove errant phantomjs-killing comma
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/web/js/ui/default/staff/services/hatch.js
+
+commit 73b7ace22996370f5bc8e338f115a3d9dd03b349
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Jul 31 16:52:18 2018 -0400
+
+    LP#1750894 Additional workstation setting types + repairs
+    
+    Added new workstation setting types:
+    
+    circ.checkout.strict_barcode
+    cat.holdings_show_empty_org
+    cat.copy.defaults
+    cat.printlabels.default_template
+    cat.printlabels.templates
+    
+    Bump perm ID in seed data, take 2.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+37	2	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+35	0	Open-ILS/src/sql/Pg/upgrade/YYYY.data.workstation-settings.sql
+
+commit 29f35dcc1862db26f486e9e0c6a2c0174281019b
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Jul 31 16:30:17 2018 -0400
+
+    LP#1750894 Batch settings lookup handles migration
+    
+    As with a single getItem() call, the batch version of the call, when
+    making server requests, will migrate any settings necessary from
+    localStorage to server settings.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+25	11	Open-ILS/web/js/ui/default/staff/services/hatch.js
+
+commit a61fc24476f6c24bceea2a4b0b9cc900ac0fe735
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Jul 27 17:52:24 2018 -0400
+
+    LP#1750894 Hatch set local storage item thinko
+    
+    Ensure hatch.setItem() returns a promise for both server- and browser-
+    stored values.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/web/js/ui/default/staff/services/hatch.js
+
+commit edd1e288917ddde1cebedf3df57732af5fc86d8a
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Jul 27 17:26:08 2018 -0400
+
+    LP#1750894 Bump perm ID; apply consistently
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+4	5	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+2	2	Open-ILS/src/sql/Pg/upgrade/YYYY.data.workstation-settings.sql
+
+commit 14803bb75f6129d59c3dc74e9c2df5909348969e
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Jun 4 17:14:24 2018 -0400
+
+    LP#1750894 Store grid limits in grid config
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+38	8	Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit f06c3c2110e164b01a46014972258ba41423aa7a
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Jun 4 12:10:20 2018 -0400
+
+    LP#1750894 Server-stored workstaion prefs admin view
+    
+    Adds a new "Server Workstation Prefs" tab to the stored preferences
+    workstation admin interface.  From here, users can view which
+    preferences are stored as server-stored workstation preferences and
+    delete select values.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+13	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Settings.pm
+5	2	Open-ILS/src/templates/staff/admin/workstation/t_stored_prefs.tt2
+13	3	Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+2	2	Open-ILS/web/js/ui/default/staff/services/hatch.js
+8	0	docs/RELEASE_NOTES_NEXT/Client/workstation-server-settings.adoc
+
+commit ff6aa2ab53271740a0b2fd73859af785f7765f32
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed May 30 16:38:56 2018 -0400
+
+    LP#1750894 Workstation/Cascade setting pgtap tests
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+84	0	Open-ILS/src/sql/Pg/t/lp1750894-workststation-settings.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1750894-workststation-settings.pg
+
+commit 7790968d6410a3de13ed606150b61f148f96b2bc
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue May 29 11:47:16 2018 -0400
+
+    LP#1750894 Workstation/Cascade settings Release Notes
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+63	0	docs/RELEASE_NOTES_NEXT/Client/workstation-server-settings.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/workstation-server-settings.adoc
+
+commit 7891c0241e9b5273f122f8d77cb20ebbf2d5cf6b
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Mar 13 14:06:23 2018 -0400
+
+    LP#1750894 Workstation & Cascade settings
+    
+    Adds a new config.workstation_setting_type table for managing
+    workstation-specific settings.
+    
+    Adds new PG and perl API functionality for determining values for
+    settings which may be represnted as workstation, user, and/or org unit
+    settings.
+    
+    Teaches the AngularJS browser client to load and apply most settings at
+    the server.  Values for settings stored in localStorage/Hatch are migrated
+    to server settings at time of next use.
+    
+    Stock workstation setting types added to accommodate most browser client
+    settings.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+45	1	Open-ILS/examples/fm_IDL.xml
+1	0	Open-ILS/src/perlmods/MANIFEST
+1	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+306	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Settings.pm
+58	0	Open-ILS/src/sql/Pg/002.schema.config.sql
+164	0	Open-ILS/src/sql/Pg/005.schema.actors.sql
+893	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+227	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.workstation-settings.sql
+893	0	Open-ILS/src/sql/Pg/upgrade/YYYY.data.workstation-settings.sql
+2	0	Open-ILS/src/templates/staff/admin/workstation/index.tt2
+3	1	Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+10	3	Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+351	35	Open-ILS/web/js/ui/default/staff/services/hatch.js
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Settings.pm
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.workstation-settings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.data.workstation-settings.sql
+
+commit 26581c762f386104c5002b68b9dd99fb0a68116e
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Jul 30 10:23:37 2018 -0400
+
+    LP#1766716 Closed dates Perl live test API repair
+    
+    Update the org unit close date Perl live test to match API changes for
+    emergecy org unit close dates handling.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+4	1	Open-ILS/src/perlmods/live_t/04-overdue_with_closed_dates.t
+
+commit 15c4db3b46d7c279ce5552ad55b08d3fe861bfb0
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Jul 26 14:40:00 2018 -0400
+
+    LP#1766716 Stamping emergency closing DB upgrade
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+449	0	Open-ILS/src/sql/Pg/upgrade/1115.schema.emergency_closing.sql
+0	449	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.emergency_closing.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1115.schema.emergency_closing.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.emergency_closing.sql
+
+commit 76ff2328fdb1ec5ef1ff19056fb5a610bdda70d8
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jul 11 16:51:59 2018 -0400
+
+    LP#1766716: Adjust date display logic
+    
+    We were using the wrong date formating filter, egDueDate, and additionly the
+    egOrgDateInContext filter was defaulting to the useless 'shortDate' format in
+    cases where a format was not passed (such as when $root.egDateAndTimeFormat
+    can't be found).  Both of these are addressed here.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	2	Open-ILS/src/templates/staff/admin/local/actor/closed_dates.tt2
+1	0	Open-ILS/web/js/ui/default/staff/admin/local/actor/closed_dates.js
+1	1	Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit 3f249b1cc43dd59da8ac640767b74a151bed7cb5
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Jul 9 11:55:07 2018 -0400
+
+    LP#1766716 Closed dates API emergency filter fix
+    
+    Fix closed dates emergency => emergency_closing DB column name thinko.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/ClosedDates.pm
+
+commit a440cb0787455a97363eb045d4bd19a865ad19d2
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed May 9 12:28:00 2018 -0400
+
+    LP#1766716: (follow-up) expand CSS imports for now
+    
+    The patches for bug 1739803 ended up removing the minification
+    of the CSS and constructing evergreen-staff-client-deps.0.0.1.min.css,
+    so consequently setting EXPAND_WEB_IMPORTS to 0 currently does not
+    work as expected. Unless that regression (if it is one) gets
+    fixed, stick with EXPAND_WEB_IMPORTS = 1 for now.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/config.tt2
+
+commit 71c46499d080f38c53bd3b8ee34852e973a2daf1
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Apr 24 16:45:31 2018 -0400
+
+    LP#1766716: Release notes
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+22	0	docs/RELEASE_NOTES_NEXT/Circulation/EmergencyClosingHandler.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/EmergencyClosingHandler.adoc
+
+commit 5caa4344f460f8496589b641854634cf799a6dca
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Feb 27 16:49:57 2018 -0500
+
+    LP#1766716: Emergency Closing handler
+    
+    New Feature Summary
+    
+    Staff are provided with interfaces and mechanisms to create library closings
+    that, in addition to affecting future circulation and booking due dates, and
+    hold shelf expirations, will automatically move existing circulation and
+    booking due dates and hold shelf expiration times.  This new functionality is
+    conceptually described as Emergency Closings and business logic implementing it
+    as the Emergency Closing Handler. It contains additions and adjustments to the
+    user interface, business logic, and database layers.  Access to this
+    functionality is available through the Closed Dates Editor interface in the
+    staff client which has been ported to AngularJS.
+    
+    Overview
+    
+    This development has created new business logic code to inspect, in real time,
+    existing circulation, booking, and hold records, and modify such date and time
+    stamps so that the circulation, booking, or hold will end in the same state it
+    would have if the closing had existed at the time the circulation or booking
+    occurred, or the hold was placed and captured.  Of specific note, hourly loans
+    will have their due date adjusted to be the end of the day following the
+    closing.
+    
+    When the Emergency Closing is saved, any fines accrued during the closing may
+    be voided, as settings dictate, with the exception of circulations that have
+    been marked as LOST or LONG OVERDUE.  That is, even for LOST and LONG OVERDUE
+    circulations with due dates that fall within the Emergency Closing, no fine
+    adjustment will be applied.  Emergency Closing processing is permanent, and
+    cannot be rolled back.
+    
+    This functionality is explicitly initiated by staff action.  If staff do not
+    request an Emergency Closing, existing circulations, bookings, and holds will
+    not be processed and adjusted.  However, if staff request any Closing that
+    starts nearer in time than the length of the longest circulation duration
+    configured for use in the Evergreen instance they will be prompted with the
+    option to create the closing as an Emergency Closing.
+    
+    Action/Trigger hooks have been created for circulations and bookings that are
+    adjusted by the Emergency Closing Handler.  These will facilitate the creation
+    of notifications to patrons that the due date has changed and to alert them to
+    potential changes in accrued fines.
+    
+    Booking start dates are explicitly ignored in this implementation.  Because an
+    Emergency Closing is, by its nature, an unexpected event, it will be up to
+    staff to address any bookings which intersect with a new Emergency Closings.
+    Reports can be used to identify booking start dates that overlap with a closing
+    and that may require staff intervention.
+    
+    Staff requsting and Emergency Closing must have the new EMERGENCY_CLOSING
+    permission.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+141	0	Open-ILS/examples/fm_IDL.xml
+201	7	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/ClosedDates.pm
+457	0	Open-ILS/src/sql/Pg/096.schema.emergency_closing.sql
+3	0	Open-ILS/src/sql/Pg/400.schema.action_trigger.sql
+3	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+2	0	Open-ILS/src/sql/Pg/sql_file_manifest
+449	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.emergency_closing.sql
+87	0	Open-ILS/src/templates/staff/admin/local/actor/closed_dates.tt2
+116	0	Open-ILS/src/templates/staff/admin/local/actor/edit_closed_dates.tt2
+1	1	Open-ILS/src/templates/staff/config.tt2
+3	3	Open-ILS/src/templates/staff/share/t_datetime.tt2
+352	0	Open-ILS/web/js/ui/default/staff/admin/local/actor/closed_dates.js
+3	0	Open-ILS/web/js/ui/default/staff/services/org.js
+1	1	Open-ILS/web/js/ui/default/staff/services/ui.js
+ create mode 100644 Open-ILS/src/sql/Pg/096.schema.emergency_closing.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.emergency_closing.sql
+ create mode 100644 Open-ILS/src/templates/staff/admin/local/actor/closed_dates.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/local/actor/edit_closed_dates.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/local/actor/closed_dates.js
+
+commit b46d4eaac2a6b023c2cde2a1642ef61cb8206548
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Mar 16 09:52:50 2018 -0400
+
+    LP#1766716 Supporting functionality added to date/time picker and progress dialog
+    
+    Here the date/time picker is given the ability to dynamically hide the time
+    picking component when show-time-picker is in effect.  This allows an
+    interface to use the time picker based on ephemeral state information and to
+    hide it when not useful.
+    
+    Additionally, the progress dialog now takes an optional label property that
+    can be passed to both open() and update(), so that textual information can
+    be provided along with the numeric and visual progress data.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	1	Open-ILS/src/templates/staff/share/t_datetime.tt2
+6	0	Open-ILS/src/templates/staff/share/t_progress_dialog.tt2
+3	0	Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit 827d0277af4405a5df1ddbbf5414c35e7250d3f2
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Jul 26 10:38:02 2018 -0400
+
+    Forward-port 3.0.10 upgrade script
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+214	0	Open-ILS/src/sql/Pg/version-upgrade/3.0.9-3.0.10-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/3.0.9-3.0.10-upgrade-db.sql
+
+commit c1fac20422420e8a11cb950741f32b2f39fa4918
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Jul 12 09:24:48 2018 -0400
+
+    Stamping upgrade script
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+211	0	Open-ILS/src/sql/Pg/upgrade/1113.function.acq.rollover-by-org-tree.sql
+0	211	Open-ILS/src/sql/Pg/upgrade/XXXX.function.acq.rollover-by-org-tree.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1113.function.acq.rollover-by-org-tree.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.acq.rollover-by-org-tree.sql
+
+commit 60eec432440657a51e8fd0fb6622e5620750ab9f
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Mar 27 14:56:23 2018 -0400
+
+    LP#1746566: Enable 500, 1K, and all rows in more patron grids
+    
+    This enables the allowAll option in the Patron Items Checked Out
+    and Other/Special Circulations grids.
+    
+    To test
+    -------
+    [1] Apply the patch.
+    [2] Verify that the Patron Items Checked Out, Other/Special Circulations,
+        Non-Catalogued Circulations, and Holds grids now include row
+        count options 500, 100, and All.
+    [3] Verify that the Item Status grid now includes the additional
+        row count options.
+    [4] Verify that when choosing the "All" row count that you are prompted
+        to confirm loading all of the rows.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+1	1	Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2
+
+commit 6c511a7d53eefa0b543c2212f8064f60cd74dd7a
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Wed Feb 7 12:05:10 2018 -0500
+
+    LP#1746566: Enable 500, 1K, and ALL-the-Rows in patron grids
+    
+    This adds to the Patron (non-catalogued) Items Out, Patron Holds, and
+    Item Status grids an 'allowAll' grid feature which will enable the 500,
+    1K, and ALL (really 10K) rows/pagesize. For the ALL option a modal has
+    been wired to that the action can be confirmed, since it might be a
+    very slow operation.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+2	0	Open-ILS/src/templates/staff/base_js.tt2
+1	1	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+1	1	Open-ILS/src/templates/staff/circ/patron/t_holds_list.tt2
+1	1	Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2
+6	1	Open-ILS/src/templates/staff/share/t_autogrid.tt2
+14	2	Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit dfc9a81480c8c5f792b5e63cd6f84c77de88eeb7
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Jun 29 12:41:26 2018 -0400
+
+    Forward port 3.0.9 upgrade script
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+15	0	Open-ILS/src/sql/Pg/version-upgrade/3.0.8-3.0.9-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/3.0.8-3.0.9-upgrade-db.sql
+
+commit a4856e5c20a5206bc0526ab24fae17addded1920
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Mon Jun 4 09:06:55 2018 -0400
+
+    Forward port 3.0.8 upgrade script
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+131	0	Open-ILS/src/sql/Pg/version-upgrade/3.0.7-3.0.8-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/3.0.7-3.0.8-upgrade-db.sql
+
+commit 0de55610cb544e58e7e7c4fc8286e24177a12ae8
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri May 25 14:12:25 2018 -0400
+
+    Moving upgrade script into place
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+35	0	Open-ILS/src/sql/Pg/upgrade/1111.data.copy_alert_perms.sql
+0	35	Open-ILS/src/sql/Pg/upgrade/XXXX.data.copy_alert_perms.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1111.data.copy_alert_perms.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.copy_alert_perms.sql
+
+commit 6f1ab733b8828d7a18260846e14d5a008c0c931d
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri May 25 14:11:02 2018 -0400
+
+    Stamping upgrade script
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/XXXX.data.copy_alert_perms.sql
+
+commit 532a09a1bd800ef3325847c8fc9d4b51d50dfac7
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Sun May 13 17:01:10 2018 -0700
+
+    Docs: starting 3.0.8 release notes
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+78	1	docs/RELEASE_NOTES_3_0.adoc
+
+commit d8e092ac014beee99ca75224a7524d3c0f41690b
+Author: Ben Shum <ben at evergreener.net>
+Date:   Wed May 2 00:45:14 2018 -0500
+
+    Revert "LP#1387722: Update MARC leader when deleting a record"
+    
+    This reverts commit 7dfcdd814f60a20c1b8b4522e69c0a27c23123b5.
+
+0	32	Open-ILS/src/sql/Pg/010.schema.biblio.sql
+0	39	Open-ILS/src/sql/Pg/t/lp1387722_record_leader_updates.pg
+0	37	Open-ILS/src/sql/Pg/upgrade/xxxx.schema.set_record_status_in_leader_trigger.sql
+0	7	docs/RELEASE_NOTES_NEXT/Cataloging/leader_updated_on_delete_creation_update.adoc
+ delete mode 100644 Open-ILS/src/sql/Pg/t/lp1387722_record_leader_updates.pg
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.schema.set_record_status_in_leader_trigger.sql
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/leader_updated_on_delete_creation_update.adoc
+
+commit 159cf3c2dd9bd465f7cab8cd44e0841bf8006343
+Author: Ben Shum <ben at evergreener.net>
+Date:   Wed May 2 00:45:12 2018 -0500
+
+    Revert "LP#1387722: Stamping upgrade script"
+    
+    This reverts commit f9a4f76fc4ea4cac75687eabf4208cce234b3f05.
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+0	37	Open-ILS/src/sql/Pg/upgrade/1110.schema.set_record_status_in_leader_trigger.sql
+37	0	Open-ILS/src/sql/Pg/upgrade/xxxx.schema.set_record_status_in_leader_trigger.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/1110.schema.set_record_status_in_leader_trigger.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.schema.set_record_status_in_leader_trigger.sql
+
+commit f9a4f76fc4ea4cac75687eabf4208cce234b3f05
+Author: Ben Shum <ben at evergreener.net>
+Date:   Tue May 1 22:08:13 2018 -0500
+
+    LP#1387722: Stamping upgrade script
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+37	0	Open-ILS/src/sql/Pg/upgrade/1110.schema.set_record_status_in_leader_trigger.sql
+0	37	Open-ILS/src/sql/Pg/upgrade/xxxx.schema.set_record_status_in_leader_trigger.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1110.schema.set_record_status_in_leader_trigger.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.schema.set_record_status_in_leader_trigger.sql
+
+commit 7dfcdd814f60a20c1b8b4522e69c0a27c23123b5
+Author: Rogan Hamby <rogan.hamby at gmail.com>
+Date:   Fri Mar 23 09:51:59 2018 -0400
+
+    LP#1387722: Update MARC leader when deleting a record
+    
+    When merging bib records, in the Leader, position 05 - Record Status
+    of the deleted record, the code should be changed to "d," for deleted,
+    as it is when a record is simply deleted within the client.
+    
+    Rogan's squashed branch for updating record status in leader, along with
+    pgtap test and release notes.
+    
+    Signed-off-by: Rogan Hamby <rogan.hamby at gmail.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+32	0	Open-ILS/src/sql/Pg/010.schema.biblio.sql
+39	0	Open-ILS/src/sql/Pg/t/lp1387722_record_leader_updates.pg
+37	0	Open-ILS/src/sql/Pg/upgrade/xxxx.schema.set_record_status_in_leader_trigger.sql
+7	0	docs/RELEASE_NOTES_NEXT/Cataloging/leader_updated_on_delete_creation_update.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1387722_record_leader_updates.pg
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.schema.set_record_status_in_leader_trigger.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/leader_updated_on_delete_creation_update.adoc
+
+commit 3a3cbc988c5431a1875397e9470ecf8025fa9e6b
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Apr 19 09:49:54 2018 -0400
+
+    Forward-port 3.0.7 upgrade script
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	0	Open-ILS/src/sql/Pg/version-upgrade/3.0.6-3.0.7-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/3.0.6-3.0.7-upgrade-db.sql
+
+commit dc62e8f18d0ea74a8a8a507a69ae287c290cd1c8
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Apr 18 16:25:34 2018 -0400
+
+    Touch up release notes for 3.0.7
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	0	docs/RELEASE_NOTES_3_0.adoc
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
index d750216..8d6014e 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 "3-2-0";
 }
 
 __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 2aade1c..a598bdc 100644
--- a/Open-ILS/src/sql/Pg/002.schema.config.sql
+++ b/Open-ILS/src/sql/Pg/002.schema.config.sql
@@ -93,6 +93,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 ('1133', :eg_version); -- berick/kmlussier
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('3.2.0', :eg_version);
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,
diff --git a/Open-ILS/src/sql/Pg/version-upgrade/3.1.5-3.2.0-upgrade-db.sql b/Open-ILS/src/sql/Pg/version-upgrade/3.1.5-3.2.0-upgrade-db.sql
new file mode 100644
index 0000000..bc276b0
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/version-upgrade/3.1.5-3.2.0-upgrade-db.sql
@@ -0,0 +1,4904 @@
+--Upgrade Script for 3.1.5 to 3.2.0
+\set eg_version '''3.2.0'''
+BEGIN;
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('3.2.0', :eg_version);
+
+SELECT evergreen.upgrade_deps_block_check('1115', :eg_version);
+
+INSERT INTO permission.perm_list (id,code,description) VALUES ( 607, 'EMERGENCY_CLOSING', 'Create and manage Emergency Closings');
+
+INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('checkout.due.emergency_closing','aecc','Circulation due date was adjusted by the Emergency Closing handler');
+INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('hold.shelf_expire.emergency_closing','aech','Hold shelf expire time was adjusted by the Emergency Closing handler');
+INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('booking.due.emergency_closing','aecr','Booking reservation return date was adjusted by the Emergency Closing handler');
+
+CREATE TABLE action.emergency_closing (
+    id                  SERIAL      PRIMARY KEY,
+    creator             INT         NOT NULL REFERENCES actor.usr (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    create_time         TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+    process_start_time  TIMESTAMPTZ,
+    process_end_time    TIMESTAMPTZ,
+    last_update_time    TIMESTAMPTZ
+);
+
+ALTER TABLE actor.org_unit_closed
+    ADD COLUMN emergency_closing INT
+        REFERENCES action.emergency_closing (id) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED;
+
+CREATE TABLE action.emergency_closing_circulation (
+    id                  BIGSERIAL   PRIMARY KEY,
+    emergency_closing   INT         NOT NULL REFERENCES action.emergency_closing (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    circulation         INT         NOT NULL REFERENCES action.circulation (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    original_due_date   TIMESTAMPTZ,
+    process_time        TIMESTAMPTZ
+);
+CREATE INDEX emergency_closing_circulation_emergency_closing_idx ON action.emergency_closing_circulation (emergency_closing);
+CREATE INDEX emergency_closing_circulation_circulation_idx ON action.emergency_closing_circulation (circulation);
+
+CREATE TABLE action.emergency_closing_reservation (
+    id                  BIGSERIAL   PRIMARY KEY,
+    emergency_closing   INT         NOT NULL REFERENCES action.emergency_closing (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    reservation         INT         NOT NULL REFERENCES booking.reservation (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    original_end_time   TIMESTAMPTZ,
+    process_time        TIMESTAMPTZ
+);
+CREATE INDEX emergency_closing_reservation_emergency_closing_idx ON action.emergency_closing_reservation (emergency_closing);
+CREATE INDEX emergency_closing_reservation_reservation_idx ON action.emergency_closing_reservation (reservation);
+
+CREATE TABLE action.emergency_closing_hold (
+    id                  BIGSERIAL   PRIMARY KEY,
+    emergency_closing   INT         NOT NULL REFERENCES action.emergency_closing (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    hold                INT         NOT NULL REFERENCES action.hold_request (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    original_shelf_expire_time   TIMESTAMPTZ,
+    process_time        TIMESTAMPTZ
+);
+CREATE INDEX emergency_closing_hold_emergency_closing_idx ON action.emergency_closing_hold (emergency_closing);
+CREATE INDEX emergency_closing_hold_hold_idx ON action.emergency_closing_hold (hold);
+
+CREATE OR REPLACE VIEW action.emergency_closing_status AS
+    SELECT  e.*,
+            COALESCE(c.count, 0) AS circulations,
+            COALESCE(c.completed, 0) AS circulations_complete,
+            COALESCE(b.count, 0) AS reservations,
+            COALESCE(b.completed, 0) AS reservations_complete,
+            COALESCE(h.count, 0) AS holds,
+            COALESCE(h.completed, 0) AS holds_complete
+      FROM  action.emergency_closing e
+            LEFT JOIN (SELECT emergency_closing, count(*) count, SUM((process_time IS NOT NULL)::INT) completed FROM action.emergency_closing_circulation GROUP BY 1) c ON (c.emergency_closing = e.id)
+            LEFT JOIN (SELECT emergency_closing, count(*) count, SUM((process_time IS NOT NULL)::INT) completed FROM action.emergency_closing_reservation GROUP BY 1) b ON (b.emergency_closing = e.id)
+            LEFT JOIN (SELECT emergency_closing, count(*) count, SUM((process_time IS NOT NULL)::INT) completed FROM action.emergency_closing_hold GROUP BY 1) h ON (h.emergency_closing = e.id)
+;
+
+CREATE OR REPLACE FUNCTION evergreen.find_next_open_time ( circ_lib INT, initial TIMESTAMPTZ, hourly BOOL DEFAULT FALSE, initial_time TIME DEFAULT NULL, dow_count INT DEFAULT 0 )
+    RETURNS TIMESTAMPTZ AS $$
+DECLARE
+    day_number      INT;
+    plus_days       INT;
+    final_time      TEXT;
+    time_adjusted   BOOL;
+    hoo_open        TIME WITHOUT TIME ZONE;
+    hoo_close       TIME WITHOUT TIME ZONE;
+    adjacent        actor.org_unit_closed%ROWTYPE;
+    breakout        INT := 0;
+BEGIN
+
+    IF dow_count > 6 THEN
+        RETURN initial;
+    END IF;
+
+    IF initial_time IS NULL THEN
+        initial_time := initial::TIME;
+    END IF;
+
+    final_time := (initial + '1 second'::INTERVAL)::TEXT;
+    LOOP
+        breakout := breakout + 1;
+
+        time_adjusted := FALSE;
+
+        IF dow_count > 0 THEN -- we're recursing, so check for HOO closing
+            day_number := EXTRACT(ISODOW FROM final_time::TIMESTAMPTZ) - 1;
+            plus_days := 0;
+            FOR i IN 1..7 LOOP
+                EXECUTE 'SELECT dow_' || day_number || '_open, dow_' || day_number || '_close FROM actor.hours_of_operation WHERE id = $1'
+                    INTO hoo_open, hoo_close
+                    USING circ_lib;
+
+                -- RAISE NOTICE 'initial time: %; dow: %; close: %',initial_time,day_number,hoo_close;
+
+                IF hoo_close = '00:00:00' THEN -- bah ... I guess we'll check the next day
+                    day_number := (day_number + 1) % 7;
+                    plus_days := plus_days + 1;
+                    time_adjusted := TRUE;
+                    CONTINUE;
+                END IF;
+
+                IF hoo_close IS NULL THEN -- no hours of operation ... assume no closing?
+                    hoo_close := '23:59:59';
+                END IF;
+
+                EXIT;
+            END LOOP;
+
+            final_time := DATE(final_time::TIMESTAMPTZ + (plus_days || ' days')::INTERVAL)::TEXT;
+            IF hoo_close <> '00:00:00' AND hourly THEN -- Not a day-granular circ
+                final_time := final_time||' '|| hoo_close;
+            ELSE
+                final_time := final_time||' 23:59:59';
+            END IF;
+        END IF;
+
+        -- Loop through other closings
+        LOOP 
+            SELECT * INTO adjacent FROM actor.org_unit_closed WHERE org_unit = circ_lib AND final_time::TIMESTAMPTZ between close_start AND close_end;
+            EXIT WHEN adjacent.id IS NULL;
+            time_adjusted := TRUE;
+            -- RAISE NOTICE 'recursing for closings with final_time: %',final_time;
+            final_time := evergreen.find_next_open_time(circ_lib, adjacent.close_end::TIMESTAMPTZ, hourly, initial_time, dow_count + 1)::TEXT;
+        END LOOP;
+
+        EXIT WHEN breakout > 100;
+        EXIT WHEN NOT time_adjusted;
+
+    END LOOP;
+
+    RETURN final_time;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE TYPE action.emergency_closing_stage_1_count AS (circulations INT, reservations INT, holds INT);
+CREATE OR REPLACE FUNCTION action.emergency_closing_stage_1 ( e_closing INT )
+    RETURNS SETOF action.emergency_closing_stage_1_count AS $$
+DECLARE
+    tmp     INT;
+    touched action.emergency_closing_stage_1_count%ROWTYPE;
+BEGIN
+    -- First, gather circs
+    INSERT INTO action.emergency_closing_circulation (emergency_closing, circulation)
+        SELECT  e_closing,
+                circ.id
+          FROM  actor.org_unit_closed closing
+                JOIN action.emergency_closing ec ON (closing.emergency_closing = ec.id AND ec.id = e_closing)
+                JOIN action.circulation circ ON (
+                    circ.circ_lib = closing.org_unit
+                    AND circ.due_date BETWEEN closing.close_start AND (closing.close_end + '1s'::INTERVAL)
+                    AND circ.xact_finish IS NULL
+                )
+          WHERE NOT EXISTS (SELECT 1 FROM action.emergency_closing_circulation t WHERE t.emergency_closing = e_closing AND t.circulation = circ.id);
+
+    GET DIAGNOSTICS tmp = ROW_COUNT;
+    touched.circulations := tmp;
+
+    INSERT INTO action.emergency_closing_reservation (emergency_closing, reservation)
+        SELECT  e_closing,
+                res.id
+          FROM  actor.org_unit_closed closing
+                JOIN action.emergency_closing ec ON (closing.emergency_closing = ec.id AND ec.id = e_closing)
+                JOIN booking.reservation res ON (
+                    res.pickup_lib = closing.org_unit
+                    AND res.end_time BETWEEN closing.close_start AND (closing.close_end + '1s'::INTERVAL)
+                )
+          WHERE NOT EXISTS (SELECT 1 FROM action.emergency_closing_reservation t WHERE t.emergency_closing = e_closing AND t.reservation = res.id);
+
+    GET DIAGNOSTICS tmp = ROW_COUNT;
+    touched.reservations := tmp;
+
+    INSERT INTO action.emergency_closing_hold (emergency_closing, hold)
+        SELECT  e_closing,
+                hold.id
+          FROM  actor.org_unit_closed closing
+                JOIN action.emergency_closing ec ON (closing.emergency_closing = ec.id AND ec.id = e_closing)
+                JOIN action.hold_request hold ON (
+                    pickup_lib = closing.org_unit
+                    AND hold.shelf_expire_time BETWEEN closing.close_start AND (closing.close_end + '1s'::INTERVAL)
+                    AND hold.fulfillment_time IS NULL
+                    AND hold.cancel_time IS NULL
+                )
+          WHERE NOT EXISTS (SELECT 1 FROM action.emergency_closing_hold t WHERE t.emergency_closing = e_closing AND t.hold = hold.id);
+
+    GET DIAGNOSTICS tmp = ROW_COUNT;
+    touched.holds := tmp;
+
+    UPDATE  action.emergency_closing
+      SET   process_start_time = NOW(),
+            last_update_time = NOW()
+      WHERE id = e_closing;
+
+    RETURN NEXT touched;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION action.emergency_closing_stage_2_hold ( hold_closing_entry INT )
+    RETURNS BOOL AS $$
+DECLARE
+    hold        action.hold_request%ROWTYPE;
+    e_closing   action.emergency_closing%ROWTYPE;
+    e_c_hold    action.emergency_closing_hold%ROWTYPE;
+    closing     actor.org_unit_closed%ROWTYPE;
+    day_number  INT;
+    hoo_close   TIME WITHOUT TIME ZONE;
+    plus_days   INT;
+BEGIN
+    -- Gather objects involved
+    SELECT  * INTO e_c_hold
+      FROM  action.emergency_closing_hold
+      WHERE id = hold_closing_entry;
+
+    IF e_c_hold.process_time IS NOT NULL THEN
+        -- Already processed ... moving on
+        RETURN FALSE;
+    END IF;
+
+    SELECT  * INTO e_closing
+      FROM  action.emergency_closing
+      WHERE id = e_c_hold.emergency_closing;
+
+    IF e_closing.process_start_time IS NULL THEN
+        -- Huh... that's odd. And wrong.
+        RETURN FALSE;
+    END IF;
+
+    SELECT  * INTO closing
+      FROM  actor.org_unit_closed
+      WHERE emergency_closing = e_closing.id;
+
+    SELECT  * INTO hold
+      FROM  action.hold_request h
+      WHERE id = e_c_hold.hold;
+
+    -- Record the processing
+    UPDATE  action.emergency_closing_hold
+      SET   original_shelf_expire_time = hold.shelf_expire_time,
+            process_time = NOW()
+      WHERE id = hold_closing_entry;
+
+    UPDATE  action.emergency_closing
+      SET   last_update_time = NOW()
+      WHERE id = e_closing.id;
+
+    UPDATE  action.hold_request
+      SET   shelf_expire_time = evergreen.find_next_open_time(closing.org_unit, hold.shelf_expire_time, TRUE)
+      WHERE id = hold.id;
+
+    RETURN TRUE;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION action.emergency_closing_stage_2_circ ( circ_closing_entry INT )
+    RETURNS BOOL AS $$
+DECLARE
+    circ            action.circulation%ROWTYPE;
+    e_closing       action.emergency_closing%ROWTYPE;
+    e_c_circ        action.emergency_closing_circulation%ROWTYPE;
+    closing         actor.org_unit_closed%ROWTYPE;
+    adjacent        actor.org_unit_closed%ROWTYPE;
+    bill            money.billing%ROWTYPE;
+    last_bill       money.billing%ROWTYPE;
+    day_number      INT;
+    hoo_close       TIME WITHOUT TIME ZONE;
+    plus_days       INT;
+    avoid_negative  BOOL;
+    extend_grace    BOOL;
+    new_due_date    TEXT;
+BEGIN
+    -- Gather objects involved
+    SELECT  * INTO e_c_circ
+      FROM  action.emergency_closing_circulation
+      WHERE id = circ_closing_entry;
+
+    IF e_c_circ.process_time IS NOT NULL THEN
+        -- Already processed ... moving on
+        RETURN FALSE;
+    END IF;
+
+    SELECT  * INTO e_closing
+      FROM  action.emergency_closing
+      WHERE id = e_c_circ.emergency_closing;
+
+    IF e_closing.process_start_time IS NULL THEN
+        -- Huh... that's odd. And wrong.
+        RETURN FALSE;
+    END IF;
+
+    SELECT  * INTO closing
+      FROM  actor.org_unit_closed
+      WHERE emergency_closing = e_closing.id;
+
+    SELECT  * INTO circ
+      FROM  action.circulation
+      WHERE id = e_c_circ.circulation;
+
+    -- Record the processing
+    UPDATE  action.emergency_closing_circulation
+      SET   original_due_date = circ.due_date,
+            process_time = NOW()
+      WHERE id = circ_closing_entry;
+
+    UPDATE  action.emergency_closing
+      SET   last_update_time = NOW()
+      WHERE id = e_closing.id;
+
+    SELECT value::BOOL INTO avoid_negative FROM actor.org_unit_ancestor_setting('bill.prohibit_negative_balance_on_overdues', circ.circ_lib);
+    SELECT value::BOOL INTO extend_grace FROM actor.org_unit_ancestor_setting('circ.grace.extend', circ.circ_lib);
+
+    new_due_date := evergreen.find_next_open_time( closing.org_unit, circ.due_date, EXTRACT(EPOCH FROM circ.duration)::INT % 86400 > 0 )::TEXT;
+    UPDATE action.circulation SET due_date = new_due_date::TIMESTAMPTZ WHERE id = circ.id;
+
+    -- Now, see if we need to get rid of some fines
+    SELECT  * INTO last_bill
+      FROM  money.billing b
+      WHERE b.xact = circ.id
+            AND NOT b.voided
+            AND b.btype = 1
+      ORDER BY billing_ts DESC
+      LIMIT 1;
+
+    FOR bill IN
+        SELECT  *
+          FROM  money.billing b
+          WHERE b.xact = circ.id
+                AND b.btype = 1
+                AND NOT b.voided
+                AND (
+                    b.billing_ts BETWEEN closing.close_start AND new_due_date::TIMESTAMPTZ
+                    OR (extend_grace AND last_bill.billing_ts <= new_due_date::TIMESTAMPTZ + circ.grace_period)
+                )
+                AND NOT EXISTS (SELECT 1 FROM money.account_adjustment a WHERE a.billing = b.id)
+          ORDER BY billing_ts
+    LOOP
+        IF avoid_negative THEN
+            PERFORM FROM money.materialized_billable_xact_summary WHERE id = circ.id AND balanced_owd < bill.amount;
+            EXIT WHEN FOUND; -- We can't go negative, and voiding this bill would do that...
+        END IF;
+
+        UPDATE  money.billing
+          SET   voided = TRUE,
+                void_time = NOW(),
+                note = COALESCE(note,'') || ' :: Voided by emergency closing handler'
+          WHERE id = bill.id;
+    END LOOP;
+    
+    RETURN TRUE;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION action.emergency_closing_stage_2_reservation ( res_closing_entry INT )
+    RETURNS BOOL AS $$
+DECLARE
+    res             booking.reservation%ROWTYPE;
+    e_closing       action.emergency_closing%ROWTYPE;
+    e_c_res         action.emergency_closing_reservation%ROWTYPE;
+    closing         actor.org_unit_closed%ROWTYPE;
+    adjacent        actor.org_unit_closed%ROWTYPE;
+    bill            money.billing%ROWTYPE;
+    day_number      INT;
+    hoo_close       TIME WITHOUT TIME ZONE;
+    plus_days       INT;
+    avoid_negative  BOOL;
+    new_due_date    TEXT;
+BEGIN
+    -- Gather objects involved
+    SELECT  * INTO e_c_res
+      FROM  action.emergency_closing_reservation
+      WHERE id = res_closing_entry;
+
+    IF e_c_res.process_time IS NOT NULL THEN
+        -- Already processed ... moving on
+        RETURN FALSE;
+    END IF;
+
+    SELECT  * INTO e_closing
+      FROM  action.emergency_closing
+      WHERE id = e_c_res.emergency_closing;
+
+    IF e_closing.process_start_time IS NULL THEN
+        -- Huh... that's odd. And wrong.
+        RETURN FALSE;
+    END IF;
+
+    SELECT  * INTO closing
+      FROM  actor.org_unit_closed
+      WHERE emergency_closing = e_closing.id;
+
+    SELECT  * INTO res
+      FROM  booking.reservation
+      WHERE id = e_c_res.reservation;
+
+    IF res.pickup_lib IS NULL THEN -- Need to be far enough along to have a pickup lib
+        RETURN FALSE;
+    END IF;
+
+    -- Record the processing
+    UPDATE  action.emergency_closing_reservation
+      SET   original_end_time = res.end_time,
+            process_time = NOW()
+      WHERE id = res_closing_entry;
+
+    UPDATE  action.emergency_closing
+      SET   last_update_time = NOW()
+      WHERE id = e_closing.id;
+
+    SELECT value::BOOL INTO avoid_negative FROM actor.org_unit_ancestor_setting('bill.prohibit_negative_balance_on_overdues', res.pickup_lib);
+
+    new_due_date := evergreen.find_next_open_time( closing.org_unit, res.end_time, EXTRACT(EPOCH FROM res.booking_interval)::INT % 86400 > 0 )::TEXT;
+    UPDATE booking.reservation SET end_time = new_due_date::TIMESTAMPTZ WHERE id = res.id;
+
+    -- Now, see if we need to get rid of some fines
+    FOR bill IN
+        SELECT  *
+          FROM  money.billing b
+          WHERE b.xact = res.id
+                AND b.btype = 1
+                AND NOT b.voided
+                AND b.billing_ts BETWEEN closing.close_start AND new_due_date::TIMESTAMPTZ
+                AND NOT EXISTS (SELECT 1 FROM money.account_adjustment a WHERE a.billing = b.id)
+    LOOP
+        IF avoid_negative THEN
+            PERFORM FROM money.materialized_billable_xact_summary WHERE id = res.id AND balanced_owd < bill.amount;
+            EXIT WHEN FOUND; -- We can't go negative, and voiding this bill would do that...
+        END IF;
+
+        UPDATE  money.billing
+          SET   voided = TRUE,
+                void_time = NOW(),
+                note = COALESCE(note,'') || ' :: Voided by emergency closing handler'
+          WHERE id = bill.id;
+    END LOOP;
+    
+    RETURN TRUE;
+END;
+$$ LANGUAGE PLPGSQL;
+
+
+
+CREATE TYPE actor.cascade_setting_summary AS (
+    name TEXT,
+    value JSON,
+    has_org_setting BOOLEAN,
+    has_user_setting BOOLEAN,
+    has_workstation_setting BOOLEAN
+);
+
+SELECT evergreen.upgrade_deps_block_check('1116', :eg_version);
+
+CREATE TABLE config.workstation_setting_type (
+    name            TEXT    PRIMARY KEY,
+    label           TEXT    UNIQUE NOT NULL,
+    grp             TEXT    REFERENCES config.settings_group (name),
+    description     TEXT,
+    datatype        TEXT    NOT NULL DEFAULT 'string',
+    fm_class        TEXT,
+    --
+    -- define valid datatypes
+    --
+    CONSTRAINT cwst_valid_datatype CHECK ( datatype IN
+    ( 'bool', 'integer', 'float', 'currency', 'interval',
+      'date', 'string', 'object', 'array', 'link' ) ),
+    --
+    -- fm_class is meaningful only for 'link' datatype
+    --
+    CONSTRAINT cwst_no_empty_link CHECK
+    ( ( datatype =  'link' AND fm_class IS NOT NULL ) OR
+      ( datatype <> 'link' AND fm_class IS NULL ) )
+);
+
+CREATE TABLE actor.workstation_setting (
+    id          SERIAL PRIMARY KEY,
+    workstation INT    NOT NULL REFERENCES actor.workstation (id) 
+                       ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    name        TEXT   NOT NULL REFERENCES config.workstation_setting_type (name) 
+                       ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    value       JSON   NOT NULL
+);
+
+
+CREATE INDEX actor_workstation_setting_workstation_idx 
+    ON actor.workstation_setting (workstation);
+
+CREATE OR REPLACE FUNCTION config.setting_is_user_or_ws()
+RETURNS TRIGGER AS $FUNC$
+BEGIN
+
+    IF TG_TABLE_NAME = 'usr_setting_type' THEN
+        PERFORM TRUE FROM config.workstation_setting_type cwst
+            WHERE cwst.name = NEW.name;
+        IF NOT FOUND THEN
+            RETURN NULL;
+        END IF;
+    END IF;
+
+    IF TG_TABLE_NAME = 'workstation_setting_type' THEN
+        PERFORM TRUE FROM config.usr_setting_type cust
+            WHERE cust.name = NEW.name;
+        IF NOT FOUND THEN
+            RETURN NULL;
+        END IF;
+    END IF;
+
+    RAISE EXCEPTION 
+        '% Cannot be used as both a user setting and a workstation setting.', 
+        NEW.name;
+END;
+$FUNC$ LANGUAGE PLPGSQL STABLE;
+
+CREATE CONSTRAINT TRIGGER check_setting_is_usr_or_ws
+  AFTER INSERT OR UPDATE ON config.usr_setting_type
+  FOR EACH ROW EXECUTE PROCEDURE config.setting_is_user_or_ws();
+
+CREATE CONSTRAINT TRIGGER check_setting_is_usr_or_ws
+  AFTER INSERT OR UPDATE ON config.workstation_setting_type
+  FOR EACH ROW EXECUTE PROCEDURE config.setting_is_user_or_ws();
+
+CREATE OR REPLACE FUNCTION actor.get_cascade_setting(
+    setting_name TEXT, org_id INT, user_id INT, workstation_id INT) 
+    RETURNS actor.cascade_setting_summary AS
+$FUNC$
+DECLARE
+    setting_value JSON;
+    summary actor.cascade_setting_summary;
+    org_setting_type config.org_unit_setting_type%ROWTYPE;
+BEGIN
+
+    summary.name := setting_name;
+
+    -- Collect the org setting type status first in case we exit early.
+    -- The existance of an org setting type is not considered
+    -- privileged information.
+    SELECT INTO org_setting_type * 
+        FROM config.org_unit_setting_type WHERE name = setting_name;
+    IF FOUND THEN
+        summary.has_org_setting := TRUE;
+    ELSE
+        summary.has_org_setting := FALSE;
+    END IF;
+
+    -- User and workstation settings have the same priority.
+    -- Start with user settings since that's the simplest code path.
+    -- The workstation_id is ignored if no user_id is provided.
+    IF user_id IS NOT NULL THEN
+
+        SELECT INTO summary.value value FROM actor.usr_setting
+            WHERE usr = user_id AND name = setting_name;
+
+        IF FOUND THEN
+            -- if we have a value, we have a setting type
+            summary.has_user_setting := TRUE;
+
+            IF workstation_id IS NOT NULL THEN
+                -- Only inform the caller about the workstation
+                -- setting type disposition when a workstation id is
+                -- provided.  Otherwise, it's NULL to indicate UNKNOWN.
+                summary.has_workstation_setting := FALSE;
+            END IF;
+
+            RETURN summary;
+        END IF;
+
+        -- no user setting value, but a setting type may exist
+        SELECT INTO summary.has_user_setting EXISTS (
+            SELECT TRUE FROM config.usr_setting_type 
+            WHERE name = setting_name
+        );
+
+        IF workstation_id IS NOT NULL THEN 
+
+            IF NOT summary.has_user_setting THEN
+                -- A workstation setting type may only exist when a user
+                -- setting type does not.
+
+                SELECT INTO summary.value value 
+                    FROM actor.workstation_setting         
+                    WHERE workstation = workstation_id AND name = setting_name;
+
+                IF FOUND THEN
+                    -- if we have a value, we have a setting type
+                    summary.has_workstation_setting := TRUE;
+                    RETURN summary;
+                END IF;
+
+                -- no value, but a setting type may exist
+                SELECT INTO summary.has_workstation_setting EXISTS (
+                    SELECT TRUE FROM config.workstation_setting_type 
+                    WHERE name = setting_name
+                );
+            END IF;
+
+            -- Finally make use of the workstation to determine the org
+            -- unit if none is provided.
+            IF org_id IS NULL AND summary.has_org_setting THEN
+                SELECT INTO org_id owning_lib 
+                    FROM actor.workstation WHERE id = workstation_id;
+            END IF;
+        END IF;
+    END IF;
+
+    -- Some org unit settings are protected by a view permission.
+    -- First see if we have any data that needs protecting, then 
+    -- check the permission if needed.
+
+    IF NOT summary.has_org_setting THEN
+        RETURN summary;
+    END IF;
+
+    -- avoid putting the value into the summary until we confirm
+    -- the value should be visible to the caller.
+    SELECT INTO setting_value value 
+        FROM actor.org_unit_ancestor_setting(setting_name, org_id);
+
+    IF NOT FOUND THEN
+        -- No value found -- perm check is irrelevant.
+        RETURN summary;
+    END IF;
+
+    IF org_setting_type.view_perm IS NOT NULL THEN
+
+        IF user_id IS NULL THEN
+            RAISE NOTICE 'Perm check required but no user_id provided';
+            RETURN summary;
+        END IF;
+
+        IF NOT permission.usr_has_perm(
+            user_id, (SELECT code FROM permission.perm_list 
+                WHERE id = org_setting_type.view_perm), org_id) 
+        THEN
+            RAISE NOTICE 'Perm check failed for user % on %',
+                user_id, org_setting_type.view_perm;
+            RETURN summary;
+        END IF;
+    END IF;
+
+    -- Perm check succeeded or was not necessary.
+    summary.value := setting_value;
+    RETURN summary;
+END;
+$FUNC$ LANGUAGE PLPGSQL;
+
+
+CREATE OR REPLACE FUNCTION actor.get_cascade_setting_batch(
+    setting_names TEXT[], org_id INT, user_id INT, workstation_id INT) 
+    RETURNS SETOF actor.cascade_setting_summary AS
+$FUNC$
+-- Returns a row per setting matching the setting name order.  If no 
+-- value is applied, NULL is returned to retain name-response ordering.
+DECLARE
+    setting_name TEXT;
+    summary actor.cascade_setting_summary;
+BEGIN
+    FOREACH setting_name IN ARRAY setting_names LOOP
+        SELECT INTO summary * FROM actor.get_cascade_setting(
+            setting_Name, org_id, user_id, workstation_id);
+        RETURN NEXT summary;
+    END LOOP;
+END;
+$FUNC$ LANGUAGE PLPGSQL;
+
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1117', :eg_version);
+
+INSERT INTO permission.perm_list (id, code, description) VALUES
+ (608, 'APPLY_WORKSTATION_SETTING',
+   oils_i18n_gettext(608, 'APPLY_WORKSTATION_SETTING', 'ppl', 'description'));
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.circ.checkin.no_precat_alert', 'circ', 'bool',
+    oils_i18n_gettext(
+        'eg.circ.checkin.no_precat_alert',
+        'Checkin: Ignore Precataloged Items',
+        'cwst', 'label'
+    )
+), (
+    'eg.circ.checkin.noop', 'circ', 'bool',
+    oils_i18n_gettext(
+        'eg.circ.checkin.noop',
+        'Checkin: Suppress Holds and Transits',
+        'cwst', 'label'
+    )
+), (
+    'eg.circ.checkin.void_overdues', 'circ', 'bool',
+    oils_i18n_gettext(
+        'eg.circ.checkin.void_overdues',
+        'Checkin: Amnesty Mode',
+        'cwst', 'label'
+    )
+), (
+    'eg.circ.checkin.auto_print_holds_transits', 'circ', 'bool',
+    oils_i18n_gettext(
+        'eg.circ.checkin.auto_print_holds_transits',
+        'Checkin: Auto-Print Holds and Transits',
+        'cwst', 'label'
+    )
+), (
+    'eg.circ.checkin.clear_expired', 'circ', 'bool',
+    oils_i18n_gettext(
+        'eg.circ.checkin.clear_expired',
+        'Checkin: Clear Holds Shelf',
+        'cwst', 'label'
+    )
+), (
+    'eg.circ.checkin.retarget_holds', 'circ', 'bool',
+    oils_i18n_gettext(
+        'eg.circ.checkin.retarget_holds',
+        'Checkin: Retarget Local Holds',
+        'cwst', 'label'
+    )
+), (
+    'eg.circ.checkin.retarget_holds_all', 'circ', 'bool',
+    oils_i18n_gettext(
+        'eg.circ.checkin.retarget_holds_all',
+        'Checkin: Retarget All Statuses',
+        'cwst', 'label'
+    )
+), (
+    'eg.circ.checkin.hold_as_transit', 'circ', 'bool',
+    oils_i18n_gettext(
+        'eg.circ.checkin.hold_as_transit',
+        'Checkin: Capture Local Holds as Transits',
+        'cwst', 'label'
+    )
+), (
+    'eg.circ.checkin.manual_float', 'circ', 'bool',
+    oils_i18n_gettext(
+        'eg.circ.checkin.manual_float',
+        'Checkin: Manual Floating Active',
+        'cwst', 'label'
+    )
+), (
+    'eg.circ.patron.summary.collapse', 'circ', 'bool',
+    oils_i18n_gettext(
+        'eg.circ.patron.summary.collapse',
+        'Collaps Patron Summary Display',
+        'cwst', 'label'
+    )
+), (
+    'circ.bills.receiptonpay', 'circ', 'bool',
+    oils_i18n_gettext(
+        'circ.bills.receiptonpay',
+        'Print Receipt On Payment',
+        'cwst', 'label'
+    )
+), (
+    'circ.renew.strict_barcode', 'circ', 'bool',
+    oils_i18n_gettext(
+        'circ.renew.strict_barcode',
+        'Renew: Strict Barcode',
+        'cwst', 'label'
+    )
+), (
+    'circ.checkin.strict_barcode', 'circ', 'bool',
+    oils_i18n_gettext(
+        'circ.checkin.strict_barcode',
+        'Checkin: Strict Barcode',
+        'cwst', 'label'
+    )
+), (
+    'circ.checkout.strict_barcode', 'circ', 'bool',
+    oils_i18n_gettext(
+        'circ.checkout.strict_barcode',
+        'Checkout: Strict Barcode',
+        'cwst', 'label'
+    )
+), (
+    'cat.holdings_show_copies', 'cat', 'bool',
+    oils_i18n_gettext(
+        'cat.holdings_show_copies',
+        'Holdings View Show Copies',
+        'cwst', 'label'
+    )
+), (
+    'cat.holdings_show_empty', 'cat', 'bool',
+    oils_i18n_gettext(
+        'cat.holdings_show_empty',
+        'Holdings View Show Empty Volumes',
+        'cwst', 'label'
+    )
+), (
+    'cat.holdings_show_empty_org', 'cat', 'bool',
+    oils_i18n_gettext(
+        'cat.holdings_show_empty_org',
+        'Holdings View Show Empty Orgs',
+        'cwst', 'label'
+    )
+), (
+    'cat.holdings_show_vols', 'cat', 'bool',
+    oils_i18n_gettext(
+        'cat.holdings_show_vols',
+        'Holdings View Show Volumes',
+        'cwst', 'label'
+    )
+), (
+    'cat.copy.defaults', 'cat', 'object',
+    oils_i18n_gettext(
+        'cat.copy.defaults',
+        'Copy Edit Default Values',
+        'cwst', 'label'
+    )
+), (
+    'cat.printlabels.default_template', 'cat', 'string',
+    oils_i18n_gettext(
+        'cat.printlabels.default_template',
+        'Print Label Default Template',
+        'cwst', 'label'
+    )
+), (
+    'cat.printlabels.templates', 'cat', 'object',
+    oils_i18n_gettext(
+        'cat.printlabels.templates',
+        'Print Label Templates',
+        'cwst', 'label'
+    )
+), (
+    'eg.circ.patron.search.include_inactive', 'circ', 'bool',
+    oils_i18n_gettext(
+        'eg.circ.patron.search.include_inactive',
+        'Patron Search Include Inactive',
+        'cwst', 'label'
+    )
+), (
+    'eg.circ.patron.search.show_extras', 'circ', 'bool',
+    oils_i18n_gettext(
+        'eg.circ.patron.search.show_extras',
+        'Patron Search Show Extra Search Options',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.checkin.checkin', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.checkin.checkin',
+        'Grid Config: circ.checkin.checkin',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.checkin.capture', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.checkin.capture',
+        'Grid Config: circ.checkin.capture',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.server.config.copy_tag_type', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.server.config.copy_tag_type',
+        'Grid Config: admin.server.config.copy_tag_type',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.server.config.metabib_field_virtual_map.grid', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.server.config.metabib_field_virtual_map.grid',
+        'Grid Config: admin.server.config.metabib_field_virtual_map.grid',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.server.config.metabib_field.grid', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.server.config.metabib_field.grid',
+        'Grid Config: admin.server.config.metabib_field.grid',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.server.config.marc_field', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.server.config.marc_field',
+        'Grid Config: admin.server.config.marc_field',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.server.asset.copy_tag', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.server.asset.copy_tag',
+        'Grid Config: admin.server.asset.copy_tag',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.local.circ.neg_balance_users', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.local.circ.neg_balance_users',
+        'Grid Config: admin.local.circ.neg_balance_users',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.local.rating.badge', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.local.rating.badge',
+        'Grid Config: admin.local.rating.badge',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.workstation.work_log', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.workstation.work_log',
+        'Grid Config: admin.workstation.work_log',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.workstation.patron_log', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.workstation.patron_log',
+        'Grid Config: admin.workstation.patron_log',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.serials.pattern_template', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.serials.pattern_template',
+        'Grid Config: admin.serials.pattern_template',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.serials.copy_templates', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.serials.copy_templates',
+        'Grid Config: serials.copy_templates',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.record_overlay.holdings', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.record_overlay.holdings',
+        'Grid Config: cat.record_overlay.holdings',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.bucket.record.search', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.bucket.record.search',
+        'Grid Config: cat.bucket.record.search',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.bucket.record.view', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.bucket.record.view',
+        'Grid Config: cat.bucket.record.view',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.bucket.record.pending', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.bucket.record.pending',
+        'Grid Config: cat.bucket.record.pending',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.bucket.copy.view', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.bucket.copy.view',
+        'Grid Config: cat.bucket.copy.view',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.bucket.copy.pending', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.bucket.copy.pending',
+        'Grid Config: cat.bucket.copy.pending',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.items', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.items',
+        'Grid Config: cat.items',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.volcopy.copies', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.volcopy.copies',
+        'Grid Config: cat.volcopy.copies',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.volcopy.copies.complete', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.volcopy.copies.complete',
+        'Grid Config: cat.volcopy.copies.complete',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.peer_bibs', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.peer_bibs',
+        'Grid Config: cat.peer_bibs',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.catalog.holds', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.catalog.holds',
+        'Grid Config: cat.catalog.holds',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.holdings', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.holdings',
+        'Grid Config: cat.holdings',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.z3950_results', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.z3950_results',
+        'Grid Config: cat.z3950_results',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.holds.shelf', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.holds.shelf',
+        'Grid Config: circ.holds.shelf',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.holds.pull', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.holds.pull',
+        'Grid Config: circ.holds.pull',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.in_house_use', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.in_house_use',
+        'Grid Config: circ.in_house_use',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.renew', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.renew',
+        'Grid Config: circ.renew',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.transits.list', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.transits.list',
+        'Grid Config: circ.transits.list',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.patron.holds', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.patron.holds',
+        'Grid Config: circ.patron.holds',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.pending_patrons.list', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.pending_patrons.list',
+        'Grid Config: circ.pending_patrons.list',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.patron.items_out.noncat', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.patron.items_out.noncat',
+        'Grid Config: circ.patron.items_out.noncat',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.patron.items_out', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.patron.items_out',
+        'Grid Config: circ.patron.items_out',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.patron.billhistory_payments', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.patron.billhistory_payments',
+        'Grid Config: circ.patron.billhistory_payments',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.user.bucket.view', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.user.bucket.view',
+        'Grid Config: user.bucket.view',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.user.bucket.pending', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.user.bucket.pending',
+        'Grid Config: user.bucket.pending',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.patron.staff_messages', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.patron.staff_messages',
+        'Grid Config: circ.patron.staff_messages',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.patron.archived_messages', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.patron.archived_messages',
+        'Grid Config: circ.patron.archived_messages',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.patron.bills', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.patron.bills',
+        'Grid Config: circ.patron.bills',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.patron.checkout', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.patron.checkout',
+        'Grid Config: circ.patron.checkout',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.serials.mfhd_grid', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.serials.mfhd_grid',
+        'Grid Config: serials.mfhd_grid',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.serials.view_item_grid', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.serials.view_item_grid',
+        'Grid Config: serials.view_item_grid',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.serials.dist_stream_grid', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.serials.dist_stream_grid',
+        'Grid Config: serials.dist_stream_grid',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.circ.patron.search', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.circ.patron.search',
+        'Grid Config: circ.patron.search',
+        'cwst', 'label'
+    )
+), (
+    'eg.cat.record.summary.collapse', 'gui', 'bool',
+    oils_i18n_gettext(
+        'eg.cat.record.summary.collapse',
+        'Collapse Bib Record Summary',
+        'cwst', 'label'
+    )
+), (
+    'cat.marcedit.flateditor', 'gui', 'bool',
+    oils_i18n_gettext(
+        'cat.marcedit.flateditor',
+        'Use Flat MARC Editor',
+        'cwst', 'label'
+    )
+), (
+    'cat.marcedit.stack_subfields', 'gui', 'bool',
+    oils_i18n_gettext(
+        'cat.marcedit.stack_subfields',
+        'MARC Editor Stack Subfields',
+        'cwst', 'label'
+    )
+), (
+    'eg.offline.print_receipt', 'gui', 'bool',
+    oils_i18n_gettext(
+        'eg.offline.print_receipt',
+        'Offline Print Receipt',
+        'cwst', 'label'
+    )
+), (
+    'eg.offline.strict_barcode', 'gui', 'bool',
+    oils_i18n_gettext(
+        'eg.offline.strict_barcode',
+        'Offline Use Strict Barcode',
+        'cwst', 'label'
+    )
+), (
+    'cat.default_bib_marc_template', 'gui', 'string',
+    oils_i18n_gettext(
+        'cat.default_bib_marc_template',
+        'Default MARC Template',
+        'cwst', 'label'
+    )
+), (
+    'eg.audio.disable', 'gui', 'bool',
+    oils_i18n_gettext(
+        'eg.audio.disable',
+        'Disable Staff Client Notification Audio',
+        'cwst', 'label'
+    )
+), (
+    'eg.search.adv_pane', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.search.adv_pane',
+        'Catalog Advanced Search Default Pane',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.bills_current', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.bills_current',
+        'Print Template Context: bills_current',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.bills_current', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.bills_current',
+        'Print Template: bills_current',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.bills_historical', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.bills_historical',
+        'Print Template Context: bills_historical',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.bills_historical', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.bills_historical',
+        'Print Template: bills_historical',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.bill_payment', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.bill_payment',
+        'Print Template Context: bill_payment',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.bill_payment', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.bill_payment',
+        'Print Template: bill_payment',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.checkin', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.checkin',
+        'Print Template Context: checkin',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.checkin', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.checkin',
+        'Print Template: checkin',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.checkout', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.checkout',
+        'Print Template Context: checkout',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.checkout', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.checkout',
+        'Print Template: checkout',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.hold_transit_slip', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.hold_transit_slip',
+        'Print Template Context: hold_transit_slip',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.hold_transit_slip', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.hold_transit_slip',
+        'Print Template: hold_transit_slip',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.hold_shelf_slip', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.hold_shelf_slip',
+        'Print Template Context: hold_shelf_slip',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.hold_shelf_slip', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.hold_shelf_slip',
+        'Print Template: hold_shelf_slip',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.holds_for_bib', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.holds_for_bib',
+        'Print Template Context: holds_for_bib',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.holds_for_bib', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.holds_for_bib',
+        'Print Template: holds_for_bib',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.holds_for_patron', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.holds_for_patron',
+        'Print Template Context: holds_for_patron',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.holds_for_patron', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.holds_for_patron',
+        'Print Template: holds_for_patron',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.hold_pull_list', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.hold_pull_list',
+        'Print Template Context: hold_pull_list',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.hold_pull_list', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.hold_pull_list',
+        'Print Template: hold_pull_list',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.hold_shelf_list', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.hold_shelf_list',
+        'Print Template Context: hold_shelf_list',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.hold_shelf_list', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.hold_shelf_list',
+        'Print Template: hold_shelf_list',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.in_house_use_list', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.in_house_use_list',
+        'Print Template Context: in_house_use_list',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.in_house_use_list', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.in_house_use_list',
+        'Print Template: in_house_use_list',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.item_status', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.item_status',
+        'Print Template Context: item_status',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.item_status', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.item_status',
+        'Print Template: item_status',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.items_out', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.items_out',
+        'Print Template Context: items_out',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.items_out', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.items_out',
+        'Print Template: items_out',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.patron_address', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.patron_address',
+        'Print Template Context: patron_address',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.patron_address', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.patron_address',
+        'Print Template: patron_address',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.patron_data', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.patron_data',
+        'Print Template Context: patron_data',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.patron_data', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.patron_data',
+        'Print Template: patron_data',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.patron_note', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.patron_note',
+        'Print Template Context: patron_note',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.patron_note', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.patron_note',
+        'Print Template: patron_note',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.renew', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.renew',
+        'Print Template Context: renew',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.renew', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.renew',
+        'Print Template: renew',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.transit_list', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.transit_list',
+        'Print Template Context: transit_list',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.transit_list', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.transit_list',
+        'Print Template: transit_list',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.transit_slip', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.transit_slip',
+        'Print Template Context: transit_slip',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.transit_slip', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.transit_slip',
+        'Print Template: transit_slip',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.offline_checkout', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.offline_checkout',
+        'Print Template Context: offline_checkout',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.offline_checkout', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.offline_checkout',
+        'Print Template: offline_checkout',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.offline_renew', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.offline_renew',
+        'Print Template Context: offline_renew',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.offline_renew', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.offline_renew',
+        'Print Template: offline_renew',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.offline_checkin', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.offline_checkin',
+        'Print Template Context: offline_checkin',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.offline_checkin', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.offline_checkin',
+        'Print Template: offline_checkin',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template_context.offline_in_house_use', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.offline_in_house_use',
+        'Print Template Context: offline_in_house_use',
+        'cwst', 'label'
+    )
+), (
+    'eg.print.template.offline_in_house_use', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template.offline_in_house_use',
+        'Print Template: offline_in_house_use',
+        'cwst', 'label'
+    )
+), (
+    'eg.serials.stream_names', 'gui', 'array',
+    oils_i18n_gettext(
+        'eg.serials.stream_names',
+        'Serials Local Stream Names',
+        'cwst', 'label'
+    )
+), (
+    'eg.serials.items.do_print_routing_lists', 'gui', 'bool',
+    oils_i18n_gettext(
+        'eg.serials.items.do_print_routing_lists',
+        'Serials Print Routing Lists',
+        'cwst', 'label'
+    )
+), (
+    'eg.serials.items.receive_and_barcode', 'gui', 'bool',
+    oils_i18n_gettext(
+        'eg.serials.items.receive_and_barcode',
+        'Serials Barcode On Receive',
+        'cwst', 'label'
+    )
+);
+
+
+-- More values with fm_class'es
+INSERT INTO config.workstation_setting_type (name, grp, datatype, fm_class, label)
+VALUES (
+    'eg.search.search_lib', 'gui', 'link', 'aou',
+    oils_i18n_gettext(
+        'eg.search.search_lib',
+        'Staff Catalog Default Search Library',
+        'cwst', 'label'
+    )
+), (
+    'eg.search.pref_lib', 'gui', 'link', 'aou',
+    oils_i18n_gettext(
+        'eg.search.pref_lib',
+        'Staff Catalog Preferred Library',
+        'cwst', 'label'
+    )
+);
+
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1118', :eg_version);
+
+UPDATE action_trigger.event_definition
+SET template =
+$$
+[%- USE date -%]
+[%- SET user = target.0.owner -%]
+To: [%- params.recipient_email || user.email %]
+From: [%- params.sender_email || default_sender %]
+Date: [%- date.format(date.now, '%a, %d %b %Y %T -0000', gmt => 1) %]
+Subject: Bibliographic Records
+Auto-Submitted: auto-generated
+
+[% FOR cbreb IN target %]
+[% FOR item IN cbreb.items;
+    bre_id = item.target_biblio_record_entry;
+
+    bibxml = helpers.unapi_bre(bre_id, {flesh => '{mra}'});
+    title = '';
+    FOR part IN bibxml.findnodes('//*[@tag="245"]/*[@code="a" or @code="b"]');
+        title = title _ part.textContent;
+    END;
+
+    author = bibxml.findnodes('//*[@tag="100"]/*[@code="a"]').textContent;
+    item_type = bibxml.findnodes('//*[local-name()="attributes"]/*[local-name()="field"][@name="item_type"]').getAttribute('coded-value');
+    publisher = bibxml.findnodes('//*[@tag="260"]/*[@code="b"]').textContent;
+    pubdate = bibxml.findnodes('//*[@tag="260"]/*[@code="c"]').textContent;
+    isbn = bibxml.findnodes('//*[@tag="020"]/*[@code="a"]').textContent;
+    issn = bibxml.findnodes('//*[@tag="022"]/*[@code="a"]').textContent;
+    upc = bibxml.findnodes('//*[@tag="024"]/*[@code="a"]').textContent;
+%]
+
+[% loop.count %]/[% loop.size %].  Bib ID# [% bre_id %] 
+[% IF isbn %]ISBN: [% isbn _ "\n" %][% END -%]
+[% IF issn %]ISSN: [% issn _ "\n" %][% END -%]
+[% IF upc  %]UPC:  [% upc _ "\n" %] [% END -%]
+Title: [% title %]
+Author: [% author %]
+Publication Info: [% publisher %] [% pubdate %]
+Item Type: [% item_type %]
+
+[% END %]
+[% END %]
+$$
+WHERE hook = 'biblio.format.record_entry.email'
+-- from previous stock definition
+AND MD5(template) = 'ee4e6c1b3049086c570c7a77413d46c1';
+
+UPDATE action_trigger.event_definition
+SET template =
+$$
+<div>
+    <style> li { padding: 8px; margin 5px; }</style>
+    <ol>
+    [% FOR cbreb IN target %]
+    [% FOR item IN cbreb.items;
+        bre_id = item.target_biblio_record_entry;
+
+        bibxml = helpers.unapi_bre(bre_id, {flesh => '{mra}'});
+        title = '';
+        FOR part IN bibxml.findnodes('//*[@tag="245"]/*[@code="a" or @code="b"]');
+            title = title _ part.textContent;
+        END;
+
+        author = bibxml.findnodes('//*[@tag="100"]/*[@code="a"]').textContent;
+        item_type = bibxml.findnodes('//*[local-name()="attributes"]/*[local-name()="field"][@name="item_type"]').getAttribute('coded-value');
+        publisher = bibxml.findnodes('//*[@tag="260"]/*[@code="b"]').textContent;
+        pubdate = bibxml.findnodes('//*[@tag="260"]/*[@code="c"]').textContent;
+        isbn = bibxml.findnodes('//*[@tag="020"]/*[@code="a"]').textContent;
+        %]
+
+        <li>
+            Bib ID# [% bre_id %] ISBN: [% isbn %]<br />
+            Title: [% title %]<br />
+            Author: [% author %]<br />
+            Publication Info: [% publisher %] [% pubdate %]<br/>
+            Item Type: [% item_type %]
+        </li>
+    [% END %]
+    [% END %]
+    </ol>
+</div>
+$$
+WHERE hook = 'biblio.format.record_entry.print'
+-- from previous stock definition
+AND MD5(template) = '9ada7ea8417cb23f89d0dc8f15ec68d0';
+
+
+SELECT evergreen.upgrade_deps_block_check('1120', :eg_version);
+
+--Only insert if the attributes are not already present
+
+INSERT INTO config.z3950_attr (source, name, label, code, format, truncation)
+SELECT 'oclc','upc','UPC','1007','6','0'
+WHERE NOT EXISTS (SELECT name FROM config.z3950_attr WHERE source = 'oclc' AND name = 'upc');
+
+INSERT INTO config.z3950_attr (source, name, label, code, format, truncation)
+SELECT 'loc','upc','UPC','1007','1','1'
+WHERE NOT EXISTS (SELECT name FROM config.z3950_attr WHERE source = 'loc' AND name = 'upc');
+
+SELECT evergreen.upgrade_deps_block_check('1121', :eg_version);
+
+CREATE TABLE permission.grp_tree_display_entry (
+    id      SERIAL PRIMARY KEY,
+    position INTEGER NOT NULL,
+    org     INTEGER NOT NULL REFERENCES actor.org_unit (id)
+            DEFERRABLE INITIALLY DEFERRED,
+    grp     INTEGER NOT NULL REFERENCES permission.grp_tree (id)
+            DEFERRABLE INITIALLY DEFERRED,
+    CONSTRAINT pgtde_once_per_org UNIQUE (org, grp)
+);
+
+ALTER TABLE permission.grp_tree_display_entry
+    ADD COLUMN parent integer REFERENCES permission.grp_tree_display_entry (id)
+            DEFERRABLE INITIALLY DEFERRED;
+
+INSERT INTO permission.perm_list (id, code, description)
+VALUES (609, 'MANAGE_CUSTOM_PERM_GRP_TREE', oils_i18n_gettext( 609,
+    'Allows a user to manage custom permission group lists.', 'ppl', 'description' ));
+            
+
+SELECT evergreen.upgrade_deps_block_check('1122', :eg_version);
+
+ALTER TABLE actor.usr 
+    ADD COLUMN pref_prefix TEXT,
+    ADD COLUMN pref_first_given_name TEXT,
+    ADD COLUMN pref_second_given_name TEXT,
+    ADD COLUMN pref_family_name TEXT,
+    ADD COLUMN pref_suffix TEXT,
+    ADD COLUMN name_keywords TEXT,
+    ADD COLUMN name_kw_tsvector TSVECTOR;
+
+ALTER TABLE staging.user_stage
+    ADD COLUMN pref_first_given_name TEXT,
+    ADD COLUMN pref_second_given_name TEXT,
+    ADD COLUMN pref_family_name TEXT;
+
+CREATE INDEX actor_usr_pref_first_given_name_idx 
+    ON actor.usr (evergreen.lowercase(pref_first_given_name));
+CREATE INDEX actor_usr_pref_second_given_name_idx 
+    ON actor.usr (evergreen.lowercase(pref_second_given_name));
+CREATE INDEX actor_usr_pref_family_name_idx 
+    ON actor.usr (evergreen.lowercase(pref_family_name));
+CREATE INDEX actor_usr_pref_first_given_name_unaccent_idx 
+    ON actor.usr (evergreen.unaccent_and_squash(pref_first_given_name));
+CREATE INDEX actor_usr_pref_second_given_name_unaccent_idx 
+    ON actor.usr (evergreen.unaccent_and_squash(pref_second_given_name));
+CREATE INDEX actor_usr_pref_family_name_unaccent_idx 
+   ON actor.usr (evergreen.unaccent_and_squash(pref_family_name));
+
+-- Update keyword indexes for existing patrons
+
+UPDATE actor.usr SET name_kw_tsvector = 
+    TO_TSVECTOR(
+        COALESCE(prefix, '') || ' ' || 
+        COALESCE(first_given_name, '') || ' ' || 
+        COALESCE(evergreen.unaccent_and_squash(first_given_name), '') || ' ' || 
+        COALESCE(second_given_name, '') || ' ' || 
+        COALESCE(evergreen.unaccent_and_squash(second_given_name), '') || ' ' || 
+        COALESCE(family_name, '') || ' ' || 
+        COALESCE(evergreen.unaccent_and_squash(family_name), '') || ' ' || 
+        COALESCE(suffix, '')
+    );
+
+CREATE OR REPLACE FUNCTION actor.user_ingest_name_keywords() 
+    RETURNS TRIGGER AS $func$
+BEGIN
+    NEW.name_kw_tsvector := TO_TSVECTOR(
+        COALESCE(NEW.prefix, '')                || ' ' || 
+        COALESCE(NEW.first_given_name, '')      || ' ' || 
+        COALESCE(evergreen.unaccent_and_squash(NEW.first_given_name), '') || ' ' || 
+        COALESCE(NEW.second_given_name, '')     || ' ' || 
+        COALESCE(evergreen.unaccent_and_squash(NEW.second_given_name), '') || ' ' || 
+        COALESCE(NEW.family_name, '')           || ' ' || 
+        COALESCE(evergreen.unaccent_and_squash(NEW.family_name), '') || ' ' || 
+        COALESCE(NEW.suffix, '')                || ' ' || 
+        COALESCE(NEW.pref_prefix, '')            || ' ' || 
+        COALESCE(NEW.pref_first_given_name, '')  || ' ' || 
+        COALESCE(evergreen.unaccent_and_squash(NEW.pref_first_given_name), '') || ' ' || 
+        COALESCE(NEW.pref_second_given_name, '') || ' ' || 
+        COALESCE(evergreen.unaccent_and_squash(NEW.pref_second_given_name), '') || ' ' || 
+        COALESCE(NEW.pref_family_name, '')       || ' ' || 
+        COALESCE(evergreen.unaccent_and_squash(NEW.pref_family_name), '') || ' ' || 
+        COALESCE(NEW.pref_suffix, '')            || ' ' || 
+        COALESCE(NEW.name_keywords, '')
+    );
+    RETURN NEW;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+-- Add after the batch upate above to avoid duplicate updates.
+CREATE TRIGGER user_ingest_name_keywords_tgr 
+    BEFORE INSERT OR UPDATE ON actor.usr 
+    FOR EACH ROW EXECUTE PROCEDURE actor.user_ingest_name_keywords();
+
+
+-- merge pref names from source user to target user, except when
+-- clobbering existing pref names.
+CREATE OR REPLACE FUNCTION actor.usr_merge(src_usr INT, dest_usr INT, 
+    del_addrs BOOLEAN, del_cards BOOLEAN, deactivate_cards BOOLEAN ) 
+    RETURNS VOID AS $$
+DECLARE
+	suffix TEXT;
+	bucket_row RECORD;
+	picklist_row RECORD;
+	queue_row RECORD;
+	folder_row RECORD;
+BEGIN
+
+    -- do some initial cleanup 
+    UPDATE actor.usr SET card = NULL WHERE id = src_usr;
+    UPDATE actor.usr SET mailing_address = NULL WHERE id = src_usr;
+    UPDATE actor.usr SET billing_address = NULL WHERE id = src_usr;
+
+    -- actor.*
+    IF del_cards THEN
+        DELETE FROM actor.card where usr = src_usr;
+    ELSE
+        IF deactivate_cards THEN
+            UPDATE actor.card SET active = 'f' WHERE usr = src_usr;
+        END IF;
+        UPDATE actor.card SET usr = dest_usr WHERE usr = src_usr;
+    END IF;
+
+
+    IF del_addrs THEN
+        DELETE FROM actor.usr_address WHERE usr = src_usr;
+    ELSE
+        UPDATE actor.usr_address SET usr = dest_usr WHERE usr = src_usr;
+    END IF;
+
+    UPDATE actor.usr_note SET usr = dest_usr WHERE usr = src_usr;
+    -- dupes are technically OK in actor.usr_standing_penalty, should manually delete them...
+    UPDATE actor.usr_standing_penalty SET usr = dest_usr WHERE usr = src_usr;
+    PERFORM actor.usr_merge_rows('actor.usr_org_unit_opt_in', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('actor.usr_setting', 'usr', src_usr, dest_usr);
+
+    -- permission.*
+    PERFORM actor.usr_merge_rows('permission.usr_perm_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_object_perm_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_grp_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_work_ou_map', 'usr', src_usr, dest_usr);
+
+
+    -- container.*
+	
+	-- For each *_bucket table: transfer every bucket belonging to src_usr
+	-- into the custody of dest_usr.
+	--
+	-- In order to avoid colliding with an existing bucket owned by
+	-- the destination user, append the source user's id (in parenthesese)
+	-- to the name.  If you still get a collision, add successive
+	-- spaces to the name and keep trying until you succeed.
+	--
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.biblio_record_entry_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.biblio_record_entry_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.call_number_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.call_number_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.copy_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.copy_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.user_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.user_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	UPDATE container.user_bucket_item SET target_user = dest_usr WHERE target_user = src_usr;
+
+    -- vandelay.*
+	-- transfer queues the same way we transfer buckets (see above)
+	FOR queue_row in
+		SELECT id, name
+		FROM   vandelay.queue
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  vandelay.queue
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = queue_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    -- money.*
+    PERFORM actor.usr_merge_rows('money.collections_tracker', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('money.collections_tracker', 'collector', src_usr, dest_usr);
+    UPDATE money.billable_xact SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE money.billing SET voider = dest_usr WHERE voider = src_usr;
+    UPDATE money.bnm_payment SET accepting_usr = dest_usr WHERE accepting_usr = src_usr;
+
+    -- action.*
+    UPDATE action.circulation SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
+    UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
+    UPDATE action.usr_circ_history SET usr = dest_usr WHERE usr = src_usr;
+
+    UPDATE action.hold_request SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
+    UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
+    UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
+
+    UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.non_cataloged_circulation SET patron = dest_usr WHERE patron = src_usr;
+    UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.survey_response SET usr = dest_usr WHERE usr = src_usr;
+
+    -- acq.*
+    UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
+	UPDATE acq.fund_transfer SET transfer_user = dest_usr WHERE transfer_user = src_usr;
+
+	-- transfer picklists the same way we transfer buckets (see above)
+	FOR picklist_row in
+		SELECT id, name
+		FROM   acq.picklist
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  acq.picklist
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = picklist_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
+    UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.provider_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.provider_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.lineitem_usr_attr_definition SET usr = dest_usr WHERE usr = src_usr;
+
+    -- asset.*
+    UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
+
+    -- serial.*
+    UPDATE serial.record_entry SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE serial.record_entry SET editor = dest_usr WHERE editor = src_usr;
+
+    -- reporter.*
+    -- It's not uncommon to define the reporter schema in a replica 
+    -- DB only, so don't assume these tables exist in the write DB.
+    BEGIN
+    	UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+    	UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+    	UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.template_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.template_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.report_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.report_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.output_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.output_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+
+    -- propagate preferred name values from the source user to the
+    -- destination user, but only when values are not being replaced.
+    WITH susr AS (SELECT * FROM actor.usr WHERE id = src_usr)
+    UPDATE actor.usr SET 
+        pref_prefix = 
+            COALESCE(pref_prefix, (SELECT pref_prefix FROM susr)),
+        pref_first_given_name = 
+            COALESCE(pref_first_given_name, (SELECT pref_first_given_name FROM susr)),
+        pref_second_given_name = 
+            COALESCE(pref_second_given_name, (SELECT pref_second_given_name FROM susr)),
+        pref_family_name = 
+            COALESCE(pref_family_name, (SELECT pref_family_name FROM susr)),
+        pref_suffix = 
+            COALESCE(pref_suffix, (SELECT pref_suffix FROM susr))
+    WHERE id = dest_usr;
+
+    -- Copy and deduplicate name keywords
+    -- String -> array -> rows -> DISTINCT -> array -> string
+    WITH susr AS (SELECT * FROM actor.usr WHERE id = src_usr),
+         dusr AS (SELECT * FROM actor.usr WHERE id = dest_usr)
+    UPDATE actor.usr SET name_keywords = (
+        WITH keywords AS (
+            SELECT DISTINCT UNNEST(
+                REGEXP_SPLIT_TO_ARRAY(
+                    COALESCE((SELECT name_keywords FROM susr), '') || ' ' ||
+                    COALESCE((SELECT name_keywords FROM dusr), ''),  E'\\s+'
+                )
+            ) AS parts
+        ) SELECT ARRAY_TO_STRING(ARRAY_AGG(kw.parts), ' ') FROM keywords kw
+    ) WHERE id = dest_usr;
+
+    -- Finally, delete the source user
+    DELETE FROM actor.usr WHERE id = src_usr;
+
+END;
+$$ LANGUAGE plpgsql;
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1123', :eg_version);
+
+    ALTER TABLE config.rule_circ_duration
+    ADD column max_auto_renewals INTEGER;
+
+    ALTER TABLE action.circulation
+    ADD column auto_renewal BOOLEAN;
+
+    ALTER TABLE action.circulation
+    ADD column auto_renewal_remaining INTEGER;
+
+    ALTER TABLE action.aged_circulation
+    ADD column auto_renewal BOOLEAN;
+
+    ALTER TABLE action.aged_circulation
+    ADD column auto_renewal_remaining INTEGER;
+
+    INSERT INTO action_trigger.validator values('CircIsAutoRenewable', 'Checks whether the circulation is able to be autorenewed.');
+    INSERT INTO action_trigger.reactor values('Circ::AutoRenew', 'Auto-Renews a circulation.');
+    INSERT INTO action_trigger.hook(key, core_type, description) values('autorenewal', 'circ', 'Item was auto-renewed to patron.');
+
+    -- AutoRenewer A/T Def: 
+    INSERT INTO action_trigger.event_definition(active, owner, name, hook, validator, reactor, delay, max_delay, delay_field, group_field)
+        values (false, 1, 'Autorenew', 'checkout.due', 'CircIsOpen', 'Circ::AutoRenew', '-23 hours'::interval,'-1 minute'::interval, 'due_date', 'usr');
+
+    -- AutoRenewal outcome Email notifier A/T Def:
+    INSERT INTO action_trigger.event_definition(active, owner, name, hook, validator, reactor, group_field, template)
+        values (false, 1, 'AutorenewNotify', 'autorenewal', 'NOOP_True', 'SendEmail', 'usr', 
+$$
+[%- USE date -%]
+[%- user = target.0.usr -%]
+To: [%- params.recipient_email || user.email %]
+From: [%- params.sender_email || default_sender %]
+Date: [%- date.format(date.now, '%a, %d %b %Y %T -0000', gmt => 1) %]
+Subject: Items Out Auto-Renewal Notification 
+Auto-Submitted: auto-generated
+
+Dear [% user.family_name %], [% user.first_given_name %]
+An automatic renewal attempt was made for the following items:
+
+[% FOR circ IN target %]
+    [%- SET idx = loop.count - 1; SET udata =  user_data.$idx -%]
+    [%- SET cid = circ.target_copy || udata.copy -%]
+    [%- SET copy_details = helpers.get_copy_bib_basics(cid) -%]
+    Item# [% loop.count %]
+    Title: [% copy_details.title %]
+    Author: [% copy_details.author %]
+    [%- IF udata.is_renewed %]
+    Status: Loan Renewed
+    New Due Date: [% date.format(helpers.format_date(udata.new_due_date), '%Y-%m-%d') %]
+    [%- ELSE %]
+    Status: Not Renewed
+    Reason: [% udata.reason %]
+    Due Date: [% date.format(helpers.format_date(circ.due_date), '%Y-%m-%d') %]
+    [% END %]
+[% END %]
+$$
+    );
+
+    INSERT INTO action_trigger.environment (event_def, path ) VALUES
+    ( currval('action_trigger.event_definition_id_seq'), 'usr' ),
+    ( currval('action_trigger.event_definition_id_seq'), 'circ_lib' );
+
+
+DROP VIEW action.all_circulation;
+CREATE OR REPLACE VIEW action.all_circulation AS
+    SELECT  id,usr_post_code, usr_home_ou, usr_profile, usr_birth_year, copy_call_number, copy_location,
+        copy_owning_lib, copy_circ_lib, copy_bib_record, xact_start, xact_finish, target_copy,
+        circ_lib, circ_staff, checkin_staff, checkin_lib, renewal_remaining, grace_period, due_date,
+        stop_fines_time, checkin_time, create_time, duration, fine_interval, recurring_fine,
+        max_fine, phone_renewal, desk_renewal, opac_renewal, duration_rule, recurring_fine_rule,
+        max_fine_rule, stop_fines, workstation, checkin_workstation, checkin_scan_time, parent_circ,
+        auto_renewal, auto_renewal_remaining, 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, EXTRACT(YEAR FROM p.dob)::INT 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.auto_renewal, circ.auto_renewal_remaining, 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);
+
+
+DROP FUNCTION action.summarize_all_circ_chain (INTEGER);
+DROP FUNCTION action.all_circ_chain (INTEGER);
+
+-- rebuild slim circ view
+DROP VIEW action.all_circulation_slim;
+CREATE OR REPLACE VIEW action.all_circulation_slim AS
+    SELECT
+        id,
+        usr,
+        xact_start,
+        xact_finish,
+        unrecovered,
+        target_copy,
+        circ_lib,
+        circ_staff,
+        checkin_staff,
+        checkin_lib,
+        renewal_remaining,
+        grace_period,
+        due_date,
+        stop_fines_time,
+        checkin_time,
+        create_time,
+        duration,
+        fine_interval,
+        recurring_fine,
+        max_fine,
+        phone_renewal,
+        desk_renewal,
+        opac_renewal,
+        duration_rule,
+        recurring_fine_rule,
+        max_fine_rule,
+        stop_fines,
+        workstation,
+        checkin_workstation,
+        copy_location,
+        checkin_scan_time,
+        auto_renewal,
+        auto_renewal_remaining,
+        parent_circ
+    FROM action.circulation
+UNION ALL
+    SELECT
+        id,
+        NULL AS usr,
+        xact_start,
+        xact_finish,
+        unrecovered,
+        target_copy,
+        circ_lib,
+        circ_staff,
+        checkin_staff,
+        checkin_lib,
+        renewal_remaining,
+        grace_period,
+        due_date,
+        stop_fines_time,
+        checkin_time,
+        create_time,
+        duration,
+        fine_interval,
+        recurring_fine,
+        max_fine,
+        phone_renewal,
+        desk_renewal,
+        opac_renewal,
+        duration_rule,
+        recurring_fine_rule,
+        max_fine_rule,
+        stop_fines,
+        workstation,
+        checkin_workstation,
+        copy_location,
+        checkin_scan_time,
+        auto_renewal,
+        auto_renewal_remaining,
+        parent_circ
+    FROM action.aged_circulation
+;
+
+CREATE OR REPLACE FUNCTION action.all_circ_chain (ctx_circ_id INTEGER) 
+    RETURNS SETOF action.all_circulation_slim AS $$
+DECLARE
+    tmp_circ action.all_circulation_slim%ROWTYPE;
+    circ_0 action.all_circulation_slim%ROWTYPE;
+BEGIN
+
+    SELECT INTO tmp_circ * FROM action.all_circulation_slim 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_slim 
+            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_slim 
+            WHERE parent_circ = tmp_circ.id;
+    END LOOP;
+
+END;
+$$ LANGUAGE 'plpgsql';
+
+-- same as action.summarize_circ_chain, but returns data collected
+-- from action.all_circulation, which may include aged circulations.
+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_slim%ROWTYPE;
+
+    -- last circ in the chain
+    circ_n action.all_circulation_slim%ROWTYPE;
+
+    -- circ chain under construction
+    chain action.circ_chain_summary;
+    tmp_circ action.all_circulation_slim%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('1124', :eg_version);
+
+INSERT into config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.grid.circ.wide_holds.shelf', 'gui', 'object',
+    oils_i18n_gettext (
+        'eg.grid.circ.wide_holds.shelf',
+        'Grid Config: circ.wide_holds.shelf',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.catalog.wide_holds', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.catalog.wide_holds',
+        'Grid Config: cat.catalog.wide_holds',
+        'cwst', 'label'
+    )
+);
+
+DELETE from config.workstation_setting_type
+WHERE name = 'eg.grid.cat.catalog.holds' OR name = 'eg.grid.circ.holds.shelf';
+
+
+SELECT evergreen.upgrade_deps_block_check('1125', :eg_version);
+
+CREATE TABLE asset.latest_inventory (
+    id                          SERIAL                      PRIMARY KEY,
+    inventory_workstation       INTEGER                     REFERENCES actor.workstation (id) DEFERRABLE INITIALLY DEFERRED,
+    inventory_date              TIMESTAMP WITH TIME ZONE    DEFAULT NOW(),
+    copy                        BIGINT                      NOT NULL
+);
+CREATE INDEX latest_inventory_copy_idx ON asset.latest_inventory (copy);
+
+CREATE OR REPLACE FUNCTION evergreen.asset_latest_inventory_copy_inh_fkey() RETURNS TRIGGER AS $f$
+BEGIN
+        PERFORM 1 FROM asset.copy WHERE id = NEW.copy;
+        IF NOT FOUND THEN
+                RAISE foreign_key_violation USING MESSAGE = FORMAT(
+                        $$Referenced asset.copy id not found, copy:%s$$, NEW.copy
+                );
+        END IF;
+        RETURN NEW;
+END;
+$f$ LANGUAGE PLPGSQL VOLATILE COST 50;
+
+CREATE CONSTRAINT TRIGGER inherit_asset_latest_inventory_copy_fkey
+        AFTER UPDATE OR INSERT ON asset.latest_inventory
+        DEFERRABLE FOR EACH ROW EXECUTE PROCEDURE evergreen.asset_latest_inventory_copy_inh_fkey();
+
+INSERT into config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.circ.checkin.do_inventory_update', 'circ', 'bool',
+    oils_i18n_gettext (
+             'eg.circ.checkin.do_inventory_update',
+             'Checkin: Update Inventory',
+             'cwst', 'label'
+    )
+);
+
+
+SELECT evergreen.upgrade_deps_block_check('1126', :eg_version);
+
+CREATE TABLE vandelay.session_tracker (
+    id          BIGSERIAL PRIMARY KEY,
+
+    -- string of characters (e.g. md5) used for linking trackers
+    -- of different actions into a series.  There can be multiple
+    -- session_keys of each action type, creating the opportunity
+    -- to link multiple action trackers into a single session.
+    session_key TEXT NOT NULL,
+
+    -- optional user-supplied name
+    name        TEXT NOT NULL, 
+
+    usr         INTEGER NOT NULL REFERENCES actor.usr(id)
+                DEFERRABLE INITIALLY DEFERRED,
+
+    -- org unit can be derived from WS
+    workstation INTEGER NOT NULL REFERENCES actor.workstation(id)
+                ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+
+    -- bib/auth
+    record_type vandelay.bib_queue_queue_type NOT NULL DEFAULT 'bib',
+
+    -- Queue defines the source of the data, it does not necessarily
+    -- mean that an action is being performed against an entire queue.
+    -- E.g. some imports are misc. lists of record IDs, but they always 
+    -- come from one queue.
+    -- No foreign key -- could be auth or bib queue.
+    queue       BIGINT NOT NULL,
+
+    create_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
+    update_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
+
+    state       TEXT NOT NULL DEFAULT 'active',
+
+    action_type TEXT NOT NULL DEFAULT 'enqueue', -- import
+
+    -- total number of tasks to perform / loosely defined
+    -- could be # of recs to import or # of recs + # of copies 
+    -- depending on the import context
+    total_actions INTEGER NOT NULL DEFAULT 0,
+
+    -- total number of tasked performed so far
+    actions_performed INTEGER NOT NULL DEFAULT 0,
+
+    CONSTRAINT vand_tracker_valid_state 
+        CHECK (state IN ('active','error','complete')),
+
+    CONSTRAINT vand_tracker_valid_action_type
+        CHECK (action_type IN ('upload', 'enqueue', 'import'))
+);
+
+
+CREATE OR REPLACE FUNCTION actor.usr_merge( src_usr INT, dest_usr INT, del_addrs BOOLEAN, del_cards BOOLEAN, deactivate_cards BOOLEAN ) RETURNS VOID AS $$
+DECLARE
+	suffix TEXT;
+	bucket_row RECORD;
+	picklist_row RECORD;
+	queue_row RECORD;
+	folder_row RECORD;
+BEGIN
+
+    -- do some initial cleanup 
+    UPDATE actor.usr SET card = NULL WHERE id = src_usr;
+    UPDATE actor.usr SET mailing_address = NULL WHERE id = src_usr;
+    UPDATE actor.usr SET billing_address = NULL WHERE id = src_usr;
+
+    -- actor.*
+    IF del_cards THEN
+        DELETE FROM actor.card where usr = src_usr;
+    ELSE
+        IF deactivate_cards THEN
+            UPDATE actor.card SET active = 'f' WHERE usr = src_usr;
+        END IF;
+        UPDATE actor.card SET usr = dest_usr WHERE usr = src_usr;
+    END IF;
+
+
+    IF del_addrs THEN
+        DELETE FROM actor.usr_address WHERE usr = src_usr;
+    ELSE
+        UPDATE actor.usr_address SET usr = dest_usr WHERE usr = src_usr;
+    END IF;
+
+    UPDATE actor.usr_note SET usr = dest_usr WHERE usr = src_usr;
+    -- dupes are technically OK in actor.usr_standing_penalty, should manually delete them...
+    UPDATE actor.usr_standing_penalty SET usr = dest_usr WHERE usr = src_usr;
+    PERFORM actor.usr_merge_rows('actor.usr_org_unit_opt_in', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('actor.usr_setting', 'usr', src_usr, dest_usr);
+
+    -- permission.*
+    PERFORM actor.usr_merge_rows('permission.usr_perm_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_object_perm_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_grp_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_work_ou_map', 'usr', src_usr, dest_usr);
+
+
+    -- container.*
+	
+	-- For each *_bucket table: transfer every bucket belonging to src_usr
+	-- into the custody of dest_usr.
+	--
+	-- In order to avoid colliding with an existing bucket owned by
+	-- the destination user, append the source user's id (in parenthesese)
+	-- to the name.  If you still get a collision, add successive
+	-- spaces to the name and keep trying until you succeed.
+	--
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.biblio_record_entry_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.biblio_record_entry_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.call_number_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.call_number_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.copy_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.copy_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.user_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.user_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	UPDATE container.user_bucket_item SET target_user = dest_usr WHERE target_user = src_usr;
+
+    -- vandelay.*
+	-- transfer queues the same way we transfer buckets (see above)
+	FOR queue_row in
+		SELECT id, name
+		FROM   vandelay.queue
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  vandelay.queue
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = queue_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    UPDATE vandelay.session_tracker SET usr = dest_usr WHERE usr = src_usr;
+
+    -- money.*
+    PERFORM actor.usr_merge_rows('money.collections_tracker', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('money.collections_tracker', 'collector', src_usr, dest_usr);
+    UPDATE money.billable_xact SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE money.billing SET voider = dest_usr WHERE voider = src_usr;
+    UPDATE money.bnm_payment SET accepting_usr = dest_usr WHERE accepting_usr = src_usr;
+
+    -- action.*
+    UPDATE action.circulation SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
+    UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
+    UPDATE action.usr_circ_history SET usr = dest_usr WHERE usr = src_usr;
+
+    UPDATE action.hold_request SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
+    UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
+    UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
+
+    UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.non_cataloged_circulation SET patron = dest_usr WHERE patron = src_usr;
+    UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.survey_response SET usr = dest_usr WHERE usr = src_usr;
+
+    -- acq.*
+    UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
+	UPDATE acq.fund_transfer SET transfer_user = dest_usr WHERE transfer_user = src_usr;
+
+	-- transfer picklists the same way we transfer buckets (see above)
+	FOR picklist_row in
+		SELECT id, name
+		FROM   acq.picklist
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  acq.picklist
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = picklist_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
+    UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.provider_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.provider_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.lineitem_usr_attr_definition SET usr = dest_usr WHERE usr = src_usr;
+
+    -- asset.*
+    UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
+
+    -- serial.*
+    UPDATE serial.record_entry SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE serial.record_entry SET editor = dest_usr WHERE editor = src_usr;
+
+    -- reporter.*
+    -- It's not uncommon to define the reporter schema in a replica 
+    -- DB only, so don't assume these tables exist in the write DB.
+    BEGIN
+    	UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+    	UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+    	UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.template_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.template_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.report_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.report_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.output_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.output_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+
+    -- propagate preferred name values from the source user to the
+    -- destination user, but only when values are not being replaced.
+    WITH susr AS (SELECT * FROM actor.usr WHERE id = src_usr)
+    UPDATE actor.usr SET 
+        pref_prefix = 
+            COALESCE(pref_prefix, (SELECT pref_prefix FROM susr)),
+        pref_first_given_name = 
+            COALESCE(pref_first_given_name, (SELECT pref_first_given_name FROM susr)),
+        pref_second_given_name = 
+            COALESCE(pref_second_given_name, (SELECT pref_second_given_name FROM susr)),
+        pref_family_name = 
+            COALESCE(pref_family_name, (SELECT pref_family_name FROM susr)),
+        pref_suffix = 
+            COALESCE(pref_suffix, (SELECT pref_suffix FROM susr))
+    WHERE id = dest_usr;
+
+    -- Copy and deduplicate name keywords
+    -- String -> array -> rows -> DISTINCT -> array -> string
+    WITH susr AS (SELECT * FROM actor.usr WHERE id = src_usr),
+         dusr AS (SELECT * FROM actor.usr WHERE id = dest_usr)
+    UPDATE actor.usr SET name_keywords = (
+        WITH keywords AS (
+            SELECT DISTINCT UNNEST(
+                REGEXP_SPLIT_TO_ARRAY(
+                    COALESCE((SELECT name_keywords FROM susr), '') || ' ' ||
+                    COALESCE((SELECT name_keywords FROM dusr), ''),  E'\\s+'
+                )
+            ) AS parts
+        ) SELECT ARRAY_TO_STRING(ARRAY_AGG(kw.parts), ' ') FROM keywords kw
+    ) WHERE id = dest_usr;
+
+    -- Finally, delete the source user
+    DELETE FROM actor.usr WHERE id = src_usr;
+
+END;
+$$ LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION actor.usr_purge_data(
+	src_usr  IN INTEGER,
+	specified_dest_usr IN INTEGER
+) RETURNS VOID AS $$
+DECLARE
+	suffix TEXT;
+	renamable_row RECORD;
+	dest_usr INTEGER;
+BEGIN
+
+	IF specified_dest_usr IS NULL THEN
+		dest_usr := 1; -- Admin user on stock installs
+	ELSE
+		dest_usr := specified_dest_usr;
+	END IF;
+
+	-- acq.*
+	UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
+	UPDATE acq.lineitem SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE acq.lineitem SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE acq.lineitem SET selector = dest_usr WHERE selector = src_usr;
+	UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
+	DELETE FROM acq.lineitem_usr_attr_definition WHERE usr = src_usr;
+
+	-- Update with a rename to avoid collisions
+	FOR renamable_row in
+		SELECT id, name
+		FROM   acq.picklist
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  acq.picklist
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = renamable_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	UPDATE acq.picklist SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE acq.picklist SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
+	UPDATE acq.purchase_order SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE acq.purchase_order SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE acq.claim_event SET creator = dest_usr WHERE creator = src_usr;
+
+	-- action.*
+	DELETE FROM action.circulation WHERE usr = src_usr;
+	UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
+	UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
+	UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
+	UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
+	UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
+	DELETE FROM action.hold_request WHERE usr = src_usr;
+	UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
+	UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
+	DELETE FROM action.non_cataloged_circulation WHERE patron = src_usr;
+	UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
+	DELETE FROM action.survey_response WHERE usr = src_usr;
+	UPDATE action.fieldset SET owner = dest_usr WHERE owner = src_usr;
+	DELETE FROM action.usr_circ_history WHERE usr = src_usr;
+
+	-- actor.*
+	DELETE FROM actor.card WHERE usr = src_usr;
+	DELETE FROM actor.stat_cat_entry_usr_map WHERE target_usr = src_usr;
+
+	-- The following update is intended to avoid transient violations of a foreign
+	-- key constraint, whereby actor.usr_address references itself.  It may not be
+	-- necessary, but it does no harm.
+	UPDATE actor.usr_address SET replaces = NULL
+		WHERE usr = src_usr AND replaces IS NOT NULL;
+	DELETE FROM actor.usr_address WHERE usr = src_usr;
+	DELETE FROM actor.usr_note WHERE usr = src_usr;
+	UPDATE actor.usr_note SET creator = dest_usr WHERE creator = src_usr;
+	DELETE FROM actor.usr_org_unit_opt_in WHERE usr = src_usr;
+	UPDATE actor.usr_org_unit_opt_in SET staff = dest_usr WHERE staff = src_usr;
+	DELETE FROM actor.usr_setting WHERE usr = src_usr;
+	DELETE FROM actor.usr_standing_penalty WHERE usr = src_usr;
+	UPDATE actor.usr_standing_penalty SET staff = dest_usr WHERE staff = src_usr;
+
+	-- asset.*
+	UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
+
+	-- auditor.*
+	DELETE FROM auditor.actor_usr_address_history WHERE id = src_usr;
+	DELETE FROM auditor.actor_usr_history WHERE id = src_usr;
+	UPDATE auditor.asset_call_number_history SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE auditor.asset_call_number_history SET editor  = dest_usr WHERE editor  = src_usr;
+	UPDATE auditor.asset_copy_history SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE auditor.asset_copy_history SET editor  = dest_usr WHERE editor  = src_usr;
+	UPDATE auditor.biblio_record_entry_history SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE auditor.biblio_record_entry_history SET editor  = dest_usr WHERE editor  = src_usr;
+
+	-- biblio.*
+	UPDATE biblio.record_entry SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE biblio.record_entry SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE biblio.record_note SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE biblio.record_note SET editor = dest_usr WHERE editor = src_usr;
+
+	-- container.*
+	-- Update buckets with a rename to avoid collisions
+	FOR renamable_row in
+		SELECT id, name
+		FROM   container.biblio_record_entry_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.biblio_record_entry_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = renamable_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR renamable_row in
+		SELECT id, name
+		FROM   container.call_number_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.call_number_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = renamable_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR renamable_row in
+		SELECT id, name
+		FROM   container.copy_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.copy_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = renamable_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR renamable_row in
+		SELECT id, name
+		FROM   container.user_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.user_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = renamable_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	DELETE FROM container.user_bucket_item WHERE target_user = src_usr;
+
+	-- money.*
+	DELETE FROM money.billable_xact WHERE usr = src_usr;
+	DELETE FROM money.collections_tracker WHERE usr = src_usr;
+	UPDATE money.collections_tracker SET collector = dest_usr WHERE collector = src_usr;
+
+	-- permission.*
+	DELETE FROM permission.usr_grp_map WHERE usr = src_usr;
+	DELETE FROM permission.usr_object_perm_map WHERE usr = src_usr;
+	DELETE FROM permission.usr_perm_map WHERE usr = src_usr;
+	DELETE FROM permission.usr_work_ou_map WHERE usr = src_usr;
+
+	-- reporter.*
+	-- Update with a rename to avoid collisions
+	BEGIN
+		FOR renamable_row in
+			SELECT id, name
+			FROM   reporter.output_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.output_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = renamable_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+	EXCEPTION WHEN undefined_table THEN
+		-- do nothing
+	END;
+
+	BEGIN
+		UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
+	EXCEPTION WHEN undefined_table THEN
+		-- do nothing
+	END;
+
+	-- Update with a rename to avoid collisions
+	BEGIN
+		FOR renamable_row in
+			SELECT id, name
+			FROM   reporter.report_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.report_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = renamable_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+	EXCEPTION WHEN undefined_table THEN
+		-- do nothing
+	END;
+
+	BEGIN
+		UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
+	EXCEPTION WHEN undefined_table THEN
+		-- do nothing
+	END;
+
+	BEGIN
+		UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
+	EXCEPTION WHEN undefined_table THEN
+		-- do nothing
+	END;
+
+	-- Update with a rename to avoid collisions
+	BEGIN
+		FOR renamable_row in
+			SELECT id, name
+			FROM   reporter.template_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.template_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = renamable_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+	EXCEPTION WHEN undefined_table THEN
+	-- do nothing
+	END;
+
+	-- vandelay.*
+	-- Update with a rename to avoid collisions
+	FOR renamable_row in
+		SELECT id, name
+		FROM   vandelay.queue
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  vandelay.queue
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = renamable_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    UPDATE vandelay.session_tracker SET usr = dest_usr WHERE usr = src_usr;
+
+    -- NULL-ify addresses last so other cleanup (e.g. circ anonymization)
+    -- can access the information before deletion.
+	UPDATE actor.usr SET
+		active = FALSE,
+		card = NULL,
+		mailing_address = NULL,
+		billing_address = NULL
+	WHERE id = src_usr;
+
+END;
+$$ LANGUAGE plpgsql;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1127', :eg_version);
+
+ALTER TABLE acq.user_request ADD COLUMN cancel_time TIMESTAMPTZ;
+ALTER TABLE acq.user_request ADD COLUMN upc TEXT;
+ALTER TABLE action.hold_request ADD COLUMN acq_request INT REFERENCES acq.user_request (id);
+
+UPDATE
+    config.org_unit_setting_type
+SET
+    label = oils_i18n_gettext(
+        'circ.holds.canceled.display_age',
+        'Canceled holds/requests display age',
+        'coust', 'label'),
+    description = oils_i18n_gettext(
+        'circ.holds.canceled.display_age',
+        'Show all canceled entries in patron holds and patron acquisition requests interfaces that were canceled within this amount of time',
+        'coust', 'description')
+WHERE
+    name = 'circ.holds.canceled.display_age'
+;
+
+UPDATE
+    config.org_unit_setting_type
+SET
+    label = oils_i18n_gettext(
+        'circ.holds.canceled.display_count',
+        'Canceled holds/requests display count',
+        'coust', 'label'),
+    description = oils_i18n_gettext(
+        'circ.holds.canceled.display_count',
+        'How many canceled entries to show in patron holds and patron acquisition requests interfaces',
+        'coust', 'description')
+WHERE
+    name = 'circ.holds.canceled.display_count'
+;
+
+INSERT INTO acq.cancel_reason (org_unit, keep_debits, id, label, description)
+    VALUES (
+        1, 'f', 1015,
+        oils_i18n_gettext(1015, 'Canceled: Fulfilled', 'acqcr', 'label'),
+        oils_i18n_gettext(1015, 'This acquisition request has been fulfilled.', 'acqcr', 'description')
+    )
+;
+
+UPDATE
+    acq.user_request_type
+SET
+    label = oils_i18n_gettext('2', 'Articles', 'aurt', 'label')
+WHERE
+    id = 2
+;
+
+INSERT INTO acq.user_request_type (id,label)
+    SELECT 6, oils_i18n_gettext('6', 'Other', 'aurt', 'label');
+
+SELECT SETVAL('acq.user_request_type_id_seq'::TEXT, (SELECT MAX(id)+1 FROM acq.user_request_type));
+
+INSERT INTO permission.perm_list ( id, code, description ) VALUES
+ ( 610, 'CLEAR_PURCHASE_REQUEST', oils_i18n_gettext(610,
+    'Clear Completed User Purchase Requests', 'ppl', 'description'))
+;
+
+CREATE TABLE acq.user_request_status_type (
+     id  SERIAL  PRIMARY KEY
+    ,label TEXT
+);
+
+INSERT INTO acq.user_request_status_type (id,label) VALUES
+     (0,oils_i18n_gettext(0,'Error','aurst','label'))
+    ,(1,oils_i18n_gettext(1,'New','aurst','label'))
+    ,(2,oils_i18n_gettext(2,'Pending','aurst','label'))
+    ,(3,oils_i18n_gettext(3,'Ordered, Hold Not Placed','aurst','label'))
+    ,(4,oils_i18n_gettext(4,'Ordered, Hold Placed','aurst','label'))
+    ,(5,oils_i18n_gettext(5,'Received','aurst','label'))
+    ,(6,oils_i18n_gettext(6,'Fulfilled','aurst','label'))
+    ,(7,oils_i18n_gettext(7,'Canceled','aurst','label'))
+;
+
+SELECT SETVAL('acq.user_request_status_type_id_seq'::TEXT, 100);
+
+-- not used
+DELETE FROM actor.org_unit_setting WHERE name = 'acq.holds.allow_holds_from_purchase_request';
+DELETE FROM config.org_unit_setting_type_log WHERE field_name = 'acq.holds.allow_holds_from_purchase_request';
+DELETE FROM config.org_unit_setting_type WHERE name = 'acq.holds.allow_holds_from_purchase_request';
+
+
+SELECT evergreen.upgrade_deps_block_check('1128', :eg_version);
+
+DROP VIEW auditor.acq_invoice_lifecycle;
+
+ALTER TABLE acq.invoice
+    ADD COLUMN close_date TIMESTAMPTZ,
+    ADD COLUMN closed_by  INTEGER 
+        REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED;
+
+-- duplicate steps for auditor table
+ALTER TABLE auditor.acq_invoice_history
+    ADD COLUMN close_date TIMESTAMPTZ,
+    ADD COLUMN closed_by  INTEGER;
+
+UPDATE acq.invoice SET close_date = NOW() WHERE complete;
+UPDATE auditor.acq_invoice_history SET close_date = NOW() WHERE complete;
+
+ALTER TABLE acq.invoice DROP COLUMN complete;
+ALTER TABLE auditor.acq_invoice_history DROP COLUMN complete;
+
+-- this recreates auditor.acq_invoice_lifecycle;
+SELECT auditor.update_auditors();
+
+CREATE OR REPLACE FUNCTION actor.usr_merge( src_usr INT, dest_usr INT, del_addrs BOOLEAN, del_cards BOOLEAN, deactivate_cards BOOLEAN ) RETURNS VOID AS $$
+DECLARE
+	suffix TEXT;
+	bucket_row RECORD;
+	picklist_row RECORD;
+	queue_row RECORD;
+	folder_row RECORD;
+BEGIN
+
+    -- do some initial cleanup 
+    UPDATE actor.usr SET card = NULL WHERE id = src_usr;
+    UPDATE actor.usr SET mailing_address = NULL WHERE id = src_usr;
+    UPDATE actor.usr SET billing_address = NULL WHERE id = src_usr;
+
+    -- actor.*
+    IF del_cards THEN
+        DELETE FROM actor.card where usr = src_usr;
+    ELSE
+        IF deactivate_cards THEN
+            UPDATE actor.card SET active = 'f' WHERE usr = src_usr;
+        END IF;
+        UPDATE actor.card SET usr = dest_usr WHERE usr = src_usr;
+    END IF;
+
+
+    IF del_addrs THEN
+        DELETE FROM actor.usr_address WHERE usr = src_usr;
+    ELSE
+        UPDATE actor.usr_address SET usr = dest_usr WHERE usr = src_usr;
+    END IF;
+
+    UPDATE actor.usr_note SET usr = dest_usr WHERE usr = src_usr;
+    -- dupes are technically OK in actor.usr_standing_penalty, should manually delete them...
+    UPDATE actor.usr_standing_penalty SET usr = dest_usr WHERE usr = src_usr;
+    PERFORM actor.usr_merge_rows('actor.usr_org_unit_opt_in', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('actor.usr_setting', 'usr', src_usr, dest_usr);
+
+    -- permission.*
+    PERFORM actor.usr_merge_rows('permission.usr_perm_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_object_perm_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_grp_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_work_ou_map', 'usr', src_usr, dest_usr);
+
+
+    -- container.*
+	
+	-- For each *_bucket table: transfer every bucket belonging to src_usr
+	-- into the custody of dest_usr.
+	--
+	-- In order to avoid colliding with an existing bucket owned by
+	-- the destination user, append the source user's id (in parenthesese)
+	-- to the name.  If you still get a collision, add successive
+	-- spaces to the name and keep trying until you succeed.
+	--
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.biblio_record_entry_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.biblio_record_entry_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.call_number_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.call_number_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.copy_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.copy_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.user_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.user_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	UPDATE container.user_bucket_item SET target_user = dest_usr WHERE target_user = src_usr;
+
+    -- vandelay.*
+	-- transfer queues the same way we transfer buckets (see above)
+	FOR queue_row in
+		SELECT id, name
+		FROM   vandelay.queue
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  vandelay.queue
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = queue_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    -- money.*
+    PERFORM actor.usr_merge_rows('money.collections_tracker', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('money.collections_tracker', 'collector', src_usr, dest_usr);
+    UPDATE money.billable_xact SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE money.billing SET voider = dest_usr WHERE voider = src_usr;
+    UPDATE money.bnm_payment SET accepting_usr = dest_usr WHERE accepting_usr = src_usr;
+
+    -- action.*
+    UPDATE action.circulation SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
+    UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
+    UPDATE action.usr_circ_history SET usr = dest_usr WHERE usr = src_usr;
+
+    UPDATE action.hold_request SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
+    UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
+    UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
+
+    UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.non_cataloged_circulation SET patron = dest_usr WHERE patron = src_usr;
+    UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.survey_response SET usr = dest_usr WHERE usr = src_usr;
+
+    -- acq.*
+    UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
+	UPDATE acq.fund_transfer SET transfer_user = dest_usr WHERE transfer_user = src_usr;
+    UPDATE acq.invoice SET closed_by = dest_usr WHERE closed_by = src_usr;
+
+	-- transfer picklists the same way we transfer buckets (see above)
+	FOR picklist_row in
+		SELECT id, name
+		FROM   acq.picklist
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  acq.picklist
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = picklist_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
+    UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.provider_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.provider_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.lineitem_usr_attr_definition SET usr = dest_usr WHERE usr = src_usr;
+
+    -- asset.*
+    UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
+
+    -- serial.*
+    UPDATE serial.record_entry SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE serial.record_entry SET editor = dest_usr WHERE editor = src_usr;
+
+    -- reporter.*
+    -- It's not uncommon to define the reporter schema in a replica 
+    -- DB only, so don't assume these tables exist in the write DB.
+    BEGIN
+    	UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+    	UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+    	UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.template_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.template_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.report_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.report_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.output_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.output_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+
+    -- Finally, delete the source user
+    DELETE FROM actor.usr WHERE id = src_usr;
+
+END;
+$$ LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION actor.usr_purge_data(
+	src_usr  IN INTEGER,
+	specified_dest_usr IN INTEGER
+) RETURNS VOID AS $$
+DECLARE
+	suffix TEXT;
+	renamable_row RECORD;
+	dest_usr INTEGER;
+BEGIN
+
+	IF specified_dest_usr IS NULL THEN
+		dest_usr := 1; -- Admin user on stock installs
+	ELSE
+		dest_usr := specified_dest_usr;
+	END IF;
+
+	-- acq.*
+	UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
+	UPDATE acq.lineitem SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE acq.lineitem SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE acq.lineitem SET selector = dest_usr WHERE selector = src_usr;
+	UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.invoice SET closed_by = dest_usr WHERE closed_by = src_usr;
+	DELETE FROM acq.lineitem_usr_attr_definition WHERE usr = src_usr;
+
+	-- Update with a rename to avoid collisions
+	FOR renamable_row in
+		SELECT id, name
+		FROM   acq.picklist
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  acq.picklist
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = renamable_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	UPDATE acq.picklist SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE acq.picklist SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
+	UPDATE acq.purchase_order SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE acq.purchase_order SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE acq.claim_event SET creator = dest_usr WHERE creator = src_usr;
+
+	-- action.*
+	DELETE FROM action.circulation WHERE usr = src_usr;
+	UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
+	UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
+	UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
+	UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
+	UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
+	DELETE FROM action.hold_request WHERE usr = src_usr;
+	UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
+	UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
+	DELETE FROM action.non_cataloged_circulation WHERE patron = src_usr;
+	UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
+	DELETE FROM action.survey_response WHERE usr = src_usr;
+	UPDATE action.fieldset SET owner = dest_usr WHERE owner = src_usr;
+	DELETE FROM action.usr_circ_history WHERE usr = src_usr;
+
+	-- actor.*
+	DELETE FROM actor.card WHERE usr = src_usr;
+	DELETE FROM actor.stat_cat_entry_usr_map WHERE target_usr = src_usr;
+
+	-- The following update is intended to avoid transient violations of a foreign
+	-- key constraint, whereby actor.usr_address references itself.  It may not be
+	-- necessary, but it does no harm.
+	UPDATE actor.usr_address SET replaces = NULL
+		WHERE usr = src_usr AND replaces IS NOT NULL;
+	DELETE FROM actor.usr_address WHERE usr = src_usr;
+	DELETE FROM actor.usr_note WHERE usr = src_usr;
+	UPDATE actor.usr_note SET creator = dest_usr WHERE creator = src_usr;
+	DELETE FROM actor.usr_org_unit_opt_in WHERE usr = src_usr;
+	UPDATE actor.usr_org_unit_opt_in SET staff = dest_usr WHERE staff = src_usr;
+	DELETE FROM actor.usr_setting WHERE usr = src_usr;
+	DELETE FROM actor.usr_standing_penalty WHERE usr = src_usr;
+	UPDATE actor.usr_standing_penalty SET staff = dest_usr WHERE staff = src_usr;
+
+	-- asset.*
+	UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
+
+	-- auditor.*
+	DELETE FROM auditor.actor_usr_address_history WHERE id = src_usr;
+	DELETE FROM auditor.actor_usr_history WHERE id = src_usr;
+	UPDATE auditor.asset_call_number_history SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE auditor.asset_call_number_history SET editor  = dest_usr WHERE editor  = src_usr;
+	UPDATE auditor.asset_copy_history SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE auditor.asset_copy_history SET editor  = dest_usr WHERE editor  = src_usr;
+	UPDATE auditor.biblio_record_entry_history SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE auditor.biblio_record_entry_history SET editor  = dest_usr WHERE editor  = src_usr;
+
+	-- biblio.*
+	UPDATE biblio.record_entry SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE biblio.record_entry SET editor = dest_usr WHERE editor = src_usr;
+	UPDATE biblio.record_note SET creator = dest_usr WHERE creator = src_usr;
+	UPDATE biblio.record_note SET editor = dest_usr WHERE editor = src_usr;
+
+	-- container.*
+	-- Update buckets with a rename to avoid collisions
+	FOR renamable_row in
+		SELECT id, name
+		FROM   container.biblio_record_entry_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.biblio_record_entry_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = renamable_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR renamable_row in
+		SELECT id, name
+		FROM   container.call_number_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.call_number_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = renamable_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR renamable_row in
+		SELECT id, name
+		FROM   container.copy_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.copy_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = renamable_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR renamable_row in
+		SELECT id, name
+		FROM   container.user_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.user_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = renamable_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	DELETE FROM container.user_bucket_item WHERE target_user = src_usr;
+
+	-- money.*
+	DELETE FROM money.billable_xact WHERE usr = src_usr;
+	DELETE FROM money.collections_tracker WHERE usr = src_usr;
+	UPDATE money.collections_tracker SET collector = dest_usr WHERE collector = src_usr;
+
+	-- permission.*
+	DELETE FROM permission.usr_grp_map WHERE usr = src_usr;
+	DELETE FROM permission.usr_object_perm_map WHERE usr = src_usr;
+	DELETE FROM permission.usr_perm_map WHERE usr = src_usr;
+	DELETE FROM permission.usr_work_ou_map WHERE usr = src_usr;
+
+	-- reporter.*
+	-- Update with a rename to avoid collisions
+	BEGIN
+		FOR renamable_row in
+			SELECT id, name
+			FROM   reporter.output_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.output_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = renamable_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+	EXCEPTION WHEN undefined_table THEN
+		-- do nothing
+	END;
+
+	BEGIN
+		UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
+	EXCEPTION WHEN undefined_table THEN
+		-- do nothing
+	END;
+
+	-- Update with a rename to avoid collisions
+	BEGIN
+		FOR renamable_row in
+			SELECT id, name
+			FROM   reporter.report_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.report_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = renamable_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+	EXCEPTION WHEN undefined_table THEN
+		-- do nothing
+	END;
+
+	BEGIN
+		UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
+	EXCEPTION WHEN undefined_table THEN
+		-- do nothing
+	END;
+
+	BEGIN
+		UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
+	EXCEPTION WHEN undefined_table THEN
+		-- do nothing
+	END;
+
+	-- Update with a rename to avoid collisions
+	BEGIN
+		FOR renamable_row in
+			SELECT id, name
+			FROM   reporter.template_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.template_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = renamable_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+	EXCEPTION WHEN undefined_table THEN
+	-- do nothing
+	END;
+
+	-- vandelay.*
+	-- Update with a rename to avoid collisions
+	FOR renamable_row in
+		SELECT id, name
+		FROM   vandelay.queue
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  vandelay.queue
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = renamable_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    -- NULL-ify addresses last so other cleanup (e.g. circ anonymization)
+    -- can access the information before deletion.
+	UPDATE actor.usr SET
+		active = FALSE,
+		card = NULL,
+		mailing_address = NULL,
+		billing_address = NULL
+	WHERE id = src_usr;
+
+END;
+$$ LANGUAGE plpgsql;
+
+
+
+
+
+-- UNDO (minus user purge/merge changes)
+/*
+
+DROP VIEW auditor.acq_invoice_lifecycle;
+ALTER TABLE acq.invoice ADD COLUMN complete BOOLEAN NOT NULL DEFAULT FALSE;
+ALTER TABLE auditor.acq_invoice_history 
+    ADD COLUMN complete BOOLEAN NOT NULL DEFAULT FALSE;
+UPDATE acq.invoice SET complete = TRUE where close_date IS NOT NULL;
+UPDATE auditor.acq_invoice_history 
+    SET complete = TRUE where close_date IS NOT NULL;
+SET CONSTRAINTS ALL IMMEDIATE; -- or get pending triggers error.
+ALTER TABLE acq.invoice DROP COLUMN close_date, DROP COLUMN closed_by;
+ALTER TABLE auditor.acq_invoice_history
+    DROP COLUMN close_date, DROP COLUMN closed_by;
+SELECT auditor.update_auditors();
+
+*/
+
+
+SELECT evergreen.upgrade_deps_block_check('1129', :eg_version);
+
+INSERT into config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.grid.admin.acq.cancel_reason', 'gui', 'object',
+    oils_i18n_gettext (
+        'eg.grid.admin.acq.cancel_reason',
+        'Grid Config: admin.acq.cancel_reason',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.claim_event_type', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.claim_event_type',
+        'Grid Config: admin.acq.claim_event_type',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.claim_policy', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.claim_policy',
+        'Grid Config: admin.acq.claim_policy',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.claim_policy_action', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.claim_policy_action',
+        'Grid Config: admin.acq.claim_policy_action',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.claim_type', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.claim_type',
+        'Grid Config: admin.acq.claim_type',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.currency_type', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.currency_type',
+        'Grid Config: admin.acq.currency_type',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.edi_account', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.edi_account',
+        'Grid Config: admin.acq.edi_account',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.edi_message', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.edi_message',
+        'Grid Config: admin.acq.edi_message',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.exchange_rate', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.exchange_rate',
+        'Grid Config: admin.acq.exchange_rate',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.fund_tag', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.fund_tag',
+        'Grid Config: admin.acq.fund_tag',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.invoice_item_type', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.invoice_item_type',
+        'Grid Config: admin.acq.invoice_item_type',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.invoice_payment_method', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.invoice_payment_method',
+        'Grid Config: admin.acq.invoice_payment_method',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.lineitem_alert_text', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.lineitem_alert_text',
+        'Grid Config: admin.acq.lineitem_alert_text',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.acq.lineitem_marc_attr_definition', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.acq.lineitem_marc_attr_definition',
+        'Grid Config: admin.acq.lineitem_marc_attr_definition',
+        'cwst', 'label'
+    )
+);
+
+
+SELECT evergreen.upgrade_deps_block_check('1130', :eg_version);
+
+CREATE OR REPLACE FUNCTION actor.usr_merge( src_usr INT, dest_usr INT, del_addrs BOOLEAN, del_cards BOOLEAN, deactivate_cards BOOLEAN ) RETURNS VOID AS $$
+DECLARE
+	suffix TEXT;
+	bucket_row RECORD;
+	picklist_row RECORD;
+	queue_row RECORD;
+	folder_row RECORD;
+BEGIN
+
+    -- Bail if src_usr equals dest_usr because the result of merging a
+    -- user with itself is not what you want.
+    IF src_usr = dest_usr THEN
+        RETURN;
+    END IF;
+
+    -- do some initial cleanup 
+    UPDATE actor.usr SET card = NULL WHERE id = src_usr;
+    UPDATE actor.usr SET mailing_address = NULL WHERE id = src_usr;
+    UPDATE actor.usr SET billing_address = NULL WHERE id = src_usr;
+
+    -- actor.*
+    IF del_cards THEN
+        DELETE FROM actor.card where usr = src_usr;
+    ELSE
+        IF deactivate_cards THEN
+            UPDATE actor.card SET active = 'f' WHERE usr = src_usr;
+        END IF;
+        UPDATE actor.card SET usr = dest_usr WHERE usr = src_usr;
+    END IF;
+
+
+    IF del_addrs THEN
+        DELETE FROM actor.usr_address WHERE usr = src_usr;
+    ELSE
+        UPDATE actor.usr_address SET usr = dest_usr WHERE usr = src_usr;
+    END IF;
+
+    UPDATE actor.usr_note SET usr = dest_usr WHERE usr = src_usr;
+    -- dupes are technically OK in actor.usr_standing_penalty, should manually delete them...
+    UPDATE actor.usr_standing_penalty SET usr = dest_usr WHERE usr = src_usr;
+    PERFORM actor.usr_merge_rows('actor.usr_org_unit_opt_in', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('actor.usr_setting', 'usr', src_usr, dest_usr);
+
+    -- permission.*
+    PERFORM actor.usr_merge_rows('permission.usr_perm_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_object_perm_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_grp_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_work_ou_map', 'usr', src_usr, dest_usr);
+
+
+    -- container.*
+	
+	-- For each *_bucket table: transfer every bucket belonging to src_usr
+	-- into the custody of dest_usr.
+	--
+	-- In order to avoid colliding with an existing bucket owned by
+	-- the destination user, append the source user's id (in parenthesese)
+	-- to the name.  If you still get a collision, add successive
+	-- spaces to the name and keep trying until you succeed.
+	--
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.biblio_record_entry_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.biblio_record_entry_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.call_number_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.call_number_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.copy_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.copy_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.user_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.user_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	UPDATE container.user_bucket_item SET target_user = dest_usr WHERE target_user = src_usr;
+
+    -- vandelay.*
+	-- transfer queues the same way we transfer buckets (see above)
+	FOR queue_row in
+		SELECT id, name
+		FROM   vandelay.queue
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  vandelay.queue
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = queue_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    UPDATE vandelay.session_tracker SET usr = dest_usr WHERE usr = src_usr;
+
+    -- money.*
+    PERFORM actor.usr_merge_rows('money.collections_tracker', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('money.collections_tracker', 'collector', src_usr, dest_usr);
+    UPDATE money.billable_xact SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE money.billing SET voider = dest_usr WHERE voider = src_usr;
+    UPDATE money.bnm_payment SET accepting_usr = dest_usr WHERE accepting_usr = src_usr;
+
+    -- action.*
+    UPDATE action.circulation SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
+    UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
+    UPDATE action.usr_circ_history SET usr = dest_usr WHERE usr = src_usr;
+
+    UPDATE action.hold_request SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
+    UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
+    UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
+
+    UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.non_cataloged_circulation SET patron = dest_usr WHERE patron = src_usr;
+    UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.survey_response SET usr = dest_usr WHERE usr = src_usr;
+
+    -- acq.*
+    UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
+	UPDATE acq.fund_transfer SET transfer_user = dest_usr WHERE transfer_user = src_usr;
+    UPDATE acq.invoice SET closed_by = dest_usr WHERE closed_by = src_usr;
+
+	-- transfer picklists the same way we transfer buckets (see above)
+	FOR picklist_row in
+		SELECT id, name
+		FROM   acq.picklist
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  acq.picklist
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = picklist_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
+    UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.provider_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.provider_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.lineitem_usr_attr_definition SET usr = dest_usr WHERE usr = src_usr;
+
+    -- asset.*
+    UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
+
+    -- serial.*
+    UPDATE serial.record_entry SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE serial.record_entry SET editor = dest_usr WHERE editor = src_usr;
+
+    -- reporter.*
+    -- It's not uncommon to define the reporter schema in a replica 
+    -- DB only, so don't assume these tables exist in the write DB.
+    BEGIN
+    	UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+    	UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+    	UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.template_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.template_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.report_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.report_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.output_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.output_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+
+    -- propagate preferred name values from the source user to the
+    -- destination user, but only when values are not being replaced.
+    WITH susr AS (SELECT * FROM actor.usr WHERE id = src_usr)
+    UPDATE actor.usr SET 
+        pref_prefix = 
+            COALESCE(pref_prefix, (SELECT pref_prefix FROM susr)),
+        pref_first_given_name = 
+            COALESCE(pref_first_given_name, (SELECT pref_first_given_name FROM susr)),
+        pref_second_given_name = 
+            COALESCE(pref_second_given_name, (SELECT pref_second_given_name FROM susr)),
+        pref_family_name = 
+            COALESCE(pref_family_name, (SELECT pref_family_name FROM susr)),
+        pref_suffix = 
+            COALESCE(pref_suffix, (SELECT pref_suffix FROM susr))
+    WHERE id = dest_usr;
+
+    -- Copy and deduplicate name keywords
+    -- String -> array -> rows -> DISTINCT -> array -> string
+    WITH susr AS (SELECT * FROM actor.usr WHERE id = src_usr),
+         dusr AS (SELECT * FROM actor.usr WHERE id = dest_usr)
+    UPDATE actor.usr SET name_keywords = (
+        WITH keywords AS (
+            SELECT DISTINCT UNNEST(
+                REGEXP_SPLIT_TO_ARRAY(
+                    COALESCE((SELECT name_keywords FROM susr), '') || ' ' ||
+                    COALESCE((SELECT name_keywords FROM dusr), ''),  E'\\s+'
+                )
+            ) AS parts
+        ) SELECT ARRAY_TO_STRING(ARRAY_AGG(kw.parts), ' ') FROM keywords kw
+    ) WHERE id = dest_usr;
+
+    -- Finally, delete the source user
+    DELETE FROM actor.usr WHERE id = src_usr;
+
+END;
+$$ LANGUAGE plpgsql;
+
+
+SELECT evergreen.upgrade_deps_block_check('1131', :eg_version);
+
+CREATE OR REPLACE FUNCTION actor.usr_merge( src_usr INT, dest_usr INT, del_addrs BOOLEAN, del_cards BOOLEAN, deactivate_cards BOOLEAN ) RETURNS VOID AS $$
+DECLARE
+	suffix TEXT;
+	bucket_row RECORD;
+	picklist_row RECORD;
+	queue_row RECORD;
+	folder_row RECORD;
+BEGIN
+
+    -- Bail if src_usr equals dest_usr because the result of merging a
+    -- user with itself is not what you want.
+    IF src_usr = dest_usr THEN
+        RETURN;
+    END IF;
+
+    -- do some initial cleanup 
+    UPDATE actor.usr SET card = NULL WHERE id = src_usr;
+    UPDATE actor.usr SET mailing_address = NULL WHERE id = src_usr;
+    UPDATE actor.usr SET billing_address = NULL WHERE id = src_usr;
+
+    -- actor.*
+    IF del_cards THEN
+        DELETE FROM actor.card where usr = src_usr;
+    ELSE
+        IF deactivate_cards THEN
+            UPDATE actor.card SET active = 'f' WHERE usr = src_usr;
+        END IF;
+        UPDATE actor.card SET usr = dest_usr WHERE usr = src_usr;
+    END IF;
+
+
+    IF del_addrs THEN
+        DELETE FROM actor.usr_address WHERE usr = src_usr;
+    ELSE
+        UPDATE actor.usr_address SET usr = dest_usr WHERE usr = src_usr;
+    END IF;
+
+    UPDATE actor.usr_note SET usr = dest_usr WHERE usr = src_usr;
+    -- dupes are technically OK in actor.usr_standing_penalty, should manually delete them...
+    UPDATE actor.usr_standing_penalty SET usr = dest_usr WHERE usr = src_usr;
+    PERFORM actor.usr_merge_rows('actor.usr_org_unit_opt_in', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('actor.usr_setting', 'usr', src_usr, dest_usr);
+
+    -- permission.*
+    PERFORM actor.usr_merge_rows('permission.usr_perm_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_object_perm_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_grp_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_work_ou_map', 'usr', src_usr, dest_usr);
+
+
+    -- container.*
+	
+	-- For each *_bucket table: transfer every bucket belonging to src_usr
+	-- into the custody of dest_usr.
+	--
+	-- In order to avoid colliding with an existing bucket owned by
+	-- the destination user, append the source user's id (in parenthesese)
+	-- to the name.  If you still get a collision, add successive
+	-- spaces to the name and keep trying until you succeed.
+	--
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.biblio_record_entry_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.biblio_record_entry_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.call_number_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.call_number_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.copy_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.copy_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.user_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.user_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	UPDATE container.user_bucket_item SET target_user = dest_usr WHERE target_user = src_usr;
+
+    -- vandelay.*
+	-- transfer queues the same way we transfer buckets (see above)
+	FOR queue_row in
+		SELECT id, name
+		FROM   vandelay.queue
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  vandelay.queue
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = queue_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    UPDATE vandelay.session_tracker SET usr = dest_usr WHERE usr = src_usr;
+
+    -- money.*
+    PERFORM actor.usr_merge_rows('money.collections_tracker', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('money.collections_tracker', 'collector', src_usr, dest_usr);
+    UPDATE money.billable_xact SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE money.billing SET voider = dest_usr WHERE voider = src_usr;
+    UPDATE money.bnm_payment SET accepting_usr = dest_usr WHERE accepting_usr = src_usr;
+
+    -- action.*
+    UPDATE action.circulation SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
+    UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
+    UPDATE action.usr_circ_history SET usr = dest_usr WHERE usr = src_usr;
+
+    UPDATE action.hold_request SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
+    UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
+    UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
+
+    UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.non_cataloged_circulation SET patron = dest_usr WHERE patron = src_usr;
+    UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.survey_response SET usr = dest_usr WHERE usr = src_usr;
+
+    -- acq.*
+    UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
+	UPDATE acq.fund_transfer SET transfer_user = dest_usr WHERE transfer_user = src_usr;
+    UPDATE acq.invoice SET closed_by = dest_usr WHERE closed_by = src_usr;
+
+	-- transfer picklists the same way we transfer buckets (see above)
+	FOR picklist_row in
+		SELECT id, name
+		FROM   acq.picklist
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  acq.picklist
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = picklist_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
+    UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.provider_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.provider_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.lineitem_usr_attr_definition SET usr = dest_usr WHERE usr = src_usr;
+
+    -- asset.*
+    UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
+
+    -- serial.*
+    UPDATE serial.record_entry SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE serial.record_entry SET editor = dest_usr WHERE editor = src_usr;
+
+    -- reporter.*
+    -- It's not uncommon to define the reporter schema in a replica 
+    -- DB only, so don't assume these tables exist in the write DB.
+    BEGIN
+    	UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+    	UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+    	UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.template_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.template_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.report_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.report_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.output_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.output_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+
+    -- propagate preferred name values from the source user to the
+    -- destination user, but only when values are not being replaced.
+    WITH susr AS (SELECT * FROM actor.usr WHERE id = src_usr)
+    UPDATE actor.usr SET 
+        pref_prefix = 
+            COALESCE(pref_prefix, (SELECT pref_prefix FROM susr)),
+        pref_first_given_name = 
+            COALESCE(pref_first_given_name, (SELECT pref_first_given_name FROM susr)),
+        pref_second_given_name = 
+            COALESCE(pref_second_given_name, (SELECT pref_second_given_name FROM susr)),
+        pref_family_name = 
+            COALESCE(pref_family_name, (SELECT pref_family_name FROM susr)),
+        pref_suffix = 
+            COALESCE(pref_suffix, (SELECT pref_suffix FROM susr))
+    WHERE id = dest_usr;
+
+    -- Copy and deduplicate name keywords
+    -- String -> array -> rows -> DISTINCT -> array -> string
+    WITH susr AS (SELECT * FROM actor.usr WHERE id = src_usr),
+         dusr AS (SELECT * FROM actor.usr WHERE id = dest_usr)
+    UPDATE actor.usr SET name_keywords = (
+        WITH keywords AS (
+            SELECT DISTINCT UNNEST(
+                REGEXP_SPLIT_TO_ARRAY(
+                    COALESCE((SELECT name_keywords FROM susr), '') || ' ' ||
+                    COALESCE((SELECT name_keywords FROM dusr), ''),  E'\\s+'
+                )
+            ) AS parts
+        ) SELECT ARRAY_TO_STRING(ARRAY_AGG(kw.parts), ' ') FROM keywords kw
+    ) WHERE id = dest_usr;
+
+    -- Finally, delete the source user
+    DELETE FROM actor.usr WHERE id = src_usr;
+
+END;
+$$ LANGUAGE plpgsql;
+
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('1132', :eg_version); -- remingtron/csharp
+
+-- fix two typo/pasto's in setting descriptions
+UPDATE config.org_unit_setting_type
+SET description = oils_i18n_gettext(
+	'circ.copy_alerts.forgive_fines_on_long_overdue_checkin',
+	'Controls whether fines are automatically forgiven when checking out an '||
+	'item that has been marked as long-overdue, and the corresponding copy alert has been '||
+	'suppressed.',
+	'coust', 'description'
+)
+WHERE NAME = 'circ.copy_alerts.forgive_fines_on_long_overdue_checkin';
+
+UPDATE config.org_unit_setting_type
+SET description = oils_i18n_gettext(
+	'circ.longoverdue.xact_open_on_zero',
+	'Leave transaction open when long-overdue balance equals zero.  ' ||
+	'This leaves the long-overdue copy on the patron record when it is paid',
+	'coust', 'description'
+)
+WHERE NAME = 'circ.longoverdue.xact_open_on_zero';
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1133', :eg_version);
+
+/* 
+Unique indexes are not inherited by child tables, so they will not prevent
+duplicate inserts on action.transit_copy and action.hold_transit_copy,
+for example.  Use check constraints instead to enforce unique-per-copy
+transits accross all transit types.
+*/
+
+-- Create an index for speedy check constraint lookups.
+CREATE INDEX active_transit_for_copy 
+    ON action.transit_copy (target_copy)
+    WHERE dest_recv_time IS NULL AND cancel_time IS NULL;
+
+-- Check for duplicate transits across all transit types
+CREATE OR REPLACE FUNCTION action.copy_transit_is_unique() 
+    RETURNS TRIGGER AS $func$
+BEGIN
+    PERFORM * FROM action.transit_copy 
+        WHERE target_copy = NEW.target_copy 
+              AND dest_recv_time IS NULL 
+              AND cancel_time IS NULL;
+    IF FOUND THEN
+        RAISE EXCEPTION 'Copy id=% is already in transit', NEW.target_copy;
+    END IF;
+    RETURN NULL;
+END;
+$func$ LANGUAGE PLPGSQL STABLE;
+
+-- Apply constraint to all transit tables
+CREATE CONSTRAINT TRIGGER transit_copy_is_unique_check
+    AFTER INSERT ON action.transit_copy
+    FOR EACH ROW EXECUTE PROCEDURE action.copy_transit_is_unique();
+
+CREATE CONSTRAINT TRIGGER hold_transit_copy_is_unique_check
+    AFTER INSERT ON action.hold_transit_copy
+    FOR EACH ROW EXECUTE PROCEDURE action.copy_transit_is_unique();
+
+CREATE CONSTRAINT TRIGGER reservation_transit_copy_is_unique_check
+    AFTER INSERT ON action.reservation_transit_copy
+    FOR EACH ROW EXECUTE PROCEDURE action.copy_transit_is_unique();
+
+/*
+-- UNDO
+DROP TRIGGER transit_copy_is_unique_check ON action.transit_copy;
+DROP TRIGGER hold_transit_copy_is_unique_check ON action.hold_transit_copy;
+DROP TRIGGER reservation_transit_copy_is_unique_check ON action.reservation_transit_copy;
+DROP INDEX action.active_transit_for_copy;
+*/
+
+
+COMMIT;
+
+\qecho A unique constraint was applied to action.transit_copy.  This will
+\qecho only effect newly created transits.  Admins are encouraged to manually 
+\qecho remove any existing duplicate transits by applying values for cancel_time
+\qecho or dest_recv_time, or by deleting the offending transits. Below is a
+\qecho query to locate duplicate transits.  Note dupes may exist accross
+\qecho parent (action.transit_copy) and child tables (action.hold_transit_copy,
+\qecho action.reservation_transit_copy)
+\qecho 
+\qecho    WITH dupe_transits AS (
+\qecho        SELECT COUNT(*), target_copy FROM action.transit_copy
+\qecho        WHERE dest_recv_time IS NULL AND cancel_time IS NULL
+\qecho        GROUP BY 2 HAVING COUNT(*) > 1
+\qecho    ) SELECT atc.* 
+\qecho        FROM dupe_transits
+\qecho        JOIN action.transit_copy atc USING (target_copy)
+\qecho        WHERE dest_recv_time IS NULL AND cancel_time IS NULL;
+\qecho
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 b2b87b6..0e48965 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_3_2_0</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..43db7d0 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_3_2_0");
 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..ed4c4fe 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 "3.2"
 !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 1ee2103..0000000
--- a/README
+++ /dev/null
@@ -1 +0,0 @@
-docs/installation/server_installation.adoc
\ No newline at end of file
diff --git a/README b/README
new file mode 100644
index 0000000..8b81d35
--- /dev/null
+++ b/README
@@ -0,0 +1,647 @@
+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 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**: The minimum supported version is 9.4.
+  * **Linux**: Evergreen has been tested on Debian Stretch (9), 
+    Debian Jessie (8), Ubuntu Xenial Xerus (16.04), and Ubuntu
+    Trusty Tahr (14.04).
+    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 or Ubuntu websites.
+  * **OpenSRF**: The minimum supported version of OpenSRF is 3.0.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 (3.0.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.4+ from external
+   repositories.
++
+  * Ubuntu (Trusty) comes with an older version of PostgreSQL, so
+    steps are taken to automatically utilize the PostgreSQL
+    community's apt sources.
+    (For complete details, see: https://wiki.postgresql.org/wiki/Apt)
+  * Debian (Jessie/Stretch) and Ubuntu (Xenial) comes with PostgreSQL 9.4+,
+    so no additional steps are required.
++
+3. Issue the following commands as the *root* Linux account to install
+   prerequisites using the `Makefile.install` prerequisite installer,
+   substituting `debian-stretch`, `debian-jessie`,`ubuntu-xenial`,
+   or `ubuntu-trusty` for <osname> below:
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>
+------------------------------------------------------------------------------
++
+4. 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 retrieving and managing web dependencies,
+   use the <osname>-developer Makefile.install target.  Currently, 
+   this is only needed for building and installing the web
+   staff client.
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>-developer
+------------------------------------------------------------------------------
++
+ * To install packages required for building Evergreen translations, use
+   the <osname>-translator Makefile.install target.
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>-translator
+------------------------------------------------------------------------------
++
+ * 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
+------------------------------------------------------------------------------
+
+Extra steps for web staff client
+--------------------------------
+
+[NOTE]
+Skip this entire section if you are using an official release tarball downloaded
+from http://evergreen-ils.org/downloads
+
+Install dependencies for web staff client
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+[NOTE]
+You may skip this section if you have installed the
+<<optional_developer_additions,optional developer additions>>.  You will still need to do the following
+steps in <<install_files_for_web_staff_client,Install files for web staff client>>.
+
+1. Install the long-term stability (LTS) release of
+https://nodejs.org[Node.js]. Add the Node.js `/bin` directory to your
+environment variable `PATH`.
+
+[[install_files_for_web_staff_client]]
+Install AngularJS files for web 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 JS dependencies
+------------------------------------------------------------------------------
++
+3. Run the build script.
++
+[source,sh]
+------------------------------------------------------------------------------
+# build, run tests, concat+minify
+npm run build-prod
+npm run test
+------------------------------------------------------------------------------
+
+[[install_files_for_angular_web_staff_client]]
+Install Angular files for web staff client
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1. Building, Testing, Minification: The remaining steps all take place within
+   the Angular staff root:
++
+[source,sh]
+------------------------------------------------------------------------------
+cd $EVERGREEN_ROOT/Open-ILS/src/eg2/
+------------------------------------------------------------------------------
++
+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 JS dependencies
+------------------------------------------------------------------------------
++
+3. Run the build script.
++
+[source,sh]
+------------------------------------------------------------------------------
+# build and run tests
+ng build --prod
+npm run test
+------------------------------------------------------------------------------
+
+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 and copy
+   example configuration files to `/openils/conf`.
++
+[source, bash]
+------------------------------------------------------------------------------
+make install
+------------------------------------------------------------------------------
+
+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
+------------------------------------------------------------------------------
+
+Run ldconfig
+------------
+
+On Debian Stretch, run the following command as the root user:
+
+[source, bash]
+------------------------------------------------------------------------------
+ldconfig
+------------------------------------------------------------------------------
+
+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
+-------------------------------
+
+. Use the example configuration files to configure your Web server for 
+the Evergreen catalog, web staff client, Web services, and administration
+interfaces. Issue the following commands as the *root* Linux account:
++
+[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_24/eg_startup    	/etc/apache2/
+# Now set up SSL
+mkdir /etc/apache2/ssl
+cd /etc/apache2/ssl
+------------------------------------------------------------------------------------
++
+. 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
+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
+------------------------------------------------------------------------------
++
+. 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):
+     * Replace `Require host 10.0.0.0/8` with `Require all granted`
+. Change the user for the Apache server.
+  * As the *root* Linux account, edit
+    `/etc/apache2/envvars`.  Change `export APACHE_RUN_USER=www-data` to 
+    `export APACHE_RUN_USER=opensrf`.
+. As the *root* Linux account, configure Apache with KeepAlive settings
+  appropriate for Evergreen. Higher values can improve the performance of a
+  single client by allowing multiple requests to be sent over the same TCP
+  connection, but increase the risk of using up all available Apache child
+  processes and memory.
+  * Edit `/etc/apache2/apache2.conf`.
+    a. Change `KeepAliveTimeout` to `1`.
+    b. Change `MaxKeepAliveRequests` to `100`.
+. As the *root* Linux account, configure the prefork module to start and keep
+  enough Apache servers available to provide quick responses to clients without
+  running out of memory. The following settings are a good starting point for a
+  site that exposes the default Evergreen catalogue to the web:
++
+.`/etc/apache2/mods-available/mpm_prefork.conf`
+[source,bash]
+------------------------------------------------------------------------------
+<IfModule mpm_prefork_module>
+   StartServers            15
+   MinSpareServers          5
+   MaxSpareServers         15
+   MaxRequestWorkers       75
+   MaxConnectionsPerChild 500
+</IfModule>
+------------------------------------------------------------------------------
++
+. As the *root* user, enable the mpm_prefork module:
++
+[source,bash]
+------------------------------------------------------------------------------
+a2dismod mpm_event
+a2enmod mpm_prefork
+------------------------------------------------------------------------------
++
+. As the *root* Linux account, enable the Evergreen site:
++
+[source,bash]
+------------------------------------------------------------------------------
+a2dissite 000-default  # OPTIONAL: disable the default site (the "It Works" page)
+a2ensite eg.conf
+------------------------------------------------------------------------------
++
+. 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
+------------------------------------------------------------------------------
+
+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 <<_creating_the_evergreen_database,Creating the Evergreen
+database>>, sets the database connection information in `opensrf.xml` for you.
+
+Configure action triggers for the Evergreen application
+-------------------------------------------------------
+_Action Triggers_ provide hooks for the system to perform actions when a given
+event occurs; for example, to generate reminder or overdue notices, the
+`checkout.due` hook is processed and events are triggered for potential actions
+if there is no checkin time.
+
+To enable the default set of hooks, issue the following command as the
+*opensrf* Linux account:
+
+[source, bash]
+------------------------------------------------------------------------------
+cp -b /openils/conf/action_trigger_filters.json.example /openils/conf/action_trigger_filters.json
+------------------------------------------------------------------------------
+
+For more information about configuring and running action triggers, see
+<<_processing_action_triggers,Notifications / Action Triggers>>.
+
+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:
+
+. 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-stretch
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-jessie
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-trusty
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-xenial
+------------------------------------------------------------------------------
+
+For a standalone PostgreSQL server, install the following Perl modules for your
+distribution as the *root* Linux account:
+
+.(Debian and Ubuntu) 
+No extra modules required for these distributions.
+
+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.
+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.4 and later
+^^^^^^^^^^^^^^^^^^^^^^^^
+To create the database instance on a remote database server running PostgreSQL
+9.4 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 web 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 web 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 dacb5a3..fd69d57 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, 3.2.0, open-ils-dev at list.georgialibraries.org)
+AM_INIT_AUTOMAKE([OpenILS], [3.2.0])
 AC_REVISION($Revision: 0.1 $)
 AC_CONFIG_SRCDIR([configure.ac])
 AC_CONFIG_SUBDIRS([Open-ILS/xul/staff_client/external/libmar])

commit 6c0fc5ebb4a542b13d22d0c45dfaa371719d4c08
Author: Mike Rylander <mrylander at gmail.com>
Date:   Mon Aug 27 12:08:37 2018 -0400

    LP#1786987: Locale-less org tree cache object becomes stale
    
    The autogen.sh script calls a function that flushes all org tree objects
    cached by locale, but does not flush the one used when the locale is
    unkown.  This commit forces that flushing to occur.
    
    berick: Definition of my $cache pushed up above first use.
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>
    Signed-off-by: Bill Erickson <berickxx at gmail.com>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Utils/Configure.pm b/Open-ILS/src/perlmods/lib/OpenILS/Utils/Configure.pm
index 4bd5b3a..351a129 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Utils/Configure.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Utils/Configure.pm
@@ -88,9 +88,12 @@ sub org_tree_js {
     # Get our list of locales
     my $locales = get_locales();
 
+    # Remove the no-locale copy
+    my $cache = OpenSRF::Utils::Cache->new;
+    $cache->delete_cache("orgtree.");
+
     foreach my $locale (@$locales) {
         warn "removing OrgTree from the cache for locale " . $locale->code . "...\n";
-        my $cache = OpenSRF::Utils::Cache->new;
         $cache->delete_cache("orgtree.".$locale->code);
 
         # fetch the org_unit's and org_unit_type's

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


hooks/post-receive
-- 
Evergreen ILS




More information about the open-ils-commits mailing list