[open-ils-commits] [GIT] Evergreen ILS branch tags/rel_2_5_beta1 created. 7339cbe034423e18aed1bbe7bb7c7536213d5b2f

Evergreen Git git at git.evergreen-ils.org
Fri Sep 27 10:56:01 EDT 2013


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

The branch, tags/rel_2_5_beta1 has been created
        at  7339cbe034423e18aed1bbe7bb7c7536213d5b2f (commit)

- Log -----------------------------------------------------------------
commit 7339cbe034423e18aed1bbe7bb7c7536213d5b2f
Author: Dan Wells <dbw2 at calvin.edu>
Date:   Thu Sep 26 19:33:57 2013 -0400

    Bumping version numbers and adding upgrade bits
    
    Including release notes, changelog, and upgrade script.
    
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>

diff --git a/ChangeLog b/ChangeLog
index 1f72b2c..784359a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10088 @@
-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 a1b9fe7e2a53483cfffbc7c8e24125cd446d03ab
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Sep 26 19:21:43 2013 -0400
+
+    Bump OpenILS.pm version
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS.pm
+
+commit ee61da7776acaa528cf31dbc57968ef76fb06bc8
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Sep 26 19:30:17 2013 -0400
+
+    Move 'floating groups' release note docs
+    
+    Not sure if this is the best place, but it seems like a better
+    place.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+122	0	docs/RELEASE_NOTES_NEXT/Circulation/floating_groups.txt
+0	122	docs/floating_groups.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/floating_groups.txt
+ delete mode 100644 docs/floating_groups.txt
+
+commit a9c36eeabdc98ad0ffb1a9058d84934c8c9ebb8e
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Sep 26 18:59:00 2013 -0400
+
+    Translation updates - fix Finnish translator email
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	build/i18n/po/AutoFieldWidget.js/fi-FI.po
+1	1	build/i18n/po/Searcher.js/fi-FI.po
+1	1	build/i18n/po/TranslatorPopup.js/fi-FI.po
+1	1	build/i18n/po/User.js/fi-FI.po
+1	1	build/i18n/po/XULTermLoader.js/fi-FI.po
+1	1	build/i18n/po/admin.properties/fi-FI.po
+1	1	build/i18n/po/auth.properties/fi-FI.po
+1	1	build/i18n/po/authority.js/fi-FI.po
+1	1	build/i18n/po/capture.js/fi-FI.po
+1	1	build/i18n/po/cat.properties/fi-FI.po
+1	1	build/i18n/po/circ.properties/fi-FI.po
+1	1	build/i18n/po/common.properties/fi-FI.po
+1	1	build/i18n/po/conify.js/fi-FI.po
+1	1	build/i18n/po/db.seed/fi-FI.po
+1	1	build/i18n/po/fm_IDL.dtd/fi-FI.po
+1	1	build/i18n/po/ils_events.xml/fi-FI.po
+1	1	build/i18n/po/lang.dtd/fi-FI.po
+1	1	build/i18n/po/offline.properties/fi-FI.po
+1	1	build/i18n/po/opac.dtd/fi-FI.po
+1	1	build/i18n/po/opac.js/fi-FI.po
+1	1	build/i18n/po/patron.properties/fi-FI.po
+1	1	build/i18n/po/pickup_and_return.js/fi-FI.po
+1	1	build/i18n/po/pull_list.js/fi-FI.po
+1	1	build/i18n/po/register.js/fi-FI.po
+1	1	build/i18n/po/reports.dtd/fi-FI.po
+1	1	build/i18n/po/reports.js/fi-FI.po
+1	1	build/i18n/po/reservation.js/fi-FI.po
+1	1	build/i18n/po/selfcheck.js/fi-FI.po
+1	1	build/i18n/po/serial.properties/fi-FI.po
+
+commit 8c7c9eec71705a75219e736ba3c8c6684fbf0a41
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Sep 26 18:57:18 2013 -0400
+
+    Translation updates - newpot
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+13	9	build/i18n/po/acq.js/acq.js.pot
+6	12	build/i18n/po/cat.properties/cat.properties.pot
+20	2	build/i18n/po/circ.properties/circ.properties.pot
+10	2	build/i18n/po/common.properties/common.properties.pot
+9503	2610	build/i18n/po/db.seed/db.seed.pot
+2632	2439	build/i18n/po/fm_IDL.dtd/fm_IDL.dtd.pot
+264	252	build/i18n/po/ils_events.xml/ils_events.xml.pot
+822	10	build/i18n/po/lang.dtd/lang.dtd.pot
+4	9	build/i18n/po/match_set.js/match_set.js.pot
+5	1	build/i18n/po/offline.properties/offline.properties.pot
+16	7	build/i18n/po/patron.properties/patron.properties.pot
+19	15	build/i18n/po/register.js/register.js.pot
+38	22	build/i18n/po/selfcheck.js/selfcheck.js.pot
+9	1	build/i18n/po/serial.properties/serial.properties.pot
+524	340	build/i18n/po/tpac/tpac.pot
+
+commit b4cc2ba841e2cc4b393247528bfe598efd556277
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Sep 26 18:09:56 2013 -0400
+
+    Translation updates - po files
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	5	build/i18n/po/Searcher.js/es-ES.po
+4	4	build/i18n/po/cat.properties/cs-CZ.po
+6	4	build/i18n/po/circ.properties/cs-CZ.po
+4	4	build/i18n/po/common.properties/cs-CZ.po
+8	8	build/i18n/po/conify.js/cs-CZ.po
+32	32	build/i18n/po/fm_IDL.dtd/cs-CZ.po
+7	4	build/i18n/po/ils_events.xml/cs-CZ.po
+66	65	build/i18n/po/lang.dtd/cs-CZ.po
+22	21	build/i18n/po/lang.dtd/es-ES.po
+4	4	build/i18n/po/offline.properties/cs-CZ.po
+4	4	build/i18n/po/patron.properties/cs-CZ.po
+6	6	build/i18n/po/serial.properties/cs-CZ.po
+
+commit e5eccfe2e032c3d1e5fe4c17833a5993ee3b8bf3
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Thu Sep 26 11:42:23 2013 -0400
+
+    Add apache config examples for AC by record id
+    
+    Add apache (and apache 2.4) config examples for added content by
+    record id, update release notes to call out changes.
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/examples/apache/eg.conf.in
+4	0	Open-ILS/examples/apache/eg_vhost.conf.in
+1	0	Open-ILS/examples/apache_24/eg.conf.in
+4	0	Open-ILS/examples/apache_24/eg_vhost.conf.in
+23	0	docs/RELEASE_NOTES_NEXT/OPAC/added_content_by_record_id.txt
+
+commit cc905f44bb5a64c91257160b66a261f4196e273e
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Thu Sep 26 11:16:43 2013 -0400
+
+    Add release notes for AC by record id
+    
+    Add release notes for Added Content by record ID.
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+30	0	docs/RELEASE_NOTES_NEXT/OPAC/added_content_by_record_id.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/added_content_by_record_id.txt
+
+commit 07e649049603a0b1e8227ab1b43c50b7efb8afe4
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Thu Sep 19 16:33:01 2013 -0400
+
+    Show jacket on record page even when no isbn/upc
+    
+    Show jacket image on record details page even when there is no isbn
+    or upc found -- because we may have an ISSN or local override image.
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+0	2	Open-ILS/src/templates/opac/parts/record/summary.tt2
+
+commit 9c0ea8aee0eb8cc38616674c97b5144a57761502
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Thu Sep 19 14:17:33 2013 -0400
+
+    Add ISSN support to Syndetic AC handler
+    
+    Add ISSN support to OpenILS::WWW::AddedContent::Syndetic added
+    content handler to take advantage of new support from upstream
+    provider.
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/src/extras/install/Makefile.debian-squeeze
+1	0	Open-ILS/src/extras/install/Makefile.debian-wheezy
+1	0	Open-ILS/src/extras/install/Makefile.fedora
+1	0	Open-ILS/src/extras/install/Makefile.ubuntu-lucid
+1	0	Open-ILS/src/extras/install/Makefile.ubuntu-precise
+1	0	Open-ILS/src/perlmods/Build.PL
+19	3	Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent.pm
+6	4	Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent/Syndetic.pm
+
+commit 83d198ae340b563b7573ecf89136b32141a82079
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Thu Sep 19 14:12:43 2013 -0400
+
+    Add method to permit AC handler to expect keyhash
+    
+    Add an expects_keyhash method to
+    OpenILS::WWW::AddedContent::Syndetic and look for it from
+    OpenILS::WWW::AddedContent. This allows us to pass a keyhash
+    (containing isbn/upc/whatever) to this handler while still passing a
+    simple scalar containing an ISBN to other AddedContent handlers.
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+7	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent.pm
+4	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent/Syndetic.pm
+
+commit b69ffb6a8377282d9e1978bb732c439c28cdec1a
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Thu Sep 19 11:17:27 2013 -0400
+
+    Teach TPAC and selfcheck jackets by record ID
+    
+    Teach TPAC and web-based selfcheck to display jackets by record ID.
+    
+    Not covered yet: KPAC (uses a non-1x1 placeholder at this time) and
+    Acq (where we don't always have a bre.id).
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	4	Open-ILS/src/templates/opac/parts/record/cnbrowse.tt2
+2	2	Open-ILS/src/templates/opac/parts/record/summary.tt2
+2	3	Open-ILS/src/templates/opac/parts/result/table.tt2
+3	3	Open-ILS/web/js/ui/default/circ/selfcheck/selfcheck.js
+
+commit 8b39a8c67ae2dd3239c86092ec40b56566b0683a
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Sat Apr 28 18:18:34 2012 -0400
+
+    Teach OPAC (jspac) jacket images by record id
+    
+    Teach the Javascript OPAC how to retrieve jacket images by
+    record id.
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+11	0	Open-ILS/web/opac/common/js/added_content.js
+1	1	Open-ILS/web/opac/skin/default/js/cn_browse.js
+6	4	Open-ILS/web/opac/skin/default/js/rdetail.js
+2	2	Open-ILS/web/opac/skin/default/js/result_common.js
+
+commit 8507b5439b0173da93b83d31c58c80cd14c1974e
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Sat Apr 28 18:16:30 2012 -0400
+
+    Removed unused, commented-out function
+    
+    Removed unused, commented-out function: an earlier iteration of
+    buildISBNSrc
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+0	6	Open-ILS/web/opac/common/js/opac_utils.js
+
+commit ded73fbb94ee4290a2e9f2a0080d00233d21f9a8
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Sat Apr 28 17:24:06 2012 -0400
+
+    Teach Syndetic.pm to pass UPC in requests
+    
+    Teach OpenILS::WWW::AddedContent::Syndetic to pass UPC when
+    requesting added content from the source.
+    
+    Protect against warnings when no isbn/upc provided
+    
+    Protect against Perl giving us uninitialized value warnings when
+    isbn or upc has not been provided.
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+4	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent/Syndetic.pm
+
+commit ff0b3542d3f7e71157a135890a835b335bd3b7eb
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Wed Apr 25 04:23:28 2012 -0400
+
+    Finish Added Content by record ID
+    
+    OpenILS::WWW::AddedContent now supports fetching content by record ID.
+    
+    To start, this lets us request content in a way that uses both ISBN
+    and UPC as keys, assuming the AC handler and provider support it.
+    
+    The previous method of requesting AC data continues to be
+    supported, and should be unaffected.
+    
+    Business::ISBN is used to clean ISBN values when fetching by record ID
+    
+    If we find no valid ISBN and no UPC values in the record,
+    do not attempt to call an AC handler. This will need
+    to change when we have AC handlers that rely on other
+    possible keys.
+    
+    Attempt to serve from cache before fetching keys from the bib
+    record in the database.
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+66	24	Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent.pm
+13	8	Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent/Syndetic.pm
+
+commit 7d26505c6b7052770032816f1197cf5d45cf8471
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Apr 27 11:42:58 2011 -0400
+
+    Start of AC by record ID from 2011 hackfest
+    
+    Rough, untested cut. use rec id as they added content key;
+    fetch isbn/upc from full_rec; push full set of isbns and upcs
+    down to handler code
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+53	10	Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent.pm
+
+commit 323b18540069cd7e2755377ccda77937e9b492ee
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Sep 26 13:53:25 2013 -0400
+
+    Fix doc typo in public interface setup section
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+2	2	docs/admin_initial_setup/designing_your_catalog.txt
+
+commit a833b349f6a5d9960eff787e8c719dc6ab163c65
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Sep 26 13:45:08 2013 -0400
+
+    Clean up minor doc problems
+    
+    "Content Café" would generate a section ID containing "é" which is not
+    well-formed XML; that was breaking PDF generation. Provide an explicit
+    ID for the section in question.
+    
+    The OPAC advanced features section skipped a level of headings, which
+    generated a warning during PDF processing.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+1	0	docs/admin_initial_setup/designing_your_catalog.txt
+3	3	docs/opac/advanced_features.txt
+
+commit 639d4352e3928488dee28d46b19c8dbe2f5465d9
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Sep 26 13:19:10 2013 -0400
+
+    Include auth browse docs in OPAC section
+    
+    Also fix a typo in the section title.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+2	2	docs/opac/authority_enhanced_browse.txt
+2	0	docs/root.txt
+
+commit e1e4198e79cd123181f92c9409f45573bacba92b
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu Sep 26 13:07:25 2013 -0400
+
+    Numbering upgrade script for auth-only-bib-auth-browse-signoff
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+989	0	Open-ILS/src/sql/Pg/upgrade/0837.schema.browse-auth-linking.plus-joiner.sql
+0	989	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.browse-auth-linking.plus-joiner.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0837.schema.browse-auth-linking.plus-joiner.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.browse-auth-linking.plus-joiner.sql
+
+commit 96e1a74b50f4ce5c84b6366e0a5b0ae4add36d40
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 20 11:15:34 2013 -0400
+
+    Some release notes for browse enhancements
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+25	0	docs/opac/authority_enhanced_browse.txt
+ create mode 100644 docs/opac/authority_enhanced_browse.txt
+
+commit d3b65482772825f1c19f0f5649dc5d8fbf75c5e9
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu May 23 14:51:27 2013 -0400
+
+    Bi-directional authority enhanced bib browse
+    
+    This functionality extends the work committed as the following set:
+    
+    e071eb91a40d3871bc0e0a078b88cfdde7ba3b5e Finish stamping for bib record browser
+    c7bad82a66554251b8a0f636e629fe98680b7765 Stamping upgrade scripts for bib record browser
+    32ec20b71540b1230ecc15f1aec95059e044499e Fix problem where basic search bar was flush with left edge of page
+    256b4d24240332ae3fd2a5cc14b1709c90f18d05 Fix issues with multiple divs having the search-wrapper id.
+    cfc828d832ecee92478466cd2f4e174c2f4b5c3c OPAC Browse: bugfixes squashed together from LP #1177810
+    6990fd819c0dae385c3cc7a40d39a0ebed91086c Break up expensive queries, match index to quals
+    c0dea517395c733b77e8eb219d2c3f43f6098d42 OPAC Browse: some squashed commits from LP #1177810
+    9d37f6890ce6b591d62972ce3e341cecf7c45535 Fix problem with YYYY.schema.bib-auth-browse.sql.
+    e710ecbee519d374bcf69b0c535c3f83814c782b Bib record browser with 'see also', etc from linked authority headings
+    d2f4cac923668ff05854ffc9720cafe514b9b71c Link browse entries to authority record when possible
+    3eb616e56c82a5106e14f5a446f1d875015db7f0 Inter-authority linking
+    
+    With this, we enhance the browse method to allow the return of authority-only
+    terms (that is, main entries not used by a bib record) if the authority record
+    from which the term comes is linked to another authority record via the
+    mechanism created by 3eb616e5, and that linked authority record is itself in
+    use by visible bibliographic records.
+    
+    In order to accomplish this we:
+     * extend normalization of both bib and auth records to allow a custom string
+       to be used when joining parts of a term (for instance, joining subject
+       components with " -- ")
+     * cause authority headings to be including in the unique set of values
+       captured by metabib.browse_entry during authority ingest
+     * link authority-heading derived browse entries to their authority-indexed
+       counterparts
+     * extend the metabib.browse() stored procedure (and related) to inspect
+       authority-linked browse entries
+     * extend bibliographic-visiblity testing to cover those bibliographic records
+       in use by remote-linked authority records.
+     * generate browse links between headings found to be appropriately linked
+       and bibliographically in-use and visible
+    
+    The addition of this functionality will require, in the least, reingest of
+    all authority records, and would benefit from reingest of bibliographic
+    records as well, as ingest has been improved and extended.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+44	0	Open-ILS/examples/fm_IDL.xml
+50	35	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Browse.pm
+1	0	Open-ILS/src/sql/Pg/002.schema.config.sql
+70	18	Open-ILS/src/sql/Pg/011.schema.authority.sql
+210	71	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+56	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+27	2	Open-ILS/src/sql/Pg/999.functions.global.sql
+989	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.browse-auth-linking.plus-joiner.sql
+53	17	Open-ILS/src/templates/opac/browse.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.browse-auth-linking.plus-joiner.sql
+
+commit c3a805e5271d28723b9e4120bc52e0446add4040
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Sep 26 12:53:01 2013 -0400
+
+    Stamping upgrade for floating groups
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+88	0	Open-ILS/src/sql/Pg/upgrade/0836.schema.floating_groups.sql
+0	82	Open-ILS/src/sql/Pg/upgrade/XXXX.floating_groups.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0836.schema.floating_groups.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.floating_groups.sql
+
+commit 2307d455215e452bc4d071fb7b07ef591410f350
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Wed Apr 18 22:03:16 2012 -0400
+
+    Floating Groups
+    
+    Convert the floating bool to a link to floating groups.
+    
+    Each group contains zero or more members that define how copies can float.
+    
+    See the included documentation file for an overview.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+47	4	Open-ILS/examples/fm_IDL.xml
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+16	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+2	2	Open-ILS/src/sql/Pg/040.schema.asset.sql
+51	0	Open-ILS/src/sql/Pg/120.floating_groups.sql
+4	0	Open-ILS/src/sql/Pg/800.fkeys.sql
+5	2	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+1	0	Open-ILS/src/sql/Pg/sql_file_manifest
+82	0	Open-ILS/src/sql/Pg/upgrade/XXXX.floating_groups.sql
+59	0	Open-ILS/src/templates/conify/global/config/floating_groups.tt2
+197	0	Open-ILS/web/js/ui/default/conify/global/config/floating_groups.js
+3	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+21	0	Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js
+1	0	Open-ILS/xul/staff_client/chrome/content/main/constants.js
+4	0	Open-ILS/xul/staff_client/chrome/content/main/menu.js
+4	0	Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul
+1	0	Open-ILS/xul/staff_client/chrome/locale/en-US/offline.properties
+2	2	Open-ILS/xul/staff_client/server/cat/copy_editor.js
+1	1	Open-ILS/xul/staff_client/server/circ/alternate_copy_summary.js
+15	0	Open-ILS/xul/staff_client/server/circ/checkin.js
+4	0	Open-ILS/xul/staff_client/server/circ/checkin_overlay.xul
+7	3	Open-ILS/xul/staff_client/server/circ/util.js
+1	2	Open-ILS/xul/staff_client/server/locale/en-US/cat.properties
+1	0	Open-ILS/xul/staff_client/server/skin/circ.css
+122	0	docs/floating_groups.txt
+ create mode 100644 Open-ILS/src/sql/Pg/120.floating_groups.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.floating_groups.sql
+ create mode 100644 Open-ILS/src/templates/conify/global/config/floating_groups.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/conify/global/config/floating_groups.js
+ create mode 100644 docs/floating_groups.txt
+
+commit 42e8c332faa280857405b5cb4af42747fb9d5d57
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu Sep 26 11:30:36 2013 -0400
+
+    OPAC: on the login page, Make "Questions?"/"FAQs" areas not float weird
+    
+    One little change from the original patch to make it 2em; instead of just 1em;
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+2	2	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 2d7c6d4c132211b4f6090d7c81c52e3e13347fdd
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Sep 26 11:42:00 2013 -0400
+
+    Push the 2.4.2 inter-version upgrade script forward
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+196	0	Open-ILS/src/sql/Pg/version-upgrade/2.4.1-2.4.2-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.4.1-2.4.2-upgrade-db.sql
+
+commit 15d09432cbeeb326adb3082bc08a370e6485962f
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Mon Sep 23 12:14:18 2013 -0400
+
+    Serials: Support reader address information in routing slip template
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
+22	2	Open-ILS/src/templates/serial/print_routing_list_users.tt2
+28	0	Open-ILS/web/js/ui/default/serial/print_routing_list_users.js
+
+commit a64be32920aaf036542998323b8feb62d7da7689
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Sep 26 09:52:04 2013 -0400
+
+    Stamping 'patron credit disable' setting
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+25	0	Open-ILS/src/sql/Pg/upgrade/0835.data.yaous-disable-patron-credit.sql
+0	25	Open-ILS/src/sql/Pg/upgrade/XXXX.data.yaous-disable-patron-credit.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0835.data.yaous-disable-patron-credit.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.yaous-disable-patron-credit.sql
+
+commit 46629e2065b12d2effe86cc6362f34f2b6aabafb
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Aug 12 15:02:57 2013 -0400
+
+    LP1211473 YAOUS : disable patron credit payments
+    
+    New org unit setting circ.disable_patron_credit.
+    
+    This prevents "patron_credit" payments in the payment creation API and
+    hides all patron credit related actions in the patron payment interface.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+6	0	Open-ILS/src/extras/ils_events.xml
+13	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Money.pm
+21	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+25	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.yaous-disable-patron-credit.sql
+13	0	Open-ILS/xul/staff_client/server/patron/bill2.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.yaous-disable-patron-credit.sql
+
+commit 64e888e5fd2f378aea6563f4aff0ab6cf8cc1fb0
+Author: Ben Shum <bshum at biblio.org>
+Date:   Wed Sep 25 22:36:29 2013 -0400
+
+    TPAC: Add format icon back to record details
+    
+    Similar to 502f93acff9a5713668931c980d6ce25962a1f8c finding compromise by
+    putting the format icon back right next to the format label.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/templates/opac/parts/record/summary.tt2
+
+commit 1db3c9196054cdd1f783e5f42b2f6b98b2eff3be
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Mon Jul 15 11:01:28 2013 +0300
+
+    In reports, show old label name as the default in the Alter Display Header -prompt
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+2	1	Open-ILS/web/reports/xul/template-config.js
+
+commit 48a44afbd82ac271c123903de2fa1351c2a0fa43
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Wed Sep 18 14:14:16 2013 -0400
+
+    Add PhoneList.pm stuff to Apache 2.4 config
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/examples/apache_24/eg.conf.in
+22	0	Open-ILS/examples/apache_24/eg_vhost.conf.in
+
+commit 6566aa8007d8156bbf8df2e1df5d38ee94c9ecaf
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Wed Sep 18 13:41:31 2013 -0400
+
+    Add phonelist.txt release notes.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+193	0	docs/RELEASE_NOTES_NEXT/phonelist.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/phonelist.txt
+
+commit e4e39e6777ab40ba1cf61728095a9fd34627f8c4
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Mon Jul 23 10:19:13 2012 -0400
+
+    Fix PhoneList.pm child_init method.
+    
+    child_init in an Apache module should return something, so it now
+    returns the OK constant.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/PhoneList.pm
+
+commit 3448c226d400d104599a05770522e2b95bc30efd
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Tue Mar 6 13:21:14 2012 -0500
+
+    Strip out spaces as well as - from phone numbers in PhoneList::Holds.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/PhoneList/Holds.pm
+
+commit 6785a4a3a1baed72f8bcff6110cff6288d9cea3b
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Thu May 26 10:30:10 2011 -0400
+
+    Add PhoneList.pm.
+    
+    A simple WWW module to list patrons who have holds with their phone
+    numbers and barcodes. The format is as requested by a specific library
+    for their automated calling program.
+    
+    Future modifications may include the ability to rearrange the output
+    columns and provide formats for some data.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/examples/apache/eg.conf.in
+1	0	Open-ILS/examples/apache/eg_startup.in
+22	0	Open-ILS/examples/apache/eg_vhost.conf.in
+132	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/PhoneList.pm
+85	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/PhoneList/Base.pm
+159	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/PhoneList/Holds.pm
+174	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/PhoneList/Overdues.pm
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/WWW/PhoneList.pm
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/WWW/PhoneList/Base.pm
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/WWW/PhoneList/Holds.pm
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/WWW/PhoneList/Overdues.pm
+
+commit addfe15b6bcfb2636b01666c50ff2f84a79bff10
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Wed Sep 11 08:54:55 2013 +0300
+
+    Fix delete items confirmation typo.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/xul/staff_client/server/locale/en-US/circ.properties
+
+commit 3282cbbac2bc04fcf5beebffcffaebb3ce72b956
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu Sep 5 13:24:54 2013 -0400
+
+    Better handling of purchase_order being non-numeric
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+3	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm
+
+commit 954bb310efd5ee54d819ae85ad18c3bc1fab8e22
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Sep 4 09:26:23 2013 -0400
+
+    Fiction records / copies test data
+    
+    Adds 17 (mostly) fiction bib records w/ copies to
+    OpenILS/tests/datasets/sql/.  New items are loaded via load_all.sql.
+    
+    Special thanks to Rogan Hamby for donating (and I believe creating)
+    these records many moons ago.  For reference:
+    
+    The father hunt;
+    Southern Gods /
+    The winter of our discontent /
+    CliffsNotes Steinbeck's Of mice and men /
+    The rum diary
+    Blueberry girl /
+    Stardust
+    Coraline
+    Objective-C programming :
+    The swordsman of Mars /
+    Ghost story
+    The Avengers
+    Throne of the Crescent Moon /
+    The walking dead.
+    Kraken :
+    The crow
+    The running man /
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+28	0	Open-ILS/tests/datasets/sql/assets_fic.sql
+22	0	Open-ILS/tests/datasets/sql/bibs_fic.sql
+6	0	Open-ILS/tests/datasets/sql/load_all.sql
+ create mode 100644 Open-ILS/tests/datasets/sql/assets_fic.sql
+ create mode 100644 Open-ILS/tests/datasets/sql/bibs_fic.sql
+
+commit 6707d536768f6cb72da4d974d6f742abf0a4681d
+Author: Steven Callender <stevecallender at esilibrary.com>
+Date:   Thu Sep 12 13:30:16 2013 -0400
+
+    Added in warning message when placing hold with no email address.
+    
+    Previously when an account didn't have an email address associated with it
+    when placing a hold, the input box would be greyed out and the display
+    would show the Email Address text with no address to go with it.
+    
+    This change will instead show text warning the user that they have
+    no email address configured and they need to go to My Account in order
+    to add one to their account.
+    
+    Signed-off-by: Steven Callender <stevecallender at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+2	1	Open-ILS/src/templates/opac/parts/place_hold.tt2
+
+commit 798a4ff8f74e063312fa8b7d5078dcad1385849e
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Sep 25 16:46:31 2013 -0400
+
+    TPAC: Consolidate and simplify button styles
+    
+    TPAC has at least two distinct types of buttons, those created by
+    input tags, and those created by anchor (that is, <a>) tags.  This
+    commit simplifies and consolidates the styles used for both types
+    of buttons.
+    
+    At least in Firefox, inline blocks display in a closer size rendering
+    to <input> tags than plain 'display:inline'.  The switch doesn't seem
+    to hurt in most cases in IE, FF, or Chrome, so let's do it.
+    
+    Two cases where inline works better are the floating 'My Account' and
+    'dash' buttons'.  They already have special classes, so let's revert
+    those back to inline.  In fact, let's make the logged-in 'dash'
+    buttons share the style of the 'My Account' button which got us there,
+    and make all three buttons more visible when hovering.
+    
+    Inputs do not inherit the body font by default, so let's apply it for
+    better display consistency.
+    
+    Finally, Firefox inputs have some extra space around them; let's make
+    a modest attempt to remove that.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+38	30	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 757d48b7498e7ff97198772ba2e22f061c14790b
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Sep 25 17:00:29 2013 -0400
+
+    TPAC: href not valid on 'button' tags
+    
+    The 'Clear Form' button was moved to a button tag, which solved a
+    display issue but didn't actually clear the form.  Let's make it
+    an <a> again.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+2	2	Open-ILS/src/templates/opac/parts/advanced/search.tt2
+
+commit 502f93acff9a5713668931c980d6ce25962a1f8c
+Author: Ben Shum <bshum at biblio.org>
+Date:   Wed Sep 25 17:40:57 2013 -0400
+
+    TPAC: Add format icon back to search results
+    
+    As a compromise, add the format icon back to the search results to sit alongside
+    the fully spelled out format label for the record. Having the label next to the
+    icon helps to inform on the icon without the need to hover.
+    
+    Local sites may consider customizing this to their personal desires.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit 85a68d8477c2372284723c391b536478267b64ea
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Sep 25 12:53:51 2013 -0400
+
+    TPAC: Make corner image link to server root
+    
+    Most people will do this anyway, and in the MOPAC view, you currently
+    get trapped in 'My Account' with no obvious way out unless we have
+    a link like this.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+1	1	Open-ILS/src/templates/opac/parts/topnav_logo.tt2
+
+commit ea017990c589ee3c9abd18c547385286921d087b
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Sep 25 12:27:40 2013 -0400
+
+    MOPAC: Remove fixed height from fines tabs
+    
+    With 'overflow:auto' applied, a fixed height isn't needed, and
+    actually causes minor issues.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+0	3	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 2e34bd51de6869f5cd15c810b49322b3e526ce15
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 23:38:23 2013 -0400
+
+    TPAC: Make low hits help support low-width devices
+    
+    Inline styles were forcing the width of the low-hits help box to be
+    353px wide, which is wider than our target 320 width for mobile devices.
+    Let the help use the full available width under the 600px barrier.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+9	0	Open-ILS/src/templates/opac/css/style.css.tt2
+1	1	Open-ILS/src/templates/opac/parts/result/lowhits.tt2
+
+commit d2a643960bc8c854b9a1c38f4fcb654b9a235145
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 23:07:30 2013 -0400
+
+    TPAC: Make home search screen work on IE8+
+    
+    The home logo is now centred on IE, and the white background extends
+    across the full width of the page. Huzzah!
+    
+    As a bonus, the markup makes more sense without the <strong><center>.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	0	Open-ILS/src/templates/opac/css/style.css.tt2
+1	1	Open-ILS/src/templates/opac/parts/homesearch.tt2
+
+commit 207177851b797c2357aa455b35e24cad9389954a
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Sep 24 17:47:16 2013 -0400
+
+    Add missing ending label tag for format selector
+    
+    On the basic search, we were missing an ending label tag so it was combining
+    the one from formats and library pickers into a single element which made
+    selecting the library misbehave.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/templates/opac/parts/searchbar.tt2
+
+commit 793168a99f4de8c70a68bbea6dc83eee71ff4868
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Sep 24 16:03:59 2013 -0400
+
+    Remove extra large facets
+    
+    While an interesting experiment, as agreed in IRC conversation with kmlussier
+    and dbs, we will remove the extra wide facets being used in wider screens for
+    the time being.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+0	7	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 77d7cda9b647c744f8c68690e4ef0f20f1651188
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Sep 24 16:02:41 2013 -0400
+
+    Increase height of facet headers
+    
+    Because the font size is larger now, the bottom of the facet headers was
+    getting too close to the text.  Increase size slightly for now.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 12c37dc68fd03deea857dd003cefea6a09b3f5b8
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Sep 24 16:01:11 2013 -0400
+
+    Remove My Account tabs at higher resolution
+    
+    The My Account tabs begin to break at a higher resolution than 600 so
+    let's remove them at 800px instead.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+6	8	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit f3b7bc3befbe09d2102cd7e0027a87869e913775
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Sep 24 15:48:35 2013 -0400
+
+    Remove explicit widths from My account
+    
+    There were a couple of explicit width in the My Account area that were
+    causing the account expiration alert to run off the screen. I removed them
+    and a tweak to the CSS to get the page elements to display
+    properly.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	0	Open-ILS/src/templates/opac/css/style.css.tt2
+3	3	Open-ILS/src/templates/opac/parts/myopac/main_base.tt2
+
+commit 3292fc83efe8fd2461c8b9d41988b0fea408a1a1
+Author: Bill Ott <bott at grpl.org>
+Date:   Tue Sep 24 15:20:56 2013 -0400
+
+    i18n support for field names in myopac css
+    
+    Signed-off-by: Bill Ott <bott at grpl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+13	13	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 405b76152eec34c993eb4e20bf18e69cb79c0ec4
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Sep 24 14:57:16 2013 -0400
+
+    Fix margins in advanced search tabs for mobile view too
+    
+    Similarly, in the mobile view, do not have a bottom margin separating the tab
+    from the content below. Clean up margin code while we're at it.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	3	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 51cba9000bbb7138aba2ca8dd7633ce61633e31c
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Sep 24 14:16:21 2013 -0400
+
+    Fix tab button margins
+    
+    Remove a hanging 10px margin that made the advanced search tabs and my account
+    tabs appear as though they were floating over the contents they were connected
+    with.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 23e8de55bb283101ba046d40fbdc75c22e55741f
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 13:21:35 2013 -0400
+
+    TPAC: Simplify opac-button styling
+    
+    Conflicting padding declarations in the stylesheet, in an old attempt to
+    balance out the sizes of various INPUT types vs A elements in Chrome vs.
+    Firefox, were resulting in increasingly odd sizes for the buttons
+    (depending on which browser you used). Switching to a BUTTON instead of
+    an A tag and dropping all of the padding declarations improves the
+    situation on Firefox, Chrome, and IE8, while simplifying the CSS.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+0	11	Open-ILS/src/templates/opac/css/style.css.tt2
+2	2	Open-ILS/src/templates/opac/parts/advanced/search.tt2
+
+commit 455c587c23c56dee0eeabee0fba0ba0b927dfa73
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 13:04:56 2013 -0400
+
+    TPAC: Retain advanced search tabs via overflow:auto
+    
+    At small widths, the advanced search tabs could be forced to escape the
+    search tab header in a displeasing fashion. Also, the background bar
+    that provides context for the selected tab had been lost - and
+    overflow:auto fixes that. Thanks to Dan Wells for the suggestion.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	3	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit bfda0d74f476629afa3c9934d29501dce3ef9991
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 11:24:39 2013 -0400
+
+    TPAC: Main content needs a clear:both style
+    
+    On My Account, the content of tabs was riding up against the tabs. Use
+    clear:both style for #main-content to force the main content to start on
+    a new line.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 4f8139372d712cbeb3a3a1bb9be9b10bc3b0c2d9
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 10:57:56 2013 -0400
+
+    TPAC expert search: wrap labelled fields consistently
+    
+    Use a new class "nonbreaking-wrapper" with display:inline-block to keep
+    label + input fields together, rather than the inline "whitespace:
+    no-wrap" which did not work on Chrome (and oddly enough forced the value
+    field to the next line).
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+4	0	Open-ILS/src/templates/opac/css/style.css.tt2
+10	6	Open-ILS/src/templates/opac/parts/advanced/expert.tt2
+
+commit 16fde03781c4efc9dc2d1f64819515603f24d9ed
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 10:51:36 2013 -0400
+
+    TPAC: Prevent IE compatibility view
+    
+    Windows XP has IE8, and it can handle the CSS we have in the TPAC.
+    However, the "compatibility view" button, if clicked, actually results
+    in horribly broken rendering (contrary to what one would expect).
+    
+     Adding this <meta> tag prevents the compatibility view button from
+    displaying and should improve the experience for users.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/templates/opac/parts/base.tt2
+
+commit 64776b44b39a60aed9e67ee1aa418df9e8677ece
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 09:53:34 2013 -0400
+
+    TPAC: Clear line for initial advanced search tab
+    
+    The initial advanced search tab was being rendered right beside the tabs
+    instead of underneath them; fix in the same way we fixed the numeric and
+    expert tabs previously.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+4	1	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit b1df6a60b40c6341874b0631cb381935bf98286b
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Sep 24 07:32:28 2013 -0400
+
+    Restore fines, checkout, and holds tabs
+    
+    These display well as tabs since there are only two tabs to display. Probably
+    inadvisable to replace these tabs with menus as we did in other places because
+    there are already menus on these screens to perform actions on selected
+    checkouts/holds.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	7	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 3314f282e94f058e05e21eba0278822b00955cba
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 01:55:37 2013 -0400
+
+    TPAC: Streamline facet display
+    
+    Rather than including a DIV containing only a non-breaking space to
+    clear the lines of the facets, just use CSS to clear each facet and set
+    a bottom margin appropriately.
+    
+    Also, take advantage of wide screens by allowing facets to display
+    more broadly rather than being limited to a 10% width of the screen.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+11	4	Open-ILS/src/templates/opac/css/style.css.tt2
+0	2	Open-ILS/src/templates/opac/parts/result/facets.tt2
+
+commit 3f746a756a063924447e1ceb8ab5621b6f2cb8a5
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 01:29:19 2013 -0400
+
+    TPAC: Advanced search - add line break
+    
+    The header and form for numeric search and expert search were being
+    displayed inline with the tabs on the advanced search page; push those
+    down where they should be.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit f89d938f4e9f0cfeebe693b3844c153d2cce405c
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 01:15:39 2013 -0400
+
+    TPAC: Draw a border under the result header bar
+    
+    Particularly needed in mobile mode, where the background has been set to
+    inherit, draw a bottom border to separate the result header actions from
+    the pagination controls.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 984ca33e5eb48e275069c092e27ed82f3552259d
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 01:11:36 2013 -0400
+
+    TPAC: Enable search bar elements to wrap gracefully
+    
+    As the browser window narrows, stack the search bar elements vertically
+    as needed.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 6748df6b22cd194b775fbf4a14a1184e284ea726
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 01:07:00 2013 -0400
+
+    TPAC: Define result header padding by contents
+    
+    Rather than defining padding for the result header bar and then defining
+    margins for the contained labels and buttons, rely strictly on the
+    buttons and labels to position themselves.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	9	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit debabf1c411689c2e00b429c4ea7b6c16d90a383
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 00:46:27 2013 -0400
+
+    TPAC: Make result label text consistent size
+    
+    The text on the result header buttons was all 100%, while the text
+    labels for the sort and limit to available widgets for some reason were
+    set to a smaller font size, despite appearing on the same line.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+0	1	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit af892c5075c8c910ac50b74a9c85b46c3e77bacf
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 00:43:50 2013 -0400
+
+    TPAC: Make result button text consistent
+    
+    There's no good reason for the result buttons to have underlined text
+    when most other buttons in the Web UI do not have underlined text.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 86ad330855587f6421dc328b37c57cdd3aa207f6
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 00:36:59 2013 -0400
+
+    TPAC: Remove wide bar under results options header
+    
+    The hard-coded <br class="clear-both"> adds a full em of empty vertical
+    space to the full TPAC with no usability gain. Remove it.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+0	1	Open-ILS/src/templates/opac/results.tt2
+
+commit dd3183bae26885baa10f61cbfc842774b1f78984
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 00:33:12 2013 -0400
+
+    TPAC: Saner search button CSS
+    
+    Gradients and text shadows begone.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+9	8	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 90d5a0e12b5d55efe4f6d212b71740b9fca11b5e
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Sep 23 23:03:05 2013 -0400
+
+    Mobile TPAC: Cleaner Refine/Return to hits behaviour
+    
+    Have the Refine results / Return to results button be the target ID, so
+    that clicking the link leaves the opposite action at the top of the page
+    (giving users a quick exit path back to where they came from).
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	2	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit 0cf1a5e5b228553e39a19d68c3b945e4b21c29c6
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Sep 23 22:55:04 2013 -0400
+
+    TPAC: Consistent results paginator font size
+    
+    It is weird to have two different font sizes appearing on the same line
+    in the regular TPAC, and it introduces slight inconsistency for the left
+    padding of the results pagination in mobile mode.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+0	5	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 48316e8c2f5ea328ac79c24fb5b45dbd38fe0a41
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Sep 23 22:44:18 2013 -0400
+
+    TPAC: Avoid paginator HTML rather than hiding it
+    
+    Rather than generating HTML and then hiding it via CSS, just don't
+    generate the HTML at all. In this case, avoid generating the Previous /
+    Next links in those cases where we're on either page one or the last page
+    of results respectively.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	5	Open-ILS/src/templates/opac/css/style.css.tt2
+8	8	Open-ILS/src/templates/opac/parts/result/paginate.tt2
+
+commit 07ae504ad135b1eec1445b647e1067082628e62b
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Sep 23 22:33:09 2013 -0400
+
+    TPAC: Align results pagination in mobile mode
+    
+    The results summary and results paginator had been using hard-coded
+    pixel values for the padding-left value; amusingly, they were different
+    values. Now that the paginator is part of the CSS stylesheet, switch to
+    using a standard 1 em so that we can also respond to the chosen font
+    size of both the stylesheet and the user's preference.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	1	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 480602d8e706a38d390113614127f870582ce565
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Sep 23 22:29:23 2013 -0400
+
+    TPAC: Reduce vertical space in results paginator
+    
+    An unnecessary span element with inline CSS results in additional blank
+    vertical space being generated for searches with only one page of
+    results. Avoid creating the span (which would normally contain the list
+    of pages), move the CSS to the style sheet, and use ems rather than
+    hard-coded px values for the padding to adjust relative to the font
+    size.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+4	1	Open-ILS/src/templates/opac/css/style.css.tt2
+9	7	Open-ILS/src/templates/opac/parts/result/paginate.tt2
+
+commit ce5504d8e64433f6e948920092c5c96cf0558634
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Sep 23 15:16:16 2013 -0400
+
+    Mobile TPAC: Show Advanced Search button in results header
+    
+    Now that the advanced search UI is reasonably mobile-friendly, make it
+    visible. At the same time, make the wrapping behaviour more friendly by
+    giving a little bit of vertical margin between wrapped buttons (because
+    adding "Advanced Search" is almost guaranteed to cause wrapping).
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+4	6	Open-ILS/src/templates/opac/css/style.css.tt2
+2	2	Open-ILS/src/templates/opac/results.tt2
+
+commit 8d4c855c239390de9e3e3c39f2087bafd47863d2
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Sep 23 15:02:04 2013 -0400
+
+    TPAC: More responsive search result header buttons
+    
+    Rather than having a specific height of 40px, which is crazy, remove the
+    specific height. This enables the buttons contained in the search result
+    header to wrap without overlapping the bottom border in strange
+    patterns.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	4	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 582f68c0f6dca59c57330d4a7f0013ac3e9df182
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Sep 23 14:59:04 2013 -0400
+
+    Mobile TPAC: Better styling for facet/results buttons
+    
+    Adopt the OPAC button style and move the buttons into the search bar to
+    consolidate result-specific actions into a single contextual area.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	5	Open-ILS/src/templates/opac/css/style.css.tt2
+6	2	Open-ILS/src/templates/opac/parts/result/table.tt2
+2	0	Open-ILS/src/templates/opac/results.tt2
+
+commit 7419645aabd19dbe9b9dac2d6292fa7afdd02c1e
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Sep 23 14:16:01 2013 -0400
+
+    TPAC: Remove "Dynamic catalog" link from footer
+    
+    The TPAC _is_ the dynamic catalog as of 2.3. It no longer has a need to
+    link to itself.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+0	1	Open-ILS/src/templates/opac/parts/footer.tt2
+
+commit db6b04817c899816e9be887c8bbc13a782614c28
+Author: Ben Shum <bshum at biblio.org>
+Date:   Fri Sep 20 17:48:40 2013 -0400
+
+    Hide searchbar from myopac and other non-search related pages
+    
+    Ugly hack to add the mobile_hide div class around the searchbar.tt2 includes.
+    
+    Eventually should add some smarter options in searchbar.tt2 for displaying or not
+    in various interfaces.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	0	Open-ILS/src/templates/opac/mylist.tt2
+2	0	Open-ILS/src/templates/opac/parts/myopac/base.tt2
+2	0	Open-ILS/src/templates/opac/password_reset.tt2
+2	0	Open-ILS/src/templates/opac/sms_cn.tt2
+
+commit f6360ccdd1652b04299eea00018fa372a8f74a8d
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Fri Sep 20 15:09:13 2013 -0400
+
+    Replace prefs tabs with select menu in mobile view
+    
+    There are too many account preference tabs to display cleanly on a small
+    screen resolution, so let's replace them with a select menu for
+    navigation. At the same time, we remove hardcoded values used for the
+    navigation tabs so that we do not need to maintain links/labels for the
+    menus in two different places.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+3	3	Open-ILS/src/templates/opac/css/style.css.tt2
+1	1	Open-ILS/src/templates/opac/myopac/prefs.tt2
+1	1	Open-ILS/src/templates/opac/myopac/prefs_my_lists.tt2
+1	1	Open-ILS/src/templates/opac/myopac/prefs_notify.tt2
+1	1	Open-ILS/src/templates/opac/myopac/prefs_settings.tt2
+33	54	Open-ILS/src/templates/opac/parts/myopac/prefs_base.tt2
+
+commit b471e6105bff194ddf26619f32bbcae10553867b
+Author: Bill Ott <bott at grpl.org>
+Date:   Fri Sep 20 09:13:05 2013 -0400
+
+    Reactive tables for myopac circ and holds.
+    
+    Initial stab at trying to restructure the table data to fit into a vertical table'ish design.
+    Also took a machete to the nth display:none portions of the previous style so we could see all
+    the glory that needed to be restructured.
+    
+    Signed-off-by: Bill Ott <bott at grpl.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+77	38	Open-ILS/src/templates/opac/css/style.css.tt2
+1	1	Open-ILS/src/templates/opac/myopac/circs.tt2
+
+commit 08beb255d5d247e29ead4e68fb41cb8db750369f
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Fri Sep 20 00:52:28 2013 -0400
+
+    Disabled option in account menu
+    
+    Instead of hiding the active page in the My Account select box navigation,
+    let's disable it so that the menu remains consistent from page to page.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	2	Open-ILS/src/templates/opac/parts/myopac/base.tt2
+
+commit 851c9a909c010d530926f8222dd52b5843858abc
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Sep 19 20:28:32 2013 -0400
+
+    Restore facet-first loading, add breakpoint for results
+    
+    Facet first loading should be faster on slow servers, so do that rather
+    than loading them after the results and forcing a page render when we
+    dump them into place on wide screens.
+    
+    Also add an 800px breakpoint to prevent results from getting pushed
+    underneath the facets; at 800px, we go into "hide facets" mode instead.
+    This gets picked up by the 600px breakpoint, so it's all good.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+13	13	Open-ILS/src/templates/opac/css/style.css.tt2
+5	15	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit ecd0b786e24811cf1e1b75929f11e396ce4d1301
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Sep 19 14:57:58 2013 -0400
+
+    Show/hide facets & search results in mobile mode
+    
+    Use CSS + a bit of JavaScript to show/hide facets and results, and
+    anchor the page accordingly.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+13	4	Open-ILS/src/templates/opac/css/style.css.tt2
+28	22	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit e72b728646e4023dbf6d7fd4ce035aa24d50481d
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Sep 19 11:45:44 2013 -0400
+
+    Mobile: group advanced search rows with a border
+    
+    We want advanced search rows to wrap on mobile, but also want to group
+    the elements in some way. This adds a simple border on the bottom of
+    each row to suggest that things are together.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+6	1	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 2cf503ac745b1a4e73d9c396da932f491aecca65
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Sep 19 11:11:22 2013 -0400
+
+    Bump up the default font size, use consistent font sizes
+    
+    opac/parts/css/fonts.tt2 defines all of the font sizes we should be
+    using for consistency throughout the TPAC. There was a need felt to bump
+    up the default font size in the mobile UI from 12px to 12pt, which was
+    matched by a number of sites who had also bumped the normal UI up to
+    14px or 15px. Rather than having a weird font-size jump when you narrow
+    a browser window to < 600px, keep the same base font size... but bump it
+    up.
+    
+    Also, replace hardcoded 100% etc font sizes with the templated font
+    sizes for consistency.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+7	10	Open-ILS/src/templates/opac/css/style.css.tt2
+5	5	Open-ILS/src/templates/opac/parts/css/fonts.tt2
+
+commit 5511067ce20b1588ba7a521ebe590000ccc0badc
+Author: Ben Shum <bshum at biblio.org>
+Date:   Thu Sep 19 10:59:30 2013 -0400
+
+    Change CSS for dash identity
+    
+    Set to float:left; for the dash identity so that the buttons are in order:
+    "My account" then "Logout"
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit bea813fb7a078dcbf53dccfc1da70a1ae1d8de95
+Author: Garry Collum <gcollum at gmail.com>
+Date:   Thu Sep 19 10:24:56 2013 -0400
+
+    Additional CSS changes for copy details for mobile web.
+    
+    Adds fix for background color for bibs with linked items.
+    
+    Signed-off-by: Garry Collum <gcollum at gmail.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+6	3	Open-ILS/src/templates/opac/css/style.css.tt2
+2	2	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+
+commit 4a1c5dd97e1df30181f086ef115ad0889a03c1e8
+Author: Bill Ott <bott at grpl.org>
+Date:   Thu Sep 19 10:18:16 2013 -0400
+
+    Fix up the advanced search tabs advanced, numeric, expert
+    Signed-off-by: Bill Ott <bott at grpl.org>
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+12	1	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit b22d9ed1bf1d062de25b06baeea28ed76265d50d
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Sep 19 10:38:40 2013 -0400
+
+    Respect adv_break with clear: both
+    
+    This keeps the old behaviour, in all ways, but rather than using a specific
+    / arbitrary pixel width it uses clear:both to start a new line for a new
+    adv_break.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/templates/opac/css/style.css.tt2
+1	1	Open-ILS/src/templates/opac/parts/config.tt2
+
+commit 2acd47d3b0d77edf6f245027e49fd14c5e1b938c
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Sep 19 10:02:45 2013 -0400
+
+    More responsive advanced search
+    
+    By default, rather than having blocks of search filters with an explicit
+    width of 800px or 850px, just have one line of filters that wraps
+    according to the width of the page (truly responsive).
+    
+    Also move all inline styles into style.css so we can more easily
+    manipulate them based on media queries. And notice silly styles that can
+    be easily swapped out with clean styles.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+16	6	Open-ILS/src/templates/opac/css/style.css.tt2
+9	10	Open-ILS/src/templates/opac/parts/advanced/search.tt2
+1	1	Open-ILS/src/templates/opac/parts/config.tt2
+
+commit 803eb2577fa106d81635c74190199a6d0ae6ef35
+Author: Ben Shum <bshum at biblio.org>
+Date:   Wed Sep 18 23:56:00 2013 -0400
+
+    Resize advanced search filters to allow more space by default
+    
+    By default, the space allotted was perfect at 800px which worked in
+    Chrome browser just fine.  But viewing in Firefox rendered the elements
+    slightly larger and wrapped some filters instead of displaying four
+    in a row as expected.
+    
+    Increase the adv_search_filters from 800px to 850px to allow for more
+    space.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 7dc6cf72acecabebc9da5f2b7b2d739d6136e9eb
+Author: Ben Shum <bshum at biblio.org>
+Date:   Wed Sep 18 22:03:19 2013 -0400
+
+    Add new span for myopac buttons
+    
+    Based on direction from Kathy Lussier:
+    
+    1) Add a new span for the myopac buttons to keep them grouped
+    2) Hide an unnecessary extra dash divider from the myopac dashboard identity
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+7	0	Open-ILS/src/templates/opac/css/style.css.tt2
+2	0	Open-ILS/src/templates/opac/parts/topnav.tt2
+
+commit b8e8f9144e968570ca33bc47537b0e2f389942e9
+Author: Ben Shum <bshum at biblio.org>
+Date:   Wed Sep 18 17:57:00 2013 -0400
+
+    Some CSS tweaks
+    
+    1) Remove the login height to prevent problems with larger fonts at entry
+    2) Add some top and bottom padding between search results
+    3) Make the titles larger by default in search results
+    4) Add some right padding to the results block
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+10	1	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 555d80d2f4ec80c11e911b6c1879a4ad6ada5d2e
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Sep 18 17:53:55 2013 -0400
+
+    Tweak My Account buttons
+    
+    Tweak the padding and margins for My Account buttons so that they fit on
+    one line for small screens. Also fits well for users with very, very long
+    names.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+6	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit bea06cf704f0d3da797dc0c7fbce3ab4604eb11a
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Sep 18 17:35:29 2013 -0400
+
+    Keep label + input together in search bar
+    
+    The better for breaking in a sane way on a non-mobile screen.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+4	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit a663723d592ef63e95181f18b1c136c5b1e73661
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Sep 18 17:23:46 2013 -0400
+
+    Restore missing format selector from search bar
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/templates/opac/css/style.css.tt2
+11	0	Open-ILS/src/templates/opac/parts/searchbar.tt2
+
+commit 73b4d7d88539a3c741495682b763f4d9f142ccbc
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 11:20:13 2013 -0400
+
+    Changes to CSS to make the table in shelf browse to display in a block for mobile tpac.
+    
+    Signed-off-by: Garry Collum <gcollum at gmail.com>
+    
+    Conflicts:
+    	Open-ILS/src/templates/opac/css/style.css.tt2
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+7	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 4a946473b83b28ce78cfdd2e88a8ebe3c107ab5a
+Author: Ben Shum <bshum at biblio.org>
+Date:   Wed Sep 18 16:46:07 2013 -0400
+
+    My account menu CSS tweaking
+    
+    Remove duplicate acct_tabs entry now that we plan to hide entirely.
+    
+    Remove unnecessary font resizing.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+4	9	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 694d31353870553bc8d89cf1a828436fe64ee88b
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Sep 18 17:13:38 2013 -0400
+
+    Refactor searchbar into non-sentence form
+    
+    A search bar that does not use a sentence is easier to translate and has
+    the additional advantage of breaking up into a simpler mobile display.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	9	Open-ILS/src/templates/opac/css/style.css.tt2
+12	12	Open-ILS/src/templates/opac/parts/searchbar.tt2
+0	1	Open-ILS/web/css/skin/default/opac/semiauto.css
+
+commit 30e6c139d88f5585ce89b484064ca6e486aa98b1
+Author: Garry Collum <gcollum at gmail.com>
+Date:   Wed Sep 18 15:52:52 2013 -0400
+
+    Improve rdetail_status table display for copy info.
+    
+    Signed-off-by: Garry Collum <gcollum at gmail.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+13	2	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 1db928e0faa39634fc9453206ab5a2dd9eeaf931
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Sep 18 15:17:58 2013 -0400
+
+    Replace My account tabs with dropdown
+    
+    The my account tabs were crowded on a small screen, so we switch it to a
+    dropdown navigation menu. Many thanks to Dan Pearl for his help!
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+12	2	Open-ILS/src/templates/opac/css/style.css.tt2
+13	1	Open-ILS/src/templates/opac/parts/myopac/base.tt2
+
+commit 29f55b22a9113a134dfcb5a3461eb74e4c96fc05
+Author: Bill Ott <bott at grpl.org>
+Date:   Wed Sep 18 14:55:40 2013 -0400
+
+    Various mobile style and display changes.
+    
+    Try to reduce the size of the search bar and search type option links.
+    Remove completely from login page (problem or make user rely on back button?)
+    Introduce mobile_hide class for cheap/easy method to alter pieces for mobile.
+    
+    Signed-off-by: Bill Ott <bott at grpl.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/templates/opac/advanced.tt2
+5	4	Open-ILS/src/templates/opac/browse.tt2
+18	7	Open-ILS/src/templates/opac/css/style.css.tt2
+3	1	Open-ILS/src/templates/opac/login.tt2
+1	1	Open-ILS/src/templates/opac/parts/searchbar.tt2
+
+commit 5d4c42799d1e1884d119bd506eb1d552ac6a2f5e
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Sep 18 14:19:49 2013 -0400
+
+    Electronic resources must be cleanly displayed
+    
+    In MOPAC view, electronic resource URIs were overlapping the rdetail
+    actions. Clear 'em out.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+6	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit d1689d088e62192a6a1210f96923b4bbc6a06c2d
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Sep 18 13:55:40 2013 -0400
+
+    Improve rdetail action formatting when no cover art
+    
+    When there is no cover art, the format label gets the actions hung oddly
+    to the right in the record detail view. Just wrap the whole block in a
+    div and float that instead.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	5	Open-ILS/src/templates/opac/css/style.css.tt2
+40	38	Open-ILS/src/templates/opac/parts/record/summary.tt2
+
+commit 19fa3682679c04f2fe645cf584b5a7fbe503c0be
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Sep 18 13:36:15 2013 -0400
+
+    Set explicit width for result metadata in main view
+    
+    We were getting ragged edges for search results with titles longer than
+    the "# of # available copies..." statement and the placement of the
+    place hold action buttons, so set an explicit width, and then deset that
+    in mobile mode.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+4	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 7adb8c4c13429c5ab64ba77f7e926ede6bbc8e8b
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Sep 18 13:13:41 2013 -0400
+
+    Minor fix for non-existent pubdates in search results
+    
+    If you do not have a pubdate, it is better etter to have nothing follow
+    the format label than "()".
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+8	4	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit d6c5604bd2213fa87bb15da765d534e8461bdf95
+Author: Bill Ott <bott at grpl.org>
+Date:   Wed Sep 18 11:26:42 2013 -0400
+
+    Allow the advanced search rows to wrap on smaller displays.
+    Signed-off-by: Bill Ott <bott at grpl.org>
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/templates/opac/parts/advanced/global_row.tt2
+
+commit 33e2d1841dc47baa483b0a28303a549a4f0520f6
+Author: Bill Ott <bott at grpl.org>
+Date:   Wed Sep 18 11:12:20 2013 -0400
+
+    Clean-up of expert and numeric forms.
+    
+    Again, toward the mobilization of advanced searches.  Allow the forms to resize happily.
+    
+    Signed-off-by: Bill Ott <bott at grpl.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	0	Open-ILS/src/templates/opac/css/style.css.tt2
+10	6	Open-ILS/src/templates/opac/parts/advanced/expert.tt2
+8	16	Open-ILS/src/templates/opac/parts/advanced/numeric.tt2
+
+commit a0a0d9a0c4eec6d608c041bfb5797f1eff6d6146
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Sep 18 10:57:52 2013 -0400
+
+    Make record actions available in mobile record details
+    
+    Use the format label approach and push the actions beside the cover art
+    (if any) so that users can do actions like place hold in a mobile UI.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+15	16	Open-ILS/src/templates/opac/css/style.css.tt2
+20	21	Open-ILS/src/templates/opac/parts/record/summary.tt2
+
+commit 4c4b103b36245acd2be41aed0baa7ec8ce83b457
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Sep 18 10:14:25 2013 -0400
+
+    Result actions use width when available
+    
+    Float the actions to the right side when enough width is available,
+    otherwise push them under the result metadata in width-constrained
+    viewports.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	0	Open-ILS/src/templates/opac/css/style.css.tt2
+2	1	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit c4812509a9d0aa0e797535257ab8e27d907eca06
+Author: Garry Collum <gcollum at gmail.com>
+Date:   Tue Sep 17 15:14:00 2013 -0400
+
+    Tpac links for search the catalog, advanced search, and browse the catalog have inconsistent styles.
+    
+    Added labels and classes to the said links for greater configurability.
+    
+    Signed-off-by: Garry Collum <gcollum at gmail.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	2	Open-ILS/src/templates/opac/advanced.tt2
+2	2	Open-ILS/src/templates/opac/browse.tt2
+8	0	Open-ILS/src/templates/opac/css/style.css.tt2
+2	2	Open-ILS/src/templates/opac/parts/searchbar.tt2
+
+commit 817d269e129b1e0a0d32b9cdafb5473bac97d031
+Author: Bill Ott <bott at grpl.org>
+Date:   Wed Sep 18 07:31:58 2013 -0400
+
+    De-table the advanced search to allow for mobile resizing.
+    
+    A first stab at allowing the advanced search page to resize for mobile use.
+    Much of the style included was borrowed from Jason Boyer.  Critical changes
+    occur in the adv_search_xxx type id's in the non-mobile style.
+    
+    to-do: See if there's any hope for the search rows.  Not sure what can be
+    done to make them fit any better.
+    
+    Signed-off-by: Bill Ott <bott at grpl.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    
+    Conflicts:
+    	Open-ILS/src/templates/opac/css/style.css.tt2
+    	Open-ILS/src/templates/opac/parts/advanced/search.tt2
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+38	3	Open-ILS/src/templates/opac/css/style.css.tt2
+35	28	Open-ILS/src/templates/opac/parts/advanced/search.tt2
+
+commit c6e95b7c2ce5810e15a48192750e87282e3028c6
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Sep 18 09:35:47 2013 -0400
+
+    Move search result "actions" below result metadata
+    
+    Rather than the tabular layout, add the place hold / add to my list
+    actions underneath the record metadata for each result. This results in
+    a narrower required width and enables us to actually display the actions
+    in mobile mode.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+7	26	Open-ILS/src/templates/opac/css/style.css.tt2
+2	3	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit 8068d338916e5fe33c02150667351bff4958ec96
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Sep 18 09:09:20 2013 -0400
+
+    Just use a format label in results + pubdate
+    
+    Rather than having the format icon, which requires either hovering (not
+    generally available in mobile) or guessing what the strange symbol
+    means, just use the plain text format label.
+    
+    In addition, move the brief pubdate from beside the author name to
+    beside the format label. This avoids confusion if the author name
+    already has birth or death dates beside it, like "Scott, Dan 1972-
+    2006". He's not dead yet!
+    
+    As a bonus, this enables us to remove one table cell from the search
+    results.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+16	21	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit 4903341c669fa968d27d42031a3c988b35513ca0
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 17 15:16:49 2013 -0400
+
+    Facets after results, then DOMinate them into place
+    
+    We can use a media query in JavaScript to detect a given width and then
+    drop the facets into their left-hand column if needed; if the browser
+    window resizes, then potentially put the facets back on the bottom.
+    
+    Also add a rudimentary "Refine these results" link at the top of the
+    page that is only visible when the facets are at the bottom to
+    facilitate navigation.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+21	4	Open-ILS/src/templates/opac/css/style.css.tt2
+25	6	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit e9de4a0583a72f50d9c5deeb019f94a5290c6fcf
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Sep 17 18:36:04 2013 -0400
+
+    Remove extra div layer around password hint include
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/templates/opac/parts/login/form.tt2
+2	2	Open-ILS/src/templates/opac/parts/login/password_hint.tt2
+
+commit 7491d0168983c7abcd5448cfd9541dbcc3453874
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Sep 17 17:44:50 2013 -0400
+
+    More tweaks to the form page
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/templates/opac/css/style.css.tt2
+1	1	Open-ILS/src/templates/opac/parts/login/form.tt2
+
+commit 05239d02340f06fe0dd64276dbd80ea715fa9de7
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Sep 17 14:43:59 2013 -0400
+
+    Change form.tt2 from table to div
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+32	43	Open-ILS/src/templates/opac/parts/login/form.tt2
+
+commit f0dba97f96cbdb5cbd069427eaf53181790ef999
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Sep 17 13:53:08 2013 -0400
+
+    Add meta viewport tag
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/templates/opac/parts/base.tt2
+
+commit c001b1d8bcb8ad142e2742859aeae99b6581169b
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Sep 17 13:43:21 2013 -0400
+
+    Add initial Indiana CSS changes
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+242	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit c722724ded1e30bd72c905652e04caf802d87e06
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Sep 24 11:08:53 2013 -0400
+
+    TPAC: Revert colspan/rowspan advanced search config option
+    
+    We're no longer going to be using a table layout, so colspan and rowspan
+    will not be useful going forward.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	3	Open-ILS/src/templates/opac/parts/advanced/search.tt2
+0	1	Open-ILS/src/templates/opac/parts/config.tt2
+
+commit 188537250069e7dd8c9624f674e03eadfd6d8db7
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Fri Aug 16 09:06:44 2013 -0400
+
+    LP 1212456 Release Notes
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+40	0	docs/RELEASE_NOTES_NEXT/Client/customize-items-out.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/customize-items-out.txt
+
+commit 5ef27d774bd41a2357c303c75015cfc4815b4609
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Mon Sep 23 17:48:03 2013 -0400
+
+    Stamping 'Items Out' config settings
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+66	0	Open-ILS/src/sql/Pg/upgrade/0834.data.yaous-items-out-by-stop-fines.sql
+0	66	Open-ILS/src/sql/Pg/upgrade/XXXX.data.yaous-items-out-by-stop-fines.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0834.data.yaous-items-out-by-stop-fines.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.yaous-items-out-by-stop-fines.sql
+
+commit a0ee19f899f038594fea496c2032b9fbeaffa63d
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Aug 14 14:00:59 2013 -0400
+
+    LP 1212456 customize items out display
+    
+    Control when lost, longoverdue, and claimsreturn'ed items display in the
+    top vs bottom list in the items out interface.  Also, control when such
+    circs should be hidden when checked in, regardless of whether the
+    transaction is still open (from fines, etc.).
+    
+    ui.circ.items_out.lost
+    ui.circ.items_out.longoverdue
+    ui.circ.items_out.claimsreturned
+    
+    The values for the settings are bit flags.
+    
+    1 = show in top list
+    2 = show in bottom list
+    4 = hide when checked in
+    
+    The magic numbers for admins to enter are:
+    
+    1 = top list, then bottom list (if xact is open)
+    2 = bottom list, then bottom list (if xact is open)
+    5 = top list, hide when checked in
+    6 = bottom list, hide when checked in
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    
+    Conflicts:
+    
+    	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+63	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+66	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.yaous-items-out-by-stop-fines.sql
+1	1	Open-ILS/web/opac/locale/en-US/lang.dtd
+100	19	Open-ILS/xul/staff_client/server/patron/items.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.yaous-items-out-by-stop-fines.sql
+
+commit 6eb667c865fe1c9557771a8975a749294b259092
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Thu Aug 29 11:00:42 2013 +0300
+
+    Add missing dojo nls files for FlattenerGrid and PCrudFilterPane to the i18n toolchain.
+    Add the missing POT files to git so "make newpo" will work.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+10	0	build/i18n/Makefile
+28	0	build/i18n/po/FlattenerGrid.js/FlattenerGrid.js.pot
+117	0	build/i18n/po/PCrudFilterPane.js/PCrudFilterPane.js.pot
+ create mode 100644 build/i18n/po/FlattenerGrid.js/FlattenerGrid.js.pot
+ create mode 100644 build/i18n/po/PCrudFilterPane.js/PCrudFilterPane.js.pot
+
+commit 1b1a28a710c9fab86fc11f4b6477f9e54cf469df
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Tue Sep 3 18:13:48 2013 +0300
+
+    New advanced search filter size/layout options
+    
+    Allow setting the heights of the advanced search select boxes in
+    config.tt2. Also provide colspan and rowspan for adjusting the layout
+    of the filter boxes.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	3	Open-ILS/src/templates/opac/parts/advanced/search.tt2
+1	0	Open-ILS/src/templates/opac/parts/coded_value_selector.tt2
+7	0	Open-ILS/src/templates/opac/parts/config.tt2
+1	0	Open-ILS/src/templates/opac/parts/filter_group_selector.tt2
+
+commit de255eae610a76ce92d94b3b9785d407a8da9872
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Aug 22 16:47:27 2013 -0400
+
+    Action/Trigger load environment via stream
+    
+    Load objects in the A/T environment via streaming response instead of
+    atomic, to avoid very large messages.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+4	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Event.pm
+
+commit ada002e0a67402431c59b0a3d0569710d8f83b70
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Sep 23 11:12:34 2013 -0400
+
+    Stamping 0833 : self-reg timeout
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+26	0	Open-ILS/src/sql/Pg/upgrade/0833.data.self-reg-timeout.sql
+0	24	Open-ILS/src/sql/Pg/upgrade/XXXX.data.self-reg-timeout.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0833.data.self-reg-timeout.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.self-reg-timeout.sql
+
+commit 1276203d893bd02a530ac75b8a47bed48d24ae27
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Sep 11 14:19:07 2013 -0400
+
+    LP#1218597 pending patron row-date IDL label change
+    
+    Change "Row Date" to "Create Date" as the row_date label in the IDL.
+    This is more consistent with other like fields viewed in the staff
+    client.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+1	1	Open-ILS/examples/fm_IDL.xml
+
+commit b720d32e0e7b7667c7c22dc805e1d9cb23919c76
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Fri Sep 6 16:17:08 2013 -0400
+
+    LP#1218597 Load pending patron via double-click
+    
+    Double-click on a row in the pending patrons list in the staff client
+    loads the pending patron into the patron registration UI in a new tab,
+    same as clicking the existing Load button.
+    
+    phasefx++ for implementation suggestions.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+4	1	Open-ILS/xul/staff_client/server/patron/staged.js
+
+commit 2b134c9ecd6bf53fae4a41f4e7079be3b5defb1b
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Aug 28 15:51:15 2013 -0400
+
+    LP#1218597 TPAC honors opac.username_regex setting
+    
+    If a value for requested username is entered and the org unit setting
+    "opac.username_regex" has a value, the regex will be enforced just like
+    the other .regex org unit settings in use in self-reg.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+5	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Register.pm
+
+commit f579796ba830f516deefb7fcfb79740abdcce837
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Aug 28 13:41:21 2013 -0400
+
+    LP#1218597 tpac self-reg refresh page for privacy
+    
+    Adding a new org unit setting "opac.self_register.timeout" /
+    "Patron Self-Reg. Display Timeout" for determning how long the self-reg
+    page will remain open before reloading to the home page.  The goal is to
+    protect the privacy of those who enter values but fail to submit the
+    form.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    
+    Conflicts:
+    
+    	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+4	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Register.pm
+21	2	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+24	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.self-reg-timeout.sql
+4	0	Open-ILS/src/templates/opac/register.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.self-reg-timeout.sql
+
+commit a70787e38083db57b3ff80922fb1c56ebbf617f3
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Aug 28 13:27:52 2013 -0400
+
+    LP#1218597 TPAC self-reg DoB date format example message
+    
+    Provide an example DoB date format message.  Since the message may need
+    translating, it is provided as a template string and not an org unit
+    setting.  Note, however, that the Dojo widget inside the patron
+    registration UI, where self-reg data ultimately goes, requires
+    incoming/default date values to be in ISO8601 format.  It will not
+    accept locale-shaped dates.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+7	0	Open-ILS/src/templates/opac/register.tt2
+
+commit 243dca2a38ff9b6358f5dbd240c61dc14d0b5e4c
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Sep 23 10:51:03 2013 -0400
+
+    Repair Vandelay async startup data retrieval
+    
+    Increment the number of items retrieved at startup to ensure the UI
+    waits for all async requests to return before continuing with page
+    rendering.
+    
+    The counter should have been updated with this commit, which adds bucket
+    retrieval to the startup sequence.
+    
+    59cc4b9524bfcf9a56f54c5ed5a3d56a7d1b86e6
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/web/js/ui/default/vandelay/vandelay.js
+
+commit c371b08e1b67356c90eb4b8be31088304af4ebea
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Fri May 10 09:57:31 2013 -0400
+
+    Update serials docs for 2.4
+    
+    In version 2.4, the serials modules underwent significant changes that
+    require significant updates to the documentation. This commit provides
+    the necessary updates, including some new screenshots. And in a few
+    cases, existing documentation was corrected or improved in ways
+    unrelated to the 2.4 update.
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+-	-	docs/media/scv-combined-dist.png
+-	-	docs/media/scv-combined-iss.png
+-	-	docs/media/scv-combined-sub.png
+-	-	docs/media/scv-distr.png
+-	-	docs/media/scv-iss.png
+-	-	docs/media/scv-rec.png
+-	-	docs/media/scv-status.png
+16	10	docs/serials/A-intro.txt
+95	29	docs/serials/C-subscription-SCV.txt
+1	1	docs/serials/D-subscription-ASCV.txt
+20	6	docs/serials/F-Receiving.txt
+ create mode 100644 docs/media/scv-combined-dist.png
+ create mode 100644 docs/media/scv-combined-iss.png
+ create mode 100644 docs/media/scv-combined-sub.png
+ create mode 100644 docs/media/scv-distr.png
+ create mode 100644 docs/media/scv-iss.png
+ create mode 100644 docs/media/scv-rec.png
+ create mode 100644 docs/media/scv-status.png
+
+commit 7801e65ced42c09d3d75f263274a9c69196346ea
+Author: Yamil Suarez <yamil at yamil.com>
+Date:   Wed Sep 18 15:01:21 2013 -0400
+
+    Add altering rows colors to (cataloging) manage authorities interface
+    
+    To make it easier to use the (cataloging) manage authorities interface I added a tiny bit of CSS to have alternating row colors. The "height: 1.5em" part is needed because the enclosing authEntry div ends up with a height of zero because its children containers are all floating. Turns out this zero height behavior is not a bug, but a natural side affect of floating the div's children.
+    
+    Signed-off-by: Yamil Suarez <yamil at yamil.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+2	1	Open-ILS/src/templates/cat/authority/list.tt2
+
+commit 96f23b77b3ebbcef9a2c52f23abb9ced1e0b1d88
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Tue Sep 17 13:55:29 2013 -0400
+
+    Fix typo in Makefile.ubuntu-precise.
+    
+    Makefile.ubuntu precise was lacking a "install_postgres_server"
+    target.  This updates that file.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/extras/install/Makefile.ubuntu-precise
+
+commit 0165ac323f6257c3bd77eb1a7b3a36930d39c2de
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Tue Sep 17 14:53:47 2013 -0400
+
+    Number upgrade script for serial alert notes
+    
+    (and fix trivial omission in XUL from that same work)
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+14	0	Open-ILS/src/sql/Pg/upgrade/0832.schema.serial_note_alerts.sql
+0	14	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.serial_note_alerts.sql
+1	0	Open-ILS/xul/staff_client/server/serial/serctrl_main.xul
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0832.schema.serial_note_alerts.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.serial_note_alerts.sql
+
+commit 7b104fe93b79e57e3f49bfd36ec4926792947a47
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Tue Sep 17 08:20:17 2013 -0400
+
+    Release notes for Serial alert notes
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+9	0	docs/RELEASE_NOTES_NEXT/Serials/serial-alert-notes.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Serials/serial-alert-notes.txt
+
+commit 471bb8b53bb46da3978ff1390fba547ba4c8e8ca
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Tue Sep 10 18:33:23 2013 -0400
+
+    Serials: alert notes when receiving
+    
+    This commit adds the ability to flag serial notes as receive-time
+    alerts, and also adds the interface widgets necessary to check for
+    and see these alerts in the serial control receiving interface.
+    
+    notes.xul was modified extensively to allow for an arbitrary pile of
+    notes to be displayed, rather than just displaying the notes for a
+    single object (which it still can do).
+    
+    As it stands, the notes are compiled locally from already retrieved
+    objects, but it would also be reasonable to add a middle-layer
+    function to do roughly the same thing.  Depending on how this is done
+    it could require a fair amount of logic duplication, so it might be
+    better done as part of a larger interface/back-end combined
+    refactoring.
+    
+    This commit also tidies up a few other minor things in
+    manage_items.js, including adding automatic refresh when notes are
+    added/edited/deleted, and also removing a duplicate function.
+    
+    Alerting the notes in the batch-receive interface is still TODO, but
+    should be fairly simple to add once this commit is in place.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+3	0	Open-ILS/examples/fm_IDL.xml
+3	0	Open-ILS/src/sql/Pg/210.schema.serials.sql
+14	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.serial_note_alerts.sql
+2	0	Open-ILS/xul/staff_client/server/locale/en-US/serial.properties
+177	26	Open-ILS/xul/staff_client/server/serial/manage_items.js
+4	1	Open-ILS/xul/staff_client/server/serial/manage_items.xul
+94	21	Open-ILS/xul/staff_client/server/serial/notes.xul
+-	-	Open-ILS/xul/staff_client/server/skin/media/images/bell.png
+-	-	Open-ILS/xul/staff_client/server/skin/media/images/bell_disabled.png
+3	0	Open-ILS/xul/staff_client/server/skin/media/images/licenses.txt
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.serial_note_alerts.sql
+ create mode 100644 Open-ILS/xul/staff_client/server/skin/media/images/bell.png
+ create mode 100644 Open-ILS/xul/staff_client/server/skin/media/images/bell_disabled.png
+ create mode 100644 Open-ILS/xul/staff_client/server/skin/media/images/licenses.txt
+
+commit ab37336715cb7d84ed0c30b1cd2e9e6b85933774
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Aug 30 11:22:27 2013 -0400
+
+    Have TPAC put user input at the end in all cases
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+16	15	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
+
+commit 20940fad40f8a6e9a6bfd92cf2b7f163e83938b6
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 28 15:05:36 2013 -0400
+
+    Stream facet data
+    
+    For certain shapes of facet datasets, the .atomic version of the
+    json_query call can produce an XMPP message large enough to cause
+    ejabberd to fall over unceremoniously.  Switch to a streaming
+    CStoreEditor-based call instead to avoid this.
+    
+    Ideally, this would use message bundling (aka, chunking) as well,
+    but the C parts of OpenSRF don't seem to support that yet.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit 8b23255595364dcce3fb0b9dbef64f10959ad234
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Mon Sep 16 16:50:53 2013 -0400
+
+    Move list delete check from onclick to onsubmit
+    
+    Cause Brendan Eich says it's better :)
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+
+2	4	Open-ILS/src/templates/opac/myopac/lists.tt2
+
+commit 8c04afc9314039b3ec78082d25e18f6155ff28ff
+Author: Kyle Tomita <ktomita at catalystitservices.com>
+Date:   Fri May 24 11:52:49 2013 -0700
+
+    LP1164674 - OPAC - Too easy to delete a list
+    
+    Added an onClick action to prompt for confirmation before
+    deleting a list.
+    
+    Signed-off-by: Kyle Tomita <ktomita at catalystitservices.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+3	1	Open-ILS/src/templates/opac/myopac/lists.tt2
+
+commit 2943a99cacc7662d0a195bfe0aad2a0bb7228e5e
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Wed Sep 11 11:46:07 2013 +0300
+
+    Browse catalog shortcut links should clear the search query
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/templates/opac/browse.tt2
+
+commit a457813d632916c0d79ec38ffe4ddf2662f91002
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Sep 6 16:36:47 2013 -0400
+
+    'Opportunistic' Acq In-process Copy Overlay
+    
+    It is both normal and common to overlay brief acquisitions bib
+    records with more complete records, and it is simple to create
+    copies as part of the overlay process, but there is no *simple* way
+    to have the imported copies overlay the acq copies.
+    
+    This code builds off the existing copy overlay code (which matches
+    and overlays using specified IDs), but uses broader matching criteria.
+    By selecting the new option, "Auto Overlay In-process Acquisitions
+    Copies", the system will potentially overlay copies which:
+      * have associated lineitem details (that is, they were created
+        by the acquisitions process), and
+      * that lineitem detail has the same owning_lib as the incoming
+        copy's owning_lib
+      * the current copy associated with that lineitem detail is "In
+        process"
+    
+    Also, fix two small bugs, one which prevented overlay using the
+    'Available' status (change 'if $val' to 'if defined $val', since
+    'Available' is '0'), and another which prevented item overlay when
+    selecting the match record manually (as_imported was null in the DB).
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+38	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
+7	0	Open-ILS/src/templates/vandelay/inc/queue.tt2
+7	0	Open-ILS/src/templates/vandelay/inc/upload.tt2
+8	0	Open-ILS/web/js/ui/default/vandelay/vandelay.js
+
+commit 823c90a959026b2e5f1ba4b4593305547ab8321c
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Sep 16 12:47:46 2013 -0400
+
+    Stamping long overdue penalty upgrade script
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+550	0	Open-ILS/src/sql/Pg/upgrade/0831.schema.long-overdue-penalty.sql
+0	550	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.long-overdue-penalty.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0831.schema.long-overdue-penalty.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.long-overdue-penalty.sql
+
+commit d031ed107483e22acb18592ab46299dabcb5ce08
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Aug 8 16:47:28 2013 -0400
+
+    LP1210291 Long Overdue Standing Penalty
+    
+    Adds a new PATRON_EXCEEDS_LONGOVERDUE_COUNT patron standing penalty.
+    It behaves the same as the PATRON_EXCEEDS_LOST_COUNT penalty for
+    long-overdue circulations.
+    
+    Release notes included.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    
+    Conflicts [resolved, normal seed data order stuff]:
+    	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+68	1	Open-ILS/src/sql/Pg/100.circ_matrix.sql
+15	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+550	0	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.long-overdue-penalty.sql
+10	0	docs/RELEASE_NOTES_NEXT/Circulation/long-overdue-penalty.txt
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.long-overdue-penalty.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/long-overdue-penalty.txt
+
+commit f24a756e107ca19ac9cce053a5bb2afa8984b497
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Thu Aug 8 10:41:39 2013 +0300
+
+    Add Finnish bib tooltips to marc editor.
+    Original translations from The Finnish National Library (http://www.kansalliskirjasto.fi/extra/marc21/)
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	2	Open-ILS/xul/staff_client/server/cat/marcedit.js
+9908	0	Open-ILS/xul/staff_client/server/locale/fi-FI/marcedit-tooltips.xml
+ create mode 100644 Open-ILS/xul/staff_client/server/locale/fi-FI/marcedit-tooltips.xml
+
+commit fc831adcb200d4b6a20c0b2b71ea7fd3c6ce1dca
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Sep 13 12:59:59 2013 -0400
+
+    Tweaks to 'my lists' paging code
+    
+    1) Don't set and refetch the 'my lists' settings if nothing changed.
+    (minor nit)
+    
+    2) Get the count through the same code where we get the bookbag data.
+    
+    For #2, I am concerned with the current duplication of logic. At best
+    we are doing things twice, and at worst we end up counting a set which
+    is slightly different than our actual bookbag search results.
+    
+    In the updated code, I think the count accuracy is subject to
+    search/superpage limit settings, so lists are effectively limited by
+    the search settings. If that is a valid concern, we can beef up the
+    settings for this query.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+27	65	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+
+commit 4b472cb269ddd85fc395a3e0d62583a9c1da9401
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Aug 20 09:33:49 2013 -0400
+
+    LP#1206649 un-cancel received lineitems / copies
+    
+    Clear the cancel reason when a canceled lineitem is marked as received.
+    With items, clear the cancel reason and re-generate fund debits if they
+    were removed during cancelation (because the keep_debits flag in the
+    cancel reason was set to false).
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+15	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm
+
+commit 081880142353b99a4e90d7fbb9e9407dabffb9a8
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Aug 14 09:44:45 2013 -0400
+
+    Billing UI style lost and longoverdue circulations
+    
+    When a LOST or LONGOVERDUE circulation, which has not yet been returned,
+    appears in the patron's list of billed transactions, style them
+    differently from other not-yet-returned items.
+    
+    Similar to regular not-yet-returned items, display a helpful message to
+    staff indicating what colors map to what types of circulations.
+    
+    The default colors are maroon for LOST and organge for LONGOVERDUE.
+    
+    To change the colors, a change to circ.css (for the style) and lang.dtd
+    (for the hint) are required.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+18	3	Open-ILS/xul/staff_client/server/patron/bill2.js
+8	1	Open-ILS/xul/staff_client/server/patron/bill2.xul
+31	0	Open-ILS/xul/staff_client/server/skin/circ.css
+
+commit 1e248d8d849a050f205a39e8f1e2bbef5db5beba
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu Aug 22 17:19:52 2013 -0400
+
+    Inter-authority linking script
+    
+    Modeled after authority_control_fields.pl.in, but different.  The script
+    has POD which you can consult for more information.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+5	0	Open-ILS/src/Makefile.am
+295	0	Open-ILS/src/support-scripts/authority_authority_linker.pl.in
+ create mode 100755 Open-ILS/src/support-scripts/authority_authority_linker.pl.in
+
+commit 1ade5922c3b35c69621c083337808e5e9a8c20d2
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Sep 13 16:35:31 2013 -0400
+
+    Stamping upgrade for 'my list' lists-per-page
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+28	0	Open-ILS/src/sql/Pg/upgrade/0830.data.my_list_lists_per_page_setting.sql
+0	29	Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_lists_per_page_for_my_list.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0830.data.my_list_lists_per_page_setting.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_lists_per_page_for_my_list.sql
+
+commit 09cf487b30cc458a2975e0c6b7d3a13addbcc65e
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Sep 13 16:30:55 2013 -0400
+
+    Trivial changes to configurable bookbag paging
+    
+    1) use class for highlight styling of current page
+    2) correct minor logic error ('<=' should be '<')
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+4	4	Open-ILS/src/templates/opac/myopac/lists.tt2
+
+commit eb647e5354db7d76f7fec3c75b0493913fc93466
+Author: Kyle Tomita <ktomita at catalystitservices.com>
+Date:   Wed Apr 3 17:07:51 2013 -0700
+
+    LP1164197 - Add page number navigation to my lists and setting for number of lists per page
+    
+    Added a user setting for the number of lists per page.
+    Added code for page number navigation.
+    
+    Signed-off-by: Kyle Tomita <ktomita at catalystitservices.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+18	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+19	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+29	0	Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_lists_per_page_for_my_list.sql
+33	2	Open-ILS/src/templates/opac/myopac/lists.tt2
+20	0	Open-ILS/src/templates/opac/myopac/prefs_my_lists.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_lists_per_page_for_my_list.sql
+
+commit 33584305c66c9343e64246174cb2b38b53b6db5d
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Sep 13 12:41:11 2013 -0400
+
+    Trivial changes to 'my list' paging code
+    
+    1) Remove unneeded comment
+    2) un-CamelCase variables
+    3) Add 'my list' paginator selection to stylesheet
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+7	11	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+1	0	Open-ILS/src/templates/opac/css/style.css.tt2
+25	25	Open-ILS/src/templates/opac/myopac/lists.tt2
+
+commit 1e2e429cd084ac32fab4dd1e4c05ba2ec12b12f4
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Sep 13 14:34:11 2013 -0400
+
+    Stamping upgrade for 'my list' items per page
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+28	0	Open-ILS/src/sql/Pg/upgrade/0829.data.my_list_items_per_page_setting.sql
+0	28	Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_items_per_page_of_a_my_list.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0829.data.my_list_items_per_page_setting.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_items_per_page_of_a_my_list.sql
+
+commit 17af956614f25c7cdb9b7ad03444bf6fa61248a9
+Author: Kyle Tomita <ktomita at catalystitservices.com>
+Date:   Wed Apr 3 14:37:41 2013 -0700
+
+    LP1160596 - Add pagination for items in My Lists
+    
+    Added pagination with page numbers when viewing the items in
+    a list.  Also made the number of list items per page a user
+    setting, per the suggestions of Pasi Kallinen and Jason
+    Stephenson.
+    
+    The setting is located in, Account Preferences -> My Lists Preferences
+    
+    Update: Added i18n part to allow for translation.  Removed hard-coded
+    bre.source.
+    
+    Signed-off-by: Kyle Tomita <ktomita at catalystitservices.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+120	5	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+19	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+28	0	Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_items_per_page_of_a_my_list.sql
+56	1	Open-ILS/src/templates/opac/myopac/lists.tt2
+45	0	Open-ILS/src/templates/opac/myopac/prefs_my_lists.tt2
+23	1	Open-ILS/src/templates/opac/parts/myopac/prefs_base.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_items_per_page_of_a_my_list.sql
+ create mode 100644 Open-ILS/src/templates/opac/myopac/prefs_my_lists.tt2
+
+commit 052d0ee6c1d6d4da7e66dbc6727e140e62eec55d
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Thu Aug 29 17:36:37 2013 +0300
+
+    Fix PCrudFilterPane generating illegal queries when using the "not like" and "not between" operators.
+    
+    Make the window remember the user-input value even when changing the operator.
+    
+    [LFW: whitespace fixes - the original commit had real tabs, which we avoid
+    in some files, including .js ones.]
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+14	3	Open-ILS/web/js/dojo/openils/widget/PCrudFilterPane.js
+
+commit 33206c48b22e811eda7e4902d9e593b5343260a0
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Fri Aug 30 16:49:58 2013 -0400
+
+    LP#856688 OUS to disable org unit as hold pickup lib
+    
+    YAOUS that removes an org unit from consideration as a hold pickup
+    library.  This setting only affects the OPAC display and does not
+    otherwise affect the display of the org unit in the OPAC.  (In other
+    words, it's not the same thing as actor.org_unit.opac_visible).  It also
+    has no affect on hold targeting / capturing.
+    
+    [LFW: Numbered upgrade script.]
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+19	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+22	0	Open-ILS/src/sql/Pg/upgrade/0828.data.org-not-pickup.sql
+2	1	Open-ILS/src/templates/opac/myopac/holds/edit.tt2
+5	0	Open-ILS/src/templates/opac/parts/org_selector.tt2
+3	1	Open-ILS/src/templates/opac/parts/place_hold.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0828.data.org-not-pickup.sql
+
+commit 777798d9e99977c35604e99f14f20217276af32a
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Tue Jun 11 09:57:19 2013 +0300
+
+    Allow translation of acq.cancel_reason texts.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+2	2	Open-ILS/examples/fm_IDL.xml
+26	15	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 75817fabba07f84ca7f12f282b328f02a1f7be10
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Sep 12 13:58:14 2013 -0400
+
+    Stamping upgrade script for repeatable events
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+8	0	Open-ILS/src/sql/Pg/upgrade/0827.schema.action_trigger.event_definition.repeat_delay.sql
+0	8	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.action_trigger.event_definition.repeat_delay.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0827.schema.action_trigger.event_definition.repeat_delay.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.action_trigger.event_definition.repeat_delay.sql
+
+commit 085fb6c9d84d3d114e004d860f75cf08f32a3e5d
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Thu Sep 5 16:48:38 2013 -0400
+
+    Release notes for Action Trigger Event Repeatability
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+12	0	docs/RELEASE_NOTES_NEXT/Administration/trigger_event_repeatability.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/trigger_event_repeatability.txt
+
+commit 86db7176873b007313f25879779a7ff853e51298
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Mon Aug 5 09:57:04 2013 -0400
+
+    Allow action trigger events to be repeated
+    
+    Currently, there is no way to repeat an event (action/trigger) when a
+    real-world event occurs more than once for the same target. This only
+    matters for targets that are persistent (such as a library card)
+    combined with events that can reoccur (such as expiration, if the
+    expiration can be removed). To address this, we add a new field to the
+    action_trigger.event_definition table that sets the amount of time
+    after which the event is allowed to repeat.
+    
+    This commit adds the new field to the IDL, database schema and template
+    files and also provides the simple db upgrade script. It is worth noting
+    that we chose to base the repeatability on the start_time of the previous
+    event, which is more predictable than complete_time (which could be null
+    if the event fails).
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	0	Open-ILS/examples/fm_IDL.xml
+5	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger.pm
+1	0	Open-ILS/src/sql/Pg/400.schema.action_trigger.sql
+8	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.action_trigger.event_definition.repeat_delay.sql
+1	1	Open-ILS/src/templates/conify/global/action_trigger/event_definition.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.action_trigger.event_definition.repeat_delay.sql
+
+commit 5d546cc4f21c9ea9431f4530af28fa5e6ad631c6
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Sep 12 13:48:47 2013 -0400
+
+    Stamping P.V. SUPA upgrade scripts
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+17	0	Open-ILS/src/sql/Pg/upgrade/0826.data.server_addon_perms.sql
+0	17	Open-ILS/src/sql/Pg/upgrade/XXXX.data.server_addon_perms.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0826.data.server_addon_perms.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.server_addon_perms.sql
+
+commit c31c7ab58ab6b99dc451b54301200c0fb58e1b92
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Tue Dec 11 20:02:38 2012 -0500
+
+    P.V. SUPA GoodStuff integration
+    
+    This impliments a "Server Add-ons" module for integrating P.V. Supa's RFID
+    product known as GoodStuff with the Evergreen staff client.
+    
+    To activate it, you should add the identifier "pv_supa_goodstuff" (without the
+    quotes) to the list managed by the Admin->Workstation Administration->Server
+    Add-ons menu action within the staff client.  You will need the
+    ADMIN_SERVER_ADDON_FOR_WORKSTATION permission to do this.
+    
+    After doing this and clicking the Update Active Add-Ons button, the interface
+    will refresh and show a GoodStuff tab in the Add-on Preferences section.  Within
+    this tab you will have the option of specifying the hostname and port for the
+    GoodStuff hardware. There is also an "Enabled" setting that needs to be checked.
+    
+    Currently three interfaces have been integrated:
+    * Circulation -> Check In Items
+    * Circulation -> Check Out Items (where you scan the patron barcode)
+    * Circulation -> Check Out Items (where you scan the item barcodes)
+    
+    Each interface gets an RFID checkbox if the "Enabled" preference has been set,
+    that can activate/deactivate the functionality on a per interface basis.  The
+    checkbox states persist (i.e. are sticky).
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+802	0	Open-ILS/xul/staff_client/server/addon/pv_supa_goodstuff.js
+46	0	Open-ILS/xul/staff_client/server/addon/pv_supa_goodstuff_config_overlay.xul
+52	0	Open-ILS/xul/staff_client/server/addon/pv_supa_goodstuff_tests/pv_supa_goodstuff_test1.expect
+144	0	Open-ILS/xul/staff_client/server/addon/pv_supa_goodstuff_tests/pv_supa_goodstuff_test2.expect
+109	0	Open-ILS/xul/staff_client/server/addon/pv_supa_goodstuff_tests/pv_supa_goodstuff_test3.expect
+23	0	Open-ILS/xul/staff_client/server/locale/en-US/addon/pv_supa_goodstuff.properties
+1	0	Open-ILS/xul/staff_client/server/skin/addon/pv_supa_goodstuff.css
+26	0	docs/RELEASE_NOTES_NEXT/pv_supa_goodstuff.txt
+ create mode 100644 Open-ILS/xul/staff_client/server/addon/pv_supa_goodstuff.js
+ create mode 100644 Open-ILS/xul/staff_client/server/addon/pv_supa_goodstuff_config_overlay.xul
+ create mode 100755 Open-ILS/xul/staff_client/server/addon/pv_supa_goodstuff_tests/pv_supa_goodstuff_test1.expect
+ create mode 100755 Open-ILS/xul/staff_client/server/addon/pv_supa_goodstuff_tests/pv_supa_goodstuff_test2.expect
+ create mode 100755 Open-ILS/xul/staff_client/server/addon/pv_supa_goodstuff_tests/pv_supa_goodstuff_test3.expect
+ create mode 100644 Open-ILS/xul/staff_client/server/locale/en-US/addon/pv_supa_goodstuff.properties
+ create mode 100644 Open-ILS/xul/staff_client/server/skin/addon/pv_supa_goodstuff.css
+ create mode 100644 docs/RELEASE_NOTES_NEXT/pv_supa_goodstuff.txt
+
+commit 8095a2efaa6ce9c264c531a46dc3983012686457
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Fri Dec 21 00:19:37 2012 -0500
+
+    JSAN module autoloader for "add-ons"
+    
+    This adds a "Server Add-ons" menu entry under Admin -> Workstation
+    Administration in the staff client.  Choosing this allows you to edit or set a
+    list of identifiers that correspond to JSAN-style modules found in
+    /server/addons/, and is meant mainly for activating 3rd party modules within the
+    staff client on a per-workstation basis.  You need the
+    ADMIN_SERVER_ADDON_FOR_WORKSTATION permission to use it.
+    
+    Configuration options for activated add-ons may also show up in this interface.
+    
+    More technical details:
+    
+    This Server Add-ons list is stored as a JSON array in the Mozilla preference
+    'oils.addon.autoload.list'.
+    
+    We also add an addon.autoloader module that gets called in most XUL interfaces
+    via the util_overlay file.  This autoloader will loop through the modules
+    specified in 'oils.addon.autoload.list' and instantiate each, storing a
+    reference to each of the newly created objects in a data structure in
+    window.oils_autoloaded.
+    
+    So, as an example, let's say there is a module: /xul/server/addon/uber_scan.js
+    And we have the identifier 'uber_scan' in our Server Add-ons list.  Then, on
+    every page load of a XUL interface using the stock util overlay, we will
+    effectively call:
+    
+        new addon.uber_scan();
+    
+    Causing the code in the module to execute.  It is up to the module to determine
+    whether it needs to do anything within a given interface.
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    
+    Conflicts [permission numbering]:
+    	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+3	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+17	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.server_addon_perms.sql
+1	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+15	0	Open-ILS/xul/staff_client/chrome/content/OpenILS/global_util.js
+2	1	Open-ILS/xul/staff_client/chrome/content/main/constants.js
+10	0	Open-ILS/xul/staff_client/chrome/content/main/menu.js
+4	0	Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul
+83	0	Open-ILS/xul/staff_client/server/addon/addons.js
+55	0	Open-ILS/xul/staff_client/server/addon/addons.xul
+78	0	Open-ILS/xul/staff_client/server/addon/autoloader.js
+6	0	Open-ILS/xul/staff_client/server/locale/en-US/addon/addons.properties
+12	0	docs/RELEASE_NOTES_NEXT/xul_server_addons.txt
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.server_addon_perms.sql
+ create mode 100644 Open-ILS/xul/staff_client/server/addon/addons.js
+ create mode 100644 Open-ILS/xul/staff_client/server/addon/addons.xul
+ create mode 100644 Open-ILS/xul/staff_client/server/addon/autoloader.js
+ create mode 100644 Open-ILS/xul/staff_client/server/locale/en-US/addon/addons.properties
+ create mode 100644 docs/RELEASE_NOTES_NEXT/xul_server_addons.txt
+
+commit 6de0fc1489856c74af2b0a5f55bb841aec74834d
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Mon Dec 10 06:30:33 2012 -0500
+
+    internal: JSAN socket library
+    
+    Leverages Mozilla's nsISocketTransportService, nsIScriptableInputStream, and
+    nsIInputStreamPump XPCOM, and the NetUtils javascript module.
+    
+        Usage example:
+    
+        Install netcat on a server and as root do:  nc -l -p 5000
+    
+        Then, in the staff client, load Admin -> For Developers -> Javascript Shell
+    
+        Enter:
+    
+        JSAN.use('util.socket');
+        var s = new util.socket('server hostname or IP address here', 5000);
+        s.write('hello\n');
+    
+        On the server, reply with world<enter>
+    
+        Back in the javascript shell, use
+    
+        s.read();
+    
+    This is geared to help with implementing future functionality, but shouldn't
+    result in any end-user visible changes by itself.
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+157	0	Open-ILS/xul/staff_client/chrome/content/util/socket.js
+ create mode 100644 Open-ILS/xul/staff_client/chrome/content/util/socket.js
+
+commit 35bbeaea9a5dfc812c82c19061d96a9c514e2b7d
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu Dec 20 17:17:24 2012 -0500
+
+    internal: an alternative to default_focus
+    
+    Interfaces can now set event listeners on their window for 'tab_focus' instead
+    of defining a single default_focus function.
+    
+    We also include a change to browser.js so that embedded interfaces also get
+    their default_focus function called (and a tab_focus event sent).
+    
+    This is geared to help future functionality, but shouldn't produce any end-user
+    visible changes by itself.
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+8	0	Open-ILS/xul/staff_client/chrome/content/main/menu.js
+11	0	Open-ILS/xul/staff_client/chrome/content/util/browser.js
+
+commit 62e7f75f9e68f0ee01dba56c3c5c2f841b7f8ae8
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu Dec 20 16:10:57 2012 -0500
+
+    internal: default_focus not called
+    
+    Minor bug. Was being called in an else clause dependent on some help context
+    logic for new tabs, but should be called for every new tab. Shouldn't result
+    in any end-user visible change, but if interfaces wrapped in browser.js were
+    to have a default_focus function, then this could come into play.
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	1	Open-ILS/xul/staff_client/chrome/content/main/menu.js
+
+commit 07b1be03657ff1a447b5e3e0f12a138bd2546791
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Wed Dec 26 06:33:47 2012 -0500
+
+    internal: allow checkout ui to set statusbar
+    
+    Minor bug fix and geared toward future functionality
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	1	Open-ILS/xul/staff_client/server/patron/display.js
+
+commit d1d41d16c7ace2c097c0dbea8c0b72a3bc6a690c
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Sep 12 13:13:23 2013 -0400
+
+    Optimize container filters in QueryParser
+    
+    When a container filter is used at the top level of a QueryParser
+    query (that is, in a simple query with no OR-logic branches or explicit
+    nesting groups) we can use an INNER join instead of LEFT + IS NOT NULL.
+    
+    On some production datasets this showed an increase in performance from
+    20+ seconds to 1ms for the core query.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+6	5	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+
+commit 2e447f31f3cd379b8323d646be7e10333153f498
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Sep 11 13:49:07 2013 -0400
+
+    LP#1084758 store staff client tpac (etc) zoom pref
+    
+    Staff client pages loaded via browser.xul which have a name (via
+    internal XUL URL param) now have the ability to store and load a per-
+    page zoom value preference.  This includes (at minimum) the embedded
+    TPAC.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+34	0	Open-ILS/xul/staff_client/chrome/content/util/browser.js
+3	3	Open-ILS/xul/staff_client/chrome/content/util/browser.xul
+
+commit 8f3ced2f524541486ca463c11146dab63547543b
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Tue May 8 10:56:08 2012 -0400
+
+    Add Zoom support to browser views
+    
+    Currently tied to CTRL with +/-/0 like Firefox uses.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+10	0	Open-ILS/xul/staff_client/chrome/content/util/browser.xul
+10	0	Open-ILS/xul/staff_client/chrome/content/util/rbrowser.xul
+
+commit a9d88279ea90355b9c683218f8d0b0192970f40f
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Jun 20 15:46:33 2013 -0400
+
+    LP1193095 lineitem batch actions sanity filters
+    
+    Avoid applying the following actions to lineitems which are in a state
+    where each action makes no sense.
+    
+    The following actions are affected.  For each, the set of states for
+    which a lineitem must be in for the action to proceed is listed.
+    
+    create PO
+        - new selector-ready order-ready approved
+    add to PO
+        - new selector-ready order-ready approved
+    create invoice
+        - !cancelled
+    add to invoice
+        - !cancelled
+    cancel lineitem
+        - !cancelled
+    mark selector ready
+        - new
+    mark order ready
+        - new selector-ready
+    mark received
+        - pending-order on-order
+    
+    Depending on the interface, some top-level lineitem actions may be
+    globally disabled.  The list of states listed above represent the bare
+    minimum requirements.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/web/js/dojo/openils/acq/nls/acq.js
+92	20	Open-ILS/web/js/ui/default/acq/common/li_table.js
+
+commit dc7ec6cfb60d66150ad43d4157a63ea739667217
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Sep 3 16:15:21 2013 -0400
+
+    LP#1220387 silence deprecation warning in Normalizer
+    
+    Avoid the following error:
+    
+    UNIVERSAL->import is deprecated and will be removed in a future perl at
+    Open-ILS/src/perlmods/lib/OpenILS/Utils/Normalize.pm line 6
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Utils/Normalize.pm
+
+commit 46a7817d1339487bacf6f056be1a8507a7bca9bf
+Author: Ben Shum <bshum at biblio.org>
+Date:   Fri Sep 6 23:20:16 2013 -0400
+
+    Stamping upgrade script for biblio A/T title variable fix
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+18	0	Open-ILS/src/sql/Pg/upgrade/0825.data.bre_format.sql
+0	18	Open-ILS/src/sql/Pg/upgrade/XXXX.data.bre_format.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0825.data.bre_format.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.bre_format.sql
+
+commit 8562d2c8815b924a5c075f61dc76ba25605fcb15
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu Nov 8 11:27:13 2012 -0500
+
+    reset title variable when looping with biblio A/T
+    
+    Two templates that I'm concerned with, though there may be others that could use
+    this treatment: biblio.record_entry.email and biblio.record_entry.print
+    
+    Basically, they can group events from the same user and consolidate bibs, but as
+    they loop through the bibs they're not clearing the temporary variable that
+    contains the bib title, so we get duplicated and run-on titles in the output.
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    
+    Conflicts:
+    	Open-ILS/src/sql/Pg/002.schema.config.sql
+
+2	2	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+18	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.bre_format.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.bre_format.sql
+
+commit 160d864cff8c1018c694609721afd378963b7b0d
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Thu May 23 13:24:04 2013 -0700
+
+    LP1183553 (continued) - Fix applied filters
+    
+    The filter dialog kept the previous filter around and then joined the
+    new one with it. This repairs that issue and applies the new filter
+    options on subsequent loading.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/web/js/dojo/openils/widget/AutoGrid.js
+
+commit c06c26252f4d592bd7dc86437f68901981700635
+Author: Steven Chan <schan at sitka.bclibraries.ca>
+Date:   Thu May 23 13:24:04 2013 -0700
+
+    LP1183553 - Default filter option for configuration screens
+    
+    In the staff client, the AutoGrid widget is used to render configuration
+    lists, and by default, the setting 'showLoadFilter' is turned off.  It
+    seems more useful to turn it on by default so that any configuration
+    screen can use it unless its template sets it off.
+    
+    Signed-off-by: Steven Chan <schan at sitka.bclibraries.ca>
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/web/js/dojo/openils/widget/AutoGrid.js
+
+commit 31b58d1b8901f9233857d5958d1fe6d1e303382d
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Mon Aug 19 14:29:23 2013 -0400
+
+    The ILS User reports source branches to an All Hold Requests linked source
+    that was marked class="circ" instead of class="ahr".  This corrects that problem.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/examples/fm_IDL.xml
+
+commit a9ea03bc8c51a6177612feffe1658c3b406154f9
+Author: Ben Shum <bshum at biblio.org>
+Date:   Thu Aug 29 14:58:20 2013 -0400
+
+    Fix some bad break syntax
+    
+    Change </br> to a more appropriate <br/>
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+5	5	Open-ILS/src/templates/circ/selfcheck/banner.tt2
+1	1	Open-ILS/src/templates/opac/password_reset.tt2
+
+commit 2859d88277b44e89b6efbeac7de77d12f0ddd0ff
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Sep 3 11:10:12 2013 -0400
+
+    .gitignore installed files more generically
+    
+    Avoid naming specific versions to ignore when possible.
+    
+    * Ignore any files in root directory (Evergreen/) that match js
+      or JavaScript (from the installer).
+    * Ignore all xulrunner*.bz2 and xulrunner*.zip
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+4	8	.gitignore
+
+commit 0835a6ee5b9fb387b49fb4e315562225957cd8cc
+Author: Ben Shum <bshum at biblio.org>
+Date:   Thu Aug 22 13:56:25 2013 -0400
+
+    Add xulrunner 14, built libmar tools, and some javascript files to .gitignore
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+12	0	.gitignore
+
+commit dcc6f453225723945c55b5b1162d3cc667911f1e
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Aug 22 12:36:17 2013 -0400
+
+    Add some 'make check' objects to .gitignore
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+3	0	.gitignore
+
+commit 48cd176db46f0119d898cd010f5b16f335c8fe7d
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu Aug 22 12:29:51 2013 -0400
+
+    Add more built things to .gitignore for master
+    
+    Tired of seeing all this meaningless red from `git status`
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+8	0	.gitignore
+
+commit a8118d892da94aa4dbd04e1559b82b731baba1b8
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Wed Sep 4 09:07:47 2013 +0300
+
+    Unify appellee/appellant relators
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+3	3	Open-ILS/src/templates/opac/parts/relators.tt2
+
+commit 64a503f12cd1094636818d4dd5725d73905517bd
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Tue Sep 3 14:30:22 2013 -0400
+
+    add src/Pg/live_t/
+    
+    for tests that assume stock test data
+    
+    Moving 0824.item_import_defaults.pg from t/ to live_t/
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+113	0	Open-ILS/src/sql/Pg/live_t/0824.item_import_defaults.pg
+1	0	Open-ILS/src/sql/Pg/live_t/README
+0	113	Open-ILS/src/sql/Pg/t/0824.item_import_defaults.pg
+ create mode 100644 Open-ILS/src/sql/Pg/live_t/0824.item_import_defaults.pg
+ create mode 100644 Open-ILS/src/sql/Pg/live_t/README
+ delete mode 100644 Open-ILS/src/sql/Pg/t/0824.item_import_defaults.pg
+
+commit 0fe3737ad1c291834dd9fff49f1661e576a3ae73
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Sep 3 11:45:25 2013 -0400
+
+    PgTAP tests for 0824
+    
+    As promised at the August 2013 dev meeting, I'll be adding PgTAP tests
+    for any database work that I create, and where possible for any that
+    I commit for others.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+113	0	Open-ILS/src/sql/Pg/t/0824.item_import_defaults.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/0824.item_import_defaults.pg
+
+commit 2f2fccbbcf9fa0df01999c1543bcb14bf3c1b77b
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Aug 30 09:32:02 2013 -0400
+
+    Stamping upgrade script for Vandelay item import defaults
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+491	0	Open-ILS/src/sql/Pg/upgrade/0824.schema.vandelay-item-import-defaults.sql
+0	491	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.vandelay-item-import-defaults.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0824.schema.vandelay-item-import-defaults.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.vandelay-item-import-defaults.sql
+
+commit db143bff957ca82507d5a977d3f4728e0dfc864a
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Aug 8 09:16:19 2013 -0400
+
+    LP1209291 vandelay item defaults release notes
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+21	0	docs/RELEASE_NOTES_NEXT/Cataloging/vandelay-item-import-defaults.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/vandelay-item-import-defaults.txt
+
+commit 0b8e167739f5722524063de5bd9380a8118fb793
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Aug 7 12:05:30 2013 -0400
+
+    LP1209291 vandelay item import defaults
+    
+    Via org settings, support auto-generation of call numbers and barcodes
+    for items imported via Vandelay's Item Import interface.  Support
+    settings for applying a local prefix string to auto-generated call
+    numbers and barcodes.  For both, the prefix defaults to "VAN".
+    
+    Similarly, support default copy location and circ modifiers.
+    
+    The new org unit settings:
+    
+    vandelay.item.barcode.auto
+    vandelay.item.barcode.prefix
+    vandelay.item.call_number.auto
+    vandelay.item.call_number.prefix
+    vandelay.item.copy_location.default
+    vandelay.item.circ_modifier.default
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+69	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
+85	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+43	2	Open-ILS/src/sql/Pg/999.functions.global.sql
+491	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.vandelay-item-import-defaults.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.vandelay-item-import-defaults.sql
+
+commit 4b1ef525740b371e1aa5b273d6a3f2fccc0a6534
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Wed Jul 17 19:07:45 2013 +0300
+
+    Save times in HH:MM format for hours of operation
+    
+    When editing Hours of Operation, save the times in HH:MM format,
+    as that is what the database wants.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+14	14	Open-ILS/web/conify/global/actor/org_unit.html
+5	0	Open-ILS/web/conify/global/actor/org_unit.js
+
+commit 1c595b8d9b92a57b9e48d55d30e215a00afadcfe
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Mon Jul 22 12:35:46 2013 -0400
+
+    Fixing LP 1203796.
+    
+    The alternate view in the Item Status screen shows a "Total Circs"
+    field that was under-counting circulations because UNION filtered
+    out duplicates.  This commit replaces UNION with UNION ALL, which
+    allows duplicate rows.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+2	2	Open-ILS/examples/fm_IDL.xml
+
+commit ad0da8c8fed4699e8a881d0e1e85cba1742e64bf
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Sun Aug 25 00:41:37 2013 -0400
+
+    Schema.org authors: relate properties to the right context
+    
+    While the approach of using the existing <a href> to launch a new search
+    based on the author name was workable, it may have been confusing for
+    schema.org processors such as Google Rich Snippets who expected that URI
+    to identify a resource for the author, not a set of search results.
+    
+    Using @resource / @about attribute pairing, and wrapping the whole type
+    in an extra <span> element, enables us to avoid associating the
+    properties within the <a href> with the implicitly chained type.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+11	7	Open-ILS/src/templates/opac/parts/record/authors.tt2
+
+commit 21bc07079d265b90c5e0a780718810ac3b384b4d
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Aug 22 18:30:34 2013 -0400
+
+    Schema.org: relate offers to record explicitly
+    
+    Although schema.org defines the nested child elements as implicit
+    relationships that should be good enough for the Offer-to-Product
+    relationship, defining that relationship explicitly can't hurt.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/templates/opac/parts/record/body.tt2
+2	0	Open-ILS/src/templates/opac/parts/record/copy_counts.tt2
+1	0	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+
+commit c3cfcf3c2943a3a9c5cf417d72cd6dbcb72809be
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Aug 20 12:45:44 2013 -0400
+
+    Map the bound-with relationship in schema.org
+    
+    We don't know what type the target record is, so fall back to Product
+    and just point at it. At least this way schema.org processors will know
+    that the target bib is related to the current bib.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+8	2	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+
+commit 1f55d0e4764e06d9b6170ef4977cd26a9431214c
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Sun Aug 25 00:40:46 2013 -0400
+
+    Add structured data for holdings via http://schema.org/Offer
+    
+    Map library name to Offer/seller, shelving location to
+    Offer/availableAtOrFrom, call number to Offer/sku, barcode to
+    Offer/serialNumber, copy status to Offer/availability, and ISBN-13 to
+    gtin13. Use the additionalType of Product to give these offers an
+    obvious relationship.
+    
+    Surface copy counts as AggregateOffer instances.
+    
+    Cut over to RDFa Lite instead of microdata for schema.org, as RDFa Lite
+    is more easily extensible with other vocabularies, and is as accepted as
+    microdata by schema.org processors.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+1	1	Open-ILS/src/templates/opac/parts/ac_google_books.tt2
+21	1	Open-ILS/src/templates/opac/parts/misc_util.tt2
+8	8	Open-ILS/src/templates/opac/parts/record/authors.tt2
+1	1	Open-ILS/src/templates/opac/parts/record/body.tt2
+1	1	Open-ILS/src/templates/opac/parts/record/contents.tt2
+7	2	Open-ILS/src/templates/opac/parts/record/copy_counts.tt2
+16	8	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+1	1	Open-ILS/src/templates/opac/parts/record/subjects.tt2
+13	7	Open-ILS/src/templates/opac/parts/record/summary.tt2
+
+commit 3732a7f7629a3ca5be60465b9daf4f641448efcc
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Sun Aug 25 00:39:46 2013 -0400
+
+    Schema.org: improve MusicGroup vs. Person parsing
+    
+    Take a stricter approach to defining MusicGroups instead of Persons for
+    the main authors of MusicAlbums. Music groups are generally catalogued
+    as a 110 or 710 tag, and this avoids defining birthDates and deathDates
+    for groups (which, however valid that might be in the real world, is not
+    valid for schema.org).
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/templates/opac/parts/record/authors.tt2
+
+commit 3613e273d1d0d399e35389a009affc7d31b83f79
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Aug 23 19:33:58 2013 -0400
+
+    Stamping upgrade for patron self-reg
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+102	0	Open-ILS/src/sql/Pg/upgrade/0823.schema.patron-self-reg.sql
+0	100	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-self-reg.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0823.schema.patron-self-reg.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-self-reg.sql
+
+commit 7df7e939c02a61bba1c87bfd8bc9b417adb8828a
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Aug 23 19:25:06 2013 -0400
+
+    Trivial changes
+    
+    -Fix (conform) whitespace in IDL
+    -Fix "county" typo in settings label
+    -Restore mysteriously absent "Bottom Link 2" :)
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	5	Open-ILS/examples/fm_IDL.xml
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-self-reg.sql
+2	1	Open-ILS/src/templates/opac/parts/footer.tt2
+
+commit cb2ad9df75ec15d6587dc0b27dc5b409f6b2d49e
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Aug 6 12:08:00 2013 -0400
+
+    LP1207396 Patron Self-Register Release Notes
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+53	0	docs/RELEASE_NOTES_NEXT/OPAC/patron_self_reg.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/patron_self_reg.txt
+
+commit 5981733f695d4b2ac8c17e5c229184b2f77fa88e
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Aug 6 13:52:24 2013 -0400
+
+    LP1207396 pending patron reg show requestor
+    
+    Show a link to the requesting user, when present, for pending patrons in
+    the staff client patron registration form.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+6	0	Open-ILS/src/templates/actor/user/register.tt2
+1	0	Open-ILS/web/css/skin/default/register.css
+2	1	Open-ILS/web/js/dojo/openils/actor/nls/register.js
+34	0	Open-ILS/web/js/ui/default/actor/user/register.js
+
+commit a14e0b45a3f084e17c5d2817553d4acf67999fb0
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Aug 6 09:31:11 2013 -0400
+
+    LP1207396 TPAC org_selector supports org filter
+    
+    When building and org unit selector via the build_org_selector MARCO,
+    the caller can now pass in a "valid_org_list" array which contains org
+    unit IDs.  When such a list is provided, any org units in the selector
+    which are not in the list are marke as disabled.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+9	1	Open-ILS/src/templates/opac/parts/org_selector.tt2
+
+commit 6dd7c5dfc73bf5ebbc52caac578ce4309161a05d
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Aug 1 16:52:18 2013 -0400
+
+    LP1207396 Patron self-registration web form
+    
+    Web form for allowing patrons to submit thier own library registration
+    requests.  The form collects various bits of user data and creates a
+    pending user account, which has no privileges.  These pending accounts
+    must be approved and completed by staff from the staff client "Pending
+    Patrons" action in the Cirulation menu.
+    
+    Control of whether to show a field, treat a field as required, show
+    example text, and validate the field format is managed with existing org
+    unit settings.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+242	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Register.pm
+17	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
+25	0	Open-ILS/src/templates/opac/css/style.css.tt2
+6	1	Open-ILS/src/templates/opac/parts/footer.tt2
+7	0	Open-ILS/src/templates/opac/parts/org_selector.tt2
+177	0	Open-ILS/src/templates/opac/register.tt2
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Register.pm
+ create mode 100644 Open-ILS/src/templates/opac/register.tt2
+
+commit 4a3a7193dbe5388b5672f29108c59dedeee65cc4
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Aug 6 10:10:19 2013 -0400
+
+    LP1207396 user stage allows username selection
+    
+    The caller may now pass a value for username.  If unset, it still falls
+    back to using a uuid.  If the username clashes with an existing staged
+    username, a USERNAME_EXISTS event is returned.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Stage.pm
+
+commit 26b04ccb853a4edd71bd820231061d4eeec16f53
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Aug 6 11:09:45 2013 -0400
+
+    LP1207396 purge old pending users
+    
+    Script to delete pending user accounts based on the interval defined in
+    the opac.pending_user_expire_interval org unit setting.
+    
+    Add /openils/bin/purge_pending_users.srfsh to opensrf's CRON.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+3	0	Open-ILS/examples/crontab.example
+24	0	Open-ILS/src/sql/Pg/015.schema.staging.sql
+25	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-self-reg.sql
+7	0	Open-ILS/src/support-scripts/purge_pending_users.srfsh
+ create mode 100755 Open-ILS/src/support-scripts/purge_pending_users.srfsh
+
+commit 97b3335282973d0577a521d1415b079ec88671ff
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Aug 1 13:30:52 2013 -0400
+
+    LP1207396 DB / IDL for patron self-reg
+    
+    Updating pending addr tables to track requesting user and address county.
+    
+    Adding org settings:
+    
+    * opac.allow_pending_user -- allow self-registration
+    * opac.pending_user_expire_interval - delete pending user interval
+    * ui.patron.edit.aua.county.require - indicate if county is required
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+6	0	Open-ILS/examples/fm_IDL.xml
+6	4	Open-ILS/src/sql/Pg/015.schema.staging.sql
+54	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+75	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-self-reg.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-self-reg.sql
+
+commit f9a2646c51ad3b71c3af0dd422dd0ab32bd5f363
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Fri Aug 23 10:35:12 2013 -0400
+
+    LP#1182519 Stamping DB upgrade 0822
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+31	0	Open-ILS/src/sql/Pg/upgrade/0822.schema.per-hold-behind-desk.sql
+0	31	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.per-hold-behind-desk.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0822.schema.per-hold-behind-desk.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.per-hold-behind-desk.sql
+
+commit 54bc2edb1e4bfceaba08e9526389aebd60dbf830
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue May 21 11:59:36 2013 -0400
+
+    LP1182519 Per-Hold Behind Desk Value
+    
+    The true/false value for behind_desk is now stored directly on the hold
+    object for more accurate tracking of the location of captured holds.
+    If configured, patrons can now set their preferred value for behind the
+    desk holds.
+    
+     * DB/IDL changes to support the new column
+     * API support for loading the setting from the patron for cases when no
+       value is provided by the caller.
+     * Staff client grid column definition for the Behind Desk field
+     * Hold counts in the staff client now show total, available, and
+       behind-desk (at the workstation).
+     * Printed hold receipt now uses the behind_desk value on the hold to
+       decide if a hold is behind the desk.
+     * Release notes
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    
+    Conflicts:
+    
+    	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+    
+    Resolved 2 conflicts in Actor.pm sub hold_request_count
+    Retained the parameters as:
+      my( $self, $client, $authtoken, $user_id, $ctx_org) = @;
+    
+    And retained:
+    
+    my @ready = grep { .... } @$holds code.
+    
+    Signed-off-by: Garry Collum <gcollum at gmail.com>
+
+3	0	Open-ILS/examples/fm_IDL.xml
+16	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm
+28	10	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+26	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+22	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+2	1	Open-ILS/src/sql/Pg/090.schema.action.sql
+31	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.per-hold-behind-desk.sql
+10	0	Open-ILS/src/templates/opac/myopac/prefs_settings.tt2
+1	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+30	19	Open-ILS/xul/staff_client/server/circ/util.js
+1	0	Open-ILS/xul/staff_client/server/locale/en-US/circ.properties
+4	0	Open-ILS/xul/staff_client/server/locale/en-US/patron.properties
+30	5	Open-ILS/xul/staff_client/server/patron/summary.js
+5	0	Open-ILS/xul/staff_client/server/patron/summary_overlay.xul
+32	0	docs/RELEASE_NOTES_NEXT/Circulation/per-hold-behind-desk.txt
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.per-hold-behind-desk.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/per-hold-behind-desk.txt
+
+commit 347e376ee8e2ce9967ddd446376721f0e637340a
+Author: Ben Shum <bshum at biblio.org>
+Date:   Thu Aug 22 12:16:39 2013 -0400
+
+    Add placeholder file for 0821 upgrade script
+    
+    0821 was added as a backport fix for 2.3 and 2.4, but not master.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+10	0	Open-ILS/src/sql/Pg/upgrade/0821.function.browse-normalize-timing.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0821.function.browse-normalize-timing.sql
+
+commit 80e3f6f63a6e8ce422e6b2e1f7c981a7c2e5ff49
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 14 10:25:14 2013 -0400
+
+    Correctly mark nested INNER joins as such
+    
+    We've been adopting containing the JOINs flavor, and then
+    attempting to use IS NOT NULL to restrict NULL-ness
+    in the WHERE clause.  This is almost right, but not quite,
+    and was done in an attempt to match behavior with the
+    expectations of users that are not SQL experts.  However,
+    right is better than "looks right most of the time", so
+    we use the proper join type now.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Jason Boyer <jboyer1 at library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Reporter/SQLBuilder.pm
+
+commit fb37e15ec7476be5a8c772595d613853e3e11019
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Thu Nov 1 09:08:38 2012 -0400
+
+    Fix A/T object cache
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+14	10	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Event.pm
+
+commit 3df6b003d17562128ad3b9220b2330ecea10aef3
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu May 23 13:30:43 2013 -0400
+
+    LP1183467 ACQ view funding source list permissions
+    
+    Limit the set of funding sources visible in the funding source list
+    interface by those the user has view permissions for, not just those the
+    user has edit permissions for.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/web/js/ui/default/acq/financial/list_funding_sources.js
+
+commit 4309de39d4c8be73a9638cf484cd13d4667e8407
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Aug 22 11:26:20 2013 -0400
+
+    Stamping upgrade script for series title normalizer improvement
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+28	0	Open-ILS/src/sql/Pg/upgrade/0820.data.series_normalizer.sql
+0	28	Open-ILS/src/sql/Pg/upgrade/xxxx.data.series_normalizer.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0820.data.series_normalizer.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.data.series_normalizer.sql
+
+commit d8422ab3072cc5fc8d872e9b79c5a5696d181b6f
+Author: Steven Callender <stevecallender at esilibrary.com>
+Date:   Tue Jun 4 14:11:50 2013 -0400
+
+    Remove [ and ] characters from seriestitle index LP#1187521
+    
+    Signed-off-by: Steven Callender <stevecallender at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+20	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+28	0	Open-ILS/src/sql/Pg/upgrade/xxxx.data.series_normalizer.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.data.series_normalizer.sql
+
+commit 43fd9c1e17aad99b58e241e1df5bc1c24656f505
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Jul 12 14:43:57 2013 -0400
+
+    Repair remaining Authority Fixed Field editor entries
+    
+    The "Item" fixed field is only valid for MFHD records, so we remove
+    that entirely from AUTH records.  The "GeoSubd" fixed field is
+    spelled "GeoDiv" everywhere, so we align that naming so that it can
+    be saved.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/web/js/dojo/MARC/FixedFields.js
+1	1	Open-ILS/xul/staff_client/server/cat/marcedit.xul
+
+commit 170e5c8c11958dc23a0936b84d408390513a00df
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Aug 22 10:24:57 2013 -0400
+
+    Propagating 2.3.10 DB upgrade script
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+75	0	Open-ILS/src/sql/Pg/version-upgrade/2.3.9-2.3.10-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.3.9-2.3.10-upgrade-db.sql
+
+commit eda67ed4588d0a07a91896b90337bdbc8cc4c8f1
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Jul 11 13:04:53 2013 -0400
+
+    Remove JSPAC-oriented PasswordReset.pm interface
+    
+    A native TPAC interface for resetting passwords arrived some time ago,
+    and the i18n for PasswordReset.pm predated the more standardized
+    approach taken by TPAC. So... kill the JSPAC interface and save
+    ourselves a little bit of Apache overhead in the process.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+0	1	Open-ILS/examples/apache/eg.conf.in
+0	1	Open-ILS/examples/apache/eg_startup.in
+0	15	Open-ILS/examples/apache/eg_vhost.conf.in
+0	1	Open-ILS/examples/apache_24/eg.conf.in
+0	15	Open-ILS/examples/apache_24/eg_vhost.conf.in
+0	1	Open-ILS/src/perlmods/MANIFEST
+0	219	Open-ILS/src/perlmods/lib/OpenILS/WWW/PasswordReset.pm
+1	2	Open-ILS/src/perlmods/t/15-OpenILS-WWW.t
+0	33	Open-ILS/src/templates/password-reset/request-form.tt2
+0	17	Open-ILS/src/templates/password-reset/reset-form.tt2
+0	15	Open-ILS/src/templates/password-reset/strings.en-US
+0	15	Open-ILS/src/templates/password-reset/strings.fr-CA
+ delete mode 100644 Open-ILS/src/perlmods/lib/OpenILS/WWW/PasswordReset.pm
+ delete mode 100644 Open-ILS/src/templates/password-reset/request-form.tt2
+ delete mode 100644 Open-ILS/src/templates/password-reset/reset-form.tt2
+ delete mode 100644 Open-ILS/src/templates/password-reset/strings.en-US
+ delete mode 100644 Open-ILS/src/templates/password-reset/strings.fr-CA
+
+commit baca6d363a0f4d08b07379dd3595baff2cb1b714
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Tue Jul 2 15:27:39 2013 -0400
+
+    Acq: Honor new dist forumula fields in old method of applying formulae
+    
+    The batch updater came with new fields on distribution formulae, but we
+    didn't teach the pre-existing code for applying formulae from the
+    lineitem copies interface to apply values from the new fields.
+    
+    Reported by Jennifer Pringle in Launchpad bug report #1195521.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+1	1	Open-ILS/web/js/ui/default/acq/common/li_table.js
+
+commit b7f13bf99487c79d65300267e82c297d95796d86
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu Aug 1 12:34:21 2013 -0400
+
+    silence some unitialized warnings
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Utils/Fieldmapper.pm
+
+commit 21bc541d8439610093e756db563501875a7bc1d3
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Mon Jan 23 18:44:00 2012 -0500
+
+    Invoke skull-and-crossbones popup in batch receive for server-side errors
+    
+    And introduce a minor bumper rail to guide serials users who might try
+    to hand-edit a holding code.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    
+    Conflicts:
+        Open-ILS/xul/staff_client/server/serial/batch_receive.js
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+14	2	Open-ILS/web/js/dojo/openils/widget/HoldingCode.js
+28	9	Open-ILS/xul/staff_client/server/serial/batch_receive.js
+
+commit e5a3ee75ff36d3ace32b6b432e4458432f9d578f
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Aug 21 11:57:40 2013 -0400
+
+    Make C unit tests more robust
+    
+    Adding -I at abs_top_srcdir@/Open-ILS/include will pull in the source tree
+    header files, so that the C unit tests can run before Evergreen has been
+    installed (and thus will be a valid test of the source header files
+    instead of relying on the installed versions that might be different).
+    
+    Build c-apps before recursing into c-apps/tests:
+    This ensures that the required libraries are built before the C unit
+    tests are built, thus preventing "make check" on a just-configured
+    source tree from failing due to missing dependencies.
+    
+    Also, link to the source tree directories first rather than last, to
+    ensure that we pull in the correct source (if possible). And remove the
+    cargo-cultish $(TMP) linking/including.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+1	1	Open-ILS/src/c-apps/Makefile.am
+3	3	Open-ILS/src/c-apps/tests/Makefile.am
+
+commit 82d65eccd0c40ab9e832a6a196b11608aa9520a4
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Mon Jun 10 08:42:18 2013 +0300
+
+    Move HTML tags out of translatable strings in toolkit templates.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+1	1	Open-ILS/src/templates/acq/common/claim_dialog.tt2
+2	2	Open-ILS/src/templates/acq/common/li_table.tt2
+1	2	Open-ILS/src/templates/acq/financial/claim_eligible.tt2
+16	16	Open-ILS/src/templates/acq/fund/list.tt2
+1	2	Open-ILS/src/templates/acq/picklist/from_bib.tt2
+1	2	Open-ILS/src/templates/acq/search/unified.tt2
+12	8	Open-ILS/src/templates/conify/global/acq/edi_account.tt2
+2	2	Open-ILS/src/templates/kpac/getit.tt2
+8	16	Open-ILS/src/templates/kpac/getit_results.tt2
+1	3	Open-ILS/src/templates/kpac/parts/paginate.tt2
+4	4	Open-ILS/src/templates/opac/myopac/lists.tt2
+2	2	Open-ILS/src/templates/opac/myopac/update_email.tt2
+3	3	Open-ILS/src/templates/opac/myopac/update_password.tt2
+3	6	Open-ILS/src/templates/opac/myopac/update_username.tt2
+2	2	Open-ILS/src/templates/opac/parts/login/form.tt2
+8	8	Open-ILS/src/templates/opac/parts/myopac/main_refund_policy.tt2
+3	3	Open-ILS/src/templates/opac/parts/myopac/prefs_hints.tt2
+1	1	Open-ILS/src/templates/opac/parts/pref_lib_display.tt2
+22	16	Open-ILS/src/templates/opac/parts/result/lowhits.tt2
+6	6	Open-ILS/src/templates/opac/parts/result/paginate.tt2
+6	7	Open-ILS/src/templates/serial/subscription.tt2
+1	1	Open-ILS/web/js/dojo/openils/acq/nls/acq.js
+1	1	Open-ILS/web/js/dojo/openils/actor/nls/register.js
+5	5	Open-ILS/web/js/dojo/openils/circ/nls/selfcheck.js
+2	2	Open-ILS/web/js/ui/default/acq/financial/list_funds.js
+3	3	Open-ILS/web/js/ui/default/actor/user/register.js
+5	5	Open-ILS/web/js/ui/default/circ/selfcheck/selfcheck.js
+6	6	Open-ILS/xul/staff_client/server/locale/en-US/patron.properties
+6	6	Open-ILS/xul/staff_client/server/patron/display.js
+
+commit 53c35f70231bb661b1f38e451ae91bf116789e70
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Aug 21 09:51:10 2013 -0400
+
+    Copying 2.3.8-2.3.9 SQL upgrade script
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+94	0	Open-ILS/src/sql/Pg/version-upgrade/2.3.8-2.3.9-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.3.8-2.3.9-upgrade-db.sql
+
+commit 856e992c21ce0812d36248a502b2ebb0601ee215
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Wed Sep 19 15:27:03 2012 -0400
+
+    Acq general search: improve searching for negative comparisons
+    
+    This aims to address Launchpad bug #1031535.  I think the bug only
+    really shows up when searches involve invoices either as the core type
+    or with filter fields.  If a search doesn't involve invoices, the
+    problematic joins aren't present.
+    
+    Could use more testing though.  Seems to make the problem go away, and
+    other basic searches seem to work, but I certainly haven't tested
+    everything.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+24	4	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Search.pm
+
+commit 11639547a6d21bb92009a237473ff7b660d3d59c
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Jul 12 17:20:07 2013 -0400
+
+    Move exchange_rate seed data to 950 file
+    
+    Since currency_type is a foreign key of acq.exchange_rate, if we move
+    currency_type to the seed data file, exchange rate must follow.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+0	3	Open-ILS/src/sql/Pg/200.schema.acq.sql
+3	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 64e473dbbf8d45447256a860801a2a9a6868468a
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Tue Jun 11 11:53:42 2013 +0300
+
+    Move acq.currency_code entries and wrap for i18n
+    
+    Fix LP#1107834 by moving the acq.currency_code entries into
+    950.data.seed-values.sql and wrapping the texts with oils_i18n_gettext.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+0	5	Open-ILS/src/sql/Pg/200.schema.acq.sql
+5	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 3e7cbfa71cef994682bdf73b281298aa448bb388
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Aug 20 13:02:23 2013 -0400
+
+    Fedora: remove source installs for packaged dependencies
+    
+    The Perl MARC packages, Library::CallNumber::LC, and libdbi / libdbd
+    drivers have been available as packages on Fedora since Fedora 18 (which
+    is now the oldest supported Fedora version), so don't install these from
+    source.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+6	27	Open-ILS/src/extras/install/Makefile.fedora
+
+commit 2f8bd75e12a59241637ca739ba1d0c9908c80fc6
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Aug 19 11:23:14 2013 -0400
+
+    LP 1190279 Modularize Makefile.install fedora target
+    
+    make -f Makefile.install fedora
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+147	0	Open-ILS/src/extras/install/Makefile.fedora
+ create mode 100644 Open-ILS/src/extras/install/Makefile.fedora
+
+commit 8b90537c05c4febdb02dc4fcc3a5ddd818e7d9e8
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Aug 19 12:16:43 2013 -0400
+
+    LP 1190279 libtest-warn-perl for ubuntu targets
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+1	0	Open-ILS/src/extras/install/Makefile.ubuntu-lucid
+1	0	Open-ILS/src/extras/install/Makefile.ubuntu-precise
+
+commit f97334dcc9439fbab0f73a9aeed1ef0001da3fc2
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Jul 9 11:43:47 2013 -0400
+
+    LP 1190279 Modularize Makefile.install misc. repairs
+    
+    apply missing install_libdbi for wheezy/squeeze
+    
+    Added libtest-warn-perl prereq for wheezy/squeeze
+    
+    per-distro makefile improvments
+    
+    install soap-lite as a deb before CPAN runs.
+       Business::OnlinePayment::PayPal fails otherwise.
+    
+    by default, use apt-get as the APT tool, since all debian distros have
+       this
+    
+    move 'install_yaz' directly into Makefile.ubuntu-lucid, since that's
+      the only OS which uses it.
+    
+    Squeeze also needs an updated yaz; Yaz-related repairs
+    
+    give debians and lucid libbz2-dev; precise has it already
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+0	11	Open-ILS/src/extras/install/Makefile.common
+1	2	Open-ILS/src/extras/install/Makefile.debian
+14	1	Open-ILS/src/extras/install/Makefile.debian-squeeze
+4	0	Open-ILS/src/extras/install/Makefile.debian-wheezy
+13	3	Open-ILS/src/extras/install/Makefile.ubuntu-lucid
+1	0	Open-ILS/src/extras/install/Makefile.ubuntu-precise
+
+commit a3c338f9417611e9116616472ca7ce3bec0ca75b
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Jul 8 15:43:57 2013 -0400
+
+    LP 1190279 Installer makefiles OS targets for PG server
+    
+    Instead of requesting install_pgsql_server_debs_91,
+    install_pgsql_server_backport_debs_91, etc. when installing the
+    postgres server, simply give each OS type its own postgres install
+    target.
+    
+    make -f Makefile.install postgres-server-debian-wheezy
+    make -f Makefile.install postgres-server-debian-squeeze
+    make -f Makefile.install postgres-server-ubuntu-lucid
+    make -f Makefile.install postgres-server-ubuntu-precise
+    make -f Makefile.install postgres-server-fedora
+    
+    Let the OS module decide what and how to install the postgres server.
+    
+    Changes are reflected in docs/installation/server_installation.txt
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+11	0	Open-ILS/src/extras/Makefile.install
+3	2	Open-ILS/src/extras/install/Makefile.debian-squeeze
+1	1	Open-ILS/src/extras/install/Makefile.debian-wheezy
+14	11	docs/installation/server_installation.txt
+
+commit c4f884b453f72b336ee9652f475e940b2d265ebd
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Thu Jun 13 07:56:45 2013 -0400
+
+    LP 1190279 Ubuntu install targets
+    
+    Ubuntu 10.04 comes with Yaz 3.0.52.
+    
+    This installs version 4.2.32 from source.
+    
+    Adding per-distro makefiles for Ubuntu 10.04 and 12.04.
+    
+    Correcting minor typo
+    
+    SimpleServer installation expects yaz to already be installed
+    
+    Ubuntu 12.04 does not like libparent-perl
+    
+    Removing librose-uri-perl from the debs list since it is not in the 12.04 repo
+    
+    Adding libbz2-dev to the deb list
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+11	0	Open-ILS/src/extras/install/Makefile.common
+113	0	Open-ILS/src/extras/install/Makefile.ubuntu-lucid
+101	0	Open-ILS/src/extras/install/Makefile.ubuntu-precise
+ create mode 100644 Open-ILS/src/extras/install/Makefile.ubuntu-lucid
+ create mode 100644 Open-ILS/src/extras/install/Makefile.ubuntu-precise
+
+commit a9558065ad54fd17891dbc444d7ade8059cd9a85
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Jun 12 11:18:46 2013 -0400
+
+    LP 1190279 Modularize Makefile.install
+    
+    Create per-distro installer Makefiles for easier maintenance and
+    per-distro tweaks.
+    
+    Included in this commit are installer Makefiles for debian wheezy and
+    squeeze.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+32	482	Open-ILS/src/extras/Makefile.install
+35	0	Open-ILS/src/extras/install/Makefile.common
+57	0	Open-ILS/src/extras/install/Makefile.debian
+114	0	Open-ILS/src/extras/install/Makefile.debian-squeeze
+96	0	Open-ILS/src/extras/install/Makefile.debian-wheezy
+ create mode 100644 Open-ILS/src/extras/install/Makefile.common
+ create mode 100644 Open-ILS/src/extras/install/Makefile.debian
+ create mode 100644 Open-ILS/src/extras/install/Makefile.debian-squeeze
+ create mode 100644 Open-ILS/src/extras/install/Makefile.debian-wheezy
+
+commit a2078f2213a2450abdf49e2966af75db5d764ebf
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Aug 20 14:29:59 2013 -0400
+
+    Update docs for Fedora install
+    
+    Fedora 17 is no longer a supported distro; long live Fedora 18/19 and
+    beyond (and their beautiful packages that let us avoid many source
+    installs).
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+6	19	docs/installation/server_installation.txt
+
+commit 68f2881ebfe5aaac9b0497b052e08d9a425fda88
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Mon Jul 1 08:36:48 2013 +0300
+
+    Read the zip code lookup file in UTF8 mode.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+2	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Zips.pm
+
+commit 59dadd1a4ce3a213e0a2367ef0ce2f0accdd480b
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Tue Jun 11 13:22:33 2013 -0400
+
+    Fix Lp bug 965656 WRT back dated checkins with fines.
+    
+    * Move _check_open_xact from OpenILS::Application::Circ::Money
+      to OpenILS::Application::AppUtils so it can be called from
+      wherever.
+    
+    * Modify OpenILS::Application::Circ::Money to use check_open_xact
+      from OpenILS::Application::AppUtils.
+    
+    * Modify finish_fines_and_voiding in OpenILS::Application::Circ::Circulate
+      to use check_open_xact instead of reopen_xact.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    
+    Conflicts:
+    	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+
+42	0	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+3	42	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Money.pm
+
+commit 4a171d1b07ad533ceb44a0cef4193b2f9ec315ad
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Jul 15 14:36:30 2013 -0400
+
+    Improved copy table CSS/markup for conjoined bibs
+    
+    Let the library name column wrap now that it may potentially contain
+    stupidly long title/author combos. Also, associate the table cells with
+    their corresponding headers for improved accessibility.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+7	2	Open-ILS/src/templates/opac/css/style.css.tt2
+7	7	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+
+commit b77db8b7e553087f962f791c169d7a4d3fac7c6f
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Jul 15 11:28:21 2013 -0400
+
+    Conjoined items / foreign items display in TPAC
+    
+    Foreign items now appear at the top of the copy table, no matter what
+    copy page you are on. See "The two violin concertos" in the Concerto
+    data set for an example; the foreign bib is linked, with a label for the
+    designated peer type.
+    
+    The parent bib record displays all of the child records in the copy table
+    underneath the pertinent copy; each title / author entry links to the
+    child bib display, naturally. See "Violin concerto no. 2 ; Six duos
+    (from 44 Duos)" in the Concerto data set for an example.
+    
+    We escape all of the text retrieved from the database to avoid XSS
+    (thanks for the heads-up from Pasi Kallinen).
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    
+    Now with HTML escaping for safety
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+6	2	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
+4	0	Open-ILS/src/templates/opac/css/style.css.tt2
+26	17	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+
+commit 30b75ceadeeb86f50ac874000e1ca38ebed725db
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Jul 15 09:11:53 2013 -0400
+
+    Whitespace and timelog entries
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+20	16	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
+21	20	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+
+commit 8c896e9524a452464042594719f1c1e34eba016e
+Author: Bill Ott <bott at grpl.org>
+Date:   Wed May 22 20:11:07 2013 -0400
+
+    Expose conjoined bibs in TPAC
+    
+    This initial work is based on the GRPL need to handle eReader bib/copy display.
+    The "joined" titles will display a copy record with a call_number link back to
+    the "master" bib, where the master will display a set of links to individual
+    titles from each "copy".
+    
+    TODO: consider peer_type when determining whether or not to display
+    
+    Signed-off-by: Bill Ott <bott at grpl.org>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+25	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
+6	0	Open-ILS/src/templates/opac/parts/misc_util.tt2
+27	0	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+
+commit f46f187408d15065ca0972d5fcae9725aba2a88f
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Aug 20 10:50:43 2013 -0400
+
+    Stamping upgrade script for dewey sort fix
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+52	0	Open-ILS/src/sql/Pg/upgrade/0819.schema.acn_dewey_normalizer.sql
+0	52	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.acn_dewey_normalizer.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0819.schema.acn_dewey_normalizer.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.acn_dewey_normalizer.sql
+
+commit 48ab13cd66c0badfd90b6d3387122968991d006a
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu Mar 7 11:59:09 2013 -0500
+
+    LP#1150939 fix dewey sort
+    
+    There's a bit in the code where it tries to pad the first digit group,
+    if it's the only digit group, but it assumed the digit group was the
+    first token.
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+6	1	Open-ILS/src/sql/Pg/040.schema.asset.sql
+52	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.acn_dewey_normalizer.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.acn_dewey_normalizer.sql
+
+commit 6144a011e1a514b4472398fc224448af9f32c58f
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Mon Aug 5 14:10:56 2013 -0400
+
+    LP1208572 - Fixes for reporter.classic_item_list
+    
+    This view was created before the extend_reporter schema and the reporter.
+    materialized_simple_record existed.  Rewriting the view definition to include
+    those.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+7	9	Open-ILS/src/sql/Pg/example.reporter-extension.sql
+
+commit e788d63a6c80f237590a3b999ad4a9eb3ef72275
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Mon Jul 15 11:22:57 2013 +0300
+
+    Fix LP#1160770 by marking default toolbar names as translatable.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+3	3	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 6c0e430e5d90173de675e671230481f2ad3f5516
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Aug 13 14:39:00 2013 -0400
+
+    LP 1084732 TPAC copy location selector
+    
+    Copy location filter selector for the TPAC advanced search interface.
+    The behavior is the same as the analogous JSPAC feature.  The interface
+    components are hidden by default, so non-JS browsers will be none the
+    wiser.
+    
+    A number of small tweaks to related code were needed and are included in
+    this commit:
+    
+    1. Make copy locations field_safe in the IDL so they can be retrieved
+       and parsed without the IDL
+    2. Insert a (full) hash-based org unit tree as inline JS at the bottom
+       of js.tt2 so JS will have access to the whole tree without having to
+       load the IDL to understand it.
+    3. Fix a bug in openils.CGI : decodeURIComponent parameter names
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/examples/fm_IDL.xml
+11	2	Open-ILS/src/templates/opac/parts/advanced/search.tt2
+2	1	Open-ILS/src/templates/opac/parts/config.tt2
+19	0	Open-ILS/src/templates/opac/parts/js.tt2
+1	0	Open-ILS/web/js/dojo/openils/CGI.js
+107	0	Open-ILS/web/js/ui/default/opac/copyloc.js
+ create mode 100644 Open-ILS/web/js/ui/default/opac/copyloc.js
+
+commit f83911089625e4db6ddd3e3ffb6d2e8c21ede8a1
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Feb 22 14:00:55 2013 -0500
+
+    LP#1131889: sort TPac copy list by normalized call number
+    
+    ... as opposed to the literal call number label.  E.g., this
+    patch would make LC call number "AE5 .E363 1975 v.10" sort
+    after "AE5 .E363 1975 v.9" rather than after "AE5 .E363 1975 v.1"
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+
+commit 3c6a6d4d227a40a4409e8a57bcb7ac882e6b3615
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Tue Aug 20 10:03:34 2013 -0400
+
+    Fix typo in release notes file name for acq-style-cancelled-delayed.
+    
+    Rename acq-style-cancelled-delayted.txt to acq-style-cancelled-dealyed.txt.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+11	0	docs/RELEASE_NOTES_NEXT/Acquisitions/acq-style-cancelled-delayed.txt
+0	11	docs/RELEASE_NOTES_NEXT/Acquisitions/acq-style-cancelled-delayted.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Acquisitions/acq-style-cancelled-delayed.txt
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Acquisitions/acq-style-cancelled-delayted.txt
+
+commit b2e84c0c72b8e3099c1fe3dc687065e18f50d7e2
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Dec 26 16:43:20 2012 -0500
+
+    ACQ delayed lineitems style release notes
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+11	0	docs/RELEASE_NOTES_NEXT/Acquisitions/acq-style-cancelled-delayted.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Acquisitions/acq-style-cancelled-delayted.txt
+
+commit 203c122803bcdab667c413ec624d3b12320c9d03
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Dec 11 10:26:30 2012 -0500
+
+    Improve styling for 'delayed' lineitems in PO UI
+    
+    When a lineitem is cancelled, but "keep_debits" is true, the lineitem is
+    in effect delayed instead of truly cancelled.  Make it more obvious in
+    the UI the difference between delayed and truly cancelled lineitems by
+    applying a row styling for delayed items (similar to other status row
+    styling) and always show the cancel reason (label) in the lineitem
+    display in the PO, next to the non-title attributes.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	0	Open-ILS/src/templates/acq/common/li_table.tt2
+1	0	Open-ILS/web/css/skin/default/acq.css
+1	0	Open-ILS/web/css/theme/default/acq.css
+10	0	Open-ILS/web/js/ui/default/acq/common/li_table.js
+
+commit cdec380cf70ef29750490f4618b1826d69f3bbc5
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Fri Aug 16 10:32:42 2013 -0400
+
+    DB numbering for patron duplication check depth setting
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+22	0	Open-ILS/src/sql/Pg/upgrade/0818.data.duplicate_patron_check_depth_ou_setting.sql
+0	22	Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_consortium_as_search_ou_for_duplicate_patron_check.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0818.data.duplicate_patron_check_depth_ou_setting.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_consortium_as_search_ou_for_duplicate_patron_check.sql
+
+commit 589b83bdc500fc8946702207c362ac966e291d43
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Fri Aug 16 09:31:16 2013 -0400
+
+    Adjust Kyle Tomita's patron dupe check fix to use the depth concept
+    
+    Addressing these comments:
+    https://bugs.launchpad.net/evergreen/+bug/1185524/comments/3
+    
+    And also renaming the OU setting to better peer with similar settings
+    affecting staff client (not OPAC) patron registration.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+11	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+6	6	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+16	18	Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_consortium_as_search_ou_for_duplicate_patron_check.sql
+
+commit 96f91f2fec04e21774fc6982a16b2b1999c8ee07
+Author: Kyle Tomita <ktomita at catalystitservices.com>
+Date:   Fri May 31 11:33:59 2013 -0700
+
+    LP1185524 - Duplicate patron checking in the user editor is limited to workstation OU
+    
+    Added a new library setting opac.duplicate_patron_check_use_consortium.
+    When true, the duplicate check will use the consortium (1) as the OU.
+    When false or not set, the duplicate check will use the workstation OU.
+    
+    The setting is checked in subroutine that creates the search request and
+    sets the OU accordingly.
+    
+    [LFW: Signing off but following with material changes next commit.]
+    
+    Signed-off-by: Kyle Tomita <ktomita at catalystitservices.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+3	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+12	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+24	0	Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_consortium_as_search_ou_for_duplicate_patron_check.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.add_setting_for_selecting_consortium_as_search_ou_for_duplicate_patron_check.sql
+
+commit 85c1d6333400942419f8741ed0af6b720c95fb0c
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Fri Jun 28 09:44:44 2013 +0300
+
+    Use uri_escape_utf8 instead of uri_escape
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+5	5	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Container.pm
+
+commit fab404955b4f1044c072df7200e5e0760b9adbf9
+Author: Steven Chan <schan at sitka.bclibraries.ca>
+Date:   Mon Aug 5 12:13:54 2013 -0400
+
+    Fix LP985075, cannot save Patron Acquisition Request form
+    
+    The form is shown using a dojo EditPane attached to an EditDialog,
+    however, attaching the pane was done manually, resulting in the dialog
+    acting improperly and the pane positioned improperly.
+    
+    Instead, we use dojo's attr method to define the content attribute of
+    the dialog to be the pane.
+    
+    Signed-off-by: Steven Chan <schan at sitka.bclibraries.ca>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	2	Open-ILS/web/js/dojo/openils/widget/EditDialog.js
+
+commit bcb54d4fe255135f00726fbb9c923d3a38d1e76f
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Wed Jul 31 11:03:25 2013 -0400
+
+    Fixing LP 1072892 - repeated rows in reporter.classic_item_list view
+    
+    The view joined the actor.card table in such a way that all library
+    cards (active or not) were being returned.  This commit changes that
+    behavior so that only the current card (from actor.usr.card) is returned.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/sql/Pg/example.reporter-extension.sql
+
+commit 76708bcc596980d74ed2825d1ba12b3692b35dba
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Fri Jun 7 19:33:46 2013 +0300
+
+    Finish i18n support for config.usr_setting_type
+    
+    Add the missing oils_i18n_gettext markers to config.usr_setting_type
+    inserts.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+36	9	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 51654a5c4e801a96feff82da4bd41f945e99461b
+Author: Dan Scott <dan at coffeecode.net>
+Date:   Tue Feb 19 21:06:05 2013 -0500
+
+    Flag cust & oust name/description fields as translatable
+    
+    Setting type names and descriptions should be translatable, a simple
+    oils_persist:i18n attribute will do the trick.
+    
+    Signed-off-by: Dan Scott <dan at coffeecode.net>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+5	5	Open-ILS/examples/fm_IDL.xml
+
+commit 3e1d2542445dc4dfb16727414671235362d83411
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Aug 13 10:03:10 2013 -0400
+
+    LP1211506 fix numeric sorting in staff client grids
+    
+    To recover numeric (vs. ascii-betical) sorting of number and money
+    values in grids, cast the cached sort values back into numbers.
+    
+    This was tested in the billing interface, but should repair numeric
+    sorting for most grids.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+8	0	Open-ILS/xul/staff_client/chrome/content/util/list.js
+
+commit 70d952428c3194fd97a01f45b18357eb8aa3d537
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Mon Jul 22 10:16:36 2013 +0300
+
+    Always show grid buttons on My Selection List
+    
+    Fix LP#1028601 by showing the selection list creation buttons in the acq
+    search UI even when there are no search results.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+5	1	Open-ILS/web/js/ui/default/acq/search/unified.js
+
+commit d1a4268d03b0e2762770615bef7fd6b3b06eab79
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Mon Aug 12 09:26:21 2013 -0400
+
+    Z39.50 documentation asciidoc fix and moved Z39.50 Servers to the appropriate location in root.txt.
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>
+
+8	4	docs/admin/restrict_Z39.50_sources_by_perm_group.txt
+2	2	docs/root.txt
+
+commit 1d7b2ffb0fc3f76dfb92f918419334afb2c418b7
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Fri Aug 9 16:03:47 2013 -0400
+
+    Stamping upgrade script for long overdue status -- LP 1169193.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+283	0	Open-ILS/src/sql/Pg/upgrade/0817.data.long-overdue.sql
+0	283	Open-ILS/src/sql/Pg/upgrade/XXXX.data.long-overdue.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0817.data.long-overdue.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.long-overdue.sql
+
+commit 3dcdcf427477cd875bb40c1ab88746bb053b3c22
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon May 6 11:01:52 2013 -0400
+
+    LP 1169193 Support L/O xact close on paid
+    
+    Middle-layer support for the org unit setting "Leave transaction
+    open when long overdue balance equals zero".  It behaves the same
+    as "Leave transaction open when lost balance equals zero", but for
+    long-overdue circs.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+15	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm
+
+commit 91e7fe44a8ca68b126715b767dd0cdb361edf2e3
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Fri Apr 26 12:59:33 2013 -0400
+
+    LP 1169193 Bypass longoverdue w/ default A/T runner
+    
+    Avoid processing LONGOVERDUE circulations in the default
+    action_trigger_runner.pl filter.
+    
+    When no custom filters are used, the script will provide it's own
+    default filter for circulation-based hooks.  This change ensure that
+    when the default filter is in use, the script will not attempt to
+    process longoverdue circulations, since they have already been processed
+    (which is how they became longoverdue in the first place).
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+1	1	Open-ILS/src/support-scripts/action_trigger_runner.pl
+
+commit 5d842e5791092ece4647ede0ab288744447bdf16
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Apr 24 14:09:12 2013 -0400
+
+    LP 1169193 long-overdue release notes
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+92	0	docs/RELEASE_NOTES_NEXT/Circulation/long-overdue.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/long-overdue.txt
+
+commit ceb56824e7ca2031366580b2d41397bdcc8102d4
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Apr 24 11:05:02 2013 -0400
+
+    LP 1169193 transit_slip macro for copy status
+    
+    Adds support for a new 'transit_slip' receipt template macro called
+    "transit_copy_status", which displays the stored status of the
+    in-transit copy (i.e. the status the copy will be placed in once it
+    arrives at the transit destination).  This is useful, in particular, for
+    lost or long-overdue items which are not "immediately available" upon
+    checkin.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+27	2	Open-ILS/xul/staff_client/server/circ/util.js
+1	0	Open-ILS/xul/staff_client/server/locale/en-US/circ.properties
+
+commit 69573105e2498ebc34f3de26882af95268d46c28
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Apr 22 13:05:14 2013 -0400
+
+    LP 1169193 long-overdue item checkin
+    
+    Checkin of long-overdue items now goes through a very simimlar process
+    as check-in of Lost items.  Staff can control how long after the due
+    date (and potentially other date-related fields) the item may be
+    returned for a configurable set of refunds and/or reinstatement of
+    overdue fines.  All settings are controlled by a series of new org unit
+    settings specifically related to long-overdue processing.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+3	1	Open-ILS/src/extras/ils_events.xml
+159	38	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+1	0	Open-ILS/src/perlmods/lib/OpenILS/Const.pm
+1	0	Open-ILS/xul/staff_client/server/circ/checkin.js
+3	0	Open-ILS/xul/staff_client/server/circ/util.js
+
+commit 18f672d40658964f85657713c743acafe22f3633
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Apr 17 10:31:04 2013 -0400
+
+    LP 1169193 long-overdue automated processing
+    
+    Middle layer components for marking circulations long overdue.  The
+    automation is controlled with an Action/Trigger event definition
+    (sample included in seed data), which uses a new MarkItemLongOverdue
+    reactor.  The reactor makes use of a new util function (AssetCommon.pm)
+    for doing the actual work and looking up the relevant org unit settings.
+    
+    Inluded is a new PatronNotInCollections Validator, which can be used to
+    avoid marking circulations long overdue for patrons that are in
+    collections processing.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+1	1	Open-ILS/examples/action_trigger_filters.json.example
+58	14	Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/AssetCommon.pm
+60	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Reactor/MarkItemLongOverdue.pm
+27	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Validator.pm
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Reactor/MarkItemLongOverdue.pm
+
+commit feb1c3f2044add1cf6a262824f7e2082a372253c
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Apr 15 11:44:26 2013 -0400
+
+    LP 1169193 long-overdue SQL seed data
+    
+    Seed data for managing long-overdue circulations.
+    
+    * new copy status
+    * new billing types
+    * new org settings
+    * new permissions
+    * sample action/trigger event definitions
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+248	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+283	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.long-overdue.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.long-overdue.sql
+
+commit e071eb91a40d3871bc0e0a078b88cfdde7ba3b5e
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Aug 9 15:16:09 2013 -0400
+
+    Finish stamping for bib record browser
+    
+    Sorry for the noise...
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/0815.schema.config-metabib-interauthority.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/0816.schema.bib-auth-browse.sql
+
+commit c7bad82a66554251b8a0f636e629fe98680b7765
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Aug 9 15:12:58 2013 -0400
+
+    Stamping upgrade scripts for bib record browser
+    
+    LP #1177810
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+129	0	Open-ILS/src/sql/Pg/upgrade/0815.schema.config-metabib-interauthority.sql
+7507	0	Open-ILS/src/sql/Pg/upgrade/0816.schema.bib-auth-browse.sql
+0	129	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.config-metabib-interauthority.sql
+0	7507	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0815.schema.config-metabib-interauthority.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0816.schema.bib-auth-browse.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.config-metabib-interauthority.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql
+
+commit 32ec20b71540b1230ecc15f1aec95059e044499e
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu Aug 8 10:27:10 2013 -0400
+
+    Fix problem where basic search bar was flush with left edge of page
+    
+    Reported by Ben Shum.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 256b4d24240332ae3fd2a5cc14b1709c90f18d05
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Fri Jul 26 09:48:59 2013 -0400
+
+    Fix issues with multiple divs having the search-wrapper id.
+    
+    Basically, remove the extra <div> from all the files that INCLUDE
+    searchbar.tt2, and leave the <div> that searchar.tt2 uses alone.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+1	3	Open-ILS/src/templates/opac/cnbrowse.tt2
+1	3	Open-ILS/src/templates/opac/home.tt2
+1	3	Open-ILS/src/templates/opac/login.tt2
+1	3	Open-ILS/src/templates/opac/mylist.tt2
+1	3	Open-ILS/src/templates/opac/parts/myopac/base.tt2
+1	3	Open-ILS/src/templates/opac/password_reset.tt2
+1	3	Open-ILS/src/templates/opac/place_hold.tt2
+1	3	Open-ILS/src/templates/opac/record.tt2
+1	3	Open-ILS/src/templates/opac/record/email.tt2
+1	3	Open-ILS/src/templates/opac/results.tt2
+1	3	Open-ILS/src/templates/opac/sms_cn.tt2
+1	3	Open-ILS/src/templates/opac/temp_warn.tt2
+
+commit cfc828d832ecee92478466cd2f4e174c2f4b5c3c
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Mon Jul 22 10:14:51 2013 -0400
+
+    OPAC Browse: bugfixes squashed together from LP #1177810
+    
+    In specific:
+        OPAC Browse: go back from numbered to bulleted results
+        OPAC Browse: Avoid showing tracing if linked authorities have no bibs
+        OPAC Browse: Replace English pager with customizable pager
+        OPAC Browse: Extra small bit of documentation about author headings
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+13	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Browse.pm
+14	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+10	0	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql
+5	6	Open-ILS/src/templates/opac/browse.tt2
+0	8	Open-ILS/src/templates/opac/parts/config.tt2
+19	8	docs/RELEASE_NOTES_NEXT/OPAC/BibAuthBrowse.txt
+
+commit 6990fd819c0dae385c3cc7a40d39a0ebed91086c
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Jul 19 12:35:31 2013 -0400
+
+    Break up expensive queries, match index to quals
+    
+    First, we order browse queries over MBE by (sort_value, value) so we
+    want to match the unique index to that.
+    
+    We're only going to use the first few rows of the cursors we build from
+    the back/forward MBE paging queries, and the embedded GROUP BY defeats
+    the planners desire to use an index for ordering the rows. So, instead,
+    we use a simpler core query and gather aggregate data as a secondary,
+    index-capable query for each MBE row.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+22	23	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+22	24	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql
+
+commit c0dea517395c733b77e8eb219d2c3f43f6098d42
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu Jun 13 16:22:13 2013 -0400
+
+    OPAC Browse: some squashed commits from LP #1177810
+    
+    Namely:
+        OPAC Browse: Various interface improvements
+        OPAC Browse: Put best-matched browse entry in middle of result set
+        OPAC Browse: Don't try to build hyperlinks from 680 ‡a
+        OPAC Browse: add a CSS class to the best-matching result when not paging
+        Remove unwanted space before question makr in "Did you mean" message
+        OPAC Browse: Fix browse interface's use of hits-per-page user setting
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+54	108	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Browse.pm
+121	60	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+121	59	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql
+29	33	Open-ILS/src/templates/opac/browse.tt2
+4	1	Open-ILS/src/templates/opac/css/style.css.tt2
+9	5	Open-ILS/src/templates/opac/parts/qtype_selector.tt2
+
+commit 9d37f6890ce6b591d62972ce3e341cecf7c45535
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Fri Jun 7 10:31:30 2013 -0400
+
+    Fix problem with YYYY.schema.bib-auth-browse.sql.
+    
+    Disable ALL triggers on authority.control_set_authority_field before
+    altering and updating the table to avoid an error related to altering
+    a table with pending trigger events.
+    
+    The triggers are enabled again after the updates and alters are done.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+8	0	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql
+
+commit e710ecbee519d374bcf69b0c535c3f83814c782b
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Wed Apr 24 10:46:27 2013 -0400
+
+    Bib record browser with 'see also', etc from linked authority headings
+    
+    This feature provides a patron-oriented OPAC interface for browsing
+    bibliographic records.
+    
+    Users choose to browse by Author, Title, Subject, or Series. They then
+    enter a browse term, and the nearest match from a left-anchored search
+    on the headings extracted for browse purposes will be displayed in a
+    typical backwards/forwards paging display. Headings link to search
+    results pages showing the related records. If the browse heading is
+    linked to any authority records, and if any *other* authority records
+    point to those with "See also" or other non-main entry headings, those
+    alternative headings are displayed a linked to a search results page
+    showing related bib records related to the alternate heading.
+    
+    The counts of holdings displayed next to headings from bibliographic
+    records are subject to the same visiibility tests as search. This means
+    that the org unit (and copy location group) dropdown on the browse
+    interface affects counds, and it further means that whether or not
+    you're looking at the browse interface through the staff client makes a
+    difference.
+    
+    This builds on the two previous commits that provide inter-authority
+    linking and the linking of metabib.browse_entry rows to authority
+    records.
+    
+    This also contains, in squashed form, these commits that resulted from
+    collaboration on LP #1177810:
+    
+        Two bugfixes to OPAC Browse: non-filing indicators, leading-article warning
+        Fix paste-o encountered in Bib browse upgrade script
+        OPAC Browse: fix 0-9 link in paging shortcuts; padding issues
+        OPAC Browse: Improve authority code to show more headings
+        OPAC Browse: Fix authority counting
+        Extensions to our MODS32 stylesheet to capture all possible NFI in fields
+        OPAC Browse: i18n improvement for short terms
+        OPAC Browser: Display Public General Notes from authorities when possible
+        OPAC Browse: Build browse entry sort_value column separately from value
+        OPAC Browse: We don't want role/relator info in browse headings
+        OPAC Browse: Better display of tracings from authorities
+        OPAC Browse: Pick up authority links from 650 fields
+        OPAC Browse: Show authority tracings only when inter-authority links exist
+        OPAC Browse: use  superpage concept for performance; fix other counting bug
+        OPAC Browse: Fix broken authority reference link
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+14	0	Open-ILS/examples/fm_IDL.xml
+17	0	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+8	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+2	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+424	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Browse.pm
+17	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
+2	0	Open-ILS/src/sql/Pg/002.schema.config.sql
+1	0	Open-ILS/src/sql/Pg/011.schema.authority.sql
+286	14	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+119	81	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+228	57	Open-ILS/src/sql/Pg/953.data.MODS32-xsl.sql
+1	1	Open-ILS/src/sql/Pg/999.functions.global.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.config-metabib-interauthority.sql
+605	61	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql
+5	3	Open-ILS/src/templates/opac/advanced.tt2
+174	0	Open-ILS/src/templates/opac/browse.tt2
+39	4	Open-ILS/src/templates/opac/css/style.css.tt2
+9	0	Open-ILS/src/templates/opac/parts/config.tt2
+7	6	Open-ILS/src/templates/opac/parts/qtype_selector.tt2
+4	4	Open-ILS/src/templates/opac/parts/searchbar.tt2
+0	1	Open-ILS/web/css/skin/default/opac/semiauto.css
+45	0	docs/RELEASE_NOTES_NEXT/OPAC/BibAuthBrowse.txt
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Browse.pm
+ create mode 100644 Open-ILS/src/templates/opac/browse.tt2
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/BibAuthBrowse.txt
+
+commit d2f4cac923668ff05854ffc9720cafe514b9b71c
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu Mar 28 18:02:32 2013 -0400
+
+    Link browse entries to authority record when possible
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+25	3	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+22	0	Open-ILS/src/sql/Pg/953.data.MODS32-xsl.sql
+16	16	Open-ILS/src/sql/Pg/954.data.MODS33-xsl.sql
+6885	0	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql
+
+commit 3eb616e56c82a5106e14f5a446f1d875015db7f0
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Fri Mar 22 17:11:50 2013 -0400
+
+    Inter-authority linking
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+1	0	Open-ILS/examples/fm_IDL.xml
+14	1	Open-ILS/src/sql/Pg/011.schema.authority.sql
+4	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+67	0	Open-ILS/src/sql/Pg/999.functions.global.sql
+129	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.config-metabib-interauthority.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.config-metabib-interauthority.sql
+
+commit a6f3e3bd7f1f2d62db72a6155b0df1d8942627f4
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Tue Jul 2 11:55:21 2013 -0400
+
+    Solidify caption/holding relationship, improve MFHD::Holding comparisons
+    
+    [This commit has been squashed for merging. LFW]
+    
+      * This commit:
+        - Makes sure that holding data is valid for the given caption
+          for new holding objects
+        - Teaches field_values() to fall back to '*' (unknown marker)
+          when a holding is missing data
+        - Allows the caption() method to be a setter
+    
+      * This commit:
+        - Makes the comparison operator consider chron data, not just
+          enumeration data
+        - Teaches the comparison operator a way to handle 'unsure' data
+          (that is, data presented in brackets [])
+    
+      * The code was assuming the $end_holding param would be uncompressed,
+        but this was not stated anywhere, nor enforced.  Let's allow the
+        method to take both compressed and uncompressed holdings as the "end"
+        (and handle it appropriately).
+    
+      * Add some holdings with missing and unsure data to test the new
+        comparison operators handling of such data.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+33	5	Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD/Holding.pm
+19	15	Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD/test/mfhddata2.txt
+
+commit 07b28a0cdba65dc88820f02de266978eb0bdfd6d
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed May 8 15:09:41 2013 -0400
+
+    Fix logic in get_compressed_holdings()
+    
+    [This commit has been squashed for merging. LFW]
+    
+      * This commit rearranges some of the logic branches to protect
+        against an unusual case of having two holding statements with
+        the same start value, but one being open-ended and one not.
+    
+      * The logic in get_combined_holdings() was a little sloppy and
+        repeated some steps unnecessarily.  This cleans things up.
+    
+        See the test case in the previous commit for more clarity.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+17	16	Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD.pm
+
+commit fbe9e5ae5114f6730996fcba2cfc207192284b4e
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Tue May 7 18:23:27 2013 -0400
+
+    Tie in new MFHD method to serials module/MFHD tests for compressing, combining
+    
+    [This commit has been squashed for merging. LFW]
+    
+     *  Now that we have a potentially better alternative, let's call
+        get_combined_holdings() in place of get_compressed_holdings() in
+        Serial.pm.
+    
+     *  First, add a test for the new get_combined_holdings() method.
+    
+        Second, add a known problem case for get_compressed_holdings().
+        The fix will come in a subsequent commit.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
+24	0	Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD/test/mfhd.t
+31	0	Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD/test/mfhddata2.txt
+
+commit 83f8420b2cac88b11ea6304f7f26952e56bffe80
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Tue May 7 18:19:34 2013 -0400
+
+    Add new get_combined_holdings() method to MFHD.pm
+    
+    This commit adds a new method to the MFHD module which creates an
+    array of compressed holdings from all holdings for a given caption,
+    combining as needed.
+    
+    NOTE: This method is similar to, but much less aggressive/strict than
+    get_compressed_holdings(). Ultimately, get_compressed_holdings()
+    might be deprecated in favor of this.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+84	0	Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD.pm
+
+commit 7f854066d05544ceabe31acdb6c26e834c6477a5
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Fri Aug 9 10:31:34 2013 -0400
+
+    Documentation for storing Z39.50 credentials.  Added to existing file on Z39.50 permissions.
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>
+
+21	3	docs/admin/restrict_Z39.50_sources_by_perm_group.txt
+-	-	docs/media/storing_z3950_credentials.JPG
+ create mode 100644 docs/media/storing_z3950_credentials.JPG
+
+commit a6a431f8fc1bc95a4ee3474d29da2f344427e58d
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Mon Jun 24 11:47:40 2013 -0400
+
+    Acq: When processing EDI invoices, skip unknown line item references
+    
+    See LP #1172373.
+    
+    In their electronic invoices, vendors sometimes include a mix of line
+    items that your ILS knows about, because you ordered them through it,
+    and line items of which your ILS knows nothing. We should not fail
+    altogether at processing invoices, but instead process what line items
+    we can.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+106	66	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm
+
+commit 2eaa5523b0c48e48bed70de200b6f5233c24cf37
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Tue Apr 16 15:18:17 2013 -0400
+
+    Acq: When building invoices from EDI messages, avoid bad data
+    
+    From some vendors, these EDI messages contain strings (useless ones,
+    like just the name of the vendor) where we had been expecting numeric
+    identifiers.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+18	5	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm
+
+commit e3e4461d6bf6f4d3b9309aa2f216102e29ac5b96
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Wed Jul 17 20:24:26 2013 +0300
+
+    Validate date ranges in Close Dates editor
+    
+    Complain in Closed Dates Editor when ending date is earlier than starting date.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+5	0	Open-ILS/xul/staff_client/server/admin/closed_dates.js
+1	0	Open-ILS/xul/staff_client/server/admin/closed_dates.xhtml
+
+commit de357eac00a21080ad2ebb1b361568bffe123049
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Mon Aug 5 16:40:02 2013 -0400
+
+    Fix org unit setting names for this example test
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+6	6	Open-ILS/src/sql/Pg/t/0799.state_field_required_toggle.pg
+
+commit f25cc39b24384ef25178e0be0ce1f0c757839da0
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Tue Jul 23 10:49:47 2013 +0300
+
+    Prevent paste from empty clipboard throwing an error
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+3	1	Open-ILS/xul/staff_client/chrome/content/util/clipboard.js
+
+commit c22418f9a1adf9af2734bd76d97d6acf938750d3
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Aug 6 12:20:33 2013 -0400
+
+    Add release note for checkout trimming whitespaces from beginning and end of barcodes
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+6	0	docs/RELEASE_NOTES_NEXT/Circulation/trim-whitespace-checkout.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/trim-whitespace-checkout.txt
+
+commit 4eb066033edea348660a0e54a45cdec8528804dc
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Tue Jul 2 19:36:53 2013 +0300
+
+    Trim whitespace from beginning and end of the barcode in checkout.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+2	2	Open-ILS/xul/staff_client/server/circ/checkout.js
+
+commit 5fe3ec70460bdd75af7bccd2967ccb62dd475c81
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Aug 6 12:13:15 2013 -0400
+
+    Stamping upgrade script for "delate" typo
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+9	0	Open-ILS/src/sql/Pg/upgrade/0814.data.fix-delate-typo.sql
+0	9	Open-ILS/src/sql/Pg/upgrade/XXXX.data.fix-delate-typo.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0814.data.fix-delate-typo.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.fix-delate-typo.sql
+
+commit 63195f57eeef5d7bcd3f7cb86e2d66408a65e944
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Mon Jul 15 10:01:57 2013 +0300
+
+    Fix typo "delate" in permission descriptions.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+9	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.fix-delate-typo.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.fix-delate-typo.sql
+
+commit a978c2d37ab57a04d6ad57afd7415b6be347154d
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Fri May 17 09:39:26 2013 -0400
+
+    Upgrade notes for IDL2js locale support
+    
+    Minor Apache configuration change required.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+28	0	docs/RELEASE_NOTES_NEXT/Administration/idl2js-locale-support.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/idl2js-locale-support.txt
+
+commit 07af51ba786c4b47471f75a5546079518ec6a429
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon May 6 09:59:22 2013 -0400
+
+    LP1171875 Support locale CGI param for fm_IDL.xml
+    
+    Adds support for passing the locale string directly to
+    /reports/fm_IDL.xml via locale= CGI parameter.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+5	0	Open-ILS/examples/apache/eg_vhost.conf.in
+5	0	Open-ILS/examples/apache_24/eg_vhost.conf.in
+
+commit 2bddeede1d84fd96df0bad2054bbce4cbefaca33
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Fri Apr 26 13:20:24 2013 -0400
+
+    LP1171875 Add locale support to IDL2js
+    
+    /IDL2js now reads locale information from either locale= CGI parameter
+    or Accept-Language HTTP headers.  The locale-aware IDL is loaded from
+    /reports/fm_IDL.xml via Apache subrequest.  Each full copy of the IDL is
+    cached within the Apache processes to avoid the need to re-parse the IDL ad
+    infinitum for full IDL retrieval.  Partial IDL retrieval is also supported
+    (but not cached).
+    
+    No attempt is made to cleanse the locale -- invalid locale strings are
+    discarded -- so it's the callers responsibility to pass a valid locale.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+77	8	Open-ILS/src/perlmods/lib/OpenILS/WWW/IDL2js.pm
+
+commit 7f04ee6f56bebc747fdaf0b3cce5febec57fdba7
+Author: Jeff Godin <jgodin at tadl.org>
+Date:   Tue May 29 10:28:50 2012 -0400
+
+    Fix IDL and OU setting check for staged users
+    
+    The IDL had references to sequences that do not exist:
+    
+    staging.usr_stage_row_id_seq -- a typo, fixed
+    
+    In the case of staging.billing_address_stage_row_id_seq, the
+    staging.billing_address_stage table is created with LIKE,
+    and uses the sequence staging.mailing_address_stage_row_id_seq
+    
+    The OU setting check for the open-ils.actor.user.stage.create API
+    call was not passing an org unit, and would always fail.
+    
+    We now pass the home_ou of the user being staged.
+    
+    At this point, the opac.allow_pending_user OU setting type must
+    be manually created before its value can be set.
+    
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+2	2	Open-ILS/examples/fm_IDL.xml
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Stage.pm
+
+commit 72e2f9378361f990636e025d96b43e80a7967f50
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Thu Aug 1 15:27:18 2013 -0400
+
+    Stamping upgrade script for LP1204273.
+    
+    Repair org unit settings for making state not required
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+29	0	Open-ILS/src/sql/Pg/upgrade/0813.data.state-field-settings-fix.sql
+0	29	Open-ILS/src/sql/Pg/upgrade/XXXX.data.state-field-settings-fix.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0813.data.state-field-settings-fix.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.state-field-settings-fix.sql
+
+commit d2ef1684cc4b71bc7714edb7a5dfdac19739fabc
+Author: Ben Shum <bshum at biblio.org>
+Date:   Mon Jul 22 15:10:37 2013 -0400
+
+    LP1204273 - Repair org unit settings for making state not required
+    
+    As noted by tsbere in IRC, the org unit settings were using "au" instead of "aua"
+    which led to issues applying the settings and making the addresses require the
+    state field.
+    
+    Also, change the constraint for field_name on actor.org_unit_setting_type_log to
+    be "DEFERRABLE INITIALLY DEFERRED" to be more flexible and consistent with other
+    parts of the database relating to org unit setting names.
+    
+    And, the table auditor.actor_usr_address_history needs to be updated so that
+    state can be NULL there as well.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+9	9	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+29	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.state-field-settings-fix.sql
+3	3	Open-ILS/web/js/ui/default/actor/user/register.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.state-field-settings-fix.sql
+
+commit d6ec45265c0d1b4b1b9444d3525e0e7e13b646f7
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Mon Jul 22 19:03:24 2013 -0400
+
+    make-pgtap-tests.pl
+    
+    For seeding a baseline set of pgTAP tests for Evergreen.  By default, assumes
+    PostgreSQL is running on localhost at port 5432 with a database name of
+    "evergreen", and with an "evergreen" user configured with password "evergreen".
+    
+    Command-line options for tweaking these are
+    
+        -db_name=? -db_host=? -db_port=? -db_user=? -db_pw=?
+    
+    Make sure to install pgTAP (probably best do it from source for all the
+    assertion functions we're using) for the database you want to run the tests
+    against.
+    
+    I did the following for my test environment:
+    
+        git clone git://github.com/theory/pgtap.git
+        cd pgtap
+        make
+        make installcheck
+        sudo make install
+    
+    Then in my Evergreen database with psql, I did:
+    
+        CREATE EXTENSION pgtap;
+    
+    I also installed a CPAN module to get pg_prove:
+    
+        sudo cpan TAP::Parser::SourceHandler::pgTAP
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+589	0	Open-ILS/src/sql/Pg/make-pgtap-tests.pl
+ create mode 100755 Open-ILS/src/sql/Pg/make-pgtap-tests.pl
+
+commit 7e8eec68388a661c68970622bccc07711b80fe47
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Mon Jun 24 16:07:44 2013 -0400
+
+    Use the .pg extension
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+47	0	Open-ILS/src/sql/Pg/t/0799.state_field_required_toggle.pg
+0	47	Open-ILS/src/sql/Pg/t/0799.state_field_required_toggle.s
+67	0	Open-ILS/src/sql/Pg/t/dewey.pg
+0	67	Open-ILS/src/sql/Pg/t/dewey.s
+52	0	Open-ILS/src/sql/Pg/t/schema.pg
+0	52	Open-ILS/src/sql/Pg/t/schema.s
+35	0	Open-ILS/src/sql/Pg/t/versions.pg
+0	35	Open-ILS/src/sql/Pg/t/versions.s
+ create mode 100644 Open-ILS/src/sql/Pg/t/0799.state_field_required_toggle.pg
+ delete mode 100644 Open-ILS/src/sql/Pg/t/0799.state_field_required_toggle.s
+ create mode 100644 Open-ILS/src/sql/Pg/t/dewey.pg
+ delete mode 100644 Open-ILS/src/sql/Pg/t/dewey.s
+ create mode 100644 Open-ILS/src/sql/Pg/t/schema.pg
+ delete mode 100644 Open-ILS/src/sql/Pg/t/schema.s
+ create mode 100644 Open-ILS/src/sql/Pg/t/versions.pg
+ delete mode 100644 Open-ILS/src/sql/Pg/t/versions.s
+
+commit bd4d76518cd3ce3476d5ea39bd584aaba2a8b69e
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Apr 12 02:41:47 2013 -0400
+
+    add regression test for LP#1155329
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+22	0	Open-ILS/src/sql/Pg/t/regress/lp1155329_use_id_for_tcn.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/regress/lp1155329_use_id_for_tcn.pg
+
+commit 97983b6660718a9420ba245a13945efe064c03ce
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Apr 12 02:21:09 2013 -0400
+
+    use .pg extension for pgTAP test cases
+    
+    That way, pg_prove --recurse t/ will DWIM.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+44	0	Open-ILS/src/sql/Pg/t/naco_normalize.pg
+0	44	Open-ILS/src/sql/Pg/t/naco_normalize.sql
+ create mode 100644 Open-ILS/src/sql/Pg/t/naco_normalize.pg
+ delete mode 100644 Open-ILS/src/sql/Pg/t/naco_normalize.sql
+
+commit bb98f3fd2887468ada6b3cee7cdccd05b809c545
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed Apr 10 20:18:10 2013 -0400
+
+    start adding pgTAP test cases
+    
+    pgTAP is a PostgreSQL unit testing framework; about which
+    more can be found at http://pgtap.org/
+    
+    This commit introduces the first pgTAP test case, which exercises
+    the NACO normalization functions.
+    
+    To run the tests, install pgTAP, create an Evergreen database that
+    contains (for now) just the seed data, and from the top of the
+    source tree run
+    
+    pg_prove -vr -U evergreen Open-ILS/src/sql/Pg/t/*
+    
+    Replace '-U evergreen' with the psql command-line switches
+    needed to access your database.
+    
+    To install pgTAP on a Debian Wheezy system, you can do:
+    
+    Then, to load the pgTAP extension into the database, run
+    
+    psql> CREATE EXTENSION pgtap;
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+44	0	Open-ILS/src/sql/Pg/t/naco_normalize.sql
+ create mode 100644 Open-ILS/src/sql/Pg/t/naco_normalize.sql
+
+commit c36c86e4bf1e8be3a613a267e7462ff3c080c45d
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Mon Jun 24 15:36:10 2013 -0400
+
+    pgTAP examples
+    
+    These specific ones do not assume stock test data such as the concerto bibs, and
+    I think such tests should go elsewhere.  You need to install pgTAP.  I did the
+    following for my test environment:
+    
+        git clone git://github.com/theory/pgtap.git
+        cd pgtap
+        make
+        make installcheck
+        sudo make install
+    
+    Then in my Evergreen database with psql, I did:
+    
+        CREATE EXTENSION pgtap;
+    
+    I also installed a CPAN module to get pg_prove:
+    
+        sudo cpan TAP::Parser::SourceHandler::pgTAP
+    
+    You can use psql to run a given test like so:
+    
+    opensrf at dev141:~/git/Evergreen/Open-ILS/src/sql/Pg/t (pgtap)$ psql -d evergreen -f 0799.state_field_required_toggle.s
+    1..4
+    ok 1 - actor.usr_address.state does not have the NOT NULL constraint
+    ok 2 - ui.patron.edit.au.state.require exists
+    ok 3 - ui.patron.edit.au.state.show exists
+    ok 4 - ui.patron.edit.au.state.suggest exists
+    
+    Or you can use pg_prove on all or some of them:
+    
+    opensrf at dev141:~/git/Evergreen/Open-ILS/src/sql/Pg/t (pgtap)$ pg_prove -d evergreen *.s
+    0799.state_field_required_toggle.s .. ok
+    dewey.s ............................. 1/6
+     # Failed (TODO) test 6: "testing prefix plus decimal"
+     #     'YR_DVD_800_100000000000000'
+     #         <
+     #     'YR_000000000000000_DVD_900'
+    dewey.s ............................. ok
+    schema.s ............................ ok
+    versions.s .......................... ok
+    All tests successful.
+    Files=4, Tests=39,  0 wallclock secs ( 0.05 usr  0.03 sys +  0.13 cusr  0.07 csys =  0.28 CPU)
+    Result: PASS
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+47	0	Open-ILS/src/sql/Pg/t/0799.state_field_required_toggle.s
+1	0	Open-ILS/src/sql/Pg/t/README
+67	0	Open-ILS/src/sql/Pg/t/dewey.s
+52	0	Open-ILS/src/sql/Pg/t/schema.s
+35	0	Open-ILS/src/sql/Pg/t/versions.s
+ create mode 100644 Open-ILS/src/sql/Pg/t/0799.state_field_required_toggle.s
+ create mode 100644 Open-ILS/src/sql/Pg/t/README
+ create mode 100644 Open-ILS/src/sql/Pg/t/dewey.s
+ create mode 100644 Open-ILS/src/sql/Pg/t/schema.s
+ create mode 100644 Open-ILS/src/sql/Pg/t/versions.s
+
+commit 33b6b485aff2b89312b9f6c3cb7f39e4857e2551
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Tue Jun 25 16:54:45 2013 -0400
+
+    C unit test examples for Evergreen
+    
+    Building off of Kevin Beswick's work in OpenSRF
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	0	Open-ILS/src/c-apps/Makefile.am
+21	0	Open-ILS/src/c-apps/tests/Makefile.am
+46	0	Open-ILS/src/c-apps/tests/check_idl.c
+46	0	Open-ILS/src/c-apps/tests/check_util.c
+15	0	Open-ILS/src/c-apps/tests/testsuite.c
+4	0	Open-ILS/src/c-apps/tests/testsuite.h
+1	0	configure.ac
+ create mode 100644 Open-ILS/src/c-apps/tests/Makefile.am
+ create mode 100644 Open-ILS/src/c-apps/tests/check_idl.c
+ create mode 100644 Open-ILS/src/c-apps/tests/check_util.c
+ create mode 100644 Open-ILS/src/c-apps/tests/testsuite.c
+ create mode 100644 Open-ILS/src/c-apps/tests/testsuite.h
+
+commit ace3d994af1b375180fcafc533f12d32a20bc352
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Tue Jun 25 17:02:37 2013 -0400
+
+    The check library for Debian and Fedora
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+3	0	Open-ILS/src/extras/Makefile.install
+
+commit 11f04eaa4a97e78d8c8c11a63fff221e4935a13d
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu Jun 13 15:45:11 2013 -0400
+
+    Test for an MFHD warning in 14-OpenILS-Utils.t
+    
+    Specifically "Cannot compress without pattern data, returning original holdings"
+    
+    I also added Test::Warn to Makefile.install for Debian and Fedora.
+    
+    --
+    Bill moved the @comp_holdings variable declaration outside of the
+    warning_like block to avoid a new warning:
+    
+    Name "main::comp_holdings" used only once: possible typo at
+    t/14-OpenILS-Utils.t line 42.
+    ---
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	0	Open-ILS/src/extras/Makefile.install
+8	2	Open-ILS/src/perlmods/t/14-OpenILS-Utils.t
+
+commit e4559139d5dd6dcf311c32a8bc9f0a73d5f774ce
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu Jun 13 14:40:45 2013 -0400
+
+    Eliminate a warning in Z3950.pm
+    
+    Noticed in 06-OpenILS-Application-Search.t:
+    Odd number of elements in anonymous hash at /usr/local/share/perl/5.10.1/OpenILS/Application/Search/Z3950.pm line 532.
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Z3950.pm
+
+commit dae5f2a1f1057ed4fdd83ca1b861ca2864fe6b45
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Wed Jul 24 10:02:08 2013 -0400
+
+    Fix error on deleted hold in transit
+    
+    May be caused by purging holds combined with "Checkout fills related hold"
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+14	7	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+
+commit 14956259a3c5f23c2255de3f0c33533555f4d80d
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Mon Jun 17 13:30:59 2013 +0300
+
+    Fix transposed acq invoice receive table column titles
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+1	1	Open-ILS/src/templates/acq/invoice/receive.tt2
+
+commit 8f745ed83f0f76cb4da8260420765147f4558d7a
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Jul 8 11:13:23 2013 -0400
+
+    LP1195150 batch update funds alters debits
+    
+    When a fund is updated via the ACQ batch update bar (along the top of
+    the PO interface), ensure that any existing fund debits are updated to
+    use the new fund.  If the selected fund exceeds the balance block
+    percent, the operation will fail and the  user will be notified.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+20	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Lineitem/BatchUpdate.pm
+
+commit 0033c26e92acb7e6577d490e4b7be357c21c6d14
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Jul 22 15:21:15 2013 -0400
+
+    LP1203753 AuthProxy barcode login support
+    
+    When users attempt a barcode-based login with AuthProxy, the system will
+    determine the username of the user (based on the barcode) and use the
+    username instead of the barcode for all proxied login attempts.  This
+    allows users to use their barcodes (or barcode-looking usernames) to
+    log in via remote authenticators.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+16	4	Open-ILS/src/perlmods/lib/OpenILS/Application/AuthProxy.pm
+
+commit c5980d3a22e04b15e08406bffc77c38e9ac4a31b
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu Jul 11 14:50:49 2013 -0400
+
+    Link checker: verification review UI needs more columns about redirects
+    
+    Link checker results can contain information about redirects when URLs
+    in a bib record happen to point to systems that return 3XX repsonses.
+    
+    All this is nicely captured in the uvuv and uvu tables, but the
+    user interface only offers the uvu.redirect_from column, when
+    uvuv.redirect_to and uvu.id are also necessary to understanding redirect
+    relationships among the results.
+    
+    Reported by Erica Rohlfs and Bill Erickson.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+4	2	Open-ILS/src/templates/url_verify/review_attempt.tt2
+
+commit d0604dbdddfe41faa8444aac66900edf34f4af32
+Author: Dan Scott <dan at coffeecode.net>
+Date:   Mon Jul 22 10:55:14 2013 -0400
+
+    Wrap upgrade script for TPAC library name links
+    
+    Signed-off-by: Dan Scott <dan at coffeecode.net>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+23	0	Open-ILS/src/sql/Pg/upgrade/0812.data.add_library_info_url_OUS.sql
+0	11	Open-ILS/src/sql/Pg/upgrade/XXXX.add_library_info_url_OUS.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0812.data.add_library_info_url_OUS.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.add_library_info_url_OUS.sql
+
+commit 256229c024871954a9e0c082e5e02396c8b4aef1
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Jul 8 14:06:48 2013 -0400
+
+    Support linking to library info from copy display
+    
+    If the "Library information URL" library setting has a value, then the
+    copy display section of the TPAC and KPAC will turn the library name
+    for that branch into a link to the given URL. This supports the patron
+    goal of quickly finding branch information such as hours of operation,
+    directions, and contact information.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Scott <dan at coffeecode.net>
+
+9	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+11	0	Open-ILS/src/sql/Pg/upgrade/XXXX.add_library_info_url_OUS.sql
+9	1	Open-ILS/src/templates/kpac/parts/copy_table.tt2
+5	3	Open-ILS/src/templates/opac/parts/misc_util.tt2
+4	1	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+8	1	Open-ILS/src/templates/opac/parts/result/table.tt2
+14	0	docs/RELEASE_NOTES_NEXT/OPAC/link_library_names.txt
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.add_library_info_url_OUS.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/link_library_names.txt
+
+commit 5d19146ef5a37337f5dea5725e9c137ab0d85728
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Jul 18 14:48:36 2013 -0400
+
+    Point feeds to TPAC instead of slimpac or JSPAC
+    
+    Where possible, point to TPAC endpoints for HMTL output of supercat feeds.
+    
+    Also, just use the bookbag (container) name for bookbag feeds, instead of
+    wrapping them in formatting and context.  The description element already
+    provides that.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+17	27	Open-ILS/src/perlmods/lib/OpenILS/WWW/SuperCat.pm
+
+commit ad8f28f45389593b04db3aeaa7ef0c82df159a59
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Fri Jul 19 09:04:04 2013 +0300
+
+    Fix LP#1187402: Datafield contents turned undefined in Marc Editor after adding 006, 007 or 008
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Dan Scott <dan at coffeecode.net>
+
+4	1	Open-ILS/xul/staff_client/server/cat/marcedit.js
+
+commit e66ddf9cc5f5e1415deb6cc8dce3c7d4ac50b2e7
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jul 17 17:13:57 2013 -0400
+
+    Explicit function ownership is not the job of upgrade scripts
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+0	2	Open-ILS/src/sql/Pg/upgrade/0811.function.copy_related_hold_stats.sql
+0	2	Open-ILS/src/sql/Pg/version-upgrade/2.4.0-2.4.1-upgrade-db.sql
+
+commit 32c56dcaa86dfdab0cf6d62d4eeda98a83ed2272
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jul 17 16:29:36 2013 -0400
+
+    Pulling in 2.4.1 upgrade script
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+298	0	Open-ILS/src/sql/Pg/version-upgrade/2.4.0-2.4.1-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.4.0-2.4.1-upgrade-db.sql
+
+commit 0c6580309531ec03ccf1a07b1e439e20289c475f
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Jul 16 16:58:57 2013 -0400
+
+    Optimize away always-true hold count clause
+    
+    When rendering results in the tpac we request hold counts for each record.
+    Most of the time (that is, whenever org unit hiding is /not/ in use) we
+    filter, essentially, on "where pickup_lib is in the org tree".  This is
+    both useless and slow, so this commit will recognize that and optimize the
+    test away.
+    
+    [LFW: fixed typo]
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+6	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+
+commit 55e62cb268e2435dfa052027229e635a243defd6
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Jun 24 10:12:50 2013 -0400
+
+    Avoid Z39.50 search warning for uninit var
+    
+    The debug log blindly attempts to access list members that might not
+    exist (if, for example, an event code was returned from the attempt to
+    run do_service_search()), thus generating spurious log warnings.
+    Instead, move the debug line to only generate output when we have
+    created the list item in question.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Z3950.pm
+
+commit 71b298857646d89527d6f50d217ba696eebde3b9
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jul 17 13:29:14 2013 -0400
+
+    Stamping upgrade script for copy stats SP fix
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+60	0	Open-ILS/src/sql/Pg/upgrade/0811.function.copy_related_hold_stats.sql
+0	60	Open-ILS/src/sql/Pg/upgrade/XXXX.function.copy_related_hold_stats.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0811.function.copy_related_hold_stats.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.copy_related_hold_stats.sql
+
+commit 896184650f588f57b31bdc214d30007e86ae633f
+Author: Fredrick Parks <fparks at catalystitservices.com>
+Date:   Wed Jul 10 11:12:17 2013 -0700
+
+    LP 1103706 Hold ratios in circ policies cause errors when trying to renew items
+    
+    Changed the function action.copy_related_hold_stats to accept a bigint as the perameter instead of an integer.
+    Copy_related_hold_stats is only called by the function action.item_user_circ_test which trys to pass a bigint.
+    
+    Signed-off-by: Fredrick Parks <fparks at catalystitservices.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/100.circ_matrix.sql
+60	0	Open-ILS/src/sql/Pg/upgrade/XXXX.function.copy_related_hold_stats.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.copy_related_hold_stats.sql
+
+commit bc9ea5cafd18ea612bc9ccd271f2a64bd08656d2
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jul 17 13:25:29 2013 -0400
+
+    Stamping upgrade script for authority labeling fix
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+10	0	Open-ILS/src/sql/Pg/upgrade/0810.data.authority_4xx_fields.sql
+0	10	Open-ILS/src/sql/Pg/upgrade/XXXX.data.authority_4xx_fields.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0810.data.authority_4xx_fields.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.authority_4xx_fields.sql
+
+commit a4266efb231ffd6df7fcfff5a65742d607c8c14c
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu Jul 11 15:31:37 2013 -0400
+
+    Authorities: 4XX fields have wrong names
+    
+    In Evergreen we have authority fields defined in the database that
+    relate to control sets.  These are used somewhere today (I'm fuzzy on
+    that at the moment; some places once had and may still have hardcoded
+    labels) but they also will be used by the bib and auth browser
+    that's not yet merged to master (see LP #1177810).
+    
+    The 4XX tags among the set I'm talking about (in
+    authority.control_set_authority_fields) are mislabled, saying See Also
+    where they ought to say See From, e.g.
+    http://www.loc.gov/marc/authority/ad400.html
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+12	12	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+10	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.authority_4xx_fields.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.authority_4xx_fields.sql
+
+commit ae25f788e275d75d58dd0f0c91ba96d9ddf844ed
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Jul 12 13:11:57 2013 -0400
+
+    Implement a concurrent-run cache for result rendering a la initial search queue compression
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+70	14	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
+
+commit 153a840b78bd224351bfe779d6720eb04958d892
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Tue Jul 16 18:33:32 2013 +0300
+
+    Fix untranslatable strings in the selfcheck interface.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+4	0	Open-ILS/web/js/dojo/openils/circ/nls/selfcheck.js
+4	4	Open-ILS/web/js/ui/default/circ/selfcheck/selfcheck.js
+
+commit b137ced2eb64640d0dd144122da415c9a9d95b45
+Author: Michael Peters <mrpeters at library.in.gov>
+Date:   Wed Aug 22 08:25:25 2012 -0400
+
+    Initial selfcheck styling enhancements
+    
+    * Convert action links to buttons for increased clarity
+    * Convert dashed fieldsets to gradient backed bubbles for depth
+    * Color line-item table headers to distinguish from actual line-items
+    * Color logo background for increased contrast
+    * Larger input box
+    * Background on prompts to distinguish from logo background
+    
+    Signed-off-by: Michael Peters <mrpeters at library.in.gov>
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    
+    Conflicts:
+    	Open-ILS/src/templates/circ/selfcheck/main.tt2
+    	Open-ILS/src/templates/circ/selfcheck/summary.tt2
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+6	1	Open-ILS/src/templates/circ/selfcheck/banner.tt2
+1	1	Open-ILS/src/templates/circ/selfcheck/main.tt2
+6	6	Open-ILS/src/templates/circ/selfcheck/summary.tt2
+99	14	Open-ILS/web/css/skin/default/selfcheck.css
+-	-	Open-ILS/web/images/self_eg_logo.png
+ create mode 100644 Open-ILS/web/images/self_eg_logo.png
+
+commit 9d26b6e8d8012b0c584c97db16a76ca94d766917
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Jul 16 15:47:28 2013 -0400
+
+    Documentation for default values in Load Order Record form
+    
+    Documentation for new default values and sticky fields in the acq Load
+    MARC Order Records form. I also moved up/modified 2.1 docs for this
+    interface and integrated them with the 2.2 acq/Vandelay integration docs.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+177	31	docs/acquisitions/vandelay_acquisitions_integration.txt
+2	1	docs/cataloging/batch_importing_MARC.txt
+-	-	docs/media/Vandelay_Integration_into_Acquisitions1.jpg
+-	-	docs/media/Vandelay_Integration_into_Acquisitions5.jpg
+
+commit 4e3fdd7ab78bdfec38f1858e1af2076010bfb757
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Oct 10 09:22:33 2012 -0400
+
+    Capture and log AuthProxy logins with no account
+    
+    The current AuthProxy.pm code assumes that if the external auth
+    passes, the Evergreen account will be there.  This protects
+    against cases where a user is in the external auth system but
+    has no matching account in Evergreen.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+4	0	Open-ILS/src/perlmods/lib/OpenILS/Application/AuthProxy.pm
+
+commit be36c3c96f7b79b9c7109de0e9a6b04c18faf559
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Oct 10 09:22:33 2012 -0400
+
+    Capture and log AuthProxy logins with no account
+    
+    The current AuthProxy.pm code assumes that if the external auth
+    passes, the Evergreen account will be there.  This protects
+    against cases where a user is in the external auth system but
+    has no matching account in Evergreen.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+4	0	Open-ILS/src/perlmods/lib/OpenILS/Application/AuthProxy.pm
+
+commit 36ea3a290b5ac52e758feda91212c2cb68d4e9b2
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Sep 27 17:35:03 2012 -0400
+
+    Make AuthProxy LDAP bind code more robust
+    
+    The existing version of LDAP_Auth.pm assumed that the user's
+    bind DN could be derived from the base DN, the ID attribute, and
+    the user's ID.  This is frequently the case, but not always,
+    particularly in Active Directory setups using sAMAccountName. This
+    commit instead uses the initial LDAP lookup as the authority for
+    determining the user's DN.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+5	5	Open-ILS/src/perlmods/lib/OpenILS/Application/AuthProxy/LDAP_Auth.pm
+
+commit f040814c7507291c388a35a23c8878293a2524e4
+Author: Liam Whalen <whalen.ld at gmail.com>
+Date:   Sun Jul 14 21:00:14 2013 -0700
+
+    Fixes error with generate_fines for overdues returned after closed date
+    
+    If an overdue is returned after a closed date, the generate_fines code
+    will not generate fines for those items because the section of code that
+    checks for closed dates returns from the function if a closed date is
+    encountered.
+    
+    For example, if an item is due on June 29th, but is not returned until
+    after July 1st (Canada Day), then when fines are generated for the item,
+    generate fines creates a fine for the 30th of June, but when it
+    gets to the 1st of July it encouters a closed date and executes a
+    'return' statement which exits the generate_fines code causing the
+    fine from June 30th to be rolled back as well as preventing
+    further fines from being generated.
+    
+    This fix replaces the 'return' statements inside the 'for' loop that is
+    nested within the eval with 'next' statements.
+    
+    Signed-off-by: Liam Whalen <whalen.ld at gmail.com>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+
+commit 335f8899ef9bd807823796d977f31bd3cc8b6ba6
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Tue Jul 2 09:13:40 2013 +0300
+
+    Move action.hold_request_cancel_cause inserts for i18n
+    
+    Move action.hold_request_cancel_cause inserts to 950.data.seed-values.sql
+    so they're picked up for translation.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+0	8	Open-ILS/src/sql/Pg/090.schema.action.sql
+11	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 3b61c0a825fe99854576f414df234c844406e49d
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Tue Jul 2 08:34:16 2013 +0300
+
+    Move acq.user_request_type data for i18n picking
+    
+    Move acq.user_request_type inserts into 950.data.seed-values.sql
+    so those get picked up for translation.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+0	8	Open-ILS/src/sql/Pg/200.schema.acq.sql
+8	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit e5ab813eecef8c7b832200885ad15c8a6b9f7409
+Author: Ben Shum <bshum at biblio.org>
+Date:   Fri Jul 12 16:44:44 2013 -0400
+
+    Add release note for Print Single Item Receipt
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+7	0	docs/RELEASE_NOTES_NEXT/Circulation/print-single-receipt.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/print-single-receipt.txt
+
+commit e7814461d7747e679c2b44d8ae33d71efd5e8fd0
+Author: edoceo <code at edoceo.com>
+Date:   Thu Apr 25 10:52:43 2013 -0700
+
+    Adds the option to print a single item from the Items Out.
+    A new button and right-click option are created.
+    
+    Signed-off-by: edoceo <code at edoceo.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+33	0	Open-ILS/xul/staff_client/server/patron/items.js
+8	0	Open-ILS/xul/staff_client/server/patron/items_overlay.xul
+
+commit 1c5edfe9546ab79685f1024e3b3e924ab75fecda
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Thu Jun 27 11:23:11 2013 +0300
+
+    Add missing character set definitions to data URIs.
+    Also use encodeURIComponent() instead of escape() so the UTF-8 characters stay intact.
+    Also, fix the print macro help popup window size.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+2	2	Open-ILS/web/opac/common/js/utils.js
+1	1	Open-ILS/xul/staff_client/chrome/content/auth/controller.js
+1	1	Open-ILS/xul/staff_client/chrome/content/util/error.js
+5	5	Open-ILS/xul/staff_client/chrome/content/util/print.js
+1	1	Open-ILS/xul/staff_client/server/admin/offline_manage_xacts.js
+2	2	Open-ILS/xul/staff_client/server/cat/marc_view.xul
+4	4	Open-ILS/xul/staff_client/server/circ/print_list_template_editor.js
+4	4	Open-ILS/xul/staff_client/server/patron/display.js
+
+commit 73f71659fa2d1dd6bcbc726cd24d9563e9df52d4
+Author: Ben Shum <bshum at biblio.org>
+Date:   Fri Jul 12 15:36:06 2013 -0400
+
+    Stamping upgrade script for making state not required in org unit address
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+8	0	Open-ILS/src/sql/Pg/upgrade/0809.schema.org-addr-state-null.sql
+0	5	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.org-addr-state-null.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0809.schema.org-addr-state-null.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.org-addr-state-null.sql
+
+commit 85bba93741c8292bcab30c301b18e6fa79640c2a
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Mon Jun 10 10:32:41 2013 +0300
+
+    Do not explicitly require the state field in org unit addresses.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/sql/Pg/005.schema.actors.sql
+5	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.org-addr-state-null.sql
+4	4	Open-ILS/web/conify/global/actor/org_unit.html
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.org-addr-state-null.sql
+
+commit 2532f01f3f6b8eec6fcbc72e42edfc9039150ad6
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Fri Jul 12 15:19:23 2013 -0400
+
+    LP1200735 stamping upgrade for usrname index
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+11	0	Open-ILS/src/sql/Pg/upgrade/0808.schema.usrname_index.sql
+0	11	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usrname_index.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0808.schema.usrname_index.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usrname_index.sql
+
+commit 2471a555354226a8a1c75de6c9e31c7f7a64ecb4
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Jul 12 15:10:32 2013 -0400
+
+    LP#1200735: improve performance of patron search by username
+    
+    This patch adds an additional index on actor.usr.usrname.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+1	0	Open-ILS/src/sql/Pg/005.schema.actors.sql
+11	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usrname_index.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usrname_index.sql
+
+commit 82e6978f5b33909c2cbb646c1dd36086e7ae7254
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Jul 12 14:29:30 2013 -0400
+
+    Whitespace-only changes to Fieldmapper.pm
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+12	12	Open-ILS/src/perlmods/lib/OpenILS/Utils/Fieldmapper.pm
+
+commit e3089098b4b27022597f7514af44108d4b3f5021
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Mar 19 18:35:52 2012 -0400
+
+    Teach Fieldmapper (Perl) to record and expose field datatype
+    
+    We record most everything from the IDL, but until now we skipped datatype
+    because it's generally not useful in perl.  But, there might be uses.  So
+    now we record it, and expose it through the class and instance FieldDatatype
+    method.  Also added is a more general FieldInfo method, which returns a hash
+    containing field attributes, including but not limited to:
+    
+     * virtual  [1|0]
+     * required [1|0]
+     * position [array position for internal implementation]
+     * datatype [bool|float|id|int|interval|link|money|number|org_unit|text|timestamp]
+     * validate [regexp]
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+18	0	Open-ILS/src/perlmods/lib/OpenILS/Utils/Fieldmapper.pm
+
+commit 213dcee877b95aa3987de4d93e83012d24d5d93c
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Fri Jul 12 12:28:58 2013 -0400
+
+    fix editing think-o in release note
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+1	1	docs/RELEASE_NOTES_NEXT/Client/user-setting-defaults.txt
+
+commit b6d0ee7f0eeed0c65270a13aba0627f2e7c83cdd
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Fri Jul 12 12:21:47 2013 -0400
+
+    upgrde scrpt/release note for Usr Setting Defaults
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+9	0	Open-ILS/src/sql/Pg/upgrade/0807.usr_setting_default.sql
+0	2	Open-ILS/src/sql/Pg/upgrade/XXXX.usr_setting_default.sql
+4	0	docs/RELEASE_NOTES_NEXT/Client/user-setting-defaults.txt
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0807.usr_setting_default.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.usr_setting_default.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/user-setting-defaults.txt
+
+commit 959bcf1f3ff5d33a610686a363337cb75b3a1365
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Fri Jul 12 12:16:10 2013 -0400
+
+    match surrounding whitespace
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+1	1	Open-ILS/examples/fm_IDL.xml
+
+commit 6d77e5d64b180f5f78627547418757ecb2d7e4e5
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Tue Oct 2 16:47:42 2012 -0400
+
+    User Setting Registration Defaults
+    
+    Add a new reg_default value for user setting types. On patron registration
+    the value (if any) is used as a default for the patron.
+    
+    Only applicable to those settings editable via the patron editor.
+    
+    Intended use cases:
+    
+    1 - Hold Notification Type Default other than phone:email
+    2 - A/T user settings defaulting to "on" at registration
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+1	0	Open-ILS/examples/fm_IDL.xml
+1	0	Open-ILS/src/sql/Pg/002.schema.config.sql
+2	0	Open-ILS/src/sql/Pg/upgrade/XXXX.usr_setting_default.sql
+8	0	Open-ILS/web/js/ui/default/actor/user/register.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.usr_setting_default.sql
+
+commit 81ce189f4623e62109bdc5bbcbcc9ba8c48e4dd5
+Author: Steven Chan <schan at sitka.bclibraries.ca>
+Date:   Sat Jun 15 13:06:43 2013 -0400
+
+    Fix LP1177916, Cannot activate PO which contains only direct charges
+    We add a safety check in the function
+    Application/Acq/Order.pm/create_lineitem_list_assets(), which is called
+    by create_po_assets(), which is the service call initiated by the user
+    trying to activate a PO.
+    
+    The safety check prevents the function from processing if there are no
+    line items specified in the arguments.
+    
+    P.S. It would be better to stop the sequence of events earlier in the
+    client, but that will need more coding, which can been done in another
+    fix.
+    
+    Signed-off-by: Steven Chan <schan at sitka.bclibraries.ca>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+3	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm
+
+commit 65693ac32e4ccb82eee8aa7fc94f77668a912e81
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Jul 11 18:04:37 2013 -0400
+
+    Self-check docs: fix URL formatting
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+4	4	docs/circulation/self_check.txt
+
+commit d1c78d8e585a2afa2be29579041d3397b3db4c0d
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Jul 11 17:53:21 2013 -0400
+
+    Document the self check interface
+    
+    This comes up from time to time on the mailing lists and on the feedback
+    email, and pulling together all of the pieces takes some time and
+    digging (thanks Bill Erickson and Ben Shum!), so let's document it once
+    and for all...
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+69	0	docs/circulation/self_check.txt
+2	0	docs/root.txt
+ create mode 100644 docs/circulation/self_check.txt
+
+commit 64475ab576d6bc7ee4fd27e0255c0d30ba369c1f
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Mon Jul 8 11:35:45 2013 -0400
+
+    Staff client index: Add tooltips, restore spacing
+    
+    This commit adds to Pasi's improvements of the staff client index (or
+    portal) page by adding a tooltip message to all of the "open in a new
+    tab" icons, using the already translatable alt text of the icon. Also,
+    this commit restores the original padding on the rows, which was changed
+    when border-collapse was previously added.
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+15	1	Open-ILS/xul/staff_client/server/index.xhtml
+
+commit ed3880a0229fb1440130cc8de163133c55fe3495
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Tue Jul 2 10:57:19 2013 +0300
+
+    Make staff client index more user friendly
+    
+    by letting the user click on a bigger area instead of trying to hit
+    the exact location of the text, and making the entry hilighted.
+    Also simplify the html a bit.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+67	100	Open-ILS/xul/staff_client/server/index.xhtml
+
+commit 1ac7a24188fe435586da0d373ce461dab9ef1af8
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Jul 11 13:14:04 2013 -0400
+
+    LP833820 repair ACQ options passing thinko
+    
+    Ensure zero_copy_activate option is passed down to
+    create_lineitem_debits with new no-asset-activation code.  Thanks to Dan
+    Wells for spotting this.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+3	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm
+
+commit 94313130f81553691967bcd8c50c17b361a8e301
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Jul 10 21:49:16 2013 -0400
+
+    Release notes entry for PO activation without loading items.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+5	0	docs/RELEASE_NOTES_NEXT/Acquisitions/acq-po-activation-sans-assets.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Acquisitions/acq-po-activation-sans-assets.txt
+
+commit bc9b805468865055184eb1f2232855a21e224124
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Nov 27 15:26:48 2012 -0500
+
+    Support PO activation w/o loading items
+    
+    Allow for the activation of purchase orders without requiring that bibs
+    and items be loaded.  (Currently, if bibs and items are not manually
+    loaded, they are loaded during PO activation).
+    
+    Adds a new link next to the existing PO Activate link for "Activate
+    Withoug Loading Items".  Apart from the fact that there are no
+    underlying bibs/copies, such a PO behaves the same as any other PO.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    
+    Conflicts:
+    	Open-ILS/src/templates/acq/po/view.tt2
+    	Open-ILS/web/js/ui/default/acq/po/view_po.js
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+13	8	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm
+9	1	Open-ILS/src/templates/acq/po/view.tt2
+1	0	Open-ILS/web/js/dojo/openils/acq/nls/acq.js
+19	6	Open-ILS/web/js/ui/default/acq/po/view_po.js
+
+commit 357b6ca85f240b249f393cc24c44dbbccba75acd
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Jul 11 13:09:11 2013 -0400
+
+    Stamping hold-cancel-via-sip upgrade script
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+9	0	Open-ILS/src/sql/Pg/upgrade/0806.data.hold_cancel_via_sip.sql
+0	9	Open-ILS/src/sql/Pg/upgrade/XXXX.data.hold_cancel_via_sip.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0806.data.hold_cancel_via_sip.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.hold_cancel_via_sip.sql
+
+commit 2deb25817573b3761b8644e120794dd3c63f7877
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Jul 11 12:31:37 2013 -0400
+
+    Unbreaking wrong-direction conflict resolution from previous commit
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	2	Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm
+
+commit 47879808611511f8db11b5f3d6831151543531bd
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Nov 27 10:42:58 2012 -0500
+
+    SIP hold cancellation support
+    
+    Implement a subset of SIP message pair 15/16 for holds cancellation.
+    
+    1. New oils_sip.xml configuration option "msg64_hold_datatype".  This
+    is similar to msg64_summary_datatype, but affacts holds instead of
+    circulations.  When set to 'barcode', holds information will be
+    delivered as a set of copy barcodes instead of title strings for patron
+    info requests.  With barcodes, SIP clients can both find the title
+    strings for display (via item info requests) and make subseqent
+    hold-related action requests, like holds cancellation.
+    
+    --
+    Copies are not an ideal identifier for holds, but SIP has a limited
+    vocabulary.  With copies we can (99% of the time) work to and from hold
+    requests to find a reasonable data set to work on.  If a patron has
+    multiple holds for the same item and wants to cancel a specific one of
+    those holds, the user should use the catalog instead of SIP.
+    --
+    
+    2. When receiving a message 15 of with a cancellation action, find the
+    newest open hold that matches the provided copy barcode and cancel the
+    hold.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+11	0	Open-ILS/examples/oils_sip.xml.example
+54	57	Open-ILS/src/perlmods/lib/OpenILS/SIP.pm
+146	37	Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm
+73	0	Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/Hold.pm
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/Hold.pm
+
+commit a4450ce1500cb83f995d8811dcf7f03e7a6374c2
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Nov 28 10:44:14 2012 -0500
+
+    New "patron via SIP" hold cancellation reason
+    
+    Seed data and upgrade script.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	0	Open-ILS/src/sql/Pg/090.schema.action.sql
+9	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.hold_cancel_via_sip.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.hold_cancel_via_sip.sql
+
+commit 5cb9bc2e3e35f0d12c4f6bd8799010f8c573a32c
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Jun 12 13:38:30 2013 -0400
+
+    LP1190305 Loosen MARC Remove Fields retrieve perms
+    
+    Allow trash fields to be publicly accessible (if logged in) instead of
+    requiring one of the edit permissions to view.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+2	4	Open-ILS/examples/fm_IDL.xml
+
+commit f9a57897338dd2568c5057d0ff0ed37ffe40ba57
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Mon May 27 13:01:52 2013 +0300
+
+    LP1182393: 'Service' in circ offline checkout columns is untranslatable
+    
+    Move that string into the common message catalog as
+    staff.checkout_column_label_service
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/xul/staff_client/server/circ/util.js
+1	0	Open-ILS/xul/staff_client/server/locale/en-US/common.properties
+
+commit 78ef108791fd2ec1050aab057464f5fbbd175feb
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Thu Jun 13 11:59:12 2013 +0300
+
+    Use the phrase "Add Search Row" in both advanced and expert search.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/templates/opac/parts/advanced/expert.tt2
+
+commit 6a25b321280371818281ea180cdbf4e90509acc2
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Jul 11 10:41:32 2013 -0400
+
+    Maintenance message: avoid Unicode corruption, support KPAC
+    
+    By shifting from an Apache config environment variable to a config.tt2
+    variable, we gain the advantage of more robust Unicode support as well
+    as the ability to turn maintenance messages on or off without requiring
+    a reload of Apache.
+    
+    However, we do lose the convenience of per-vhost maintenance messages;
+    sites requiring this functionality can use the ctx.hostname variable to
+    provide conditional per-host messages.
+    
+    This also adds support for displaying the maintenance message in the
+    KPAC.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+0	3	Open-ILS/examples/apache/eg.conf.in
+0	2	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+3	0	Open-ILS/src/templates/kpac/parts/base.tt2
+5	0	Open-ILS/src/templates/opac/parts/config.tt2
+3	5	Open-ILS/src/templates/opac/parts/topnav.tt2
+7	0	Open-ILS/web/css/skin/default/kpac/style.css
+
+commit 6fbaf6cec686cfe25b2186799ed7b0368aa1cc6f
+Author: Steven Chan <schan at sitka.bclibraries.ca>
+Date:   Thu May 23 15:22:15 2013 -0700
+
+    Patron Editor can enter erroneous values for Claims-returned count
+    
+    In the staff client, Patrons interface, Edit screen, when
+    mouse-scrolling up and down the Edit form, it is possible to
+    inadvertently change the value in Claims-returned Count or Claims Never
+    Checked Out Count field.  It will happen if the mouse hovers over either
+    data field while using the mouse wheel.
+    
+    Both data fields use the dijit.form.NumberSpinner widget to provide a
+    'spin' behaviour.  The fix involves cancelling the mouse scroll event as
+    it propagates to input fields in table rows that are using the
+    dijit.form.NumberSpinner widget, because the mouse scroll would be
+    applied too early by the widget, before the user has intentionally
+    focussed on one of the input fields.  Now, mouse scrolling has no effect
+    on the two input fields; it will only have an effect in scrolling the
+    page up or down.
+    
+    Signed-off-by: Steven Chan <schan at sitka.bclibraries.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+11	0	Open-ILS/web/js/ui/default/actor/user/register.js
+
+commit 70d25de2bdd7837f3740769495655b9922e6397c
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Thu May 24 12:37:33 2012 -0400
+
+    SIP2: Return slightly more hold info
+    
+    We don't have a normal hold queue, but if there is a hold we can call that
+    the hold queue. So return the ID of the hold that was captured.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/src/perlmods/lib/OpenILS/SIP/Item.pm
+
+commit 4e030f77264f7f7a11029a4390bc4ec990d65829
+Author: James Fournie <jfournie at sitka.bclibraries.ca>
+Date:   Fri Feb 22 17:28:29 2013 -0800
+
+    Server maintenance message via Apache config
+    
+    This adds a custom maintenance message which you can issue in your
+    Apache config by setting the environment variable "MAINTENANCE_MESSAGE"
+    and restarting/reloading Apache.  This message appears in the TPAC for
+    both staff and patrons in the form of a red banner across the top of the
+    screen.
+    
+    Signed-off-by: James Fournie <jfournie at sitka.bclibraries.ca>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+3	0	Open-ILS/examples/apache/eg.conf.in
+2	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+9	1	Open-ILS/src/templates/opac/css/style.css.tt2
+5	0	Open-ILS/src/templates/opac/parts/topnav.tt2
+6	0	Open-ILS/web/opac/skin/default/xml/home/index_body.xml
+
+commit 117a66a7c6e11764665314817beb617e5596f3fe
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Jul 10 21:03:38 2013 -0400
+
+    Revert 56a63f03 and try again
+    
+    I totally screwed up this commit by committing old versions of files
+    instead of the deltas against current master. Reverting, then will apply
+    the correct commit.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+0	154	Open-ILS/examples/apache/eg.conf
+0	2	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+45	16	Open-ILS/src/templates/opac/css/style.css.tt2
+1	6	Open-ILS/src/templates/opac/parts/topnav.tt2
+ delete mode 100644 Open-ILS/examples/apache/eg.conf
+
+commit 56a63f03c5f057fa06e1b093fdc35906e3ac4176
+Author: James Fournie <jfournie at sitka.bclibraries.ca>
+Date:   Wed Jul 10 20:41:51 2013 -0400
+
+    Server maintenance message via Apache config
+    
+    This adds a custom maintenance message which you can issue in your
+    Apache config by setting the environment variable "MAINTENANCE_MESSAGE"
+    and restarting/reloading Apache.  This message appears in the TPAC for
+    both staff and patrons in the form of a red banner across the top of the
+    screen.
+    
+    Signed-off-by: James Fournie <jfournie at sitka.bclibraries.ca>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+154	0	Open-ILS/examples/apache/eg.conf
+2	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+16	45	Open-ILS/src/templates/opac/css/style.css.tt2
+6	1	Open-ILS/src/templates/opac/parts/topnav.tt2
+ create mode 100644 Open-ILS/examples/apache/eg.conf
+
+commit aaec1bdfa8be334d1d4322ecaf20d4a128d6dead
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Wed Jul 10 17:22:24 2013 -0400
+
+    Restore look of acct summary table
+    
+    This commit makes a small adjustment to Pasi's cleaner layout of the
+    Account Summary table.
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+4	0	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 15d7de9d1f184de84c00ae40128663e11f972f7c
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Thu Jan 31 12:20:48 2013 +0200
+
+    Clean up the account summary table HTML.
+    
+    Instead of faking a table with three separate DIVs,
+    actually use a single table.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+8	5	Open-ILS/src/templates/opac/css/style.css.tt2
+8	19	Open-ILS/src/templates/opac/parts/myopac/main_base.tt2
+
+commit 6bf2e8f997c28fb4c26a0565ff8ce1cb7cc36341
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jul 10 12:44:33 2013 -0400
+
+    Stamping upgrade script for Desk Renewal Circ Lib
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+18	0	Open-ILS/src/sql/Pg/upgrade/0805.schema.desk_renewal_reuse_circ_lib.sql
+0	18	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.desk_renewal_reuse_circ_lib.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0805.schema.desk_renewal_reuse_circ_lib.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.desk_renewal_reuse_circ_lib.sql
+
+commit 931dcde1977afa8aa442cdb8c3e18eba937d25b7
+Author: Ben Shum <bshum at biblio.org>
+Date:   Mon Feb 11 12:16:10 2013 -0500
+
+    Desk Renewal at original circ library
+    
+    In the same spirit as OPAC Renewal at the original circ library, include a
+    new setting to allow the same for Desk Renewals.
+    
+    See 8823e4060bbc825c859327b018c5f8cb29b9ac2a and related.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+15	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+12	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+18	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.desk_renewal_reuse_circ_lib.sql
+8	0	docs/RELEASE_NOTES_NEXT/Circulation/desk-renewal-at-original-circ-lib.txt
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.desk_renewal_reuse_circ_lib.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/desk-renewal-at-original-circ-lib.txt
+
+commit 6693be3c9cdd8353556a045d61826ed6608fe91a
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Jul 10 11:39:08 2013 -0400
+
+    Add missing oils_i18n call #2 to upgrade script
+    
+    Simple thinko fix for missing translation function call.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/upgrade/0804.data.gwichin-typo-fix.sql
+
+commit a7b06d177875b01d73f5f33be9e138d6b81c799e
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Jul 10 11:39:08 2013 -0400
+
+    Add missing oils_i18n call to upgrade script
+    
+    Simple thinko fix for missing translation function call.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+
+3	1	Open-ILS/src/sql/Pg/upgrade/0803.data.fill_empty_description.sql
+
+commit 572e9a28bc3bba7a5543cad3b00bc0f913f9328a
+Author: Mark Cooper <markchristophercooper at gmail.com>
+Date:   Mon Mar 18 15:45:14 2013 -0700
+
+    LP1156905 lineitem worksheet sorts copies by org
+    
+    Lineitem copies (details) were set to be sorted by branch ('owning_lib')
+    by default. However this was not happening because the lineitem_details
+    'owning_lib' referenced a fieldmapper object (not an id or name).
+    This submission sets the owning_lib to the shortname so that sorting can
+    occur in the intended way.
+    
+    Signed-off-by: Mark Cooper <markchristophercooper at gmail.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+6	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit a9ae9004898089a852f33637b3d2dc14def6915f
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Jul 10 11:26:07 2013 -0400
+
+    Stamping upgrade for Gwich'in language typo
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+9	0	Open-ILS/src/sql/Pg/upgrade/0804.data.gwichin-typo-fix.sql
+0	9	Open-ILS/src/sql/Pg/upgrade/XXXX.data.gwichin-typo-fix.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0804.data.gwichin-typo-fix.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.gwichin-typo-fix.sql
+
+commit 24f008f6cd7808fe9c07979f7839e10d6607ddea
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Jul 9 20:47:20 2013 -0400
+
+    LP1158206 - include upgrade script to fix Gwich'in typo
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+9	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.gwichin-typo-fix.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.gwichin-typo-fix.sql
+
+commit dc36d51403c7024f3dbbf4333922361a7ae080d8
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Thu Jun 13 09:06:26 2013 +0300
+
+    Fix LP1158206 - The language is Gwich'in.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit c260a675d60119edb9d23d0dd86213e81d681df9
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Jul 10 10:53:41 2013 -0400
+
+    Stamping upgrade script for empty seed description
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+9	0	Open-ILS/src/sql/Pg/upgrade/0803.data.fill_empty_description.sql
+0	9	Open-ILS/src/sql/Pg/upgrade/XXXX.data.fill_empty_description.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0803.data.fill_empty_description.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.fill_empty_description.sql
+
+commit 21bcf415df7efb7d3336283fe5045c174c3b1a4a
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Wed Jul 10 09:32:07 2013 -0400
+
+    LP1158211 - add upgrade script to fill empty description
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+9	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.fill_empty_description.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.fill_empty_description.sql
+
+commit f81eff8f86e733a7ebe527ed961bf2ca51caa05e
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Tue Jun 11 11:01:53 2013 +0300
+
+    Description for circ.holds.default_shelf_expire_interval
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit a1344fa35bd6690e8b9495e54dfa4b1e157cab12
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Fri Aug 17 13:57:08 2012 -0400
+
+    Simplified pull list: More name options
+    
+    Because sometimes you don't want the alias to override the entire name.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+28	1	Open-ILS/examples/fm_IDL.xml
+
+commit 0ebeb8a5a0b7b21667dfb3319b006e21f0a950c5
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Mon May 27 12:02:38 2013 +0300
+
+    LP1183414: OPAC patron opt-in settings table does not work correctly
+    
+    Fix the template logic error, trying to use a variable before
+    it is defined.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+9	6	Open-ILS/src/templates/opac/myopac/prefs_notify.tt2
+
+commit 8a1598e34dfea1c61c8ffa1c8f676b0e8099339a
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Fri Jun 28 10:22:59 2013 +0300
+
+    Don't let pref_ou repeat in staff recent searches list
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
+
+commit d2a8ca3104453778b80c40395b991e0c8b348b5c
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Fri Jun 7 09:25:56 2013 -0400
+
+    Modify default logging of SIP2 in oils_ctl.sh.
+    
+    Change the default of OILS_SIP_ERR_LOG from /dev/null to
+    LOCALSTATEDIR/log/oils_sip.log to mirror what is done with the
+    Z39.50 log.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/examples/oils_ctl.sh
+
+commit f0f70c455756d1666328cc1028a04036c7d1d6d7
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Tue Jun 11 12:29:29 2013 +0300
+
+    Fix LP#1108668 by marking the internet access level column contents as translatable in fm_IDL.xml
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/examples/fm_IDL.xml
+
+commit 39c46c14b5df32f3777175a65841e282c77309a3
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Jul 9 16:53:29 2013 -0400
+
+    Correct Linux staff client build instructions
+    
+    There were a few things going on here; 2.3 introduced linux32-client and
+    linux64-client targets, so the old linux-client Make target no longer
+    worked.
+    
+    Also, Wine isn't generally how many of us would recommend running staff
+    clients when there's a perfectly good native client likely to better
+    support printing, etc.
+    
+    Also, rather than pointing at evergreen-ils.org for downloads, which
+    won't work in many situations (and which prevents the use of the
+    auto-update mechanism), use the "updates" target to point at the locally
+    downloadable clients. Eventually we'll properly document the use of
+    auto-updates, but for now this is hopefully a step in the right
+    direction.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+37	50	docs/installation/staff_client_installation.txt
+
+commit ccc0a7547ad3d30a28970c8b949f6d60cab7c5df
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Jul 9 19:43:17 2013 -0400
+
+    Build 64-bit Linux client updates when asked
+    
+    A copy/paste error led to a request for linux64-updates-client to
+    generate 32-bit clients instead of the requested 64-bit clients.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/xul/staff_client/external/make_updates.sh
+
+commit 4cfa942dab61505927d2ebb996ec3a385fc96064
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Tue Jul 9 11:46:31 2013 -0400
+
+    Stamping upgrade script for file-order authority subfields
+    
+    And fixing a small typo.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+170	0	Open-ILS/src/sql/Pg/upgrade/0802.function.authority-sf-file-order.sql
+0	170	Open-ILS/src/sql/Pg/upgrade/XXXX.function.authority-sf-file-order.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0802.function.authority-sf-file-order.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.authority-sf-file-order.sql
+
+commit 333c1b847552f1682ba856c9608e2e0b3db40fdf
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Jul 9 10:09:39 2013 -0400
+
+    Upgrade script for file-order authority subfields
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+170	0	Open-ILS/src/sql/Pg/upgrade/XXXX.function.authority-sf-file-order.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.authority-sf-file-order.sql
+
+commit 4307f5d7377906100b7fbc55f3f2344e778d0c59
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Jun 25 10:03:36 2013 -0400
+
+    Preserve record order of subfields for authority heading extraction
+    
+    When extracting headings from authority records we currently read the
+    subfields of a tag in configuration order.  We should, instead, read
+    them in record order, to preserve the desired sorting properties that
+    the cataloger has encoded in the record.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Yamil Suarez <yamil at yamil.com>
+
+43	33	Open-ILS/src/sql/Pg/011.schema.authority.sql
+
+commit f6c06a2e370281680d35f3094f09b05a6ca0d56b
+Author: Michael Peters <mrpeters at library.in.gov>
+Date:   Thu Apr 5 10:23:32 2012 -0400
+
+    LP#973666: Print Purchase Order does not print PO Name
+    
+    Printing a PO from the menu option "Actions-->Print Purchase Order"
+    generates a document that displays the PO #, but not the PO Name. It
+    was suggested that it would be helpful if the print document
+    displayed the PO Name instead of, or in addition to, the PO #. This
+    commit adds the PO Name in the default template for new installs,
+    but does not affect upgrades.
+    
+    Signed-off-by: Michael Peters <mrpeters at library.in.gov>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 004974d43a038046cb3569fa9e506722faa9cd43
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Jun 5 17:29:36 2013 -0400
+
+    LP1187016 Prevent new copies on activated POs
+    
+    If a PO has already been activated, prevent users from adding new copies
+    in the Item Count entry under the full lineitem copy grid.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+6	0	Open-ILS/web/js/ui/default/acq/common/li_table.js
+
+commit ab37833ff9df7fa13e86e41fb160232bdee51793
+Author: Ben Shum <bshum at biblio.org>
+Date:   Mon Jul 8 10:33:12 2013 -0400
+
+    Stamping upgrade script for user barcode regex setting
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+16	0	Open-ILS/src/sql/Pg/upgrade/0801.check_barcode_regex.sql
+0	10	Open-ILS/src/sql/Pg/upgrade/XXXX.check_barcode_regex.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0801.check_barcode_regex.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.check_barcode_regex.sql
+
+commit 47bfda2570939d9560e1c3aac330feb1e2e735d5
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Tue Jan 31 16:50:21 2012 -0500
+
+    Add registration/edit time barcode restrictions
+    
+    In the quest to not let staff put bad data into the system (losing battle,
+    but hey, gotta keep trying, right?), add a barcode regex specifically for
+    patron registration.
+    
+    This intentionally does *not* check the opac "is this a barcode?" value.
+    
+    Use cases for not checking that value include, but are not limited to:
+    
+    Special "barcodes" for staff accounts. Specific OUs may have a barcode
+    regex of ".*" to ensure they can use anything for these accounts.
+    
+    Different prefixes per library - To prevent libraries from using another
+    library's prefix, but still detect all of them as barcodes.
+    
+    Special case "this is a barcode" checks for the opac, like legacy barcodes
+    that should no longer be assigned to new patrons, or on edits.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+9	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+10	0	Open-ILS/src/sql/Pg/upgrade/XXXX.check_barcode_regex.sql
+19	0	Open-ILS/web/js/ui/default/actor/user/register.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.check_barcode_regex.sql
+
+commit 19ecb62f9955f720c9cc0de61eaa47b18c2d4037
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Tue Jun 26 11:39:48 2012 -0400
+
+    fix clear hold shelf with 25 or more holds
+    
+    When there are 25 or more shelf expired holds to be processed, the API call
+    returns an array of objects instead of an object, which the staff client wasn't
+    prepared to accommodate. This fixes that.
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+14	2	Open-ILS/xul/staff_client/server/patron/holds.js
+
+commit 77b750d4163897d3e8105388d352e75e19e803fc
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Jun 27 09:46:55 2013 -0400
+
+    Avoid 0788 duplication from 2.3 failure
+    
+    Recent installs of 2.3, or upgrades during 2.3, will have introduced
+    0788 already into the upgrade process -- meaning that the 2.3-2.4.0
+    script will rollback the entire transaction if it hits the duplicated
+    0788. Instead, move 0788 into its own transaction to increase the
+    chances that the 2.3-2.4.0 script will work for sites that stay up to
+    date or that recently installed Evergreen.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+41	35	Open-ILS/src/sql/Pg/version-upgrade/2.3-2.4.0-upgrade-db.sql
+
+commit 7f1ae7e5d686e9f4d6ee62b9d22aa88ac3eb116d
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Jun 26 23:01:36 2013 -0400
+
+    Sign off on apostrophe upgrade script
+    
+    Also had to quote the \qecho commands to prevent them from being
+    executed instead of simply set to STDOUT.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    
+    Conflicts:
+    	Open-ILS/src/sql/Pg/002.schema.config.sql
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+202	0	Open-ILS/src/sql/Pg/upgrade/0800.function.apostrophe-search.sql
+0	202	Open-ILS/src/sql/Pg/upgrade/XXXX.function.apostrophe-search.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0800.function.apostrophe-search.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.apostrophe-search.sql
+
+commit 8508a0d89efb0305e590bec9d6b94c1236a5e641
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Jun 24 15:48:07 2013 -0400
+
+    Create upgrade script for ingest normalization changes
+    
+    This provides the upgrade script for the ingest changes outlined
+    in LP 1187433.  In addition, the version-upgrade script for 2.3 to
+    2.4.0 has been modified to move the final reingest step until after
+    this incremental change has been applied.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+202	0	Open-ILS/src/sql/Pg/upgrade/XXXX.function.apostrophe-search.sql
+0	2	Open-ILS/src/sql/Pg/version-upgrade/2.3-2.4.0-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.apostrophe-search.sql
+
+commit 6205d9b43d60939fdc173ff77e661fa7ebe3dbdd
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Jun 13 01:16:23 2013 -0400
+
+    Retain index granularity with minimal bloat
+    
+    The previous approach to reducing index bloat arguably went too far, in
+    that analytics such as separately catalogued songs for an album were all
+    simply aggregated together in a single metabib.title_field_entry row,
+    rather than being added as separated metabib.title_field_entry rows for
+    each unique value.
+    
+    To avoid the original problem of exact duplicate rows being inserted, we
+    now check for an existing matching row before inserting into the index.
+    A good test record is title "Cello concerto." which results in 1 title
+    proper row and 4 added entry title rows in metabib.title_field_entry
+    after this change.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+11	2	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+
+commit 68d9a2111f6087a1377ff4bed8fa5a485fec4932
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 12 11:17:08 2013 -0400
+
+    Bring back "split-brain" indexing normalization
+    
+    Before 2.4-era changes to indexing and search, normalizers were applied
+    in a way that resulted in different effects on the value and index_vector
+    columns of metabib.*field_entry tables.  This behavior was lost during
+    the changes mentioned above, but we need it for several things to work
+    properly, phrase search and (likely) facets among them.  This commit
+    brings that behavior back.
+    
+    See here for the original behavioral documentation:
+    
+    http://evergreen-ils.org/dokuwiki/doku.php?id=documentation:indexing#field_normalization_settings
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+22	2	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+
+commit 2f9c80ae6b6a3a8ed1f7d2b91f310a6faf1d69fa
+Author: Bob Wicksall <bwicksall at pls-net.org>
+Date:   Thu Jun 13 01:06:10 2013 -0400
+
+    Reduce index bloat involving non-search_field values
+    
+    Rows in metabib.title_field_entry, subject_field_entry,
+    series_field_entry, and author_field_entry are doubled or tripled due to
+    bad logic in biblio.extract_metabib_field_entry. This results in these
+    tables being 2 or more times their correct size.
+    
+    This was introduced in 2.2.0 when the logic for browse_field and
+    facet_field were added to biblio.extract_metabib_field_entry. 2.1 is not
+    affected.
+    
+    The duplicates are caused when biblio.extract_metabib_field_entry
+    returns TRUE in the search_field column for all rows even if they should
+    just be facet_field or browse_field after the first search_field value
+    is returned.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+6	0	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+
+commit fceea3d2e12537ccb540a2a950a5ada22f73b7bf
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Jun 25 07:44:22 2013 -0400
+
+    Only attempt to map copies once per hold
+    
+    The development of Calculated Proximity Adjustment (CPA) for 2.4 added a "prox"
+    column to action.hold_copy_map (ahcm) to store on variant of copy proximity.  That
+    value is calculated at the same time that certain other data structures are
+    set up, and is conceptually tied to them, so the resulting combined data
+    set is used to insert values into the ahcm.  However, user configuration
+    can cause that data set to contain non-unique values, where the data structure
+    used previous to CPA was guaranteed to be unique.  This lack of uniqueness
+    would then violate a constraint on the achm table.  This commit restores the
+    required uniqueness for the purpose of creating the ahcm rows.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+2	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+
+commit 79eb7d97debfa8e4292f3f3170fe862ddd09f8ca
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Fri Apr 12 16:40:34 2013 -0700
+
+    Generate Password Label
+    
+    The "Reset" label for the button that generates random passwords can be
+    confusing for staff. Changes the label to "Generate Password" to let
+    people know what the button does.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/web/js/dojo/openils/actor/nls/register.js
+
+commit 31d0f9ef53fcb57faff46a2c7ad471040b432a72
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Fri Jun 21 14:49:27 2013 -0400
+
+    Prevent JavaScript error on non-Novelist sites
+    
+    Unless the Evergreen site in question is signed up and configured to
+    support Novelist added content, every details page will generate a
+    JavaScript error due to the reference to an undefined JavaScript
+    function. Guard against that by testing for the presence of the Novelist
+    URL.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+2	0	Open-ILS/src/templates/opac/parts/acjs.tt2
+
+commit cb7fb21c45329fd3b4f17dc4721e7f1e28ce0aab
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Wed Jun 19 16:49:14 2013 -0400
+
+    Silence QP warning due to inappropriate cmp op
+    
+    In QueryParser, we're comparing two strings, but using the numeric !=
+    operator. Switching to the 'ne' operator silences a warning that came up
+    7,000 today in our logs so far...
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+
+commit 84d6910d27d7f91ed82dce193501a4c36f37d79c
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Jun 20 23:11:20 2013 -0400
+
+    Silence uninit var warnings from query normalizer
+    
+    $field_info can return undef from the search for a matching ID from the
+    list of normalizers, which in turn generates several uninit var warnings
+    when attempts are made to access members of the undef variable. We saw
+    6700 occurrences of these warnings during a typical day of operations.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+1	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+
+commit 174c7db5bb5be07b19d564412fc5651405ba5b1c
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Jun 20 23:39:21 2013 -0400
+
+    return, not next, from eval BLOCK
+    
+    Per perldoc eval, exiting an eval BLOCK is not allowed. And it generates
+    warnings - 37,000 of them in one day - on a system on which the fine
+    generator runs every 15 minutes. Simply returning from the block
+    achieves the same goal without generating scads of warnings.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+6	6	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+
+commit adba9bf5b841e3b38cb78002db94b341fa9ce78b
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon May 13 13:22:37 2013 -0400
+
+    LP1179609 ACQ lineitem identifier inline update
+    
+    When the identifier value for a linetiem is changed, apply the change
+    and refresh the lineitem in real time instead of requiring users to
+    click the 'Apply Lineitem Identifier' link.
+    
+    The 'Apply Lineitem Identifier' link has also been removed, since it is
+    no longer needed.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+0	6	Open-ILS/src/templates/acq/common/li_table.tt2
+46	9	Open-ILS/web/js/ui/default/acq/common/li_table.js
+
+commit 0ad53700f03e7b65446ba60ab8ff734a1dc0be17
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Wed Jun 19 15:42:07 2013 -0400
+
+    Add (noop) upgrade script for 2.2.10
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+5	0	Open-ILS/src/sql/Pg/version-upgrade/2.2.9-2.2.10-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.2.9-2.2.10-upgrade-db.sql
+
+commit 0136b8a455918c10cc088a199818615b04b33d9c
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Jun 19 10:47:20 2013 -0400
+
+    2.3.8 stub upgrade script
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+5	0	Open-ILS/src/sql/Pg/version-upgrade/2.3.7-2.3.8-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.3.7-2.3.8-upgrade-db.sql
+
+commit d273da4d53d1b8763c8864401503532ed77e1e48
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Jun 17 00:38:43 2013 -0400
+
+    Support script-based circ in nearest_hold()
+    
+    The nearest_hold() implementation recently changed to pull in the circ
+    library ID; however, if circulation runs through scripts, the circ
+    library on the copy object has been fleshed, and the nearest hold
+    routine gets very confused.
+    
+    Check to see if we do, in fact, have an object instead of a plain
+    scalar, and assign the value to a placeholder variable accordingly.
+    
+    Thanks to Jeff Godin for his great assistance on debugging this!
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    
+    Conflicts:
+    	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+    
+    (Just whitespace. Resolved by hand.  --miker)
+
+12	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+
+commit aae36eabf72fb037ed54d8b24146723230e669aa
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue May 7 09:48:05 2013 -0400
+
+    LP 1177388 'Add to Po' Honors default copy count
+    
+    Create the requested number of copies for lineitems added to purchase
+    orders whose provider has a non-zero value for 'default copy count'.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm
+
+commit 7d8e0cab70128e271f7cfcc321cf67c6b1027aa2
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Jun 18 12:17:40 2013 -0400
+
+    Prevent uninit var warnings in Search/Biblio.pm
+    
+    The logger messages in Search/Biblio.pm throw _many_ uninitialized
+    variable warnings. With a little care, we can prevent those warnings and
+    return our attention to more important log messages.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+7	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit 693ed63d2f3f92ef1be6d474c6d5b732e3b65912
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Fri Jun 14 15:51:42 2013 -0400
+
+    Fixes to MARC batch import docs
+    
+    Added needed subheadings to the MARC batch update docs. Also shortened
+    line lengths and modified intro that focused on 2.2 new features.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+134	62	docs/cataloging/batch_importing_MARC.txt
+
+commit 14354b693ca19511e4d5465ca3e344308c85c235
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Jun 14 14:21:10 2013 -0400
+
+    Post-2.5-m1 whitespace fixup
+    
+    This is an attempt at an automated whitespace cleanup for the m1
+    milestone of version 2.5.  It was created using the following
+    commands (run from Open-ILS/src/perlmods/lib):
+    
+    find . -name "*.pm" \
+    -exec sh -c 'sed "/<</s/\t/    /g" < {} \
+    | expand -t 4 > {}.fixed ; \
+    cp --no-preserve=mode,ownership {}.fixed {}; \
+    rm {}.fixed' \;
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+
+7	7	Open-ILS/src/perlmods/lib/OpenILS/Application.pm
+6	6	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Claims.pm
+3	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm
+77	77	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Financials.pm
+9	9	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Invoice.pm
+6	6	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Lineitem.pm
+55	55	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm
+27	27	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Picklist.pm
+18	18	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Provider.pm
+1108	1108	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+93	93	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/ClosedDates.pm
+251	251	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Container.pm
+12	12	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Stage.pm
+74	74	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/UserGroups.pm
+833	833	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+250	250	Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/AssetCommon.pm
+15	15	Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/AuthCommon.pm
+23	23	Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/Authority.pm
+202	202	Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/BibCommon.pm
+174	174	Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/Merge.pm
+643	643	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+10	10	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm
+40	40	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+53	53	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CopyLocations.pm
+237	237	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/HoldNotify.pm
+3	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+116	116	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm
+267	267	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/ScriptBuilder.pm
+431	431	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/StatCat.pm
+226	226	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Survey.pm
+233	233	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Transit.pm
+16	16	Open-ILS/src/perlmods/lib/OpenILS/Application/Penalty.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/PermaCrud.pm
+28	28	Open-ILS/src/perlmods/lib/OpenILS/Application/Proxy.pm
+351	351	Open-ILS/src/perlmods/lib/OpenILS/Application/Reporter.pm
+22	22	Open-ILS/src/perlmods/lib/OpenILS/Application/Search.pm
+41	41	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/AddedContent.pm
+212	212	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Authority.pm
+598	598	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+52	52	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/CNBrowse.pm
+56	56	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Serial.pm
+39	39	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Zips.pm
+51	51	Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
+109	109	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage.pm
+704	704	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI.pm
+28	28	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/action.pm
+15	15	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/actor.pm
+6	6	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/asset.pm
+4	4	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/authority.pm
+3	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/biblio.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/booking.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/metabib.pm
+9	9	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/money.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/permission.pm
+6	6	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/serial.pm
+206	206	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg.pm
+27	27	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/cdbi.pm
+728	728	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/dbi.pm
+83	83	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/fts.pm
+367	367	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/storage.pm
+157	157	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/FTS.pm
+643	643	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher.pm
+1488	1488	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+533	533	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm
+509	509	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/asset.pm
+205	205	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/authority.pm
+406	406	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/biblio.pm
+51	51	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/config.pm
+2423	2423	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+230	230	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/money.pm
+67	67	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/permission.pm
+2260	2260	Open-ILS/src/perlmods/lib/OpenILS/Application/SuperCat.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Reactor.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Reactor/AstCall.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Const.pm
+36	36	Open-ILS/src/perlmods/lib/OpenILS/Event.pm
+3	3	Open-ILS/src/perlmods/lib/OpenILS/Perm.pm
+99	99	Open-ILS/src/perlmods/lib/OpenILS/Reporter/Proxy.pm
+575	575	Open-ILS/src/perlmods/lib/OpenILS/Reporter/SQLBuilder.pm
+20	20	Open-ILS/src/perlmods/lib/OpenILS/SIP/Item.pm
+19	19	Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction.pm
+5	5	Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/Checkout.pm
+23	23	Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/Renew.pm
+13	13	Open-ILS/src/perlmods/lib/OpenILS/Template/Plugin/WebSession.pm
+19	19	Open-ILS/src/perlmods/lib/OpenILS/Template/Plugin/WebUtils.pm
+313	313	Open-ILS/src/perlmods/lib/OpenILS/Utils/CStoreEditor.pm
+16	16	Open-ILS/src/perlmods/lib/OpenILS/Utils/Configure.pm
+278	278	Open-ILS/src/perlmods/lib/OpenILS/Utils/Editor.pm
+283	283	Open-ILS/src/perlmods/lib/OpenILS/Utils/Fieldmapper.pm
+25	25	Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD/Caption.pm
+7	7	Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD/Date.pm
+370	370	Open-ILS/src/perlmods/lib/OpenILS/Utils/ModsParser.pm
+7	7	Open-ILS/src/perlmods/lib/OpenILS/Utils/Normalize.pm
+47	47	Open-ILS/src/perlmods/lib/OpenILS/Utils/OfflineStore.pm
+127	127	Open-ILS/src/perlmods/lib/OpenILS/Utils/PermitHold.pm
+15	15	Open-ILS/src/perlmods/lib/OpenILS/Utils/RemoteAccount.pm
+469	469	Open-ILS/src/perlmods/lib/OpenILS/Utils/ScriptRunner.pm
+321	321	Open-ILS/src/perlmods/lib/OpenILS/Utils/SpiderMonkey.pm
+71	71	Open-ILS/src/perlmods/lib/OpenILS/Utils/ZClient.pm
+46	46	Open-ILS/src/perlmods/lib/OpenILS/WWW/BadDebt.pm
+6	6	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGWeb.pm
+236	236	Open-ILS/src/perlmods/lib/OpenILS/WWW/Exporter.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/PasswordReset.pm
+113	113	Open-ILS/src/perlmods/lib/OpenILS/WWW/Proxy.pm
+22	22	Open-ILS/src/perlmods/lib/OpenILS/WWW/Proxy/Authen.pm
+25	25	Open-ILS/src/perlmods/lib/OpenILS/WWW/Redirect.pm
+86	86	Open-ILS/src/perlmods/lib/OpenILS/WWW/Reporter.pm
+476	476	Open-ILS/src/perlmods/lib/OpenILS/WWW/SuperCat/Feed.pm
+19	19	Open-ILS/src/perlmods/lib/OpenILS/WWW/Vandelay.pm
+34	34	Open-ILS/src/perlmods/lib/OpenILS/WWW/XMLRPCGateway.pm
+5	5	Open-ILS/src/perlmods/lib/Template/Plugin/ResolverResolver.pm
+
+commit db9a773aa5b515f9ad469407d3673240531f28ed
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Aug 27 10:38:48 2012 -0400
+
+    Repair fine generator memory leak
+    
+    Calling "next" from within a "try" block results in a memory leak,
+    presumably because "try" is a tangled nest of subs and evals.
+    Replacing the "try" with a good ol' "eval" avoids the leak.
+    
+    This can be reproduced with the following:
+    
+    ---------
+    use Error qw/:try/;
+    
+    foreach (0..200000) {
+        try {
+            next;
+        } catch Error with {
+        };
+    }
+    ---------
+    
+    This particular leak in the fine generator is onerous when the fine
+    generator is run often (e.g. every 15 mins), which means circs that
+    have already been processed for the day are re-analzyed over and over,
+    causing the code to continue early (next) to the next loop iteration
+    for large numbers of circs.  It also happens when a circs are skipped
+    because they have no fine interval, rate, or max fine.
+    
+    You know this is happening because you will see something like this in
+    the storage stderr log:
+    
+    Exiting eval via next at
+    /usr/local/share/perl/5.10.1/OpenILS/Application/Storage/Publisher/action.pm
+    line 820.
+    
+    Exiting subroutine via next at
+    /usr/local/share/perl/5.10.1/OpenILS/Application/Storage/Publisher/action.pm
+    line 820.
+    
+    This patch does not avoid the "exiting eval via next" warning, since
+    we're still next'ing out of the eval.  It just avoids the memory leak
+    (and the "Exiting subroutine" warning).  More extensive refactoring is
+    needed to to completely remove the second warning.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+7	5	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+
+commit da4074de8135d671cfb742983ae492e9c83c238a
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Jun 11 16:44:35 2013 -0400
+
+    Use the centralized initialization method for QP
+    
+    QueryParser maintains an effective singleton for internal configuration of
+    the driver in order to avoid going to the database on every search request
+    to gather configuration parameters.  There is also a centralized sub that
+    has the task of properly configuring said singleton.  Previous to this commit
+    we were not using that centralized initializer in one case, and that case
+    happened to be the most important initialization of QP in all of Evergreen.
+    The fallout from that was that some configuration was not being gathered
+    and passed to QueryParser, resulting in incorrect search SQL being generated.
+    
+    This is rectified by using the centralized initializer everywhere that it
+    is needed and can be used -- and particularly in the effected case.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+1	40	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+
+commit b14ece4977475d990e13069168d37b0625194e1c
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Apr 30 16:45:55 2013 -0400
+
+    Search clicked /and/ preceding sf values
+    
+    When looking for authority records to control a bib field, we currently
+    search using exactly, and only, the subfield that was clicked.  This
+    commit changes that so that the full field up to and including the clicked
+    subfield is used in the simple authority heading search we perform to find
+    the best-match (pivot) authority record.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+8	1	Open-ILS/xul/staff_client/server/cat/marcedit.js
+
+commit 3087ab433bf0675b3e37867dc1cd91e736ecb23e
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Tue Jun 11 10:56:01 2013 -0400
+
+    Edits to documentation
+    
+    Edits to fit documentation structure.
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>
+
+6	3	docs/opac/advanced_features.txt
+2	2	docs/root.txt
+
+commit badc7282c92497a9a0f511378d81c2ed7f175263
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Mon Jun 10 16:17:08 2013 -0400
+
+    Documentation for Binary MARC21 Feeds and search enhancements
+    
+    Documentation for Binary MARC21 Feeds and Bibliographic Search Enhancements added to opac/advanced_features.
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>
+
+95	0	docs/opac/advanced_features.txt
+2	0	docs/root.txt
+ create mode 100644 docs/opac/advanced_features.txt
+
+commit 01c06000763615cabe69968ce3940e21d4e9ebd9
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Mon Jun 10 15:29:20 2013 -0400
+
+    Documentation for MARC Import Remove Fields
+    
+    MARC Import Remove Field documentation added to docs/admin
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>
+
+57	0	docs/admin/MARC_Import_Remove_Fields.txt
+-	-	docs/media/marc_import_remove_fields1.JPG
+-	-	docs/media/marc_import_remove_fields2.JPG
+-	-	docs/media/marc_import_remove_fields3.JPG
+-	-	docs/media/marc_import_remove_fields5.JPG
+2	0	docs/root.txt
+ create mode 100644 docs/admin/MARC_Import_Remove_Fields.txt
+ create mode 100644 docs/media/marc_import_remove_fields1.JPG
+ create mode 100644 docs/media/marc_import_remove_fields2.JPG
+ create mode 100644 docs/media/marc_import_remove_fields3.JPG
+ create mode 100644 docs/media/marc_import_remove_fields5.JPG
+
+commit dd0ad7d8045bae6a1c3a2ca2f067fd350da05f87
+Author: Ben Shum <bshum at biblio.org>
+Date:   Fri Jun 7 16:21:07 2013 -0400
+
+    Stamping upgrade script for making state not required
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+69	0	Open-ILS/src/sql/Pg/upgrade/0799.state_field_required_toggle.sql
+0	69	Open-ILS/src/sql/Pg/upgrade/XXXX.state_field_required_toggle.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0799.state_field_required_toggle.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.state_field_required_toggle.sql
+
+commit a9d5cd96f2e4cc6684002538733fcc960e2ec75c
+Author: Ben Shum <bshum at biblio.org>
+Date:   Wed Jun 5 00:40:53 2013 -0400
+
+    LP1079041 - making state not required (continued)
+    
+    The last commit did not add the default YAOUS to the seed data. Also, some
+    wording tweaks to bring the content in line with the existing entries for
+    consistency.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+27	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+7	7	Open-ILS/src/sql/Pg/upgrade/XXXX.state_field_required_toggle.sql
+
+commit 2fd3e8a20e73f78bb1f997fbdd120dea4f24a3b8
+Author: Michael Peters <mrpeters at library.in.gov>
+Date:   Thu Nov 15 12:49:05 2012 -0500
+
+    Make the "state" field in registration a togglable YAOUS
+    
+    Some countries do not use "State" therefore we need to create
+    a YAOUS to make it non-required/displaying.  This also requires
+    that we no longer force a "not null" on state in actor.usr_address.
+    
+    Signed-off-by: Michael Peters <mrpeters at library.in.gov>
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/sql/Pg/005.schema.actors.sql
+69	0	Open-ILS/src/sql/Pg/upgrade/XXXX.state_field_required_toggle.sql
+1	1	Open-ILS/src/templates/actor/user/register_table.tt2
+4	1	Open-ILS/web/js/ui/default/actor/user/register.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.state_field_required_toggle.sql
+
+commit d4d42526de97ce1aba91d76de0f2dfad5ee3711b
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Jun 7 15:58:55 2013 -0400
+
+    Stamping upgrade script for purge circs fixes
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+212	0	Open-ILS/src/sql/Pg/upgrade/0798.function.purge_circulations_updates.sql
+0	207	Open-ILS/src/sql/Pg/upgrade/XXXX.purge_circulations_updates.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0798.function.purge_circulations_updates.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.purge_circulations_updates.sql
+
+commit e70c9cd218aa7148bd3be6736f3be463abf12942
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Mon Mar 25 09:10:40 2013 -0400
+
+    Add srfsh script to call action.purge_circulations().
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/Makefile.am
+7	0	Open-ILS/src/support-scripts/purge_circulations.srfsh
+ create mode 100755 Open-ILS/src/support-scripts/purge_circulations.srfsh
+
+commit b370f8417c3ff48cba5577fa9cb04dbda3d24127
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Wed Sep 19 11:30:40 2012 -0400
+
+    Return count purged
+    
+    Because postgres dislikes functions that don't return.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+2	0	Open-ILS/src/sql/Pg/090.schema.action.sql
+2	0	Open-ILS/src/sql/Pg/upgrade/XXXX.purge_circulations_updates.sql
+
+commit c399232c4f82d59f53c275056d3b0ae0b5c3d309
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Mon Sep 10 12:14:09 2012 -0400
+
+    Fix rentention typo
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/XXXX.purge_circulations_updates.sql
+
+commit 867448d6007877096441160812e60b0bf8646718
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Mon Jun 18 13:45:21 2012 -0400
+
+    Purge Circulations: Unwrapped Upgrade Script
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+205	0	Open-ILS/src/sql/Pg/upgrade/XXXX.purge_circulations_updates.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.purge_circulations_updates.sql
+
+commit 6ae718ec5e6541857d62c8e5f02e11817ebbc36a
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Mon Jun 18 13:29:58 2012 -0400
+
+    Purge Circulations: Allow global age as forced min
+    
+    This allows a library to keep all circs in the last Y interval, regardless
+    of user settings that may otherwise cause an earlier purging.
+    
+    Another global flag that defaults to off controls this behavior.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+7	1	Open-ILS/src/sql/Pg/090.schema.action.sql
+8	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit e9c7e761b49bcde12e1719c6644cb810cbbf1722
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Mon Jun 18 13:19:18 2012 -0400
+
+    Purge Circulations: Remove extra delete loop
+    
+    A trigger on action.circulation purges upwards through the circ chain. Thus
+    we don't need to do the loop ourselves.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+1	4	Open-ILS/src/sql/Pg/090.schema.action.sql
+
+commit 8f324450421997cb5619d7ba00e38d423ad466d8
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Mon Jun 18 13:07:56 2012 -0400
+
+    Purge Circulations: Better selection logic
+    
+    This attempts two things:
+    
+    1 - Keep the number of circs the library wants based on the most recent
+        circulations, regardless of user prefs and such.
+    
+        This is accomplished by changing the circ fetching query to use a
+        window function in a subquery so we can filter on it easily.
+    
+        This also allowed removal of the purge position counter.
+    
+    2 - Allow removal of circs that are between kept circs if they meet all
+        other removal criteria.
+    
+        This is accomplished by using CONTINUE instead of EXIT in the loop.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+12	13	Open-ILS/src/sql/Pg/090.schema.action.sql
+
+commit 9b352b2b69fdbdabf24b07ec7f4d8d474330e205
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Mon Jun 18 13:00:30 2012 -0400
+
+    Purge Circulations: Support last xact_finished use
+    
+    Based on a new (off by default) global flag change between the xact_finish
+    on the last circ in the chain and the most recent one.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+11	2	Open-ILS/src/sql/Pg/090.schema.action.sql
+10	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 98d1254a4f36390cca3d0eeef5c402d191c25678
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Mon Jun 18 12:52:04 2012 -0400
+
+    Purge Circulations: Skip partially complete chains
+    
+    Billings in earlier portions of the chain may leave them open. Thus, look
+    for any circulations in the chain with a null xact_finish.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+3	1	Open-ILS/src/sql/Pg/090.schema.action.sql
+
+commit f9e98718eb532c5e536f5a9a15b8d9c080b53343
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Mon Jun 18 12:49:39 2012 -0400
+
+    Circ Chain Functions should take BIGINTs
+    
+    Because INTEGER isn't suitable for circ IDs.
+    
+    This only requires editing the input definitions.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+2	2	Open-ILS/src/sql/Pg/090.schema.action.sql
+
+commit cc0ef7448c8a92f1715dd1726aead4409a8b0e08
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Jun 7 15:31:37 2013 -0400
+
+    Stamping upgrade script for purge holds functionality
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+372	0	Open-ILS/src/sql/Pg/upgrade/0797.schema.action.purge_holds.sql
+0	368	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.action.purge_holds.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0797.schema.action.purge_holds.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.action.purge_holds.sql
+
+commit eb4fc15d55d1a74a9fafe24a033955a6a757a2c6
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Wed Apr 10 17:29:28 2013 -0400
+
+    Update the purge_holds.txt release notes.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+3	1	docs/RELEASE_NOTES_NEXT/purge_holds.txt
+
+commit 246fff2d71f640954194f999af0a59f06a416e9a
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Thu Apr 4 11:30:25 2013 -0400
+
+    Add table, view and trigger for "aging" hold requests on delete.
+    
+    This creates the action.aged_hold_request table, the
+    action.all_hold_request view, the action.age_hold_on_delete
+    function, and the action_hold_request_aging_tgr on action.hold_request.
+    
+    Add fieldmapper entries for action.all_hold_request view and
+    action.aged_hold_request table.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+117	0	Open-ILS/examples/fm_IDL.xml
+204	0	Open-ILS/src/sql/Pg/090.schema.action.sql
+0	163	Open-ILS/src/sql/Pg/upgrade/XXXX.purge_holds.sql
+368	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.action.purge_holds.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.purge_holds.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.action.purge_holds.sql
+
+commit dc40c1c748cfbb0c4b14d94b5fe72825cb110a08
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Mon Apr 1 16:59:59 2013 -0400
+
+    Add a purge_holds.srfsh script so it can be run from cron.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/Makefile.am
+7	0	Open-ILS/src/support-scripts/purge_holds.srfsh
+ create mode 100755 Open-ILS/src/support-scripts/purge_holds.srfsh
+
+commit 765aea78207f879e81eeb9f3d7614699399e585f
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Tue Apr 2 10:18:55 2013 -0400
+
+    Fix typo in purge holds function
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+1	1	Open-ILS/src/sql/Pg/090.schema.action.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/XXXX.purge_holds.sql
+
+commit d43e92f682f6e06a61d508944cf340093168e77a
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Wed Feb 13 16:08:01 2013 -0500
+
+    Release notes for Purge Holds routine
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+7	0	docs/RELEASE_NOTES_NEXT/purge_holds.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/purge_holds.txt
+
+commit 86995bbb791f3ba0771e92921f756f6680a22571
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Wed Feb 13 15:41:44 2013 -0500
+
+    Fix seed values and upgrade script
+    
+    enabled and label were out of order.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/XXXX.purge_holds.sql
+
+commit 0771f7c6ea249a336ec7e68bd6e1949311ce3856
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Thu Jun 21 09:55:05 2012 -0400
+
+    Make user visible holds based on fill/cancel time
+    
+    Instead of request time. That way holds don't vanish after filling when
+    keeping history was turned on after hold placement.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+2	2	Open-ILS/src/sql/Pg/090.schema.action.sql
+63	0	Open-ILS/src/sql/Pg/upgrade/XXXX.purge_holds.sql
+
+commit 1523a8b6c8512cac58d8ecbe5a5456265eb6fcf3
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Thu Jun 21 09:44:11 2012 -0400
+
+    Add purge_holds DB function
+    
+    This allows removing of holds based on patron and library preferences.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+59	0	Open-ILS/src/sql/Pg/090.schema.action.sql
+39	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+100	0	Open-ILS/src/sql/Pg/upgrade/XXXX.purge_holds.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.purge_holds.sql
+
+commit 288c1d1c5f23e991bbaf74c42ed4fba7ef5c1151
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Jun 7 15:07:30 2013 -0400
+
+    We still don't support Z30.59 or Z39.59
+    
+    Actually, just fix a few typos :)
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/templates/opac/myopac/lists.tt2
+1	1	Open-ILS/web/opac/locale/en-US/lang.dtd
+1	1	docs/RELEASE_NOTES_NEXT/z39_batch_search_queue.txt
+
+commit d7376fdf678deeb4932388fb78ec4066de16b338
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Jun 7 14:57:48 2013 -0400
+
+    Stamping upgrade script for batch z39.50 search, match, overlay
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+107	0	Open-ILS/src/sql/Pg/upgrade/0795.schema.z39-batch-fetch-overlay.sql
+136	0	Open-ILS/src/sql/Pg/upgrade/0796.schema.vandelay_bucket_match.sql
+0	107	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.z39-batch-fetch-overlay.sql
+0	136	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.vandelay_bucket_match.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0795.schema.z39-batch-fetch-overlay.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0796.schema.vandelay_bucket_match.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.z39-batch-fetch-overlay.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.vandelay_bucket_match.sql
+
+commit e047b415d433b41b42348f7093e2f9afab89f050
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Mar 5 09:20:43 2013 -0500
+
+    Z39.50 Batch Search/Overlay : SQL / IDL
+    
+    Copied some missing pieces from the upgrade scripts into the seed schema
+    / data files.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+35	0	Open-ILS/src/sql/Pg/002.schema.config.sql
+1	0	Open-ILS/src/sql/Pg/012.schema.vandelay.sql
+1	0	Open-ILS/src/sql/Pg/800.fkeys.sql
+7	2	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.z39-batch-fetch-overlay.sql
+2	1	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.vandelay_bucket_match.sql
+
+commit 3bb8ff29f2c1d9c1e536035903b47d0d8a2bb53a
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Feb 25 11:37:28 2013 -0500
+
+    Z39.50 Batch Search/Overlay Release Notes
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+89	0	docs/RELEASE_NOTES_NEXT/z39_batch_search_queue.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/z39_batch_search_queue.txt
+
+commit 20fd7bb9d558ae75a6bd1ccde77865fc3e318fce
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Feb 25 13:17:59 2013 -0500
+
+    Z39.50 Batch Search/Overlay TPAC my-list entry point
+    
+    Similar to the staff client bucket UI, this adds a button which allows
+    staff to access the batch Z39 search-and-queue operation directly from
+    the TPAC my-lists UI.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+7	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+21	0	Open-ILS/src/templates/opac/myopac/lists.tt2
+
+commit 91d11f40825fc18f743f950294feeac276eec570
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Feb 25 10:37:11 2013 -0500
+
+    Z39.50 Batch Search/Overlay Z-Index Admin UI
+    
+    Admin -> Server Admin -> Z-Index Field Maps
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+118	0	Open-ILS/src/templates/conify/global/config/z3950_index_field_map.tt2
+1	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+4	0	Open-ILS/xul/staff_client/chrome/content/main/menu.js
+4	0	Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul
+ create mode 100644 Open-ILS/src/templates/conify/global/config/z3950_index_field_map.tt2
+
+commit a422aa3f6b5837c7730b513780524ffe2571c0ac
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Feb 25 10:36:54 2013 -0500
+
+    Z39.50 Batch Search/Overlay minor IDL repairs
+    
+    Added some missing reporter:selector attributes and repaired an invalid
+    link class.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+3	3	Open-ILS/examples/fm_IDL.xml
+
+commit 3c656e65e787a5b1d2569a69c8aff5354f9f5223
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Feb 18 10:41:01 2013 -0500
+
+    Z39.50 Batch Search/Overlay Z-Search UI
+    
+    Adds a new "Find Z39.50 Matches" option to Cataloging -> Manage Record
+    Buckets.  When selected, the user chooses the Z39 fields, the Z39
+    sources, the destination queue, and the queue match set.  The user then
+    submits the search.  Basic progress info is reported to the user.
+    Once complete, the user can open the destination queue, from which
+    regular vandelay import, etc. actions may be performed on the newly
+    found records.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+12	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+236	0	Open-ILS/xul/staff_client/server/cat/bucketz39_dialog.js
+35	0	Open-ILS/xul/staff_client/server/cat/bucketz39_dialog.xul
+97	0	Open-ILS/xul/staff_client/server/cat/bucketz39_dialog_overlay.xul
+25	0	Open-ILS/xul/staff_client/server/cat/record_buckets.js
+3	0	Open-ILS/xul/staff_client/server/cat/record_buckets_overlay.xul
+5	0	Open-ILS/xul/staff_client/server/skin/bucketz39.css
+ create mode 100644 Open-ILS/xul/staff_client/server/cat/bucketz39_dialog.js
+ create mode 100644 Open-ILS/xul/staff_client/server/cat/bucketz39_dialog.xul
+ create mode 100644 Open-ILS/xul/staff_client/server/cat/bucketz39_dialog_overlay.xul
+ create mode 100644 Open-ILS/xul/staff_client/server/skin/bucketz39.css
+
+commit 9dff75bd1173f2f9806087752f75cae3b5108a91
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Feb 13 14:07:29 2013 -0500
+
+    Z39.50 Batch Search/Overlay Seed Data
+    
+    Org unit setting seed data:
+    * cat.z3950.batch.max_parallel
+    * cat.z3950.batch.max_parallel
+    
+    Stock / sample seed data entries for config.z3950_index_field_map, with
+    room added for future stock data.
+    
+    Vandelay bib attribute seed data for Z39.50 source (901z), which is
+    stamped during the Z39.50 batch search-and-queue operation.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+7	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Z3950.pm
+58	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+50	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.z39-batch-fetch-overlay.sql
+
+commit 437aa283e1f7dd121268ee362db87ebd05a58235
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Feb 13 12:16:24 2013 -0500
+
+    Vandelay : sort queued records by matches
+    
+    Sort queued records by their matches (based on the first match) so that
+    like records are grouped in the queue interface.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+20	5	Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
+
+commit 59cc4b9524bfcf9a56f54c5ed5a3d56a7d1b86e6
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Jan 31 12:37:44 2013 -0500
+
+    Vandelay record bucket-limited matching
+    
+    Provides the option to link record buckets to vandelay queues.  When
+    linked, vandelay imports where a match set is specified will limit
+    matches to records within the selected bucket.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+2	0	Open-ILS/examples/fm_IDL.xml
+2	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
+16	4	Open-ILS/src/sql/Pg/012.schema.vandelay.sql
+0	1	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.z39-batch-fetch-overlay.sql
+135	0	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.vandelay_bucket_match.sql
+5	0	Open-ILS/src/templates/vandelay/inc/upload.tt2
+42	5	Open-ILS/web/js/ui/default/vandelay/vandelay.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.vandelay_bucket_match.sql
+
+commit 446284353bb7f6072198af09a0ff8b9379f2a481
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Jan 30 17:44:30 2013 -0500
+
+    Z39.50 Batch Search/Overlay API
+    
+    New API for performing Z39.50 queries for a set of bib records across a
+    set of Z39 sources.  Searches are performed in parallel (up to a
+    configurable maximum number of active searches and maximum results) and
+    results are stored in a vandelay MARC Import/Export queue.
+    
+    Search fields and values are determined by Z39 index field maps.  At
+    search time, the caller provides a set of field maps to use for the
+    search. Search values for each bib record are found by following the
+    index maps to the indexed values in metabib.*_field_entry or
+    metabib.record_attr.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+374	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Z3950.pm
+
+commit 832e9b0bc783d12babf6dd0f310a7e7fb8f78fc9
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Wed Jan 30 15:08:47 2013 -0500
+
+    Z39.50 Batch Search/Overlay : SQL / IDL
+    
+     * DB table for Z39.50 index field maps, which link Z39 search fields to
+       indexed bib data via metabib fields and record attributes (svf)
+    
+     * Seed data for Z39.50 batch search org unit settings
+      ** cat.z3950.batch.max_parallel
+      ** cat.z3950.batch.max_results
+    
+     * Stock seed data for config.z3950_index_field_map entries
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+28	0	Open-ILS/examples/fm_IDL.xml
+53	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.z39-batch-fetch-overlay.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.z39-batch-fetch-overlay.sql
+
+commit 418bbfa33aecb0bdbc118d2162ae6b7e3c2b8d8b
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Fri Apr 5 13:28:08 2013 -0400
+
+    Repair SIP start/end list ranges
+    
+    SIP supports paging of certain lists (holds, fines, etc.) by allowing
+    the SIP client to provide start and end points for lists.  This patch
+    repairs how Evgreen extracts the list ranges from arrays.
+    
+    When using Perl array ranges, the array variable should be accessed via
+    '@' and not '$'.  Prior to this change, all ranged lists resulted in
+    returning the first item in the list instead of the full range.
+    
+    This change affects lists of holds, overdues, fines, and charges.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Jeff Godin <jgodin at tadl.org>
+
+4	4	Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm
+
+commit 7a42d7f7f57ca885532c24b285f6375fb3338973
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Thu Jul 26 10:25:32 2012 -0400
+
+    Make Force/Recall holds always return as nearest
+    
+    Without even running the hold rules.
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    
+    Conflicts:
+    	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+    
+    (Just whitespace conflicts on tab vs space -- repaired by hand.)
+
+5	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+
+commit 49b345aba9cfa263d8101e0835776bb6bad0c9a2
+Author: Ben Shum <bshum at biblio.org>
+Date:   Sat Mar 2 02:21:58 2013 -0500
+
+    TPAC - set autofocus to user input when placing holds in staff client
+    
+    When placing holds in TPAC via the staff client, the focus had been on the
+    basic search field above. Change this to have autofocus on the input field
+    for the hold user by default.
+    
+    This can potentially save staff from having to perform an extra click to
+    select the input field. Now they can immediately begin entering the barcode
+    of the user they plan to create a hold on behalf of.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/templates/opac/parts/place_hold.tt2
+3	0	Open-ILS/src/templates/opac/place_hold.tt2
+
+commit 9eb947d7266e01c3eb9c42ef001bb76b2c85282e
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Jan 7 09:35:55 2013 -0500
+
+    SIP renew-all; reset renewal statuses
+    
+    Reset the list of renewed and unrenewed items for each instance of the
+    RenewAll transactions.  Otherwise, items from previous transactions will
+    bleed into the current transaction.
+    
+    While we're in there, fix a couple of tabs.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+7	5	Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/RenewAll.pm
+
+commit 2c964ef481c4613a187268ec8b5800a2dac889dd
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Mon Nov 26 14:51:27 2012 -0500
+
+    SIP RenewAll
+    
+    Adds SIP plugin support for SIP message types 65/66 (Renew All).  When
+    requested, the plugin performs a renewal on all items currently checked
+    out for the user.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/examples/oils_sip.xml.example
+23	0	Open-ILS/src/perlmods/lib/OpenILS/SIP.pm
+5	2	Open-ILS/src/perlmods/lib/OpenILS/SIP/Item.pm
+3	2	Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm
+0	2	Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/Renew.pm
+69	0	Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/RenewAll.pm
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/RenewAll.pm
+
+commit 3a0dd23027cf94d0149ae637eef765f736205f75
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Fri Jun 7 09:42:57 2013 -0400
+
+    LP1040147 Return wrong-shelf holds in clearable list
+    
+    1. Change the staff client "View Shelf-Expired Holds" action label to
+    "View Clearable Holds".
+    
+    2.  When "View Clearable Holds" is selected, display both shelf-expired
+    and wrong-shelf holds.
+    
+    New API calls:
+    
+    open-ils.circ.captured_holds.expired_on_shelf_or_wrong_shelf.retrieve
+    open-ils.circ.captured_holds.id_list.expired_on_shelf_or_wrong_shelf.retrieve
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+35	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+1	1	Open-ILS/xul/staff_client/chrome/content/main/constants.js
+
+commit 221ed45e9c93587b1e6461597f3932de4ee818f3
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu Jun 6 19:00:45 2013 -0400
+
+    change checkbox label in Browse Hold Shelf
+    
+    from View Shelf-Expired Holds to View Clearable Holds
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+1	1	Open-ILS/web/opac/locale/en-US/lang.dtd
+
+commit 0759846a2dd381db698ffd04b873129655f869b9
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu Jun 6 17:49:46 2013 -0400
+
+    add Current Shelf Library column to xul interfaces
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+31	0	Open-ILS/xul/staff_client/server/circ/util.js
+1	0	Open-ILS/xul/staff_client/server/locale/en-US/circ.properties
+1	0	Open-ILS/xul/staff_client/server/locale/en-US/common.properties
+
+commit aea4764fea34c1f1ba3bd617b811dde2404a87a1
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Aug 21 17:19:54 2012 -0400
+
+    Include Wrong-Shelf holds in clear-shelf results
+    
+    Include non-expired, Wrong-Shelf holds in the results list of the "Clear
+    Shelf-Expired Holds" process.  ("Wrong-Shelf" holds are those whose
+    pickup lib was changed while the hold was on the holds shelf).  The idea
+    behind this option is that branches may use the clear-shelf process as a
+    general shelf management report beyond just holds that have expired.
+    I.e. tell me everything I need to remove from the shelf.
+    
+    This change includes a label change for the clear-shelf menu options:
+    
+    "Clear Shelf-Expired Holds" -> "Clear Holds Shelf"
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+38	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+2	2	Open-ILS/web/opac/locale/en-US/lang.dtd
+1	0	Open-ILS/xul/staff_client/server/locale/en-US/circ.properties
+
+commit c9eaeb57d803a448bd763f915acca2db1901915f
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Fri Jun 7 10:04:27 2013 -0400
+
+    Asciidoc edit for My Lists documentation
+    
+    Change to asciidoc structure in opac/my_lists.txt
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>
+
+2	2	docs/opac/my_lists.txt
+
+commit e9531be98f5f72775da475388660840b19a0e565
+Author: Ben Shum <bshum at biblio.org>
+Date:   Thu Jun 6 20:14:08 2013 -0400
+
+    Remove unnecessary TPAC toggle strings on staff client splash page
+    
+    Accidentally reintroduced with commit ad86ef5d3c689c9b514cc09bfc93e7f451461dc7,
+    we can skip adding back TPAC toggle strings to the index.xhtml file since that
+    toggle action has been removed from the page.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+0	2	Open-ILS/xul/staff_client/server/index.xhtml
+
+commit 28c10007bb5fa54a262cfd221430557926d2a04e
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Mon Apr 15 14:06:54 2013 -0400
+
+    Acq: Be fuzzy about case when retrieving EDI documents
+    
+    The edi_fetcher relies on a routine in OpenILS::Acq::EDI to, among
+    other things, try to avoid fetching the same EDI document multiple times
+    when many rows in acq.edi_account refer to the same host and login
+    credentials.
+    
+    Since in practice most vendors seem to run FTP servers for EDI on
+    Windows, not UNIX, and pathnames are therefore case-insensitive, that
+    test for other occurrences ought also to be case-insensitive.
+    
+    If I were to look at this as a purist, I could argue that vendor servers
+    might sometimes by run on UNIX, and that for some reason it is possible
+    that different vendor-to-buyer EDI documents (order responses or
+    invoices) could have pathnames that differ only in the case of some
+    characters.  But that seems wildly unlikely.  If anyone does take this
+    possibility seriously, perhaps acq.edi_account needs a Boolean column to
+    indicate the remote host's case [in]sensitivity.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm
+
+commit 3e10372c3a3e7eb3928affdc790277b164c8c45a
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu Jun 6 17:39:24 2013 -0400
+
+    lp1183525 Edit Item Attributes pop-up dimensions
+    
+    Took Steven Chan's patch from the launchpad bug and added "stickiness" to the
+    window dimensions.  So by default, it'll come up maximized, but once adjusted,
+    it will stay adjusted.
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+2	0	Open-ILS/xul/staff_client/server/cat/copy_editor.xul
+
+commit fd91f3a20da530e73fa639952576b91575cfc7fe
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu May 2 15:00:31 2013 -0400
+
+    "Return to record" after submission of phone number on SMS page fixed
+    
+    Before this, it only worked on the page load *before* form submission.
+    There's probably a more elegant solution that doesn't involve keeping
+    track of URIs, but this seems to me to work.
+    
+    Problem relayed to me by Dale Rigney at Equinox, who helped reproduce
+    the issue and test a fix.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/SMS.pm
+
+commit 8c4192c71b361acd852f04866f8e5936e3d9be42
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Thu Jun 6 16:47:13 2013 -0400
+
+    fix copy/paste error
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+1	1	Open-ILS/xul/staff_client/chrome/content/main/main.xul
+
+commit 109e8e0d584d57e3b1185681df723746899b439a
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Wed Mar 20 01:21:28 2013 +0200
+
+    Allow translating more strings in xul-files.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+175	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+3	3	Open-ILS/xul/staff_client/chrome/content/main/main.xul
+1	1	Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul
+1	1	Open-ILS/xul/staff_client/chrome/content/util/browser.xul
+2	2	Open-ILS/xul/staff_client/chrome/content/util/list_clipboard.xul
+1	1	Open-ILS/xul/staff_client/chrome/content/util/rbrowser.xul
+8	5	Open-ILS/xul/staff_client/server/OpenILS/symbol_overlay.xul
+4	4	Open-ILS/xul/staff_client/server/OpenILS/util_overlay.xul
+3	3	Open-ILS/xul/staff_client/server/cat/bibs_abreast.xul
+1	1	Open-ILS/xul/staff_client/server/patron/bill_summary_overlay.xul
+5	5	Open-ILS/xul/staff_client/server/serial/manage_dists.xul
+23	23	Open-ILS/xul/staff_client/server/serial/manage_subs.xul
+1	1	Open-ILS/xul/staff_client/server/serial/pattern_wizard.xul
+95	98	Open-ILS/xul/staff_client/server/serial/pattern_wizard_overlay.xul
+1	1	Open-ILS/xul/staff_client/server/serial/sbsum_editor.xul
+1	1	Open-ILS/xul/staff_client/server/serial/scap_editor.xul
+3	3	Open-ILS/xul/staff_client/server/serial/sdist2_editor.xul
+3	3	Open-ILS/xul/staff_client/server/serial/sdist_editor.xul
+5	5	Open-ILS/xul/staff_client/server/serial/select_aou.xul
+5	5	Open-ILS/xul/staff_client/server/serial/select_unit.xul
+8	8	Open-ILS/xul/staff_client/server/serial/serctrl_main.xul
+1	1	Open-ILS/xul/staff_client/server/serial/sisum_editor.xul
+3	3	Open-ILS/xul/staff_client/server/serial/sitem_editor.xul
+1	1	Open-ILS/xul/staff_client/server/serial/sssum_editor.xul
+1	1	Open-ILS/xul/staff_client/server/serial/sstr_editor.xul
+
+commit 8f03641c4e31c4dffb4432d1ae06cae928ab07a6
+Author: Steven Callender <stevecallender at esilibrary.com>
+Date:   Mon Mar 11 15:48:57 2013 -0400
+
+    Add the copy number to the list of data being pulled for access by the TPAC.
+    
+    Signed-off-by: Steven Callender <stevecallender at esilibrary.com>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+3	2	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+
+commit ad86ef5d3c689c9b514cc09bfc93e7f451461dc7
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Thu Mar 7 12:17:09 2013 +0200
+
+    Allow translating the staff client tab names
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+11	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+36	14	Open-ILS/xul/staff_client/server/index.xhtml
+
+commit 96c877ea56afaf59927859eb63ad4ddd2172d0db
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Jun 6 14:01:07 2013 -0400
+
+    Fix Latin-1 encoding that broke doc output
+    
+    asciidoc only expects and can only handle utf-8 encoding :)
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+3	8	docs/opac/my_lists.txt
+
+commit f5727683ea8cabd74bb2ccf8e6e41429ef1b9889
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Thu Mar 21 12:01:24 2013 +0200
+
+    Improve the db-seed-i18n.py -script to actually grab all strings.
+    
+    Previously the script could only handle oils_i18n_gettext -markers
+    if the marker and it's parameters were all on one line.
+    
+    Now it also correctly parses the postgres E'' escaped strings, and
+    removes sql string concatenations.
+    
+    Also adds test cases.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+40	34	build/i18n/scripts/db-seed-i18n.py
+158	0	build/i18n/tests/data/sql2pot.pot
+116	0	build/i18n/tests/data/sqlsource.sql
+
+commit d51fa3aa9886981ab7f6c5d10bc18e17f425aa5f
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Jun 6 12:13:36 2013 -0400
+
+    Add new POT files to git so "make newpo" will work
+    
+    Running "make newpo" errored out because the po subdirectories didn't
+    exist for the newly added POT files. This will also enable translators
+    to access the strings in Launchpad.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+108	0	build/i18n/po/URLVerify.js/URLVerify.js.pot
+73	0	build/i18n/po/match_set.js/match_set.js.pot
+36	0	build/i18n/po/serial.js/serial.js.pot
+24	0	build/i18n/po/vandelay.js/vandelay.js.pot
+ create mode 100644 build/i18n/po/URLVerify.js/URLVerify.js.pot
+ create mode 100644 build/i18n/po/match_set.js/match_set.js.pot
+ create mode 100644 build/i18n/po/serial.js/serial.js.pot
+ create mode 100644 build/i18n/po/vandelay.js/vandelay.js.pot
+
+commit 9b5a19f1e3284ae359a73d8543a48b3676654e81
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Tue Jun 4 12:01:32 2013 +0300
+
+    Add missing dojo nls files to the i18n toolchain, and fix one of the files so they be built.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+2	2	Open-ILS/web/js/dojo/openils/vandelay/nls/vandelay.js
+26	0	build/i18n/Makefile
+
+commit 3b828afbe3dab8f764a7378b65ade1e190be5d56
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Jun 6 09:40:59 2013 -0400
+
+    Fedora RPM for bzip2 headers is bzip2-devel
+    
+    There was an attempt to add the right RPM for the bzip2 headers in
+    Makefile.install, but that failed on Fedora 19. Swap in bzip2-devel
+    instead to correct that.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+2	2	Open-ILS/src/extras/Makefile.install
+
+commit dcf9cb39d3243ea3a59035c150d521cf5816b9c8
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Mon Oct 22 18:02:23 2012 -0400
+
+    TPAC: First part of locg param can be branch shortname
+    
+    Addresses LP #1020625.  You can use the locg param, which can set an
+    an OU for search context (and which has other implications related to
+    location/scope) by shortname now.
+    
+    As long as your shortnames are something that work in an HTTP query
+    string, don't contain colons, and as long as you don't have numeric
+    shortnames for any orgs that would mask orgs with the sames numbers
+    as an ID (but that would be a lousy setup anyway), this should work.
+    
+    Now case insensitive per recommendation by Michael Peters.  In the
+    event that you have org units with names that are the same except
+    for case (probably a bad practice), the locg parameter will simply
+    fail to set your context, rather than try to guess which org unit
+    you meant.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    
+    Conflicts:
+    	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
+
+34	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
+2	1	Open-ILS/src/templates/opac/parts/misc_util.tt2
+
+commit 05bda47c168e25fcd0aed5444a8995b3c9895efb
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Thu Jun 6 10:38:42 2013 -0400
+
+    Asciidoc fix for documentation
+    
+    Fixed faulty asciidoc in docs/admin/lsa-library_settings_editor.
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>
+
+1	1	docs/admin/lsa-library_settings_editor.txt
+
+commit e103aadbf620e75933a3de80c901a5f91d98f5e8
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Jun 4 23:17:17 2013 -0400
+
+    Move lost items modification release notes
+    
+    Moved to the Circulation category and small changes to the formatting for
+    conversion.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+14	0	docs/RELEASE_NOTES_NEXT/Circulation/lost_items_modifications.txt
+0	14	docs/RELEASE_NOTES_NEXT/lost_items_modifications.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/lost_items_modifications.txt
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/lost_items_modifications.txt
+
+commit c13dc8a6b5247c89a874ad92ecaa04974409389c
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Jun 4 23:38:25 2013 -0400
+
+    Stamping upgrade script for lost items blocking
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+483	0	Open-ILS/src/sql/Pg/upgrade/0794.add_option_for_including_lost_in_items_out_and_patron_blocking_by_lost.sql
+0	483	Open-ILS/src/sql/Pg/upgrade/XXXX.add_option_for_including_lost_in_items_out_and_patron_blocking_by_lost.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0794.add_option_for_including_lost_in_items_out_and_patron_blocking_by_lost.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.add_option_for_including_lost_in_items_out_and_patron_blocking_by_lost.sql
+
+commit d4918fa6a9b433b35dcc1c186902a7235fb928fd
+Author: Kyle Tomita <ktomita at catalystitservices.com>
+Date:   Thu Mar 14 15:01:14 2013 -0700
+
+    Patron Blocking by lost items and include lost as items out
+    
+    This feature has two main parts, patron blocking by number
+    of lost items and include lost items as items out.  A group penalty
+    threshold will be added for lost items.  This will restrict patrons
+    who have lost too many items. The inclusion of lost items as items
+    out will be an optional setting, like claimed returned items. This
+    will allow libraries to set what type of item statuses count toward
+    the total items out.
+    
+    Signed-off-by: Kyle Tomita <ktomita at catalystitservices.com>
+    Signed-off-by: Justin Douma <jdouma at catalystitservices.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+3	4	Open-ILS/src/extras/ils_events.xml
+81	1	Open-ILS/src/sql/Pg/100.circ_matrix.sql
+17	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+483	0	Open-ILS/src/sql/Pg/upgrade/XXXX.add_option_for_including_lost_in_items_out_and_patron_blocking_by_lost.sql
+2	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+9	0	Open-ILS/xul/staff_client/server/circ/checkout.js
+3	0	Open-ILS/xul/staff_client/server/circ/util.js
+3	0	Open-ILS/xul/staff_client/server/patron/display.js
+2	0	Open-ILS/xul/staff_client/server/patron/display_horiz_overlay.xul
+2	0	Open-ILS/xul/staff_client/server/patron/display_overlay.xul
+3	0	Open-ILS/xul/staff_client/server/patron/summary.js
+13	0	Open-ILS/xul/staff_client/server/patron/util.js
+12	0	Open-ILS/xul/staff_client/server/skin/patron_display.css
+14	0	docs/RELEASE_NOTES_NEXT/lost_items_modifications.txt
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.add_option_for_including_lost_in_items_out_and_patron_blocking_by_lost.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/lost_items_modifications.txt
+
+commit 2060027f71755fbdf284470e68acc0bac40cbb15
+Author: Ben Shum <bshum at biblio.org>
+Date:   Tue Jun 4 22:57:00 2013 -0400
+
+    Added release note for standalone mode shortcuts
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+5	0	docs/RELEASE_NOTES_NEXT/Client/standalone-mode-shortcut.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/standalone-mode-shortcut.txt
+
+commit b55da928a94aa3976d02fed6c1603dd1d237b260
+Author: Pranjal Prabhash <pranjal.prabhash at gmail.com>
+Date:   Mon Apr 9 10:55:08 2012 -0400
+
+    Standalone Mode Staff Client Shortcuts
+    
+    This commit addresses LP#955283, which requested the creation
+    of a Windows shortcut for Evergreen's standalone staff client
+    mode.
+    
+    Signed-off-by: Pranjal Prabhash <pranjal.prabhash at gmail.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+3	0	Open-ILS/xul/staff_client/windowssetup.nsi
+
+commit 717a1263a3fee997c3617326e0d90450e2c07220
+Author: Simon Hieu Mai <hieu.mai at mnsu.edu>
+Date:   Mon Jun 3 17:45:08 2013 -0400
+
+    LP#1053074: Editimg MARC Fixed Fields jumps cursor to marc record
+    
+    Put the cursor back to the current fixed field after reload
+    the MARC record table.
+    
+    Signed-off-by: Simon Hieu Mai <hieu.mai at mnsu.edu>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	0	Open-ILS/xul/staff_client/server/cat/marcedit.js
+
+commit ed8cb3204bbb4f2d8bf671c9da3fa0d5f1c98f0c
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu May 23 09:11:25 2013 -0400
+
+    LP1183340 selectivly apply editable funds sorting
+    
+    Avoid sorting editable funds to the front of the fund list when there
+    are no org units at which the user has the ADMIN_ACQ_FUND permission.
+    Otherwise, we are sorting on an empty 'IN' list in pcrud, which results
+    in an error.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+14	13	Open-ILS/web/js/ui/default/acq/financial/list_funds.js
+
+commit 154e4946456f43769a00843e021f1981eaffda7e
+Author: Tracy Swaim <tswaim at mvlc.org>
+Date:   Sat Jun 1 01:13:13 2013 -0400
+
+    Documentation for preset tabs and auto login
+    
+    Missed the actual documentation in the last commit for preset tabs and
+    auto login docs. Here it is.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+121	0	docs/admin/staff_client-login.txt
+
+commit fa7608448d97be98076be8b4076f82ed84734ae9
+Author: Tracy Swaim <tswaim at mvlc.org>
+Date:   Sat Jun 1 01:00:26 2013 -0400
+
+    Pre-set tabs and auto login
+    
+    Adding staff client documentation for pre-set tabs and auto login.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+-	-	docs/media/auto_login.png
+-	-	docs/media/create_shortcut_here.png
+-	-	docs/media/preset_tabs.png
+-	-	docs/media/send_to_desktop.png
+-	-	docs/media/shortcut_properties.png
+-	-	docs/media/shortcut_properties_window.png
+-	-	docs/media/target_box.png
+ create mode 100644 docs/media/auto_login.png
+ create mode 100644 docs/media/create_shortcut_here.png
+ create mode 100644 docs/media/preset_tabs.png
+ create mode 100644 docs/media/send_to_desktop.png
+ create mode 100644 docs/media/shortcut_properties.png
+ create mode 100644 docs/media/shortcut_properties_window.png
+ create mode 100644 docs/media/target_box.png
+
+commit 7ebe6a0a7dd9c0c6156d3e45a1eb9082fc310a8a
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Fri May 31 15:09:11 2013 -0400
+
+    Documentation for Org Unit Hiding in TPAC
+    
+    Added Org Unit Hiding in TPAC documentation to admin/lsa-library_settings_editor.txt.
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>
+
+13	0	docs/admin/lsa-library_settings_editor.txt
+
+commit 4ad49105a58fc4241737718feb4b9aae57eced7f
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Fri May 10 12:32:51 2013 -0400
+
+    When delivering MARC21 via SuperCat, OpenSearch, offer filename w/ extension
+    
+    If you want a record feed in MARC21, without this commit a web browser
+    just suggests "marc21" as the filename for saving to your local system.
+    
+    Although many consumers of these feeds will be custom scripts and other
+    non-interactive software components that won't care about filename, for
+    the web browser case it's helpful if the server suggests a filename that
+    ends in .mrc.
+    
+    So here we go.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+62	8	Open-ILS/src/perlmods/lib/OpenILS/WWW/SuperCat.pm
+
+commit d1621affb0f403a68c642ebb652da576ec9e0c10
+Author: Ben Shum <bshum at biblio.org>
+Date:   Thu May 23 16:32:49 2013 -0400
+
+    LP1081576 - fix utf8 characters in searches using portal page
+    
+    Replace escape() with encodeURIComponent() on the portal page to allow utf8
+    characters to be passed more appropriately to the subsequent search in catalog.
+    
+    Thanks Dan Scott for pointing this out.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+
+2	2	Open-ILS/xul/staff_client/server/index.xhtml
+
+commit cb89d0ee2d52acf584123c75291accaf1ad3d349
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Fri May 31 12:27:13 2013 -0400
+
+    Fix reference to image that broke epub build
+    
+    The path pointing to the desired image was incorrect, which resulted in
+    a broken epub build and probably just a missing image in other formats.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+2	2	docs/admin/Org_Unit_Proximity_Adjustments.txt
+
+commit 99affffb3ba30ceb715b0b0f215cf92fe4966f3a
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Fri May 24 20:52:01 2013 -0400
+
+    Acquisitions Admin updates
+    
+    Updates to the chapter on acquisitions administration, including 1) the
+    reintroduction of the Providers section, which appears to have dropped out
+    of the docs after 2.1 2) the new default # copies and improvements to
+    distributions formulas introduced in 2.4 and 3) minor copy editing.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+549	187	docs/admin/acquisitions_admin.txt
+
+commit 0f6ec1ea2c6d7aba2bf790de87bf8f187921b994
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Mon Apr 2 17:07:55 2012 -0400
+
+    don't let function keys lock the MARC editor
+    
+    lock = put the interface into a state where it prompts with an unsaved data
+    warning before closing the interface
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    
+    Conflicts:
+    	Open-ILS/xul/staff_client/server/cat/marcedit.js
+    	Open-ILS/xul/staff_client/server/cat/marcedit.xul
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+43	1	Open-ILS/xul/staff_client/server/cat/marcedit.js
+68	68	Open-ILS/xul/staff_client/server/cat/marcedit.xul
+
+commit 8911681e6446fb3b30c543522208ce04ed82dfa3
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Thu May 30 13:01:38 2013 -0400
+
+    Documentation updates for acquisitions invoices
+    
+    Updates to acquisitions invoices documentation, including new 2.4
+    features. Also moves up some 2.1 documentation that is still relevant.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+209	30	docs/acquisitions/invoices.txt
+
+commit 35e197dd18c58ce21af875b4a76fca1c7d30d7e2
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Thu May 30 11:12:40 2013 -0400
+
+    Documentation for Call Numbers in My Lists
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>
+
+-	-	docs/media/my_list_call_numbers.JPG
+17	2	docs/opac/my_lists.txt
+ create mode 100644 docs/media/my_list_call_numbers.JPG
+
+commit 7c6ecb3a940bcb7a3b50650be7f44a202d93e438
+Author: Ben Shum <bshum at biblio.org>
+Date:   Wed May 29 18:06:09 2013 -0400
+
+    Change autoconf required version for libmar's configure.ac
+    
+    Having it set to 2.68 (current for Ubuntu Precise) broke autoreconf for other
+    distributions. Notably Debian Squeeze/Wheezy have 2.67 and Ubuntu Lucid has
+    2.65 for their autoconf version.
+    
+    Set a minimum requirement of 2.61 that we use in the existing options.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/xul/staff_client/external/libmar/configure.ac
+
+commit 78e19fd3f4c8baa6d003ee230d18bf0c34e9f00b
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Tue Mar 26 11:01:50 2013 -0400
+
+    Add new dependency on libbz2-dev(el).
+    
+    Our own mar tools add a build dependency on libbz2.  The easiest way to
+    make sure this is there seems to be to install libbz2-dev(el).
+    
+    Also, update the release notes to reflect the new dependency.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+4	2	Open-ILS/src/extras/Makefile.install
+6	3	docs/RELEASE_NOTES_NEXT/Administration/new-updates-tools.txt
+
+commit fc5182a90f625a21ce5a4668dcd3c6130477e202
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Wed Mar 20 10:45:03 2013 -0400
+
+    Add release notes for the new updates tools.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+26	0	docs/RELEASE_NOTES_NEXT/Administration/new-updates-tools.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/new-updates-tools.txt
+
+commit 8819aa61378fee8c58d2b307f802d24cc7a8acc9
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Tue Mar 19 08:38:31 2013 -0400
+
+    Fix segmentation fault in mbsdiff and fix crc by linking with libbz2.
+    
+    Doh! I typed memcpy when I really wanted memset.
+    
+    This does not actually introduce any new dependencies.  Evergreen
+    updates/installation already requires bzip2.  If bzip2 is present,
+    then libbz2 is present.  We don't need libbz2 headers, just the
+    library itself for a single data structure used in crc32 calculation.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/xul/staff_client/external/libmar/configure.ac
+1	1	Open-ILS/xul/staff_client/external/libmar/tool/bsdiff.c
+2	2	Open-ILS/xul/staff_client/external/libmar/tool/crc32.c
+
+commit a698dc48c5d3a01515127b131e9506dda6c74137
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Mon Mar 18 20:03:42 2013 -0400
+
+    Add libmar to build update tools to the repo.
+    
+    This adds code from Mozilla to build a command line mar program and the
+    libmar library that it uses.  This code is now dual-licensed under the
+    MPL 2.0 and GPL v2 or later.
+    
+    We also add our own version of mbsdiff using a modified version of Colin
+    Percival's FreeBSD-licensed bsdiff program.  We also copy the crc32 code
+    from Mozilla's updater.
+    
+    Add libmar as "subpackage" in cofigure.ac.
+    
+    Add AC_CONFIG_SUBDIRS macro call for Open-ILS/xul/staff_client/external/
+    libmar so that our update tools will get configured and built when
+    Evergreen is built.
+    
+    Modify make_updates.sh for our update tools.
+    
+    Instead of downloading mar and mbsdiff from Mozilla.org's servers,
+    we check if they exist in Open-ILS/xul/staff_client/external/libmar/tool
+    and if not we build them.  They should be there already.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/xul/staff_client/external/libmar/Makefile.am
+11	0	Open-ILS/xul/staff_client/external/libmar/README
+49	0	Open-ILS/xul/staff_client/external/libmar/configure.ac
+2	0	Open-ILS/xul/staff_client/external/libmar/src/Makefile.am
+169	0	Open-ILS/xul/staff_client/external/libmar/src/mar.h
+94	0	Open-ILS/xul/staff_client/external/libmar/src/mar_cmdline.h
+416	0	Open-ILS/xul/staff_client/external/libmar/src/mar_create.c
+102	0	Open-ILS/xul/staff_client/external/libmar/src/mar_extract.c
+88	0	Open-ILS/xul/staff_client/external/libmar/src/mar_private.h
+581	0	Open-ILS/xul/staff_client/external/libmar/src/mar_read.c
+5	0	Open-ILS/xul/staff_client/external/libmar/tool/Makefile.am
+393	0	Open-ILS/xul/staff_client/external/libmar/tool/bsdiff.c
+22	0	Open-ILS/xul/staff_client/external/libmar/tool/crc32.c
+179	0	Open-ILS/xul/staff_client/external/libmar/tool/mar.c
+6	5	Open-ILS/xul/staff_client/external/make_updates.sh
+1	0	configure.ac
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/Makefile.am
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/README
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/configure.ac
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/src/Makefile.am
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/src/mar.h
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/src/mar_cmdline.h
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/src/mar_create.c
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/src/mar_extract.c
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/src/mar_private.h
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/src/mar_read.c
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/tool/Makefile.am
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/tool/bsdiff.c
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/tool/crc32.c
+ create mode 100644 Open-ILS/xul/staff_client/external/libmar/tool/mar.c
+
+commit 77c9886c809b407653b8b6580899ea7ad328b457
+Author: Ben Shum <bshum at biblio.org>
+Date:   Sat Apr 13 22:28:53 2013 -0400
+
+    LP1168186 - Add tag 111 and remove subfield 4 from author pool
+    
+    Add meeting/conference main entry (111) to TPAC author pool.
+    
+    Remove subfield 4 from the author data because the information contained
+    refers to relator and may not be helpful at this time.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Mark Cooper <markchristophercooper at gmail.com>
+
+2	1	Open-ILS/src/templates/opac/parts/misc_util.tt2
+
+commit 07cddc9f1f03414d92d50efb99bd1da40893149b
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Apr 11 19:54:12 2013 -0400
+
+    Add corporate author (110) to TPAC author pool
+    
+    As requested in LP#1168186, here is a simple attempt to add corporate
+    authors to the author 'pool' in TPAC.
+    
+    We may also want to consider adding 111 (meeting or conference as
+    main entry), but that isn't totally clear cut.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Mark Cooper <markchristophercooper at gmail.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/src/templates/opac/parts/misc_util.tt2
+
+commit 5a5d84c6f3c9007e0bda83aa5df5369c838014aa
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu May 23 09:43:52 2013 -0400
+
+    LP1183357 Pass locale to bib search (tpac)
+    
+    Pass the TPAC locale value, which is collected at each page load, to the
+    bib search API call.  This allows us to take advantage of language-based
+    relevance bumps.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
+
+commit a6c2c194f5acd29af9772323e02bc17413555472
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Wed May 29 15:44:56 2013 -0400
+
+    Documentation for Best Hold Selection Sort Order
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>
+
+60	0	docs/admin/Best_Hold_Selection_Sort_Order.txt
+-	-	docs/media/best_hold_sort_order1.jpg
+-	-	docs/media/best_hold_sort_order2.jpg
+2	0	docs/root.txt
+ create mode 100644 docs/admin/Best_Hold_Selection_Sort_Order.txt
+ create mode 100644 docs/media/best_hold_sort_order1.jpg
+ create mode 100644 docs/media/best_hold_sort_order2.jpg
+
+commit abc74b8359e646b5e3118e449f21624aa015d991
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Wed May 29 15:40:19 2013 -0400
+
+    Updated root
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>
+
+3	1	docs/root.txt
+
+commit c8b679ebcd332054fb935512bdb3c8eed1b157d9
+Author: akilsdonk <akilsdonk at esilibrary.com>
+Date:   Wed May 29 14:59:48 2013 -0400
+
+    Org Unit Proximity Adjustment documentation
+    
+    Signed-off-by: akilsdonk <akilsdonk at esilibrary.com>
+
+44	0	docs/admin/Org_Unit_Proximity_Adjustments.txt
+-	-	docs/media/Org_Unit_Prox_Adj1.PNG
+-	-	docs/media/Org_Unit_Prox_Adj2.PNG
+ create mode 100644 docs/admin/Org_Unit_Proximity_Adjustments.txt
+ create mode 100644 docs/media/Org_Unit_Prox_Adj1.PNG
+ create mode 100644 docs/media/Org_Unit_Prox_Adj2.PNG
+
+commit 927f436d9b6674b6cf2a6c9ee77bbc71db9aad10
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu Apr 11 06:43:10 2013 -0700
+
+    Test dataset: authority records for concerto
+    
+    Add a handful of authority records to match a subset of the Concerto
+    bib records. When the --load-all or --load-concerto options are passed
+    to eg_db_config, these authority records will be loaded. Running
+    "authority_control_fields -s 1 -e 100" will then generate 19 links from
+    Concerto bibs to corresponding authority records.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+76	0	Open-ILS/tests/datasets/sql/auth_concerto.sql
+3	0	Open-ILS/tests/datasets/sql/load_all.sql
+3	0	Open-ILS/tests/datasets/sql/load_concerto.sql
+ create mode 100644 Open-ILS/tests/datasets/sql/auth_concerto.sql
+
+commit 29f71b28b2bc9b56987654f8ee0c6427b9fd3979
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Fri May 10 13:12:55 2013 -0400
+
+    TPAC: Death date missing from authors in record details
+    
+    The trailing period prescribed by ISBD punctuation for x00 $d subfields
+    in certain circumstances confounds the regex that was expected the $d
+    subfield to match ^\s*\d{4}-\d{4}\s*$. As a result, death dates were
+    often being omitted from the record detail display. Relaxing the regex
+    to match against a trailing .* instead of \s* resolves the issue.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+2	2	Open-ILS/src/templates/opac/parts/record/authors.tt2
+
+commit 38e1b847ea3c9d4b3ea672baa14bd707bb2380c9
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Thu May 23 11:44:05 2013 -0400
+
+    Fix Launchpad Bug 1183418.
+    
+    Clicking on an author with a dash or dates in the name on the search
+    results page comes up with 0 results. It looks like the dash is stripped
+    from the date and/or name.
+    
+    Clicking on such a link from the record view actually works because
+    the dash is replaced with a space.
+    
+    This branch changes table.tt2 to replace special characters in author
+    output with a space in the same way that authors.tt2 does.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit 445d8b184e562dcb72f28ce8dcfbded30067e418
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Thu May 23 12:09:55 2013 -0400
+
+    Avoid additional whitespace in password messages
+    
+    Trivial enhancements to avoid extra linefeeds in generated HTML, as well
+    as including a linefeed at the end of the new password_reset_msg.tt2
+    file. Good old DOS vs. UNIX :)
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+2	2	Open-ILS/src/templates/opac/myopac/update_password.tt2
+1	1	Open-ILS/src/templates/opac/password_reset.tt2
+1	1	Open-ILS/src/templates/opac/password_reset_msg.tt2
+
+commit 97d1c4f8010f1b040f860fe2a207bea1631a87f5
+Author: Melissa Lefebvre <mlefebvre at biblio.org>
+Date:   Fri May 10 15:19:09 2013 -0400
+
+    TPAC - Password Messages
+    
+    In jspac a message appeared when the patron went to change their
+    password stating the requirements. This same message is missing
+    in TPAC. The wording from jspac has been added to a separate
+    file, update_password_msg.tt2,  that can later be easily edited
+    and the original update_password.tt2 has been edited with an
+    INCLUDE statement pointing to the newly created file.
+    
+    Also improved is the message when requesting a forgotten password.
+    Patrons are unaware that a valid email address needs to be in
+    their record until after they try to send a reset. Text has been
+    added to a new file, password_reset_msg.tt2,  to explain the need
+    for an email address.  Password_reset.tt2  has been edited with
+    an INCLUDE statement pointing to the newly created file.
+    
+    Style.css.tt2 was also updated to remove extra padding on
+    #account-update-email table to raise the table on
+    update_password.tt2.  This value is also used on
+    update_username.tt2 and update_email.tt2 without considerable
+    impact to the look of those pages.
+    
+    Signed-off-by: Melissa Lefebvre <mlefebvre at biblio.org>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+7	1	Open-ILS/src/templates/opac/css/style.css.tt2
+2	0	Open-ILS/src/templates/opac/myopac/update_password.tt2
+3	0	Open-ILS/src/templates/opac/myopac/update_password_msg.tt2
+1	0	Open-ILS/src/templates/opac/password_reset.tt2
+3	0	Open-ILS/src/templates/opac/password_reset_msg.tt2
+ create mode 100644 Open-ILS/src/templates/opac/myopac/update_password_msg.tt2
+ create mode 100644 Open-ILS/src/templates/opac/password_reset_msg.tt2
+
+commit ae55f787643032be2765fc54447b3316742da4ff
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Tue May 21 15:00:13 2013 -0400
+
+    LP#1182360: typo fix
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+1	1	Open-ILS/src/templates/url_verify/create_session.tt2
+
+commit 2390d0213581fdc7baa143026c594988bde5350f
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Thu May 16 16:12:14 2013 -0400
+
+    Database upgrade script for 2.2.9
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+40	0	Open-ILS/src/sql/Pg/version-upgrade/2.2.8-2.2.9-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.2.8-2.2.9-upgrade-db.sql
+
+commit 32862c51adbbddbb30cf2d9a2253f21b9b94b438
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu May 16 15:52:38 2013 -0400
+
+    2.3.6 -> 2.3.7 DB upgrade script
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+40	0	Open-ILS/src/sql/Pg/version-upgrade/2.3.6-2.3.7-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.3.6-2.3.7-upgrade-db.sql
+
+commit 02f1c1f1c5c31159bb7c8df147c4ff5588fdca76
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Apr 19 16:14:13 2013 -0400
+
+    Correct subfield format for authority lookup
+    
+    The Authority Control Set code expects the format of subfields
+    that it will be used to build a MARC.Field object to be of the
+    form: [[code,value],...]  This commit makes that true.
+    
+    Additionally, dojo.filter over a list of lists can cause the
+    nested array set to be flattened.  So, instead, we loop directly.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+
+10	5	Open-ILS/web/js/dojo/openils/AuthorityControlSet.js
+1	2	Open-ILS/xul/staff_client/server/cat/marcedit.js
+
+commit d810037052a181640183217756fc1e2f489605e1
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu May 16 09:11:50 2013 -0400
+
+    Repair faulty MARC editor authority validation
+    
+    Repair how the JS inspects the results of
+    open-ils.search.authority.simple_heading.from_xml.batch.atomic, which is
+    used to look up matches for authority validation.  It returns a more
+    complex structure in the brave new world of authority control sets.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+19	2	Open-ILS/xul/staff_client/server/cat/marcedit.js
+
+commit 9ff0e469765105c78f8007810916a8e5dbfeaa36
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Jan 29 11:04:33 2013 -0500
+
+    Apply all 2.2 upgrades prior to running 2.3.0 upgrade
+    
+    If users are expected to run all of the 2.2 upgrade scripts, then let's
+    make it easy for them. As PostgreSQL 9.1 does not include the \ir
+    "include relative path" command, we have to pause at the beginning of
+    the upgrade process to ensure that the user is running the script from
+    the right directory.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+19	1	Open-ILS/src/sql/Pg/version-upgrade/2.2-2.3.0-upgrade-db.sql
+
+commit e3b249bcca7eae1b79bd75bdcd88388bb38e1874
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Tue May 14 15:33:54 2013 -0400
+
+    LP#118066: fix searches that failed because punctuation was a token in query
+    
+    When building the text array literal to pass to evergreen.rel_bump,
+    make sure that tokens that get {search_}normalize{d} away
+    don't result in syntax errors.
+    
+    With this patch, searches like the following will work again:
+    
+    keyword:Take me to the river / Al Green and Mabon
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+
+3	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+
+commit 919f3bb1d16cca586299e745ce6bfdeeee9b8c98
+Author: Ben Shum <bshum at biblio.org>
+Date:   Mon May 13 14:19:06 2013 -0400
+
+    LP1179614 - fix Export All Records action
+    
+    In the record buckets, the button for 'Export All Records' would work up
+    to the point where you chose where to save the file. After clicking where
+    to save, it would not show any saved files or prompts indicating it completed
+    the export process.
+    
+    This fix changes the location of where to find the export tool and properly
+    exports the bibs as the file format selected.
+    
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+1	1	Open-ILS/xul/staff_client/server/cat/record_buckets.js
+
+commit e414073d82c84ebb4b230aa5b54e2f3593b1b5ba
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Mon May 6 14:15:18 2013 -0400
+
+    Serials: MFHD::get_compressed_holdings() can reach infinite loop
+    
+    Even controlled serials holdings involve the internal creation of MFHD
+    fields, upon which caculations are performed for such purposes as the
+    display of holdings summaries in the OPAC.
+    
+    There are too many ways that incorrect MFHD (or MFHD that our code just
+    can't yet handle) can lead our MFHD routines to crash. We can't address
+    all these possibilities in a single bug fix. But we can avoid this
+    infinite loop.
+    
+    A subroutine within open-ils.serial (_summarize_contents()) relies on
+    MFHD::get_compressed_holdings(). When the latter went into an infinite
+    loop the result would be an open-il.serial drone process consuming CPU
+    time indefinitely and, depending on the data that provoked the loop,
+    potentially writing repeating messages to stderr indefinitely.
+    
+    End users will still see the item receiving fail in these cases, and be
+    obliged to work around the issue as before until more robust
+    holdings summarization code can be written, but at least the overall
+    condition of the running Evergreen system won't be affected, and there
+    will be better information in the error logs.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+22	5	Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
+15	3	Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD.pm
+
+commit b0c03ad9a42dd34824a6a16634c2c306c81de558
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Mon May 6 14:13:13 2013 -0400
+
+    Serials: Test method to identify holdings that lead to summarization bugs
+    
+    This adds a simple test method that allows testing of problem holdings.
+    See the next commit.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+31	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
+
+commit 2773d92425a803f55bbb2533ee07d60fd5864719
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri May 3 17:20:21 2013 -0400
+
+    LP#1176206: improve deadlock handling in 2.3-2.4-supplemental.sh
+    
+    - make sure that it doesn't attempt to create more than one
+      index at a time for a given table
+    - if deadlocks occur (because of a PostgreSQL bug whose fix
+      isn't slated for release until after April 2013), find
+      and recreate the affected indexes.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+
+34	3	Open-ILS/src/sql/Pg/version-upgrade/2.3-2.4-supplemental.sh
+
+commit 8859597476993b407fa881f05f6187a17447730a
+Author: Mark Cooper <markchristophercooper at gmail.com>
+Date:   Mon May 6 12:37:32 2013 -0700
+
+    Exports are broken
+    
+    Proposed fix for lp1175816, tested with 2.3.2 / 2.4.0.
+    
+    Signed-off-by: Mark Cooper <markchristophercooper at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+2	2	Open-ILS/src/perlmods/lib/OpenILS/WWW/Exporter.pm
+2	2	Open-ILS/src/support-scripts/marc_export.in
+
+commit 885eacc8fa6c768dea4443d471bb9f1d0f8d1c9a
+Author: Thomas Berezansky <tsbere at mvlc.org>
+Date:   Sun Oct 7 11:58:37 2012 -0400
+
+    Add params support to show in opac function
+    
+    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+7	6	Open-ILS/xul/staff_client/server/cat/util.js
+
+commit 2be86106c04187a6bfeb3a688b1e87d1743f441f
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed May 1 16:33:39 2013 -0400
+
+    LP#1175287: make sure tsearch2 is removed, regardless of its origin
+    
+    A sufficiently old Evergreen database might still have tsearch2
+    exist as an unpackaged contrib, so convert it to an extension first.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+3	0	Open-ILS/src/sql/Pg/upgrade/0743.schema.remove_tsearch2.sql
+3997	0	Open-ILS/src/sql/Pg/version-upgrade/2.3-2.4.0-upgrade-db.sql
+3	0	Open-ILS/src/sql/Pg/version-upgrade/2.3-2.4.0RC-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.3-2.4.0-upgrade-db.sql
+
+commit 9d32147ead32c688e39eb47d0229e19b9972da40
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed May 1 17:35:30 2013 -0400
+
+    adjust release notes references to refer to 2.4.0
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	2	docs/RELEASE_NOTES_2_4.txt
+1	1	docs/root.txt
+
+commit 0fdd34b1e15d910ca084e1515ef755c825a2d178
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed May 1 17:34:02 2013 -0400
+
+    update upgrade instructions for 2.4.0 release
+    
+    - specify minimum supported PostgreSQL version as 9.1
+    - specify minimum supported OpenSRF version as 2.2.0
+    - update schema upgrade instructions and miscellaneous
+      references to 2.3
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+24	23	docs/installation/server_upgrade.txt
+
+commit 3018dfb619bc7d3bccf0722c3f72326a22b5ed51
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed May 1 17:02:57 2013 -0400
+
+    revisions to installation instructions
+    
+    - Remove references to PostgreSQL 9.0; 9.1 is recommended
+      for Evergreen 2.4.
+    - Clarify that the latest version of OpenSRF now means 2.2
+      or later.
+    - Increase chances that somebody following the instructions
+      precisely doesn't run into a problem during the configure step.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+6	22	docs/installation/server_installation.txt
+
+commit b263a51180d7e3cbf0025a10e0625e5a75321f1a
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Apr 30 11:26:00 2013 -0400
+
+    Make sure the "running" indicator goes away
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+8	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit 6a7c526aaed9af40f7ac7855e6ca3094da2bdc59
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Apr 26 11:28:38 2013 -0400
+
+    Add a $cache_timeout-based backstop for infinite loops
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+2	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit 58394533a75a616e36755c514ffe686f537b593e
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Apr 26 10:49:17 2013 -0400
+
+    "Queue Compression" -- let one do the work for all identical, concurrent searches
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+17	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit b417d5a57dc26b3180af17097349a3224a5e50cb
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Wed May 1 15:01:30 2013 -0400
+
+    LP#1174359: follow-up on dropping the reporter.classic_item_list view
+    
+    Add note for the benefit of any Evergreen admin who may
+    need to recreate that view.  Also, update the point schema
+    update script.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+5	0	Open-ILS/src/sql/Pg/upgrade/0743.schema.remove_tsearch2.sql
+4	0	Open-ILS/src/sql/Pg/version-upgrade/2.3-2.4.0RC-upgrade-db.sql
+
+commit 383e99e07ee3e1e8a27deafbb31663d4fc50e231
+Author: Michael Peters <mpeters at emeralddata.net>
+Date:   Mon Apr 29 11:14:39 2013 -0400
+
+    LP#1174359 Need to drop reporter.classic_item_list
+    
+    ERROR: cannot drop view metabib.full_rec because other objects depend on it
+    DETAIL: view reporter.classic_item_list depends on view metabib.full_rec
+    HINT: Use DROP ... CASCADE to drop the dependent objects too.
+    
+    Beginning at line 55 of the upgrade script, several views and functions are dropped
+    so metabib.full_rec can be dropped. One of them is missing.
+    
+    We need to drop reporter.classic_item_list as well, for the script to work.
+    
+    Signed-off-by: Michael Peters <mpeters at emeralddata.net>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+
+1	0	Open-ILS/src/sql/Pg/version-upgrade/2.3-2.4.0RC-upgrade-db.sql
+
+commit 749917f0321016a0959e876dc2601a34b1afbeea
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Wed May 1 12:08:29 2013 -0400
+
+    Improved AC socket fix
+    
+    This provides better coverage for socket shutdown needs, but intends
+    to fix the same issue as the previous commit.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	2	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
+
+commit 5693b91de2c70f8383b497790f4bcc7b4c9ce903
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Tue Apr 30 13:23:24 2013 -0400
+
+    Shutdown added content sockets to prevent hung connections.
+    
+    We were getting several thousand sockets hanging around in a
+    CLOSE_WAIT state on our server.  The connections were from our
+    server and to our server.  Further investigation showed it to be
+    caused by the stage2 added content lookup not closing the request
+    sockets when it was done reading data.  This branch fixes that.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
+
+commit f04b5bd4c83a6f69b54d1fea30359778febfd104
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Fri Mar 29 09:41:44 2013 -0400
+
+    LP1076411 Return updated circ object from checkin
+    
+    Retrieve an updated copy of the circulation object to return to the
+    caller during checkin.  This ensures the data in the circ object, in
+    particular date fields, are consistent with the database.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+11	5	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+
+commit 723589b01bcaa3092031a91849eedd95934c41a7
+Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+Date:   Wed Apr 3 15:31:09 2013 -0400
+
+    When adding errors from failed processing to acq.edi_message, set error_time
+    
+    This has obvious benefits in facilitating log analysis after a problem.
+    
+    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm
+
+commit 5aa876b42db179ba67de9bacc9adc4cf5af8ab47
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Thu Mar 14 14:37:17 2013 -0400
+
+    Add accepting_usr to IDL to fix reporter field
+    
+    In the reporter interface, the view 'Payments: Brick-and-mortar' is
+    missing the 'Accepting User' field, which is present in the similar view
+    'Payments: Desk'. This field is already present in the database view and
+    is simply missing from the IDL.  Since it is needed for certain kinds of
+    reports, this commit adds the missing IDL fields. It also adds the
+    missing 'reporter:datatype' to an existing instance of the IDL field.
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+3	1	Open-ILS/examples/fm_IDL.xml
+
+commit 562d6a81757f401250b15bf095a0019052b9db08
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Tue Apr 23 11:47:37 2013 -0400
+
+    LP1170861 Remove unused lineitem alert field
+    
+    Remove extraneous field from the IDL field list for acq lineitem alerts.
+    The extra field prevented new alerts from getting saved.
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+0	1	Open-ILS/examples/fm_IDL.xml
+
+commit 9aa7340a843d4c260b9ea6ac636f4fcaf2386cac
+Author: Kyle Tomita <ktomita at catalystitservices.com>
+Date:   Tue Apr 9 13:51:14 2013 -0700
+
+    LP1104823 - OPAC search results "Limit to available items" toggles
+    off "Show more details"
+    
+    Added a hidden input to the form when "Show more details" is selected
+    so that when the form is reloaded, "Show more details" will be still
+    selected.
+    
+    Signed-off-by: Kyle Tomita <ktomita at catalystitservices.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+3	0	Open-ILS/src/templates/opac/results.tt2
+
+commit 8793974a0ff6a84737bca29b3d787b792a6addf5
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Apr 25 11:54:40 2013 -0400
+
+    LP#1172893: fix query for retrieving available holds
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Ben Shum <bshum at biblio.org>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+
+commit 15de0f58f95ba3784d96d33443676ff9fed1ab24
+Author: Jason Stephenson <jstephenson at mvlc.org>
+Date:   Tue Apr 23 10:39:55 2013 -0400
+
+    Add 2.4 release notes for Novelist Select changes.
+    
+    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
+
+18	0	docs/RELEASE_NOTES_2_4.txt
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
index d750216..bab0e01 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
@@ -7,7 +7,7 @@ use OpenILS::Utils::Fieldmapper;
 sub ils_version {
     # version format is "x-y-z", for example "2-0-0" for Evergreen 2.0.0
     # For branches, format is "x-y"
-    return "HEAD";
+    return "2-5-beta1";
 }
 
 __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 ef779f5..aeb8538 100644
--- a/Open-ILS/src/sql/Pg/002.schema.config.sql
+++ b/Open-ILS/src/sql/Pg/002.schema.config.sql
@@ -92,6 +92,7 @@ CREATE TRIGGER no_overlapping_deps
     FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
 
 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0837', :eg_version); -- eeevil/senator/csharp
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.5-beta1', :eg_version);
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,
diff --git a/Open-ILS/src/sql/Pg/version-upgrade/2.4.2-2.5-beta1-upgrade-db.sql b/Open-ILS/src/sql/Pg/version-upgrade/2.4.2-2.5-beta1-upgrade-db.sql
new file mode 100644
index 0000000..2ad963d
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/version-upgrade/2.4.2-2.5-beta1-upgrade-db.sql
@@ -0,0 +1,12118 @@
+--Upgrade Script for 2.4.2 to 2.5-beta1
+
+\qecho **** Libraries that upgraded or installed 2.0 before May 2011 never
+\qecho **** got this schema, so add it first.
+\qecho **** If this fails, don't worry, it probably won't be an issue.
+\qecho
+
+BEGIN;
+
+CREATE SCHEMA staging;
+
+CREATE TABLE staging.user_stage (
+        row_id                  BIGSERIAL PRIMARY KEY,
+        row_date                TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
+        usrname                 TEXT NOT NULL,
+        profile                 TEXT,
+        email                   TEXT,
+        passwd                  TEXT,
+        ident_type              INT DEFAULT 3,
+        first_given_name        TEXT,
+        second_given_name       TEXT,
+        family_name             TEXT,
+        day_phone               TEXT,
+        evening_phone           TEXT,
+        home_ou                 INT DEFAULT 2,
+        dob                     TEXT,
+        complete                BOOL DEFAULT FALSE
+);
+
+CREATE TABLE staging.card_stage ( -- for new library barcodes
+        row_id          BIGSERIAL PRIMARY KEY,
+        row_date        TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
+        usrname         TEXT NOT NULL,
+        barcode         TEXT NOT NULL,
+        complete        BOOL DEFAULT FALSE
+);
+
+CREATE TABLE staging.mailing_address_stage (
+        row_id          BIGSERIAL PRIMARY KEY,
+        row_date        TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
+        usrname         TEXT NOT NULL,  -- user's SIS barcode, for linking
+        street1         TEXT,
+        street2         TEXT,
+        city            TEXT NOT NULL DEFAULT '',
+        state           TEXT    NOT NULL DEFAULT 'OK',
+        country         TEXT NOT NULL DEFAULT 'US',
+        post_code       TEXT NOT NULL,
+        complete        BOOL DEFAULT FALSE
+);
+
+CREATE TABLE staging.billing_address_stage (
+        LIKE staging.mailing_address_stage INCLUDING DEFAULTS
+);
+
+ALTER TABLE staging.billing_address_stage ADD PRIMARY KEY (row_id);
+
+CREATE TABLE staging.statcat_stage (
+        row_id          BIGSERIAL PRIMARY KEY,
+        row_date        TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
+        usrname         TEXT NOT NULL,
+        statcat         TEXT NOT NULL, -- for things like 'Year of study'
+        value           TEXT NOT NULL, -- and the value, such as 'Freshman'
+        complete        BOOL DEFAULT FALSE
+);
+
+COMMIT;
+
+
+\qecho **** REAL 2.5 upgrade starting now...
+
+\set eg_version '''2.5-beta1'''
+BEGIN;
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.5-beta1', :eg_version);
+
+SELECT evergreen.upgrade_deps_block_check('0794', :eg_version);
+
+INSERT INTO config.standing_penalty (id,name,label,block_list,staff_alert)
+    VALUES (5,'PATRON_EXCEEDS_LOST_COUNT',oils_i18n_gettext(5, 'Patron exceeds max lost item threshold', 'csp', 'label'),'CIRC|FULFILL|HOLD|CAPTURE|RENEW', TRUE);
+
+INSERT INTO config.org_unit_setting_type ( name, grp, label, description, datatype ) VALUES (
+    'circ.tally_lost', 'circ',
+    oils_i18n_gettext(
+        'circ.tally_lost',
+        'Include Lost circulations in lump sum tallies in Patron Display.',
+        'coust',
+        'label'),
+    oils_i18n_gettext(
+        'circ.tally_lost',
+        'In the Patron Display interface, the number of total active circulations for a given patron is presented in the Summary sidebar and underneath the Items Out navigation button.  This setting will include Lost circulations as counting toward these tallies.',
+        'coust',
+        'description'),
+    'bool'
+);
+
+-- Function: actor.calculate_system_penalties(integer, integer)
+-- DROP FUNCTION actor.calculate_system_penalties(integer, integer);
+
+CREATE OR REPLACE FUNCTION actor.calculate_system_penalties(match_user integer, context_org integer)
+    RETURNS SETOF actor.usr_standing_penalty AS
+$BODY$
+DECLARE
+    user_object             actor.usr%ROWTYPE;
+    new_sp_row            actor.usr_standing_penalty%ROWTYPE;
+    existing_sp_row       actor.usr_standing_penalty%ROWTYPE;
+    collections_fines      permission.grp_penalty_threshold%ROWTYPE;
+    max_fines               permission.grp_penalty_threshold%ROWTYPE;
+    max_overdue           permission.grp_penalty_threshold%ROWTYPE;
+    max_items_out       permission.grp_penalty_threshold%ROWTYPE;
+    max_lost      		     permission.grp_penalty_threshold%ROWTYPE;
+    tmp_grp                 INT;
+    items_overdue        INT;
+    items_out              INT;
+    items_lost	            INT;
+    context_org_list     INT[];
+    current_fines          NUMERIC(8,2) := 0.0;
+    tmp_fines               NUMERIC(8,2);
+    tmp_groc               RECORD;
+    tmp_circ                RECORD;
+    tmp_org                actor.org_unit%ROWTYPE;
+    tmp_penalty          config.standing_penalty%ROWTYPE;
+    tmp_depth            INTEGER;
+BEGIN
+    SELECT INTO user_object * FROM actor.usr WHERE id = match_user;
+
+    -- Max fines
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has a high fine balance
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+            SELECT * INTO max_fines FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 1 AND org_unit = tmp_org.id;
+
+            IF max_fines.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_fines.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT * INTO tmp_org FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_fines.threshold IS NOT NULL THEN
+
+        RETURN QUERY
+            SELECT  *
+              FROM  actor.usr_standing_penalty
+              WHERE usr = match_user
+                    AND org_unit = max_fines.org_unit
+                    AND (stop_date IS NULL or stop_date > NOW())
+                    AND standing_penalty = 1;
+
+        SELECT INTO context_org_list ARRAY_ACCUM(id) FROM actor.org_unit_full_path( max_fines.org_unit );
+
+        SELECT  SUM(f.balance_owed) INTO current_fines
+          FROM  money.materialized_billable_xact_summary f
+                JOIN (
+                    SELECT  r.id
+                      FROM  booking.reservation r
+                      WHERE r.usr = match_user
+                            AND r.pickup_lib IN (SELECT * FROM unnest(context_org_list))
+                            AND xact_finish IS NULL
+                                UNION ALL
+                    SELECT  g.id
+                      FROM  money.grocery g
+                      WHERE g.usr = match_user
+                            AND g.billing_location IN (SELECT * FROM unnest(context_org_list))
+                            AND xact_finish IS NULL
+                                UNION ALL
+                    SELECT  circ.id
+                      FROM  action.circulation circ
+                      WHERE circ.usr = match_user
+                            AND circ.circ_lib IN (SELECT * FROM unnest(context_org_list))
+                            AND xact_finish IS NULL ) l USING (id);
+
+        IF current_fines >= max_fines.threshold THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_fines.org_unit;
+            new_sp_row.standing_penalty := 1;
+            RETURN NEXT new_sp_row;
+        END IF;
+    END IF;
+
+    -- Start over for max overdue
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has too many overdue items
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+
+            SELECT * INTO max_overdue FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 2 AND org_unit = tmp_org.id;
+
+            IF max_overdue.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_overdue.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT INTO tmp_org * FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_overdue.threshold IS NOT NULL THEN
+
+        RETURN QUERY
+            SELECT  *
+              FROM  actor.usr_standing_penalty
+              WHERE usr = match_user
+                    AND org_unit = max_overdue.org_unit
+                    AND (stop_date IS NULL or stop_date > NOW())
+                    AND standing_penalty = 2;
+
+        SELECT  INTO items_overdue COUNT(*)
+          FROM  action.circulation circ
+                JOIN  actor.org_unit_full_path( max_overdue.org_unit ) fp ON (circ.circ_lib = fp.id)
+          WHERE circ.usr = match_user
+            AND circ.checkin_time IS NULL
+            AND circ.due_date < NOW()
+            AND (circ.stop_fines = 'MAXFINES' OR circ.stop_fines IS NULL);
+
+        IF items_overdue >= max_overdue.threshold::INT THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_overdue.org_unit;
+            new_sp_row.standing_penalty := 2;
+            RETURN NEXT new_sp_row;
+        END IF;
+    END IF;
+
+    -- Start over for max out
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has too many checked out items
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+            SELECT * INTO max_items_out FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 3 AND org_unit = tmp_org.id;
+
+            IF max_items_out.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_items_out.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT INTO tmp_org * FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    -- Fail if the user has too many items checked out
+    IF max_items_out.threshold IS NOT NULL THEN
+        RETURN QUERY
+            SELECT  *
+            FROM  actor.usr_standing_penalty
+            WHERE usr = match_user
+                AND org_unit = max_items_out.org_unit
+                AND (stop_date IS NULL or stop_date > NOW())
+                AND standing_penalty = 3;
+            SELECT  INTO items_out COUNT(*)
+            FROM  action.circulation circ
+            JOIN  actor.org_unit_full_path( max_items_out.org_unit ) fp ON (circ.circ_lib = fp.id)
+            WHERE circ.usr = match_user
+                AND circ.checkin_time IS NULL
+                AND (circ.stop_fines IN (
+                    SELECT 'MAXFINES'::TEXT
+                    UNION ALL
+                    SELECT 'LONGOVERDUE'::TEXT
+                    UNION ALL
+                    SELECT 'LOST'::TEXT
+                    WHERE 'true' ILIKE
+                    (
+                        SELECT CASE
+                            WHEN (SELECT value FROM actor.org_unit_ancestor_setting('circ.tally_lost', circ.circ_lib)) ILIKE 'true' THEN 'true'
+                            ELSE 'false'
+                        END
+                    )
+                    UNION ALL
+                    SELECT 'CLAIMSRETURNED'::TEXT
+                    WHERE 'false' ILIKE
+                        (
+                            SELECT CASE
+                            WHEN (SELECT value FROM actor.org_unit_ancestor_setting('circ.do_not_tally_claims_returned', circ.circ_lib)) ILIKE 'true' THEN 'true'
+                            ELSE 'false'
+                            END
+                        )
+                    ) OR circ.stop_fines IS NULL)
+                AND xact_finish IS NULL;
+
+    IF items_out >= max_items_out.threshold::INT THEN
+        new_sp_row.usr := match_user;
+        new_sp_row.org_unit := max_items_out.org_unit;
+        new_sp_row.standing_penalty := 3;
+        RETURN NEXT new_sp_row;
+   END IF;
+END IF;
+
+    -- Start over for max lost
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has too many lost items
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+            SELECT * INTO max_lost FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 5 AND org_unit = tmp_org.id;
+            IF max_lost.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_lost.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT INTO tmp_org * FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_lost.threshold IS NOT NULL THEN
+        RETURN QUERY
+            SELECT  *
+            FROM  actor.usr_standing_penalty
+            WHERE usr = match_user
+                AND org_unit = max_lost.org_unit
+                AND (stop_date IS NULL or stop_date > NOW())
+                AND standing_penalty = 5;
+
+        SELECT INTO items_lost COUNT(*)
+        FROM  action.circulation circ
+            JOIN  actor.org_unit_full_path( max_lost.org_unit ) fp ON (circ.circ_lib = fp.id)
+            WHERE circ.usr = match_user
+                AND circ.checkin_time IS NULL
+                AND (circ.stop_fines = 'LOST')
+                AND xact_finish IS NULL;
+
+        IF items_lost >= max_lost.threshold::INT AND 0 < max_lost.threshold::INT THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_lost.org_unit;
+            new_sp_row.standing_penalty := 5;
+            RETURN NEXT new_sp_row;
+        END IF;
+    END IF;
+
+    -- Start over for collections warning
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has a collections-level fine balance
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+            SELECT * INTO max_fines FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 4 AND org_unit = tmp_org.id;
+            IF max_fines.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_fines.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT * INTO tmp_org FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_fines.threshold IS NOT NULL THEN
+
+        RETURN QUERY
+            SELECT  *
+                FROM  actor.usr_standing_penalty
+                WHERE usr = match_user
+                    AND org_unit = max_fines.org_unit
+                    AND (stop_date IS NULL or stop_date > NOW())
+                    AND standing_penalty = 4;
+
+        SELECT INTO context_org_list ARRAY_ACCUM(id) FROM actor.org_unit_full_path( max_fines.org_unit );
+
+        SELECT  SUM(f.balance_owed) INTO current_fines
+            FROM  money.materialized_billable_xact_summary f
+                JOIN (
+                    SELECT  r.id
+                        FROM  booking.reservation r
+                        WHERE r.usr = match_user
+                            AND r.pickup_lib IN (SELECT * FROM unnest(context_org_list))
+                            AND r.xact_finish IS NULL
+                                UNION ALL
+                    SELECT  g.id
+                        FROM  money.grocery g
+                        WHERE g.usr = match_user
+                            AND g.billing_location IN (SELECT * FROM unnest(context_org_list))
+                            AND g.xact_finish IS NULL
+                                UNION ALL
+                    SELECT  circ.id
+                        FROM  action.circulation circ
+                        WHERE circ.usr = match_user
+                            AND circ.circ_lib IN (SELECT * FROM unnest(context_org_list))
+                            AND circ.xact_finish IS NULL ) l USING (id);
+
+        IF current_fines >= max_fines.threshold THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_fines.org_unit;
+            new_sp_row.standing_penalty := 4;
+            RETURN NEXT new_sp_row;
+        END IF;
+    END IF;
+
+    -- Start over for in collections
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Remove the in-collections penalty if the user has paid down enough
+    -- This penalty is different, because this code is not responsible for creating 
+    -- new in-collections penalties, only for removing them
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+            SELECT * INTO max_fines FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 30 AND org_unit = tmp_org.id;
+
+            IF max_fines.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_fines.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT * INTO tmp_org FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_fines.threshold IS NOT NULL THEN
+
+        SELECT INTO context_org_list ARRAY_ACCUM(id) FROM actor.org_unit_full_path( max_fines.org_unit );
+
+        -- first, see if the user had paid down to the threshold
+        SELECT  SUM(f.balance_owed) INTO current_fines
+          FROM  money.materialized_billable_xact_summary f
+                JOIN (
+                    SELECT  r.id
+                        FROM  booking.reservation r
+                        WHERE r.usr = match_user
+                            AND r.pickup_lib IN (SELECT * FROM unnest(context_org_list))
+                            AND r.xact_finish IS NULL
+                                UNION ALL
+                    SELECT  g.id
+                        FROM  money.grocery g
+                        WHERE g.usr = match_user
+                            AND g.billing_location IN (SELECT * FROM unnest(context_org_list))
+                            AND g.xact_finish IS NULL
+                                UNION ALL
+                    SELECT  circ.id
+                        FROM  action.circulation circ
+                        WHERE circ.usr = match_user
+                            AND circ.circ_lib IN (SELECT * FROM unnest(context_org_list))
+                            AND circ.xact_finish IS NULL ) l USING (id);
+
+        IF current_fines IS NULL OR current_fines <= max_fines.threshold THEN
+            -- patron has paid down enough
+
+            SELECT INTO tmp_penalty * FROM config.standing_penalty WHERE id = 30;
+
+            IF tmp_penalty.org_depth IS NOT NULL THEN
+
+                -- since this code is not responsible for applying the penalty, it can't 
+                -- guarantee the current context org will match the org at which the penalty 
+                --- was applied.  search up the org tree until we hit the configured penalty depth
+                SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+                SELECT INTO tmp_depth depth FROM actor.org_unit_type WHERE id = tmp_org.ou_type;
+
+                WHILE tmp_depth >= tmp_penalty.org_depth LOOP
+
+                    RETURN QUERY
+                        SELECT  *
+                            FROM  actor.usr_standing_penalty
+                            WHERE usr = match_user
+                                AND org_unit = tmp_org.id
+                                AND (stop_date IS NULL or stop_date > NOW())
+                                AND standing_penalty = 30;
+
+                    IF tmp_org.parent_ou IS NULL THEN
+                        EXIT;
+                    END IF;
+
+                    SELECT * INTO tmp_org FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+                    SELECT INTO tmp_depth depth FROM actor.org_unit_type WHERE id = tmp_org.ou_type;
+                END LOOP;
+
+            ELSE
+
+                -- no penalty depth is defined, look for exact matches
+
+                RETURN QUERY
+                    SELECT  *
+                        FROM  actor.usr_standing_penalty
+                        WHERE usr = match_user
+                            AND org_unit = max_fines.org_unit
+                            AND (stop_date IS NULL or stop_date > NOW())
+                            AND standing_penalty = 30;
+            END IF;
+
+        END IF;
+
+    END IF;
+
+    RETURN;
+END;
+$BODY$
+    LANGUAGE plpgsql VOLATILE
+    COST 100
+    ROWS 1000;
+
+
+SELECT evergreen.upgrade_deps_block_check('0795', :eg_version);
+
+CREATE OR REPLACE FUNCTION 
+    evergreen.z3950_attr_name_is_valid(TEXT) RETURNS BOOLEAN AS $func$
+    SELECT EXISTS (SELECT 1 FROM config.z3950_attr WHERE name = $1);
+$func$ LANGUAGE SQL STRICT IMMUTABLE;
+
+COMMENT ON FUNCTION evergreen.z3950_attr_name_is_valid(TEXT) IS $$
+Results in TRUE if there exists at least one config.z3950_attr
+with the provided name.  Used by config.z3950_index_field_map
+to verify z3950_attr_type maps.
+$$;
+
+CREATE TABLE config.z3950_index_field_map (
+    id              SERIAL  PRIMARY KEY,
+    label           TEXT    NOT NULL, -- i18n
+    metabib_field   INTEGER REFERENCES config.metabib_field(id),
+    record_attr     TEXT    REFERENCES config.record_attr_definition(name),
+    z3950_attr      INTEGER REFERENCES config.z3950_attr(id),
+    z3950_attr_type TEXT,-- REFERENCES config.z3950_attr(name)
+    CONSTRAINT metabib_field_or_record_attr CHECK (
+        metabib_field IS NOT NULL OR 
+        record_attr IS NOT NULL
+    ),
+    CONSTRAINT attr_or_attr_type CHECK (
+        z3950_attr IS NOT NULL OR 
+        z3950_attr_type IS NOT NULL
+    ),
+    -- ensure the selected z3950_attr_type refers to a valid attr name
+    CONSTRAINT valid_z3950_attr_type CHECK (
+        z3950_attr_type IS NULL OR 
+            evergreen.z3950_attr_name_is_valid(z3950_attr_type)
+    )
+);
+
+-- seed data
+
+INSERT INTO config.z3950_index_field_map 
+    (id, label, metabib_field, z3950_attr_type) VALUES 
+(1, oils_i18n_gettext(1, 'Title',   'czifm', 'label'), 5,  'title'),
+(2, oils_i18n_gettext(2, 'Author',  'czifm', 'label'), 8,  'author'),
+(3, oils_i18n_gettext(3, 'ISBN',    'czifm', 'label'), 18, 'isbn'),
+(4, oils_i18n_gettext(4, 'ISSN',    'czifm', 'label'), 19, 'issn'),
+(5, oils_i18n_gettext(5, 'LCCN',    'czifm', 'label'), 30, 'lccn');
+
+INSERT INTO config.z3950_index_field_map 
+    (id, label, record_attr, z3950_attr_type) VALUES 
+(6, oils_i18n_gettext(6, 'Pubdate',  'czifm', 'label'),'pubdate', 'pubdate'),
+(7, oils_i18n_gettext(7, 'Item Type', 'czifm', 'label'),'item_type', 'item_type');
+
+
+-- let's leave room for more stock mappings
+SELECT SETVAL('config.z3950_index_field_map_id_seq'::TEXT, 1000);
+
+INSERT INTO config.org_unit_setting_type
+    (name, grp, label, description, datatype)
+    VALUES (
+        'cat.z3950.batch.max_parallel',
+        'cat',
+        oils_i18n_gettext(
+            'cat.z3950.batch.max_parallel',
+            'Maximum Parallel Z39.50 Batch Searches',
+            'coust',
+            'label'
+        ),
+        oils_i18n_gettext(
+            'cat.z3950.batch.max_parallel',
+            'The maximum number of Z39.50 searches that can be in-flight at any given time when performing batch Z39.50 searches',
+            'coust',
+            'description'
+        ),
+        'integer'
+    );
+
+INSERT INTO config.org_unit_setting_type
+    (name, grp, label, description, datatype)
+    VALUES (
+        'cat.z3950.batch.max_results',
+        'cat',
+        oils_i18n_gettext(
+            'cat.z3950.batch.max_results',
+            'Maximum Z39.50 Batch Search Results',
+            'coust',
+            'label'
+        ),
+        oils_i18n_gettext(
+            'cat.z3950.batch.max_results',
+            'The maximum number of search results to retrieve and queue for each record + Z39 source during batch Z39.50 searches',
+            'coust',
+            'description'
+        ),
+        'integer'
+    );
+
+INSERT INTO vandelay.bib_attr_definition (id, code, description, xpath) 
+    VALUES (
+        16, 
+        'zsource',
+        oils_i18n_gettext(16, 'Z39.50 Source', 'vqbrad', 'description'),
+        '//*[@tag="901"]/*[@code="z"]'
+    );
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0796', :eg_version);
+
+ALTER TABLE vandelay.bib_queue ADD COLUMN match_bucket
+   INTEGER REFERENCES container.biblio_record_entry_bucket(id)
+   ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;  
+
+CREATE OR REPLACE FUNCTION vandelay.match_bib_record() RETURNS TRIGGER AS $func$
+DECLARE
+    incoming_existing_id    TEXT;
+    test_result             vandelay.match_set_test_result%ROWTYPE;
+    tmp_rec                 BIGINT;
+    match_set               INT;
+    match_bucket            INT;
+BEGIN
+    IF TG_OP IN ('INSERT','UPDATE') AND NEW.imported_as IS NOT NULL THEN
+        RETURN NEW;
+    END IF;
+
+    DELETE FROM vandelay.bib_match WHERE queued_record = NEW.id;
+
+    SELECT q.match_set INTO match_set FROM vandelay.bib_queue q WHERE q.id = NEW.queue;
+
+    IF match_set IS NOT NULL THEN
+        NEW.quality := vandelay.measure_record_quality( NEW.marc, match_set );
+    END IF;
+
+    -- Perfect matches on 901$c exit early with a match with high quality.
+    incoming_existing_id :=
+        oils_xpath_string('//*[@tag="901"]/*[@code="c"][1]', NEW.marc);
+
+    IF incoming_existing_id IS NOT NULL AND incoming_existing_id != '' THEN
+        SELECT id INTO tmp_rec FROM biblio.record_entry WHERE id = incoming_existing_id::bigint;
+        IF tmp_rec IS NOT NULL THEN
+            INSERT INTO vandelay.bib_match (queued_record, eg_record, match_score, quality) 
+                SELECT
+                    NEW.id, 
+                    b.id,
+                    9999,
+                    -- note: no match_set means quality==0
+                    vandelay.measure_record_quality( b.marc, match_set )
+                FROM biblio.record_entry b
+                WHERE id = incoming_existing_id::bigint;
+        END IF;
+    END IF;
+
+    IF match_set IS NULL THEN
+        RETURN NEW;
+    END IF;
+
+    SELECT q.match_bucket INTO match_bucket FROM vandelay.bib_queue q WHERE q.id = NEW.queue;
+
+    FOR test_result IN SELECT * FROM
+        vandelay.match_set_test_marcxml(match_set, NEW.marc, match_bucket) LOOP
+
+        INSERT INTO vandelay.bib_match ( queued_record, eg_record, match_score, quality )
+            SELECT  
+                NEW.id,
+                test_result.record,
+                test_result.quality,
+                vandelay.measure_record_quality( b.marc, match_set )
+	        FROM  biblio.record_entry b
+	        WHERE id = test_result.record;
+
+    END LOOP;
+
+    RETURN NEW;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+DROP FUNCTION IF EXISTS vandelay.match_set_test_marcxml(INTEGER, TEXT);
+
+CREATE OR REPLACE FUNCTION vandelay.match_set_test_marcxml(
+    match_set_id INTEGER, record_xml TEXT, bucket_id INTEGER 
+) RETURNS SETOF vandelay.match_set_test_result AS $$
+DECLARE
+    tags_rstore HSTORE;
+    svf_rstore  HSTORE;
+    coal        TEXT;
+    joins       TEXT;
+    query_      TEXT;
+    wq          TEXT;
+    qvalue      INTEGER;
+    rec         RECORD;
+BEGIN
+    tags_rstore := vandelay.flatten_marc_hstore(record_xml);
+    svf_rstore := vandelay.extract_rec_attrs(record_xml);
+
+    CREATE TEMPORARY TABLE _vandelay_tmp_qrows (q INTEGER);
+    CREATE TEMPORARY TABLE _vandelay_tmp_jrows (j TEXT);
+
+    -- generate the where clause and return that directly (into wq), and as
+    -- a side-effect, populate the _vandelay_tmp_[qj]rows tables.
+    wq := vandelay.get_expr_from_match_set(match_set_id, tags_rstore);
+
+    query_ := 'SELECT DISTINCT(record), ';
+
+    -- qrows table is for the quality bits we add to the SELECT clause
+    SELECT ARRAY_TO_STRING(
+        ARRAY_ACCUM('COALESCE(n' || q::TEXT || '.quality, 0)'), ' + '
+    ) INTO coal FROM _vandelay_tmp_qrows;
+
+    -- our query string so far is the SELECT clause and the inital FROM.
+    -- no JOINs yet nor the WHERE clause
+    query_ := query_ || coal || ' AS quality ' || E'\n';
+
+    -- jrows table is for the joins we must make (and the real text conditions)
+    SELECT ARRAY_TO_STRING(ARRAY_ACCUM(j), E'\n') INTO joins
+        FROM _vandelay_tmp_jrows;
+
+    -- add those joins and the where clause to our query.
+    query_ := query_ || joins || E'\n';
+
+    -- join the record bucket
+    IF bucket_id IS NOT NULL THEN
+        query_ := query_ || 'JOIN container.biblio_record_entry_bucket_item ' ||
+            'brebi ON (brebi.target_biblio_record_entry = record ' ||
+            'AND brebi.bucket = ' || bucket_id || E')\n';
+    END IF;
+
+    query_ := query_ || 'JOIN biblio.record_entry bre ON (bre.id = record) ' || 'WHERE ' || wq || ' AND not bre.deleted';
+
+    -- this will return rows of record,quality
+    FOR rec IN EXECUTE query_ USING tags_rstore, svf_rstore LOOP
+        RETURN NEXT rec;
+    END LOOP;
+
+    DROP TABLE _vandelay_tmp_qrows;
+    DROP TABLE _vandelay_tmp_jrows;
+    RETURN;
+END;
+$$ LANGUAGE PLPGSQL;
+
+
+SELECT evergreen.upgrade_deps_block_check('0797', :eg_version);
+
+-- New global flags for the purge function
+INSERT INTO config.global_flag  (name, label, enabled)
+    VALUES (
+        'history.hold.retention_age',
+        oils_i18n_gettext('history.hold.retention_age', 'Historical Hold Retention Age', 'cgf', 'label'),
+        TRUE
+    ),(
+        'history.hold.retention_age_fulfilled',
+        oils_i18n_gettext('history.hold.retention_age_fulfilled', 'Historical Hold Retention Age - Fulfilled', 'cgf', 'label'),
+        FALSE
+    ),(
+        'history.hold.retention_age_canceled',
+        oils_i18n_gettext('history.hold.retention_age_canceled', 'Historical Hold Retention Age - Canceled (Default)', 'cgf', 'label'),
+        FALSE
+    ),(
+        'history.hold.retention_age_canceled_1',
+        oils_i18n_gettext('history.hold.retention_age_canceled_1', 'Historical Hold Retention Age - Canceled (Untarged expiration)', 'cgf', 'label'),
+        FALSE
+    ),(
+        'history.hold.retention_age_canceled_2',
+        oils_i18n_gettext('history.hold.retention_age_canceled_2', 'Historical Hold Retention Age - Canceled (Hold Shelf expiration)', 'cgf', 'label'),
+        FALSE
+    ),(
+        'history.hold.retention_age_canceled_3',
+        oils_i18n_gettext('history.hold.retention_age_canceled_3', 'Historical Hold Retention Age - Canceled (Patron via phone)', 'cgf', 'label'),
+        TRUE
+    ),(
+        'history.hold.retention_age_canceled_4',
+        oils_i18n_gettext('history.hold.retention_age_canceled_4', 'Historical Hold Retention Age - Canceled (Patron in person)', 'cgf', 'label'),
+        TRUE
+    ),(
+        'history.hold.retention_age_canceled_5',
+        oils_i18n_gettext('history.hold.retention_age_canceled_5', 'Historical Hold Retention Age - Canceled (Staff forced)', 'cgf', 'label'),
+        TRUE
+    ),(
+        'history.hold.retention_age_canceled_6',
+        oils_i18n_gettext('history.hold.retention_age_canceled_6', 'Historical Hold Retention Age - Canceled (Patron via OPAC)', 'cgf', 'label'),
+        FALSE
+    );
+
+CREATE OR REPLACE FUNCTION action.purge_holds() RETURNS INT AS $func$
+DECLARE
+  current_hold RECORD;
+  purged_holds INT;
+  cgf_d INTERVAL;
+  cgf_f INTERVAL;
+  cgf_c INTERVAL;
+  prev_usr INT;
+  user_start TIMESTAMPTZ;
+  user_age INTERVAL;
+  user_count INT;
+BEGIN
+  purged_holds := 0;
+  SELECT INTO cgf_d value::INTERVAL FROM config.global_flag WHERE name = 'history.hold.retention_age' AND enabled;
+  SELECT INTO cgf_f value::INTERVAL FROM config.global_flag WHERE name = 'history.hold.retention_age_fulfilled' AND enabled;
+  SELECT INTO cgf_c value::INTERVAL FROM config.global_flag WHERE name = 'history.hold.retention_age_canceled' AND enabled;
+  FOR current_hold IN
+    SELECT
+      rank() OVER (PARTITION BY usr ORDER BY COALESCE(fulfillment_time, cancel_time) DESC),
+      cgf_cs.value::INTERVAL as cgf_cs,
+      ahr.*
+    FROM
+      action.hold_request ahr
+      LEFT JOIN config.global_flag cgf_cs ON (ahr.cancel_cause IS NOT NULL AND cgf_cs.name = 'history.hold.retention_age_canceled_' || ahr.cancel_cause AND cgf_cs.enabled)
+    WHERE
+      (fulfillment_time IS NOT NULL OR cancel_time IS NOT NULL)
+  LOOP
+    IF prev_usr IS NULL OR prev_usr != current_hold.usr THEN
+      prev_usr := current_hold.usr;
+      SELECT INTO user_start oils_json_to_text(value)::TIMESTAMPTZ FROM actor.usr_setting WHERE usr = prev_usr AND name = 'history.hold.retention_start';
+      SELECT INTO user_age oils_json_to_text(value)::INTERVAL FROM actor.usr_setting WHERE usr = prev_usr AND name = 'history.hold.retention_age';
+      SELECT INTO user_count oils_json_to_text(value)::INT FROM actor.usr_setting WHERE usr = prev_usr AND name = 'history.hold.retention_count';
+      IF user_start IS NOT NULL THEN
+        user_age := LEAST(user_age, AGE(NOW(), user_start));
+      END IF;
+      IF user_count IS NULL THEN
+        user_count := 1000; -- Assumption based on the user visible holds routine
+      END IF;
+    END IF;
+    -- Library keep age trumps user keep anything, for purposes of being able to hold on to things when staff canceled and such.
+    IF current_hold.fulfillment_time IS NOT NULL AND current_hold.fulfillment_time > NOW() - COALESCE(cgf_f, cgf_d) THEN
+      CONTINUE;
+    END IF;
+    IF current_hold.cancel_time IS NOT NULL AND current_hold.cancel_time > NOW() - COALESCE(current_hold.cgf_cs, cgf_c, cgf_d) THEN
+      CONTINUE;
+    END IF;
+
+    -- User keep age needs combining with count. If too old AND within the count, keep!
+    IF user_start IS NOT NULL AND COALESCE(current_hold.fulfillment_time, current_hold.cancel_time) > NOW() - user_age AND current_hold.rank <= user_count THEN
+      CONTINUE;
+    END IF;
+
+    -- All checks should have passed, delete!
+    DELETE FROM action.hold_request WHERE id = current_hold.id;
+    purged_holds := purged_holds + 1;
+  END LOOP;
+  RETURN purged_holds;
+END;
+$func$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE FUNCTION action.usr_visible_holds (usr_id INT) RETURNS SETOF action.hold_request AS $func$
+DECLARE
+    h               action.hold_request%ROWTYPE;
+    view_age        INTERVAL;
+    view_count      INT;
+    usr_view_count  actor.usr_setting%ROWTYPE;
+    usr_view_age    actor.usr_setting%ROWTYPE;
+    usr_view_start  actor.usr_setting%ROWTYPE;
+BEGIN
+    SELECT * INTO usr_view_count FROM actor.usr_setting WHERE usr = usr_id AND name = 'history.hold.retention_count';
+    SELECT * INTO usr_view_age FROM actor.usr_setting WHERE usr = usr_id AND name = 'history.hold.retention_age';
+    SELECT * INTO usr_view_start FROM actor.usr_setting WHERE usr = usr_id AND name = 'history.hold.retention_start';
+
+    FOR h IN
+        SELECT  *
+          FROM  action.hold_request
+          WHERE usr = usr_id
+                AND fulfillment_time IS NULL
+                AND cancel_time IS NULL
+          ORDER BY request_time DESC
+    LOOP
+        RETURN NEXT h;
+    END LOOP;
+
+    IF usr_view_start.value IS NULL THEN
+        RETURN;
+    END IF;
+
+    IF usr_view_age.value IS NOT NULL THEN
+        -- User opted in and supplied a retention age
+        IF oils_json_to_text(usr_view_age.value)::INTERVAL > AGE(NOW(), oils_json_to_text(usr_view_start.value)::TIMESTAMPTZ) THEN
+            view_age := AGE(NOW(), oils_json_to_text(usr_view_start.value)::TIMESTAMPTZ);
+        ELSE
+            view_age := oils_json_to_text(usr_view_age.value)::INTERVAL;
+        END IF;
+    ELSE
+        -- User opted in
+        view_age := AGE(NOW(), oils_json_to_text(usr_view_start.value)::TIMESTAMPTZ);
+    END IF;
+
+    IF usr_view_count.value IS NOT NULL THEN
+        view_count := oils_json_to_text(usr_view_count.value)::INT;
+    ELSE
+        view_count := 1000;
+    END IF;
+
+    -- show some fulfilled/canceled holds
+    FOR h IN
+        SELECT  *
+          FROM  action.hold_request
+          WHERE usr = usr_id
+                AND ( fulfillment_time IS NOT NULL OR cancel_time IS NOT NULL )
+                AND COALESCE(fulfillment_time, cancel_time) > NOW() - view_age
+          ORDER BY COALESCE(fulfillment_time, cancel_time) DESC
+          LIMIT view_count
+    LOOP
+        RETURN NEXT h;
+    END LOOP;
+
+    RETURN;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+CREATE TABLE action.aged_hold_request (
+    usr_post_code		TEXT,
+    usr_home_ou		INT	NOT NULL,
+    usr_profile		INT	NOT NULL,
+    usr_birth_year		INT,
+    staff_placed        BOOLEAN NOT NULL,
+    LIKE action.hold_request
+);
+ALTER TABLE action.aged_hold_request
+      ADD PRIMARY KEY (id),
+      DROP COLUMN usr,
+      DROP COLUMN requestor,
+      DROP COLUMN sms_carrier,
+      ALTER COLUMN phone_notify TYPE BOOLEAN
+            USING CASE WHEN phone_notify IS NULL OR phone_notify = '' THEN FALSE ELSE TRUE END,
+      ALTER COLUMN sms_notify TYPE BOOLEAN
+            USING CASE WHEN sms_notify IS NULL OR sms_notify = '' THEN FALSE ELSE TRUE END,
+      ALTER COLUMN phone_notify SET NOT NULL,
+      ALTER COLUMN sms_notify SET NOT NULL;
+CREATE INDEX aged_hold_request_target_idx ON action.aged_hold_request (target);
+CREATE INDEX aged_hold_request_pickup_lib_idx ON action.aged_hold_request (pickup_lib);
+CREATE INDEX aged_hold_request_current_copy_idx ON action.aged_hold_request (current_copy);
+CREATE INDEX aged_hold_request_fulfillment_staff_idx ON action.aged_hold_request ( fulfillment_staff );
+
+CREATE OR REPLACE VIEW action.all_hold_request AS
+    SELECT DISTINCT
+           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,
+           CAST(ahr.requestor <> ahr.usr AS BOOLEAN) AS staff_placed,
+           ahr.id,
+           ahr.request_time,
+           ahr.capture_time,
+           ahr.fulfillment_time,
+           ahr.checkin_time,
+           ahr.return_time,
+           ahr.prev_check_time,
+           ahr.expire_time,
+           ahr.cancel_time,
+           ahr.cancel_cause,
+           ahr.cancel_note,
+           ahr.target,
+           ahr.current_copy,
+           ahr.fulfillment_staff,
+           ahr.fulfillment_lib,
+           ahr.request_lib,
+           ahr.selection_ou,
+           ahr.selection_depth,
+           ahr.pickup_lib,
+           ahr.hold_type,
+           ahr.holdable_formats,
+           CASE
+           WHEN ahr.phone_notify IS NULL THEN FALSE
+           WHEN ahr.phone_notify = '' THEN FALSE
+           ELSE TRUE
+           END AS phone_notify,
+           ahr.email_notify,
+           CASE
+           WHEN ahr.sms_notify IS NULL THEN FALSE
+           WHEN ahr.sms_notify = '' THEN FALSE
+           ELSE TRUE
+           END AS sms_notify,
+           ahr.frozen,
+           ahr.thaw_date,
+           ahr.shelf_time,
+           ahr.cut_in_line,
+           ahr.mint_condition,
+           ahr.shelf_expire_time,
+           ahr.current_shelf_lib
+    FROM action.hold_request ahr
+         JOIN actor.usr p ON (ahr.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)
+    UNION ALL
+    SELECT 
+           usr_post_code,
+           usr_home_ou,
+           usr_profile,
+           usr_birth_year,
+           staff_placed,
+           id,
+           request_time,
+           capture_time,
+           fulfillment_time,
+           checkin_time,
+           return_time,
+           prev_check_time,
+           expire_time,
+           cancel_time,
+           cancel_cause,
+           cancel_note,
+           target,
+           current_copy,
+           fulfillment_staff,
+           fulfillment_lib,
+           request_lib,
+           selection_ou,
+           selection_depth,
+           pickup_lib,
+           hold_type,
+           holdable_formats,
+           phone_notify,
+           email_notify,
+           sms_notify,
+           frozen,
+           thaw_date,
+           shelf_time,
+           cut_in_line,
+           mint_condition,
+           shelf_expire_time,
+           current_shelf_lib
+    FROM action.aged_hold_request;
+
+CREATE OR REPLACE FUNCTION action.age_hold_on_delete () RETURNS TRIGGER AS $$
+DECLARE
+BEGIN
+    -- Archive a copy of the old row to action.aged_hold_request
+
+    INSERT INTO action.aged_hold_request
+           (usr_post_code,
+            usr_home_ou,
+            usr_profile,
+            usr_birth_year,
+            staff_placed,
+            id,
+            request_time,
+            capture_time,
+            fulfillment_time,
+            checkin_time,
+            return_time,
+            prev_check_time,
+            expire_time,
+            cancel_time,
+            cancel_cause,
+            cancel_note,
+            target,
+            current_copy,
+            fulfillment_staff,
+            fulfillment_lib,
+            request_lib,
+            selection_ou,
+            selection_depth,
+            pickup_lib,
+            hold_type,
+            holdable_formats,
+            phone_notify,
+            email_notify,
+            sms_notify,
+            frozen,
+            thaw_date,
+            shelf_time,
+            cut_in_line,
+            mint_condition,
+            shelf_expire_time,
+            current_shelf_lib)
+      SELECT 
+           usr_post_code,
+           usr_home_ou,
+           usr_profile,
+           usr_birth_year,
+           staff_placed,
+           id,
+           request_time,
+           capture_time,
+           fulfillment_time,
+           checkin_time,
+           return_time,
+           prev_check_time,
+           expire_time,
+           cancel_time,
+           cancel_cause,
+           cancel_note,
+           target,
+           current_copy,
+           fulfillment_staff,
+           fulfillment_lib,
+           request_lib,
+           selection_ou,
+           selection_depth,
+           pickup_lib,
+           hold_type,
+           holdable_formats,
+           phone_notify,
+           email_notify,
+           sms_notify,
+           frozen,
+           thaw_date,
+           shelf_time,
+           cut_in_line,
+           mint_condition,
+           shelf_expire_time,
+           current_shelf_lib
+        FROM action.all_hold_request WHERE id = OLD.id;
+
+    RETURN OLD;
+END;
+$$ LANGUAGE 'plpgsql';
+
+CREATE TRIGGER action_hold_request_aging_tgr
+	BEFORE DELETE ON action.hold_request
+	FOR EACH ROW
+	EXECUTE PROCEDURE action.age_hold_on_delete ();
+
+
+SELECT evergreen.upgrade_deps_block_check('0798', :eg_version);
+
+INSERT INTO config.global_flag (name, label)
+    VALUES (
+        'history.circ.retention_uses_last_finished',
+        oils_i18n_gettext(
+            'history.circ.retention_uses_last_finished',
+            'Historical Circulations use most recent xact_finish date instead of last circ''s.',
+            'cgf',
+            'label'
+        )
+    ),(
+        'history.circ.retention_age_is_min',
+        oils_i18n_gettext(
+            'history.circ.retention_age_is_min',
+            'Historical Circulations are kept for global retention age at a minimum, regardless of user preferences.',
+            'cgf',
+            'label'
+        )
+    );
+
+
+-- Drop old variants
+DROP FUNCTION IF EXISTS action.circ_chain(INTEGER);
+DROP FUNCTION IF EXISTS action.summarize_circ_chain(INTEGER);
+
+CREATE OR REPLACE FUNCTION action.circ_chain ( ctx_circ_id BIGINT ) RETURNS SETOF action.circulation AS $$
+DECLARE
+    tmp_circ action.circulation%ROWTYPE;
+    circ_0 action.circulation%ROWTYPE;
+BEGIN
+
+    SELECT INTO tmp_circ * FROM action.circulation WHERE id = ctx_circ_id;
+
+    IF tmp_circ IS NULL THEN
+        RETURN NEXT tmp_circ;
+    END IF;
+    circ_0 := tmp_circ;
+
+    -- find the front of the chain
+    WHILE TRUE LOOP
+        SELECT INTO tmp_circ * FROM action.circulation WHERE id = tmp_circ.parent_circ;
+        IF tmp_circ IS NULL THEN
+            EXIT;
+        END IF;
+        circ_0 := tmp_circ;
+    END LOOP;
+
+    -- now send the circs to the caller, oldest to newest
+    tmp_circ := circ_0;
+    WHILE TRUE LOOP
+        IF tmp_circ IS NULL THEN
+            EXIT;
+        END IF;
+        RETURN NEXT tmp_circ;
+        SELECT INTO tmp_circ * FROM action.circulation WHERE parent_circ = tmp_circ.id;
+    END LOOP;
+
+END;
+$$ LANGUAGE 'plpgsql';
+
+CREATE OR REPLACE FUNCTION action.summarize_circ_chain ( ctx_circ_id BIGINT ) RETURNS action.circ_chain_summary AS $$
+
+DECLARE
+
+    -- first circ in the chain
+    circ_0 action.circulation%ROWTYPE;
+
+    -- last circ in the chain
+    circ_n action.circulation%ROWTYPE;
+
+    -- circ chain under construction
+    chain action.circ_chain_summary;
+    tmp_circ action.circulation%ROWTYPE;
+
+BEGIN
+    
+    chain.num_circs := 0;
+    FOR tmp_circ IN SELECT * FROM action.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';
+
+CREATE OR REPLACE FUNCTION action.purge_circulations () RETURNS INT AS $func$
+DECLARE
+    usr_keep_age    actor.usr_setting%ROWTYPE;
+    usr_keep_start  actor.usr_setting%ROWTYPE;
+    org_keep_age    INTERVAL;
+    org_use_last    BOOL = false;
+    org_age_is_min  BOOL = false;
+    org_keep_count  INT;
+
+    keep_age        INTERVAL;
+
+    target_acp      RECORD;
+    circ_chain_head action.circulation%ROWTYPE;
+    circ_chain_tail action.circulation%ROWTYPE;
+
+    count_purged    INT;
+    num_incomplete  INT;
+
+    last_finished   TIMESTAMP WITH TIME ZONE;
+BEGIN
+
+    count_purged := 0;
+
+    SELECT value::INTERVAL INTO org_keep_age FROM config.global_flag WHERE name = 'history.circ.retention_age' AND enabled;
+
+    SELECT value::INT INTO org_keep_count FROM config.global_flag WHERE name = 'history.circ.retention_count' AND enabled;
+    IF org_keep_count IS NULL THEN
+        RETURN count_purged; -- Gimme a count to keep, or I keep them all, forever
+    END IF;
+
+    SELECT enabled INTO org_use_last FROM config.global_flag WHERE name = 'history.circ.retention_uses_last_finished';
+    SELECT enabled INTO org_age_is_min FROM config.global_flag WHERE name = 'history.circ.retention_age_is_min';
+
+    -- First, find copies with more than keep_count non-renewal circs
+    FOR target_acp IN
+        SELECT  target_copy,
+                COUNT(*) AS total_real_circs
+          FROM  action.circulation
+          WHERE parent_circ IS NULL
+                AND xact_finish IS NOT NULL
+          GROUP BY target_copy
+          HAVING COUNT(*) > org_keep_count
+    LOOP
+        -- And, for those, select circs that are finished and older than keep_age
+        FOR circ_chain_head IN
+            -- For reference, the subquery uses a window function to order the circs newest to oldest and number them
+            -- The outer query then uses that information to skip the most recent set the library wants to keep
+            -- End result is we don't care what order they come out in, as they are all potentials for deletion.
+            SELECT ac.* FROM action.circulation ac JOIN (
+              SELECT  rank() OVER (ORDER BY xact_start DESC), ac.id
+                FROM  action.circulation ac
+                WHERE ac.target_copy = target_acp.target_copy
+                  AND ac.parent_circ IS NULL
+                ORDER BY ac.xact_start ) ranked USING (id)
+                WHERE ranked.rank > org_keep_count
+        LOOP
+
+            SELECT * INTO circ_chain_tail FROM action.circ_chain(circ_chain_head.id) ORDER BY xact_start DESC LIMIT 1;
+            SELECT COUNT(CASE WHEN xact_finish IS NULL THEN 1 ELSE NULL END), MAX(xact_finish) INTO num_incomplete, last_finished FROM action.circ_chain(circ_chain_head.id);
+            CONTINUE WHEN circ_chain_tail.xact_finish IS NULL OR num_incomplete > 0;
+
+            IF NOT org_use_last THEN
+                last_finished := circ_chain_tail.xact_finish;
+            END IF;
+
+            -- Now get the user settings, if any, to block purging if the user wants to keep more circs
+            usr_keep_age.value := NULL;
+            SELECT * INTO usr_keep_age FROM actor.usr_setting WHERE usr = circ_chain_head.usr AND name = 'history.circ.retention_age';
+
+            usr_keep_start.value := NULL;
+            SELECT * INTO usr_keep_start FROM actor.usr_setting WHERE usr = circ_chain_head.usr AND name = 'history.circ.retention_start';
+
+            IF usr_keep_age.value IS NOT NULL AND usr_keep_start.value IS NOT NULL THEN
+                IF oils_json_to_text(usr_keep_age.value)::INTERVAL > AGE(NOW(), oils_json_to_text(usr_keep_start.value)::TIMESTAMPTZ) THEN
+                    keep_age := AGE(NOW(), oils_json_to_text(usr_keep_start.value)::TIMESTAMPTZ);
+                ELSE
+                    keep_age := oils_json_to_text(usr_keep_age.value)::INTERVAL;
+                END IF;
+            ELSIF usr_keep_start.value IS NOT NULL THEN
+                keep_age := AGE(NOW(), oils_json_to_text(usr_keep_start.value)::TIMESTAMPTZ);
+            ELSE
+                keep_age := COALESCE( org_keep_age, '2000 years'::INTERVAL );
+            END IF;
+
+            IF org_age_is_min THEN
+                keep_age := GREATEST( keep_age, org_keep_age );
+            END IF;
+
+            CONTINUE WHEN AGE(NOW(), last_finished) < keep_age;
+
+            -- We've passed the purging tests, purge the circ chain starting at the end
+            -- A trigger should auto-purge the rest of the chain.
+            DELETE FROM action.circulation WHERE id = circ_chain_tail.id;
+
+            count_purged := count_purged + 1;
+
+        END LOOP;
+    END LOOP;
+
+    return count_purged;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+SELECT evergreen.upgrade_deps_block_check('0799', :eg_version);
+
+-- allow state to be null
+ALTER TABLE actor.usr_address ALTER COLUMN state DROP NOT NULL;
+
+-- create new YAOUS
+INSERT into config.org_unit_setting_type
+    (name, grp, label, description, datatype)
+    VALUES (
+        'ui.patron.edit.au.state.require',
+        'gui',
+        oils_i18n_gettext(
+            'ui.patron.edit.au.state.require',
+            'Require State field on patron registration',
+            'coust',
+            'label'
+        ),
+        oils_i18n_gettext(
+            'ui.patron.edit.au.state.require',
+            'The State field will be required on the patron registration screen.',
+            'coust',
+            'description'
+        ),
+        'bool'
+    );
+
+INSERT into config.org_unit_setting_type
+    (name, grp, label, description, datatype)
+    VALUES (
+        'ui.patron.edit.au.state.show',
+        'gui',
+        oils_i18n_gettext(
+            'ui.patron.edit.au.state.show',
+            'Show State field on patron registration',
+            'coust',
+            'label'
+        ),
+        oils_i18n_gettext(
+            'ui.patron.edit.au.state.show',
+            'The State field will be shown on the patron registration screen. Showing a field makes it appear with required fields even when not required. If the field is required this setting is ignored.',
+            'coust',
+            'description'
+        ),
+        'bool'
+    );	
+
+INSERT into config.org_unit_setting_type
+    (name, grp, label, description, datatype)
+    VALUES (
+        'ui.patron.edit.au.state.suggest',
+        'gui',
+        oils_i18n_gettext(
+            'ui.patron.edit.au.state.suggest',
+            'Suggest State field on patron registration',
+            'coust',
+            'label'
+        ),
+        oils_i18n_gettext(
+            'ui.patron.edit.au.state.suggest',
+            'The State field will be suggested on the patron registration screen. Suggesting a field makes it appear when suggested fields are shown. If the field is shown or required this setting is ignored.',
+            'coust',
+            'description'
+        ),
+        'bool'
+    );		
+
+
+SELECT evergreen.upgrade_deps_block_check('0801', :eg_version);
+
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype, fm_class ) VALUES
+( 'ui.patron.edit.ac.barcode.regex', 'gui',
+    oils_i18n_gettext('ui.patron.edit.ac.barcode.regex',
+        'Regex for barcodes on patron registration',
+        'coust', 'label'),
+    oils_i18n_gettext('ui.patron.edit.ac.barcode.regex',
+        'The Regular Expression for validation on barcodes in patron registration.',
+        'coust', 'description'),
+    'string', null);
+
+
+SELECT evergreen.upgrade_deps_block_check('0802', :eg_version);
+
+CREATE OR REPLACE FUNCTION authority.normalize_heading( marcxml TEXT, no_thesaurus BOOL ) RETURNS TEXT AS $func$
+DECLARE
+    acsaf           authority.control_set_authority_field%ROWTYPE;
+    tag_used        TEXT;
+    nfi_used        TEXT;
+    sf              TEXT;
+    sf_node         TEXT;
+    tag_node        TEXT;
+    thes_code       TEXT;
+    cset            INT;
+    heading_text    TEXT;
+    tmp_text        TEXT;
+    first_sf        BOOL;
+    auth_id         INT DEFAULT COALESCE(NULLIF(oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml), ''), '0')::INT;
+BEGIN
+    SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
+
+    IF cset IS NULL THEN
+        SELECT  control_set INTO cset
+          FROM  authority.control_set_authority_field
+          WHERE tag IN ( SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]))
+          LIMIT 1;
+    END IF;
+
+    thes_code := vandelay.marc21_extract_fixed_field(marcxml,'Subj');
+    IF thes_code IS NULL THEN
+        thes_code := '|';
+    ELSIF thes_code = 'z' THEN
+        thes_code := COALESCE( oils_xpath_string('//*[@tag="040"]/*[@code="f"][1]', marcxml), '' );
+    END IF;
+
+    heading_text := '';
+    FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset AND main_entry IS NULL LOOP
+        tag_used := acsaf.tag;
+        nfi_used := acsaf.nfi;
+        first_sf := TRUE;
+
+        FOR tag_node IN SELECT unnest(oils_xpath('//*[@tag="'||tag_used||'"]',marcxml)) LOOP
+            FOR sf_node IN SELECT unnest(oils_xpath('//*[contains("'||acsaf.sf_list||'", at code)]',tag_node)) LOOP
+
+                tmp_text := oils_xpath_string('.', sf_node);
+                sf := oils_xpath_string('./@code', sf_node);
+
+                IF first_sf AND tmp_text IS NOT NULL AND nfi_used IS NOT NULL THEN
+
+                    tmp_text := SUBSTRING(
+                        tmp_text FROM
+                        COALESCE(
+                            NULLIF(
+                                REGEXP_REPLACE(
+                                    oils_xpath_string('./@ind'||nfi_used, tag_node),
+                                    $$\D+$$,
+                                    '',
+                                    'g'
+                                ),
+                                ''
+                            )::INT,
+                            0
+                        ) + 1
+                    );
+
+                END IF;
+
+                first_sf := FALSE;
+
+                IF tmp_text IS NOT NULL AND tmp_text <> '' THEN
+                    heading_text := heading_text || E'\u2021' || sf || ' ' || tmp_text;
+                END IF;
+            END LOOP;
+
+            EXIT WHEN heading_text <> '';
+        END LOOP;
+
+        EXIT WHEN heading_text <> '';
+    END LOOP;
+
+    IF heading_text <> '' THEN
+        IF no_thesaurus IS TRUE THEN
+            heading_text := tag_used || ' ' || public.naco_normalize(heading_text);
+        ELSE
+            heading_text := tag_used || '_' || COALESCE(nfi_used,'-') || '_' || thes_code || ' ' || public.naco_normalize(heading_text);
+        END IF;
+    ELSE
+        heading_text := 'NOHEADING_' || thes_code || ' ' || MD5(marcxml);
+    END IF;
+
+    RETURN heading_text;
+END;
+$func$ LANGUAGE PLPGSQL IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION authority.simple_heading_set( marcxml TEXT ) RETURNS SETOF authority.simple_heading AS $func$
+DECLARE
+    res             authority.simple_heading%ROWTYPE;
+    acsaf           authority.control_set_authority_field%ROWTYPE;
+    tag_used        TEXT;
+    nfi_used        TEXT;
+    sf              TEXT;
+    cset            INT;
+    heading_text    TEXT;
+    sort_text       TEXT;
+    tmp_text        TEXT;
+    tmp_xml         TEXT;
+    first_sf        BOOL;
+    auth_id         INT DEFAULT oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml)::INT;
+BEGIN
+
+    res.record := auth_id;
+
+    SELECT  control_set INTO cset
+      FROM  authority.control_set_authority_field
+      WHERE tag IN ( SELECT UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]) )
+      LIMIT 1;
+
+    FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset LOOP
+
+        res.atag := acsaf.id;
+        tag_used := acsaf.tag;
+        nfi_used := acsaf.nfi;
+
+        FOR tmp_xml IN SELECT UNNEST(XPATH('//*[@tag="'||tag_used||'"]', marcxml::XML)) LOOP
+
+            heading_text := public.naco_normalize(
+                COALESCE(
+                    oils_xpath_string('//*[contains("'||acsaf.sf_list||'", at code)]',tmp_xml::TEXT, ' '),
+                    ''
+                )
+            );
+
+            IF nfi_used IS NOT NULL THEN
+
+                sort_text := SUBSTRING(
+                    heading_text FROM
+                    COALESCE(
+                        NULLIF(
+                            REGEXP_REPLACE(
+                                oils_xpath_string('./@ind'||nfi_used, tmp_xml::TEXT),
+                                $$\D+$$,
+                                '',
+                                'g'
+                            ),
+                            ''
+                        )::INT,
+                        0
+                    ) + 1
+                );
+
+            ELSE
+                sort_text := heading_text;
+            END IF;
+
+            IF heading_text IS NOT NULL AND heading_text <> '' THEN
+                res.value := heading_text;
+                res.sort_value := sort_text;
+                RETURN NEXT res;
+            END IF;
+
+        END LOOP;
+
+    END LOOP;
+
+    RETURN;
+END;
+$func$ LANGUAGE PLPGSQL IMMUTABLE;
+
+
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0805', :eg_version);
+
+INSERT INTO config.global_flag (name, label, enabled)
+    VALUES (
+        'circ.desk_renewal.use_original_circ_lib',
+        oils_i18n_gettext(
+            'circ.desk_renewal.use_original_circ_lib',
+            'Circ: Use original circulation library on desk renewal instead of user home library',
+            'cgf',
+            'label'
+        ),
+        FALSE
+    );
+
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0806', :eg_version);
+
+INSERT INTO action.hold_request_cancel_cause (id,label) 
+    VALUES (7,'Patron via SIP');
+
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0807', :eg_version);
+
+ALTER TABLE config.usr_setting_type
+    ADD COLUMN reg_default TEXT;
+
+
+SELECT evergreen.upgrade_deps_block_check('0809', :eg_version);
+
+ALTER TABLE actor.org_address ALTER COLUMN state DROP NOT NULL;
+
+
+-- Evergreen DB patch 0812.data.add_library_info_url_OUS.sql
+--
+-- Adds YAOUS for enabling information links from the TPAC to a library URL
+--
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0812', :eg_version);
+
+-- FIXME: add/check SQL statements to perform the upgrade
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype, fm_class ) VALUES
+( 'lib.info_url', 'lib',
+    oils_i18n_gettext('lib.info_url',
+        'Library information URL (such as "http://example.com/about.html")',
+        'coust', 'label'),
+    oils_i18n_gettext('lib.info_url',
+        'URL for information on this library, such as contact information, hours of operation, and directions. If set, the library name in the copy details section links to that URL. Use a complete URL, such as "http://example.com/hours.html".',
+        'coust', 'description'),
+    'string', null)
+;
+
+
+SELECT evergreen.upgrade_deps_block_check('0813', :eg_version);
+
+-- Don't require state in the auditor tracking for user addresses
+
+ALTER TABLE auditor.actor_usr_address_history ALTER COLUMN state DROP NOT NULL;
+
+-- Change constraint on actor.org_unit_setting_log to be deferrable initially
+
+ALTER TABLE config.org_unit_setting_type_log
+  DROP CONSTRAINT org_unit_setting_type_log_field_name_fkey,
+  ADD CONSTRAINT org_unit_setting_type_log_field_name_fkey FOREIGN KEY (field_name)
+    REFERENCES config.org_unit_setting_type (name) MATCH SIMPLE
+    ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED;
+
+-- Fix names in the org unit setting configuration
+
+UPDATE config.org_unit_setting_type SET name = overlay(name placing 'aua' from 16 for 2) where name like 'ui.patron.edit.au.state.%';
+
+-- Fix names if they have already been set in the editor
+
+UPDATE actor.org_unit_setting SET name = overlay(name placing 'aua' from 16 for 2) where name like 'ui.patron.edit.au.state.%';
+
+-- and the logs too
+
+UPDATE config.org_unit_setting_type_log SET field_name = overlay(field_name placing 'aua' from 16 for 2) where field_name like 'ui.patron.edit.au.state.%';
+
+
+SELECT evergreen.upgrade_deps_block_check('0814', :eg_version);
+
+UPDATE permission.perm_list
+SET description = 'Allow a user to delete a provider'
+WHERE code = 'DELETE_PROVIDER';
+
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0815', :eg_version);
+
+ALTER TABLE authority.control_set_authority_field
+    ADD COLUMN linking_subfield CHAR(1);
+
+UPDATE authority.control_set_authority_field
+    SET linking_subfield = '0' WHERE main_entry IS NOT NULL;
+
+CREATE TABLE authority.authority_linking (
+    id      BIGSERIAL PRIMARY KEY,
+    source  BIGINT REFERENCES authority.record_entry (id) NOT NULL,
+    target  BIGINT REFERENCES authority.record_entry (id) NOT NULL,
+    field   INT REFERENCES authority.control_set_authority_field (id) NOT NULL
+);
+
+-- Given an authority record's ID, control set ID (if known), and marc::XML,
+-- return all links to other authority records in the form of rows that
+-- can be inserted into authority.authority_linking.
+CREATE OR REPLACE FUNCTION authority.calculate_authority_linking(
+    rec_id BIGINT, rec_control_set INT, rec_marc_xml XML
+) RETURNS SETOF authority.authority_linking AS $func$
+DECLARE
+    acsaf       authority.control_set_authority_field%ROWTYPE;
+    link        TEXT;
+    aal         authority.authority_linking%ROWTYPE;
+BEGIN
+    IF rec_control_set IS NULL THEN
+        -- No control_set on record?  Guess at one
+        SELECT control_set INTO rec_control_set
+            FROM authority.control_set_authority_field
+            WHERE tag IN (
+                SELECT UNNEST(
+                    XPATH('//*[starts-with(@tag,"1")]/@tag',rec_marc_xml::XML)::TEXT[]
+                )
+            ) LIMIT 1;
+
+        IF NOT FOUND THEN
+            RAISE WARNING 'Could not even guess at control set for authority record %', rec_id;
+            RETURN;
+        END IF;
+    END IF;
+
+    aal.source := rec_id;
+
+    FOR acsaf IN
+        SELECT * FROM authority.control_set_authority_field
+        WHERE control_set = rec_control_set
+            AND linking_subfield IS NOT NULL
+            AND main_entry IS NOT NULL
+    LOOP
+        link := SUBSTRING(
+            (XPATH('//*[@tag="' || acsaf.tag || '"]/*[@code="' ||
+                acsaf.linking_subfield || '"]/text()', rec_marc_xml))[1]::TEXT,
+            '\d+$'
+        );
+
+        -- Ignore links that are null, malformed, circular, or point to
+        -- non-existent authority records.
+        IF link IS NOT NULL AND link::BIGINT <> rec_id THEN
+            PERFORM * FROM authority.record_entry WHERE id = link::BIGINT;
+            IF FOUND THEN
+                aal.target := link::BIGINT;
+                aal.field := acsaf.id;
+                RETURN NEXT aal;
+            END IF;
+        END IF;
+    END LOOP;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+-- AFTER UPDATE OR INSERT trigger for authority.record_entry
+CREATE OR REPLACE FUNCTION authority.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$
+BEGIN
+
+    IF NEW.deleted IS TRUE THEN -- If this authority is deleted
+        DELETE FROM authority.bib_linking WHERE authority = NEW.id; -- Avoid updating fields in bibs that are no longer visible
+        DELETE FROM authority.full_rec WHERE record = NEW.id; -- Avoid validating fields against deleted authority records
+        DELETE FROM authority.simple_heading WHERE record = NEW.id;
+          -- Should remove matching $0 from controlled fields at the same time?
+
+        -- XXX What do we about the actual linking subfields present in
+        -- authority records that target this one when this happens?
+        DELETE FROM authority.authority_linking
+            WHERE source = NEW.id OR target = NEW.id;
+
+        RETURN NEW; -- and we're done
+    END IF;
+
+    IF TG_OP = 'UPDATE' THEN -- re-ingest?
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled;
+
+        IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change
+            RETURN NEW;
+        END IF;
+
+        -- Propagate these updates to any linked bib records
+        PERFORM authority.propagate_changes(NEW.id) FROM authority.record_entry WHERE id = NEW.id;
+
+        DELETE FROM authority.simple_heading WHERE record = NEW.id;
+        DELETE FROM authority.authority_linking WHERE source = NEW.id;
+    END IF;
+
+    INSERT INTO authority.authority_linking (source, target, field)
+        SELECT source, target, field FROM authority.calculate_authority_linking(
+            NEW.id, NEW.control_set, NEW.marc::XML
+        );
+
+    INSERT INTO authority.simple_heading (record,atag,value,sort_value)
+        SELECT record, atag, value, sort_value FROM authority.simple_heading_set(NEW.marc);
+
+    -- Flatten and insert the afr data
+    PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_full_rec' AND enabled;
+    IF NOT FOUND THEN
+        PERFORM authority.reingest_authority_full_rec(NEW.id);
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_rec_descriptor' AND enabled;
+        IF NOT FOUND THEN
+            PERFORM authority.reingest_authority_rec_descriptor(NEW.id);
+        END IF;
+    END IF;
+
+    RETURN NEW;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0816', :eg_version);
+
+-- To avoid problems with altering a table column after doing an
+-- update.
+ALTER TABLE authority.control_set_authority_field
+    DISABLE TRIGGER ALL;
+
+ALTER TABLE authority.control_set_authority_field
+    ADD COLUMN display_sf_list TEXT;
+
+UPDATE authority.control_set_authority_field
+    SET display_sf_list = REGEXP_REPLACE(sf_list, '[w254]', '', 'g');
+
+ALTER TABLE authority.control_set_authority_field
+    ALTER COLUMN display_sf_list SET NOT NULL;
+
+ALTER TABLE authority.control_set_authority_field
+    ENABLE TRIGGER ALL;
+
+ALTER TABLE metabib.browse_entry_def_map
+    ADD COLUMN authority BIGINT REFERENCES authority.record_entry (id)
+        ON DELETE SET NULL;
+
+ALTER TABLE config.metabib_field ADD COLUMN authority_xpath TEXT;
+ALTER TABLE config.metabib_field ADD COLUMN browse_sort_xpath TEXT;
+
+UPDATE config.metabib_field
+    SET authority_xpath = '//@xlink:href'
+    WHERE
+        format = 'mods32' AND
+        field_class IN ('subject','series','title','author') AND
+        browse_field IS TRUE;
+
+ALTER TYPE metabib.field_entry_template ADD ATTRIBUTE authority BIGINT;
+ALTER TYPE metabib.field_entry_template ADD ATTRIBUTE sort_value TEXT;
+
+CREATE OR REPLACE FUNCTION metabib.reingest_metabib_field_entries( bib_id BIGINT, skip_facet BOOL DEFAULT FALSE, skip_browse BOOL DEFAULT FALSE, skip_search BOOL DEFAULT FALSE ) RETURNS VOID AS $func$
+DECLARE
+    fclass          RECORD;
+    ind_data        metabib.field_entry_template%ROWTYPE;
+    mbe_row         metabib.browse_entry%ROWTYPE;
+    mbe_id          BIGINT;
+    b_skip_facet    BOOL;
+    b_skip_browse   BOOL;
+    b_skip_search   BOOL;
+    value_prepped   TEXT;
+BEGIN
+
+    SELECT COALESCE(NULLIF(skip_facet, FALSE), EXISTS (SELECT enabled FROM config.internal_flag WHERE name =  'ingest.skip_facet_indexing' AND enabled)) INTO b_skip_facet;
+    SELECT COALESCE(NULLIF(skip_browse, FALSE), EXISTS (SELECT enabled FROM config.internal_flag WHERE name =  'ingest.skip_browse_indexing' AND enabled)) INTO b_skip_browse;
+    SELECT COALESCE(NULLIF(skip_search, FALSE), EXISTS (SELECT enabled FROM config.internal_flag WHERE name =  'ingest.skip_search_indexing' AND enabled)) INTO b_skip_search;
+
+    PERFORM * FROM config.internal_flag WHERE name = 'ingest.assume_inserts_only' AND enabled;
+    IF NOT FOUND THEN
+        IF NOT b_skip_search THEN
+            FOR fclass IN SELECT * FROM config.metabib_class LOOP
+                -- RAISE NOTICE 'Emptying out %', fclass.name;
+                EXECUTE $$DELETE FROM metabib.$$ || fclass.name || $$_field_entry WHERE source = $$ || bib_id;
+            END LOOP;
+        END IF;
+        IF NOT b_skip_facet THEN
+            DELETE FROM metabib.facet_entry WHERE source = bib_id;
+        END IF;
+        IF NOT b_skip_browse THEN
+            DELETE FROM metabib.browse_entry_def_map WHERE source = bib_id;
+        END IF;
+    END IF;
+
+    FOR ind_data IN SELECT * FROM biblio.extract_metabib_field_entry( bib_id ) LOOP
+        IF ind_data.field < 0 THEN
+            ind_data.field = -1 * ind_data.field;
+        END IF;
+
+        IF ind_data.facet_field AND NOT b_skip_facet THEN
+            INSERT INTO metabib.facet_entry (field, source, value)
+                VALUES (ind_data.field, ind_data.source, ind_data.value);
+        END IF;
+
+        IF ind_data.browse_field AND NOT b_skip_browse THEN
+            -- A caveat about this SELECT: this should take care of replacing
+            -- old mbe rows when data changes, but not if normalization (by
+            -- which I mean specifically the output of
+            -- evergreen.oils_tsearch2()) changes.  It may or may not be
+            -- expensive to add a comparison of index_vector to index_vector
+            -- to the WHERE clause below.
+
+            value_prepped := metabib.browse_normalize(ind_data.value, ind_data.field);
+            SELECT INTO mbe_row * FROM metabib.browse_entry
+                WHERE value = value_prepped AND sort_value = ind_data.sort_value;
+
+            IF FOUND THEN
+                mbe_id := mbe_row.id;
+            ELSE
+                INSERT INTO metabib.browse_entry
+                    ( value, sort_value ) VALUES
+                    ( value_prepped, ind_data.sort_value );
+
+                mbe_id := CURRVAL('metabib.browse_entry_id_seq'::REGCLASS);
+            END IF;
+
+            INSERT INTO metabib.browse_entry_def_map (entry, def, source, authority)
+                VALUES (mbe_id, ind_data.field, ind_data.source, ind_data.authority);
+        END IF;
+
+        IF ind_data.search_field AND NOT b_skip_search THEN
+            EXECUTE $$
+                INSERT INTO metabib.$$ || ind_data.field_class || $$_field_entry (field, source, value)
+                    VALUES ($$ ||
+                        quote_literal(ind_data.field) || $$, $$ ||
+                        quote_literal(ind_data.source) || $$, $$ ||
+                        quote_literal(ind_data.value) ||
+                    $$);$$;
+        END IF;
+
+    END LOOP;
+
+    IF NOT b_skip_search THEN
+        PERFORM metabib.update_combined_index_vectors(bib_id);
+    END IF;
+
+    RETURN;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+CREATE OR REPLACE FUNCTION biblio.extract_metabib_field_entry ( rid BIGINT, default_joiner TEXT ) RETURNS SETOF metabib.field_entry_template AS $func$
+DECLARE
+    bib     biblio.record_entry%ROWTYPE;
+    idx     config.metabib_field%ROWTYPE;
+    xfrm        config.xml_transform%ROWTYPE;
+    prev_xfrm   TEXT;
+    transformed_xml TEXT;
+    xml_node    TEXT;
+    xml_node_list   TEXT[];
+    facet_text  TEXT;
+    browse_text TEXT;
+    sort_value  TEXT;
+    raw_text    TEXT;
+    curr_text   TEXT;
+    joiner      TEXT := default_joiner; -- XXX will index defs supply a joiner?
+    authority_text TEXT;
+    authority_link BIGINT;
+    output_row  metabib.field_entry_template%ROWTYPE;
+BEGIN
+
+    -- Get the record
+    SELECT INTO bib * FROM biblio.record_entry WHERE id = rid;
+
+    -- Loop over the indexing entries
+    FOR idx IN SELECT * FROM config.metabib_field ORDER BY format LOOP
+
+        SELECT INTO xfrm * from config.xml_transform WHERE name = idx.format;
+
+        -- See if we can skip the XSLT ... it's expensive
+        IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
+            -- Can't skip the transform
+            IF xfrm.xslt <> '---' THEN
+                transformed_xml := oils_xslt_process(bib.marc,xfrm.xslt);
+            ELSE
+                transformed_xml := bib.marc;
+            END IF;
+
+            prev_xfrm := xfrm.name;
+        END IF;
+
+        xml_node_list := oils_xpath( idx.xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+
+        raw_text := NULL;
+        FOR xml_node IN SELECT x FROM unnest(xml_node_list) AS x LOOP
+            CONTINUE WHEN xml_node !~ E'^\\s*<';
+
+            curr_text := ARRAY_TO_STRING(
+                oils_xpath( '//text()',
+                    REGEXP_REPLACE( -- This escapes all &s not followed by "amp;".  Data ise returned from oils_xpath (above) in UTF-8, not entity encoded
+                        REGEXP_REPLACE( -- This escapes embeded <s
+                            xml_node,
+                            $re$(>[^<]+)(<)([^>]+<)$re$,
+                            E'\\1&lt;\\3',
+                            'g'
+                        ),
+                        '&(?!amp;)',
+                        '&amp;',
+                        'g'
+                    )
+                ),
+                ' '
+            );
+
+            CONTINUE WHEN curr_text IS NULL OR curr_text = '';
+
+            IF raw_text IS NOT NULL THEN
+                raw_text := raw_text || joiner;
+            END IF;
+
+            raw_text := COALESCE(raw_text,'') || curr_text;
+
+            -- autosuggest/metabib.browse_entry
+            IF idx.browse_field THEN
+
+                IF idx.browse_xpath IS NOT NULL AND idx.browse_xpath <> '' THEN
+                    browse_text := oils_xpath_string( idx.browse_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+                ELSE
+                    browse_text := curr_text;
+                END IF;
+
+                IF idx.browse_sort_xpath IS NOT NULL AND
+                    idx.browse_sort_xpath <> '' THEN
+
+                    sort_value := oils_xpath_string(
+                        idx.browse_sort_xpath, xml_node, joiner,
+                        ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]
+                    );
+                ELSE
+                    sort_value := browse_text;
+                END IF;
+
+                output_row.field_class = idx.field_class;
+                output_row.field = idx.id;
+                output_row.source = rid;
+                output_row.value = BTRIM(REGEXP_REPLACE(browse_text, E'\\s+', ' ', 'g'));
+                output_row.sort_value :=
+                    public.search_normalize(sort_value);
+
+                output_row.authority := NULL;
+
+                IF idx.authority_xpath IS NOT NULL AND idx.authority_xpath <> '' THEN
+                    authority_text := oils_xpath_string(
+                        idx.authority_xpath, xml_node, joiner,
+                        ARRAY[
+                            ARRAY[xfrm.prefix, xfrm.namespace_uri],
+                            ARRAY['xlink','http://www.w3.org/1999/xlink']
+                        ]
+                    );
+
+                    IF authority_text ~ '^\d+$' THEN
+                        authority_link := authority_text::BIGINT;
+                        PERFORM * FROM authority.record_entry WHERE id = authority_link;
+                        IF FOUND THEN
+                            output_row.authority := authority_link;
+                        END IF;
+                    END IF;
+
+                END IF;
+
+                output_row.browse_field = TRUE;
+                RETURN NEXT output_row;
+                output_row.browse_field = FALSE;
+                output_row.sort_value := NULL;
+            END IF;
+
+            -- insert raw node text for faceting
+            IF idx.facet_field THEN
+
+                IF idx.facet_xpath IS NOT NULL AND idx.facet_xpath <> '' THEN
+                    facet_text := oils_xpath_string( idx.facet_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+                ELSE
+                    facet_text := curr_text;
+                END IF;
+
+                output_row.field_class = idx.field_class;
+                output_row.field = -1 * idx.id;
+                output_row.source = rid;
+                output_row.value = BTRIM(REGEXP_REPLACE(facet_text, E'\\s+', ' ', 'g'));
+
+                output_row.facet_field = TRUE;
+                RETURN NEXT output_row;
+                output_row.facet_field = FALSE;
+            END IF;
+
+        END LOOP;
+
+        CONTINUE WHEN raw_text IS NULL OR raw_text = '';
+
+        -- insert combined node text for searching
+        IF idx.search_field THEN
+            output_row.field_class = idx.field_class;
+            output_row.field = idx.id;
+            output_row.source = rid;
+            output_row.value = BTRIM(REGEXP_REPLACE(raw_text, E'\\s+', ' ', 'g'));
+
+            output_row.search_field = TRUE;
+            RETURN NEXT output_row;
+            output_row.search_field = FALSE;
+        END IF;
+
+    END LOOP;
+
+END;
+
+$func$ LANGUAGE PLPGSQL;
+
+
+-- 953.data.MODS32-xsl.sql
+UPDATE config.xml_transform SET xslt=$$<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns="http://www.loc.gov/mods/v3" xmlns:marc="http://www.loc.gov/MARC21/slim" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xlink marc" version="1.0">
+	<xsl:output encoding="UTF-8" indent="yes" method="xml"/>
+<!--
+Revision 1.14 - Fixed template isValid and fields 010, 020, 022, 024, 028, and 037 to output additional identifier elements 
+  with corresponding @type and @invalid eq 'yes' when subfields z or y (in the case of 022) exist in the MARCXML ::: 2007/01/04 17:35:20 cred
+
+Revision 1.13 - Changed order of output under cartographics to reflect schema  2006/11/28 tmee
+	
+Revision 1.12 - Updated to reflect MODS 3.2 Mapping  2006/10/11 tmee
+		
+Revision 1.11 - The attribute objectPart moved from <languageTerm> to <language>
+      2006/04/08  jrad
+
+Revision 1.10 MODS 3.1 revisions to language and classification elements  
+				(plus ability to find marc:collection embedded in wrapper elements such as SRU zs: wrappers)
+				2006/02/06  ggar
+
+Revision 1.9 subfield $y was added to field 242 2004/09/02 10:57 jrad
+
+Revision 1.8 Subject chopPunctuation expanded and attribute fixes 2004/08/12 jrad
+
+Revision 1.7 2004/03/25 08:29 jrad
+
+Revision 1.6 various validation fixes 2004/02/20 ntra
+
+Revision 1.5  2003/10/02 16:18:58  ntra
+MODS2 to MODS3 updates, language unstacking and 
+de-duping, chopPunctuation expanded
+
+Revision 1.3  2003/04/03 00:07:19  ntra
+Revision 1.3 Additional Changes not related to MODS Version 2.0 by ntra
+
+Revision 1.2  2003/03/24 19:37:42  ckeith
+Added Log Comment
+
+-->
+	<xsl:template match="/">
+		<xsl:choose>
+			<xsl:when test="//marc:collection">
+				<modsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
+					<xsl:for-each select="//marc:collection/marc:record">
+						<mods version="3.2">
+							<xsl:call-template name="marcRecord"/>
+						</mods>
+					</xsl:for-each>
+				</modsCollection>
+			</xsl:when>
+			<xsl:otherwise>
+				<mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
+					<xsl:for-each select="//marc:record">
+						<xsl:call-template name="marcRecord"/>
+					</xsl:for-each>
+				</mods>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+	<xsl:template name="marcRecord">
+		<xsl:variable name="leader" select="marc:leader"/>
+		<xsl:variable name="leader6" select="substring($leader,7,1)"/>
+		<xsl:variable name="leader7" select="substring($leader,8,1)"/>
+		<xsl:variable name="controlField008" select="marc:controlfield[@tag='008']"/>
+		<xsl:variable name="typeOf008">
+			<xsl:choose>
+				<xsl:when test="$leader6='a'">
+					<xsl:choose>
+						<xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">BK</xsl:when>
+						<xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">SE</xsl:when>
+					</xsl:choose>
+				</xsl:when>
+				<xsl:when test="$leader6='t'">BK</xsl:when>
+				<xsl:when test="$leader6='p'">MM</xsl:when>
+				<xsl:when test="$leader6='m'">CF</xsl:when>
+				<xsl:when test="$leader6='e' or $leader6='f'">MP</xsl:when>
+				<xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">VM</xsl:when>
+				<xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'">MU</xsl:when>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:for-each select="marc:datafield[@tag='245']">
+			<titleInfo>
+				<xsl:variable name="title">
+					<xsl:choose>
+						<xsl:when test="marc:subfield[@code='b']">
+							<xsl:call-template name="specialSubfieldSelect">
+								<xsl:with-param name="axis">b</xsl:with-param>
+								<xsl:with-param name="beforeCodes">afgk</xsl:with-param>
+							</xsl:call-template>
+						</xsl:when>
+						<xsl:otherwise>
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">abfgk</xsl:with-param>
+							</xsl:call-template>
+						</xsl:otherwise>
+					</xsl:choose>
+				</xsl:variable>
+				<xsl:variable name="titleChop">
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="$title"/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</xsl:variable>
+				<xsl:choose>
+					<xsl:when test="@ind2>0">
+						<nonSort>
+							<xsl:value-of select="substring($titleChop,1, at ind2)"/>
+						</nonSort>
+						<title>
+							<xsl:value-of select="substring($titleChop, at ind2+1)"/>
+						</title>
+					</xsl:when>
+					<xsl:otherwise>
+						<title>
+							<xsl:value-of select="$titleChop"/>
+						</title>
+					</xsl:otherwise>
+				</xsl:choose>
+				<xsl:if test="marc:subfield[@code='b']">
+					<subTitle>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="axis">b</xsl:with-param>
+									<xsl:with-param name="anyCodes">b</xsl:with-param>
+									<xsl:with-param name="afterCodes">afgk</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</subTitle>
+				</xsl:if>
+				<xsl:call-template name="part"></xsl:call-template>
+			</titleInfo>
+			<!-- A form of title that ignores non-filing characters; useful
+				 for not converting "L'Oreal" into "L' Oreal" at index time -->
+			<titleNonfiling>
+				<xsl:variable name="title">
+					<xsl:choose>
+						<xsl:when test="marc:subfield[@code='b']">
+							<xsl:call-template name="specialSubfieldSelect">
+								<xsl:with-param name="axis">b</xsl:with-param>
+								<xsl:with-param name="beforeCodes">afgk</xsl:with-param>
+							</xsl:call-template>
+						</xsl:when>
+						<xsl:otherwise>
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">abfgk</xsl:with-param>
+							</xsl:call-template>
+						</xsl:otherwise>
+					</xsl:choose>
+				</xsl:variable>
+				<title>
+					<xsl:value-of select="$title"/>
+				</title>
+				<xsl:if test="marc:subfield[@code='b']">
+					<subTitle>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="axis">b</xsl:with-param>
+									<xsl:with-param name="anyCodes">b</xsl:with-param>
+									<xsl:with-param name="afterCodes">afgk</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</subTitle>
+				</xsl:if>
+				<xsl:call-template name="part"></xsl:call-template>
+			</titleNonfiling>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='210']">
+			<titleInfo type="abbreviated">
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">a</xsl:with-param>
+							</xsl:call-template>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:call-template name="subtitle"/>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='242']">
+			<xsl:variable name="titleChop">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:call-template name="subfieldSelect">
+							<!-- 1/04 removed $h, b -->
+							<xsl:with-param name="codes">a</xsl:with-param>
+						</xsl:call-template>
+					</xsl:with-param>
+				</xsl:call-template>
+			</xsl:variable>
+			<titleInfo type="translated">
+				<!--09/01/04 Added subfield $y-->
+				<xsl:for-each select="marc:subfield[@code='y']">
+					<xsl:attribute name="lang">
+						<xsl:value-of select="text()"/>
+					</xsl:attribute>
+				</xsl:for-each>
+				<title>
+					<xsl:value-of select="$titleChop" />
+				</title>
+				<!-- 1/04 fix -->
+				<xsl:call-template name="subtitle"/>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+			<titleInfo type="translated-nfi">
+				<xsl:for-each select="marc:subfield[@code='y']">
+					<xsl:attribute name="lang">
+						<xsl:value-of select="text()"/>
+					</xsl:attribute>
+				</xsl:for-each>
+				<xsl:choose>
+					<xsl:when test="@ind2>0">
+						<nonSort>
+							<xsl:value-of select="substring($titleChop,1, at ind2)"/>
+						</nonSort>
+						<title>
+							<xsl:value-of select="substring($titleChop, at ind2+1)"/>
+						</title>
+					</xsl:when>
+					<xsl:otherwise>
+						<title>
+							<xsl:value-of select="$titleChop" />
+						</title>
+					</xsl:otherwise>
+				</xsl:choose>
+				<xsl:call-template name="subtitle"/>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='246']">
+			<titleInfo type="alternative">
+				<xsl:for-each select="marc:subfield[@code='i']">
+					<xsl:attribute name="displayLabel">
+						<xsl:value-of select="text()"/>
+					</xsl:attribute>
+				</xsl:for-each>
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:call-template name="subfieldSelect">
+								<!-- 1/04 removed $h, $b -->
+								<xsl:with-param name="codes">af</xsl:with-param>
+							</xsl:call-template>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:call-template name="subtitle"/>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='130']|marc:datafield[@tag='240']|marc:datafield[@tag='730'][@ind2!='2']">
+			<xsl:variable name="nfi">
+				<xsl:choose>
+					<xsl:when test="@tag='240'">
+						<xsl:value-of select="@ind2"/>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:value-of select="@ind1"/>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:variable>
+			<xsl:variable name="titleChop">
+				<xsl:call-template name="uri" />
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield">
+						<xsl:if test="(contains('adfklmor', at code) and (not(../marc:subfield[@code='n' or @code='p']) or (following-sibling::marc:subfield[@code='n' or @code='p'])))">
+							<xsl:value-of select="text()"/>
+							<xsl:text> </xsl:text>
+						</xsl:if>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+					</xsl:with-param>
+				</xsl:call-template>
+			</xsl:variable>
+			<titleInfo type="uniform">
+				<title>
+					<xsl:value-of select="$titleChop"/>
+				</title>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+			<titleInfo type="uniform-nfi">
+				<xsl:choose>
+					<xsl:when test="$nfi>0">
+						<nonSort>
+							<xsl:value-of select="substring($titleChop,1,$nfi)"/>
+						</nonSort>
+						<title>
+							<xsl:value-of select="substring($titleChop,$nfi+1)"/>
+						</title>
+					</xsl:when>
+					<xsl:otherwise>
+						<title>
+							<xsl:value-of select="$titleChop"/>
+						</title>
+					</xsl:otherwise>
+				</xsl:choose>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='740'][@ind2!='2']">
+			<xsl:variable name="titleChop">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">ah</xsl:with-param>
+						</xsl:call-template>
+					</xsl:with-param>
+				</xsl:call-template>
+			</xsl:variable>
+			<titleInfo type="alternative">
+				<title>
+					<xsl:value-of select="$titleChop" />
+				</title>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+			<titleInfo type="alternative-nfi">
+				<xsl:choose>
+					<xsl:when test="@ind1>0">
+						<nonSort>
+							<xsl:value-of select="substring($titleChop,1, at ind1)"/>
+						</nonSort>
+						<title>
+							<xsl:value-of select="substring($titleChop, at ind1+1)"/>
+						</title>
+					</xsl:when>
+					<xsl:otherwise>
+						<title>
+							<xsl:value-of select="$titleChop" />
+						</title>
+					</xsl:otherwise>
+				</xsl:choose>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='100']">
+			<name type="personal">
+				<xsl:call-template name="uri" />
+				<xsl:call-template name="nameABCDQ"/>
+				<xsl:call-template name="affiliation"/>
+				<role>
+					<roleTerm authority="marcrelator" type="text">creator</roleTerm>
+				</role>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='110']">
+			<name type="corporate">
+				<xsl:call-template name="uri" />
+				<xsl:call-template name="nameABCDN"/>
+				<role>
+					<roleTerm authority="marcrelator" type="text">creator</roleTerm>
+				</role>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='111']">
+			<name type="conference">
+				<xsl:call-template name="uri" />
+				<xsl:call-template name="nameACDEQ"/>
+				<role>
+					<roleTerm authority="marcrelator" type="text">creator</roleTerm>
+				</role>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='700'][not(marc:subfield[@code='t'])]">
+			<name type="personal">
+				<xsl:call-template name="uri" />
+				<xsl:call-template name="nameABCDQ"/>
+				<xsl:call-template name="affiliation"/>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='710'][not(marc:subfield[@code='t'])]">
+			<name type="corporate">
+				<xsl:call-template name="uri" />
+				<xsl:call-template name="nameABCDN"/>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='711'][not(marc:subfield[@code='t'])]">
+			<name type="conference">
+				<xsl:call-template name="uri" />
+				<xsl:call-template name="nameACDEQ"/>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='720'][not(marc:subfield[@code='t'])]">
+			<name>
+				<xsl:if test="@ind1=1">
+					<xsl:attribute name="type">
+						<xsl:text>personal</xsl:text>
+					</xsl:attribute>
+				</xsl:if>
+				<namePart>
+					<xsl:value-of select="marc:subfield[@code='a']"/>
+				</namePart>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<typeOfResource>
+			<xsl:if test="$leader7='c'">
+				<xsl:attribute name="collection">yes</xsl:attribute>
+			</xsl:if>
+			<xsl:if test="$leader6='d' or $leader6='f' or $leader6='p' or $leader6='t'">
+				<xsl:attribute name="manuscript">yes</xsl:attribute>
+			</xsl:if>
+			<xsl:choose>
+				<xsl:when test="$leader6='a' or $leader6='t'">text</xsl:when>
+				<xsl:when test="$leader6='e' or $leader6='f'">cartographic</xsl:when>
+				<xsl:when test="$leader6='c' or $leader6='d'">notated music</xsl:when>
+				<xsl:when test="$leader6='i'">sound recording-nonmusical</xsl:when>
+				<xsl:when test="$leader6='j'">sound recording-musical</xsl:when>
+				<xsl:when test="$leader6='k'">still image</xsl:when>
+				<xsl:when test="$leader6='g'">moving image</xsl:when>
+				<xsl:when test="$leader6='r'">three dimensional object</xsl:when>
+				<xsl:when test="$leader6='m'">software, multimedia</xsl:when>
+				<xsl:when test="$leader6='p'">mixed material</xsl:when>
+			</xsl:choose>
+		</typeOfResource>
+		<xsl:if test="substring($controlField008,26,1)='d'">
+			<genre authority="marc">globe</genre>
+		</xsl:if>
+		<xsl:if test="marc:controlfield[@tag='007'][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
+			<genre authority="marc">remote sensing image</genre>
+		</xsl:if>
+		<xsl:if test="$typeOf008='MP'">
+			<xsl:variable name="controlField008-25" select="substring($controlField008,26,1)"></xsl:variable>
+			<xsl:choose>
+				<xsl:when test="$controlField008-25='a' or $controlField008-25='b' or $controlField008-25='c' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
+					<genre authority="marc">map</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-25='e' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
+					<genre authority="marc">atlas</genre>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:if test="$typeOf008='SE'">
+			<xsl:variable name="controlField008-21" select="substring($controlField008,22,1)"></xsl:variable>
+			<xsl:choose>
+				<xsl:when test="$controlField008-21='d'">
+					<genre authority="marc">database</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-21='l'">
+					<genre authority="marc">loose-leaf</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-21='m'">
+					<genre authority="marc">series</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-21='n'">
+					<genre authority="marc">newspaper</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-21='p'">
+					<genre authority="marc">periodical</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-21='w'">
+					<genre authority="marc">web site</genre>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:if test="$typeOf008='BK' or $typeOf008='SE'">
+			<xsl:variable name="controlField008-24" select="substring($controlField008,25,4)"></xsl:variable>
+			<xsl:choose>
+				<xsl:when test="contains($controlField008-24,'a')">
+					<genre authority="marc">abstract or summary</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'b')">
+					<genre authority="marc">bibliography</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'c')">
+					<genre authority="marc">catalog</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'d')">
+					<genre authority="marc">dictionary</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'e')">
+					<genre authority="marc">encyclopedia</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'f')">
+					<genre authority="marc">handbook</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'g')">
+					<genre authority="marc">legal article</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'i')">
+					<genre authority="marc">index</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'k')">
+					<genre authority="marc">discography</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'l')">
+					<genre authority="marc">legislation</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'m')">
+					<genre authority="marc">theses</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'n')">
+					<genre authority="marc">survey of literature</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'o')">
+					<genre authority="marc">review</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'p')">
+					<genre authority="marc">programmed text</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'q')">
+					<genre authority="marc">filmography</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'r')">
+					<genre authority="marc">directory</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'s')">
+					<genre authority="marc">statistics</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'t')">
+					<genre authority="marc">technical report</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'v')">
+					<genre authority="marc">legal case and case notes</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'w')">
+					<genre authority="marc">law report or digest</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'z')">
+					<genre authority="marc">treaty</genre>
+				</xsl:when>
+			</xsl:choose>
+			<xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"></xsl:variable>
+			<xsl:choose>
+				<xsl:when test="$controlField008-29='1'">
+					<genre authority="marc">conference publication</genre>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:if test="$typeOf008='CF'">
+			<xsl:variable name="controlField008-26" select="substring($controlField008,27,1)"></xsl:variable>
+			<xsl:choose>
+				<xsl:when test="$controlField008-26='a'">
+					<genre authority="marc">numeric data</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-26='e'">
+					<genre authority="marc">database</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-26='f'">
+					<genre authority="marc">font</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-26='g'">
+					<genre authority="marc">game</genre>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:if test="$typeOf008='BK'">
+			<xsl:if test="substring($controlField008,25,1)='j'">
+				<genre authority="marc">patent</genre>
+			</xsl:if>
+			<xsl:if test="substring($controlField008,31,1)='1'">
+				<genre authority="marc">festschrift</genre>
+			</xsl:if>
+			<xsl:variable name="controlField008-34" select="substring($controlField008,35,1)"></xsl:variable>
+			<xsl:if test="$controlField008-34='a' or $controlField008-34='b' or $controlField008-34='c' or $controlField008-34='d'">
+				<genre authority="marc">biography</genre>
+			</xsl:if>
+			<xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"></xsl:variable>
+			<xsl:choose>
+				<xsl:when test="$controlField008-33='e'">
+					<genre authority="marc">essay</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='d'">
+					<genre authority="marc">drama</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='c'">
+					<genre authority="marc">comic strip</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='l'">
+					<genre authority="marc">fiction</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='h'">
+					<genre authority="marc">humor, satire</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='i'">
+					<genre authority="marc">letter</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='f'">
+					<genre authority="marc">novel</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='j'">
+					<genre authority="marc">short story</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='s'">
+					<genre authority="marc">speech</genre>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:if test="$typeOf008='MU'">
+			<xsl:variable name="controlField008-30-31" select="substring($controlField008,31,2)"></xsl:variable>
+			<xsl:if test="contains($controlField008-30-31,'b')">
+				<genre authority="marc">biography</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'c')">
+				<genre authority="marc">conference publication</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'d')">
+				<genre authority="marc">drama</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'e')">
+				<genre authority="marc">essay</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'f')">
+				<genre authority="marc">fiction</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'o')">
+				<genre authority="marc">folktale</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'h')">
+				<genre authority="marc">history</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'k')">
+				<genre authority="marc">humor, satire</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'m')">
+				<genre authority="marc">memoir</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'p')">
+				<genre authority="marc">poetry</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'r')">
+				<genre authority="marc">rehearsal</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'g')">
+				<genre authority="marc">reporting</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'s')">
+				<genre authority="marc">sound</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'l')">
+				<genre authority="marc">speech</genre>
+			</xsl:if>
+		</xsl:if>
+		<xsl:if test="$typeOf008='VM'">
+			<xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"></xsl:variable>
+			<xsl:choose>
+				<xsl:when test="$controlField008-33='a'">
+					<genre authority="marc">art original</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='b'">
+					<genre authority="marc">kit</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='c'">
+					<genre authority="marc">art reproduction</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='d'">
+					<genre authority="marc">diorama</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='f'">
+					<genre authority="marc">filmstrip</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='g'">
+					<genre authority="marc">legal article</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='i'">
+					<genre authority="marc">picture</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='k'">
+					<genre authority="marc">graphic</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='l'">
+					<genre authority="marc">technical drawing</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='m'">
+					<genre authority="marc">motion picture</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='n'">
+					<genre authority="marc">chart</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='o'">
+					<genre authority="marc">flash card</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='p'">
+					<genre authority="marc">microscope slide</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='q' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
+					<genre authority="marc">model</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='r'">
+					<genre authority="marc">realia</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='s'">
+					<genre authority="marc">slide</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='t'">
+					<genre authority="marc">transparency</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='v'">
+					<genre authority="marc">videorecording</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='w'">
+					<genre authority="marc">toy</genre>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:for-each select="marc:datafield[@tag=655]">
+			<genre authority="marc">
+				<xsl:attribute name="authority">
+					<xsl:value-of select="marc:subfield[@code='2']"/>
+				</xsl:attribute>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">abvxyz</xsl:with-param>
+					<xsl:with-param name="delimeter">-</xsl:with-param>
+				</xsl:call-template>
+			</genre>
+		</xsl:for-each>
+		<originInfo>
+			<xsl:variable name="MARCpublicationCode" select="normalize-space(substring($controlField008,16,3))"></xsl:variable>
+			<xsl:if test="translate($MARCpublicationCode,'|','')">
+				<place>
+					<placeTerm>
+						<xsl:attribute name="type">code</xsl:attribute>
+						<xsl:attribute name="authority">marccountry</xsl:attribute>
+						<xsl:value-of select="$MARCpublicationCode"/>
+					</placeTerm>
+				</place>
+			</xsl:if>
+			<xsl:for-each select="marc:datafield[@tag=044]/marc:subfield[@code='c']">
+				<place>
+					<placeTerm>
+						<xsl:attribute name="type">code</xsl:attribute>
+						<xsl:attribute name="authority">iso3166</xsl:attribute>
+						<xsl:value-of select="."/>
+					</placeTerm>
+				</place>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='a']">
+				<place>
+					<placeTerm>
+						<xsl:attribute name="type">text</xsl:attribute>
+						<xsl:call-template name="chopPunctuationFront">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="chopPunctuation">
+									<xsl:with-param name="chopString" select="."/>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</placeTerm>
+				</place>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='m']">
+				<dateValid point="start">
+					<xsl:value-of select="."/>
+				</dateValid>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='n']">
+				<dateValid point="end">
+					<xsl:value-of select="."/>
+				</dateValid>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='j']">
+				<dateModified>
+					<xsl:value-of select="."/>
+				</dateModified>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='b' or @code='c' or @code='g']">
+				<xsl:choose>
+					<xsl:when test="@code='b'">
+						<publisher>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."/>
+								<xsl:with-param name="punctuation">
+									<xsl:text>:,;/ </xsl:text>
+								</xsl:with-param>
+							</xsl:call-template>
+						</publisher>
+					</xsl:when>
+					<xsl:when test="@code='c'">
+						<dateIssued>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."/>
+							</xsl:call-template>
+						</dateIssued>
+					</xsl:when>
+					<xsl:when test="@code='g'">
+						<dateCreated>
+							<xsl:value-of select="."/>
+						</dateCreated>
+					</xsl:when>
+				</xsl:choose>
+			</xsl:for-each>
+			<xsl:variable name="dataField260c">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="marc:datafield[@tag=260]/marc:subfield[@code='c']"></xsl:with-param>
+				</xsl:call-template>
+			</xsl:variable>
+			<xsl:variable name="controlField008-7-10" select="normalize-space(substring($controlField008, 8, 4))"></xsl:variable>
+			<xsl:variable name="controlField008-11-14" select="normalize-space(substring($controlField008, 12, 4))"></xsl:variable>
+			<xsl:variable name="controlField008-6" select="normalize-space(substring($controlField008, 7, 1))"></xsl:variable>
+			<xsl:if test="$controlField008-6='e' or $controlField008-6='p' or $controlField008-6='r' or $controlField008-6='t' or $controlField008-6='s'">
+				<xsl:if test="$controlField008-7-10 and ($controlField008-7-10 != $dataField260c)">
+					<dateIssued encoding="marc">
+						<xsl:value-of select="$controlField008-7-10"/>
+					</dateIssued>
+				</xsl:if>
+			</xsl:if>
+			<xsl:if test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
+				<xsl:if test="$controlField008-7-10">
+					<dateIssued encoding="marc" point="start">
+						<xsl:value-of select="$controlField008-7-10"/>
+					</dateIssued>
+				</xsl:if>
+			</xsl:if>
+			<xsl:if test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
+				<xsl:if test="$controlField008-11-14">
+					<dateIssued encoding="marc" point="end">
+						<xsl:value-of select="$controlField008-11-14"/>
+					</dateIssued>
+				</xsl:if>
+			</xsl:if>
+			<xsl:if test="$controlField008-6='q'">
+				<xsl:if test="$controlField008-7-10">
+					<dateIssued encoding="marc" point="start" qualifier="questionable">
+						<xsl:value-of select="$controlField008-7-10"/>
+					</dateIssued>
+				</xsl:if>
+			</xsl:if>
+			<xsl:if test="$controlField008-6='q'">
+				<xsl:if test="$controlField008-11-14">
+					<dateIssued encoding="marc" point="end" qualifier="questionable">
+						<xsl:value-of select="$controlField008-11-14"/>
+					</dateIssued>
+				</xsl:if>
+			</xsl:if>
+			<xsl:if test="$controlField008-6='t'">
+				<xsl:if test="$controlField008-11-14">
+					<copyrightDate encoding="marc">
+						<xsl:value-of select="$controlField008-11-14"/>
+					</copyrightDate>
+				</xsl:if>
+			</xsl:if>
+			<xsl:for-each select="marc:datafield[@tag=033][@ind1=0 or @ind1=1]/marc:subfield[@code='a']">
+				<dateCaptured encoding="iso8601">
+					<xsl:value-of select="."/>
+				</dateCaptured>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][1]">
+				<dateCaptured encoding="iso8601" point="start">
+					<xsl:value-of select="."/>
+				</dateCaptured>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][2]">
+				<dateCaptured encoding="iso8601" point="end">
+					<xsl:value-of select="."/>
+				</dateCaptured>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=250]/marc:subfield[@code='a']">
+				<edition>
+					<xsl:value-of select="."/>
+				</edition>
+			</xsl:for-each>
+			<xsl:for-each select="marc:leader">
+				<issuance>
+					<xsl:choose>
+						<xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">monographic</xsl:when>
+						<xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">continuing</xsl:when>
+					</xsl:choose>
+				</issuance>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=310]|marc:datafield[@tag=321]">
+				<frequency>
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">ab</xsl:with-param>
+					</xsl:call-template>
+				</frequency>
+			</xsl:for-each>
+		</originInfo>
+		<xsl:variable name="controlField008-35-37" select="normalize-space(translate(substring($controlField008,36,3),'|#',''))"></xsl:variable>
+		<xsl:if test="$controlField008-35-37">
+			<language>
+				<languageTerm authority="iso639-2b" type="code">
+					<xsl:value-of select="substring($controlField008,36,3)"/>
+				</languageTerm>
+			</language>
+		</xsl:if>
+		<xsl:for-each select="marc:datafield[@tag=041]">
+			<xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='d' or @code='e' or @code='f' or @code='g' or @code='h']">
+				<xsl:variable name="langCodes" select="."/>
+				<xsl:choose>
+					<xsl:when test="../marc:subfield[@code='2']='rfc3066'">
+						<!-- not stacked but could be repeated -->
+						<xsl:call-template name="rfcLanguages">
+							<xsl:with-param name="nodeNum">
+								<xsl:value-of select="1"/>
+							</xsl:with-param>
+							<xsl:with-param name="usedLanguages">
+								<xsl:text></xsl:text>
+							</xsl:with-param>
+							<xsl:with-param name="controlField008-35-37">
+								<xsl:value-of select="$controlField008-35-37"></xsl:value-of>
+							</xsl:with-param>
+						</xsl:call-template>
+					</xsl:when>
+					<xsl:otherwise>
+						<!-- iso -->
+						<xsl:variable name="allLanguages">
+							<xsl:copy-of select="$langCodes"></xsl:copy-of>
+						</xsl:variable>
+						<xsl:variable name="currentLanguage">
+							<xsl:value-of select="substring($allLanguages,1,3)"></xsl:value-of>
+						</xsl:variable>
+						<xsl:call-template name="isoLanguage">
+							<xsl:with-param name="currentLanguage">
+								<xsl:value-of select="substring($allLanguages,1,3)"></xsl:value-of>
+							</xsl:with-param>
+							<xsl:with-param name="remainingLanguages">
+								<xsl:value-of select="substring($allLanguages,4,string-length($allLanguages)-3)"></xsl:value-of>
+							</xsl:with-param>
+							<xsl:with-param name="usedLanguages">
+								<xsl:if test="$controlField008-35-37">
+									<xsl:value-of select="$controlField008-35-37"></xsl:value-of>
+								</xsl:if>
+							</xsl:with-param>
+						</xsl:call-template>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:for-each>
+		</xsl:for-each>
+		<xsl:variable name="physicalDescription">
+			<!--3.2 change tmee 007/11 -->
+			<xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='a']">
+				<digitalOrigin>reformatted digital</digitalOrigin>
+			</xsl:if>
+			<xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='b']">
+				<digitalOrigin>digitized microfilm</digitalOrigin>
+			</xsl:if>
+			<xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='d']">
+				<digitalOrigin>digitized other analog</digitalOrigin>
+			</xsl:if>
+			<xsl:variable name="controlField008-23" select="substring($controlField008,24,1)"></xsl:variable>
+			<xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"></xsl:variable>
+			<xsl:variable name="check008-23">
+				<xsl:if test="$typeOf008='BK' or $typeOf008='MU' or $typeOf008='SE' or $typeOf008='MM'">
+					<xsl:value-of select="true()"></xsl:value-of>
+				</xsl:if>
+			</xsl:variable>
+			<xsl:variable name="check008-29">
+				<xsl:if test="$typeOf008='MP' or $typeOf008='VM'">
+					<xsl:value-of select="true()"></xsl:value-of>
+				</xsl:if>
+			</xsl:variable>
+			<xsl:choose>
+				<xsl:when test="($check008-23 and $controlField008-23='f') or ($check008-29 and $controlField008-29='f')">
+					<form authority="marcform">braille</form>
+				</xsl:when>
+				<xsl:when test="($controlField008-23=' ' and ($leader6='c' or $leader6='d')) or (($typeOf008='BK' or $typeOf008='SE') and ($controlField008-23=' ' or $controlField008='r'))">
+					<form authority="marcform">print</form>
+				</xsl:when>
+				<xsl:when test="$leader6 = 'm' or ($check008-23 and $controlField008-23='s') or ($check008-29 and $controlField008-29='s')">
+					<form authority="marcform">electronic</form>
+				</xsl:when>
+				<xsl:when test="($check008-23 and $controlField008-23='b') or ($check008-29 and $controlField008-29='b')">
+					<form authority="marcform">microfiche</form>
+				</xsl:when>
+				<xsl:when test="($check008-23 and $controlField008-23='a') or ($check008-29 and $controlField008-29='a')">
+					<form authority="marcform">microfilm</form>
+				</xsl:when>
+			</xsl:choose>
+			<!-- 1/04 fix -->
+			<xsl:if test="marc:datafield[@tag=130]/marc:subfield[@code='h']">
+				<form authority="gmd">
+					<xsl:call-template name="chopBrackets">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:datafield[@tag=130]/marc:subfield[@code='h']"></xsl:value-of>
+						</xsl:with-param>
+					</xsl:call-template>
+				</form>
+			</xsl:if>
+			<xsl:if test="marc:datafield[@tag=240]/marc:subfield[@code='h']">
+				<form authority="gmd">
+					<xsl:call-template name="chopBrackets">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:datafield[@tag=240]/marc:subfield[@code='h']"></xsl:value-of>
+						</xsl:with-param>
+					</xsl:call-template>
+				</form>
+			</xsl:if>
+			<xsl:if test="marc:datafield[@tag=242]/marc:subfield[@code='h']">
+				<form authority="gmd">
+					<xsl:call-template name="chopBrackets">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:datafield[@tag=242]/marc:subfield[@code='h']"></xsl:value-of>
+						</xsl:with-param>
+					</xsl:call-template>
+				</form>
+			</xsl:if>
+			<xsl:if test="marc:datafield[@tag=245]/marc:subfield[@code='h']">
+				<form authority="gmd">
+					<xsl:call-template name="chopBrackets">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='h']"></xsl:value-of>
+						</xsl:with-param>
+					</xsl:call-template>
+				</form>
+			</xsl:if>
+			<xsl:if test="marc:datafield[@tag=246]/marc:subfield[@code='h']">
+				<form authority="gmd">
+					<xsl:call-template name="chopBrackets">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:datafield[@tag=246]/marc:subfield[@code='h']"></xsl:value-of>
+						</xsl:with-param>
+					</xsl:call-template>
+				</form>
+			</xsl:if>
+			<xsl:if test="marc:datafield[@tag=730]/marc:subfield[@code='h']">
+				<form authority="gmd">
+					<xsl:call-template name="chopBrackets">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:datafield[@tag=730]/marc:subfield[@code='h']"></xsl:value-of>
+						</xsl:with-param>
+					</xsl:call-template>
+				</form>
+			</xsl:if>
+			<xsl:for-each select="marc:datafield[@tag=256]/marc:subfield[@code='a']">
+				<form>
+					<xsl:value-of select="."></xsl:value-of>
+				</form>
+			</xsl:for-each>
+			<xsl:for-each select="marc:controlfield[@tag=007][substring(text(),1,1)='c']">
+				<xsl:choose>
+					<xsl:when test="substring(text(),14,1)='a'">
+						<reformattingQuality>access</reformattingQuality>
+					</xsl:when>
+					<xsl:when test="substring(text(),14,1)='p'">
+						<reformattingQuality>preservation</reformattingQuality>
+					</xsl:when>
+					<xsl:when test="substring(text(),14,1)='r'">
+						<reformattingQuality>replacement</reformattingQuality>
+					</xsl:when>
+				</xsl:choose>
+			</xsl:for-each>
+			<!--3.2 change tmee 007/01 -->
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='b']">
+				<form authority="smd">chip cartridge</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='c']">
+				<form authority="smd">computer optical disc cartridge</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='j']">
+				<form authority="smd">magnetic disc</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='m']">
+				<form authority="smd">magneto-optical disc</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='o']">
+				<form authority="smd">optical disc</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='r']">
+				<form authority="smd">remote</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='a']">
+				<form authority="smd">tape cartridge</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='f']">
+				<form authority="smd">tape cassette</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='h']">
+				<form authority="smd">tape reel</form>
+			</xsl:if>
+			
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='a']">
+				<form authority="smd">celestial globe</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='e']">
+				<form authority="smd">earth moon globe</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='b']">
+				<form authority="smd">planetary or lunar globe</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='c']">
+				<form authority="smd">terrestrial globe</form>
+			</xsl:if>
+			
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='o'][substring(text(),2,1)='o']">
+				<form authority="smd">kit</form>
+			</xsl:if>
+			
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
+				<form authority="smd">atlas</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='g']">
+				<form authority="smd">diagram</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
+				<form authority="smd">map</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
+				<form authority="smd">model</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='k']">
+				<form authority="smd">profile</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
+				<form authority="smd">remote-sensing image</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='s']">
+				<form authority="smd">section</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='y']">
+				<form authority="smd">view</form>
+			</xsl:if>
+			
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='a']">
+				<form authority="smd">aperture card</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='e']">
+				<form authority="smd">microfiche</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='f']">
+				<form authority="smd">microfiche cassette</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='b']">
+				<form authority="smd">microfilm cartridge</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='c']">
+				<form authority="smd">microfilm cassette</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='d']">
+				<form authority="smd">microfilm reel</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='g']">
+				<form authority="smd">microopaque</form>
+			</xsl:if>
+			
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='c']">
+				<form authority="smd">film cartridge</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='f']">
+				<form authority="smd">film cassette</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='r']">
+				<form authority="smd">film reel</form>
+			</xsl:if>
+			
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='n']">
+				<form authority="smd">chart</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='c']">
+				<form authority="smd">collage</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='d']">
+				<form authority="smd">drawing</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='o']">
+				<form authority="smd">flash card</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='e']">
+				<form authority="smd">painting</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='f']">
+				<form authority="smd">photomechanical print</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='g']">
+				<form authority="smd">photonegative</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='h']">
+				<form authority="smd">photoprint</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='i']">
+				<form authority="smd">picture</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='j']">
+				<form authority="smd">print</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='l']">
+				<form authority="smd">technical drawing</form>
+			</xsl:if>
+			
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='q'][substring(text(),2,1)='q']">
+				<form authority="smd">notated music</form>
+			</xsl:if>
+			
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='d']">
+				<form authority="smd">filmslip</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='c']">
+				<form authority="smd">filmstrip cartridge</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='o']">
+				<form authority="smd">filmstrip roll</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='f']">
+				<form authority="smd">other filmstrip type</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='s']">
+				<form authority="smd">slide</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='t']">
+				<form authority="smd">transparency</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='r'][substring(text(),2,1)='r']">
+				<form authority="smd">remote-sensing image</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='e']">
+				<form authority="smd">cylinder</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='q']">
+				<form authority="smd">roll</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='g']">
+				<form authority="smd">sound cartridge</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='s']">
+				<form authority="smd">sound cassette</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='d']">
+				<form authority="smd">sound disc</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='t']">
+				<form authority="smd">sound-tape reel</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='i']">
+				<form authority="smd">sound-track film</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='w']">
+				<form authority="smd">wire recording</form>
+			</xsl:if>
+			
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='c']">
+				<form authority="smd">braille</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='b']">
+				<form authority="smd">combination</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='a']">
+				<form authority="smd">moon</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='d']">
+				<form authority="smd">tactile, with no writing system</form>
+			</xsl:if>
+			
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='c']">
+				<form authority="smd">braille</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='b']">
+				<form authority="smd">large print</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='a']">
+				<form authority="smd">regular print</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='d']">
+				<form authority="smd">text in looseleaf binder</form>
+			</xsl:if>
+			
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='c']">
+				<form authority="smd">videocartridge</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='f']">
+				<form authority="smd">videocassette</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='d']">
+				<form authority="smd">videodisc</form>
+			</xsl:if>
+			<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='r']">
+				<form authority="smd">videoreel</form>
+			</xsl:if>
+			
+			<xsl:for-each select="marc:datafield[@tag=856]/marc:subfield[@code='q'][string-length(.)>1]">
+				<internetMediaType>
+					<xsl:value-of select="."></xsl:value-of>
+				</internetMediaType>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=300]">
+				<extent>
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">abce</xsl:with-param>
+					</xsl:call-template>
+				</extent>
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:if test="string-length(normalize-space($physicalDescription))">
+			<physicalDescription>
+				<xsl:copy-of select="$physicalDescription"></xsl:copy-of>
+			</physicalDescription>
+		</xsl:if>
+		<xsl:for-each select="marc:datafield[@tag=520]">
+			<abstract>
+				<xsl:call-template name="uri"></xsl:call-template>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</abstract>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=505]">
+			<tableOfContents>
+				<xsl:call-template name="uri"></xsl:call-template>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">agrt</xsl:with-param>
+				</xsl:call-template>
+			</tableOfContents>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=521]">
+			<targetAudience>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</targetAudience>
+		</xsl:for-each>
+		<xsl:if test="$typeOf008='BK' or $typeOf008='CF' or $typeOf008='MU' or $typeOf008='VM'">
+			<xsl:variable name="controlField008-22" select="substring($controlField008,23,1)"></xsl:variable>
+			<xsl:choose>
+				<!-- 01/04 fix -->
+				<xsl:when test="$controlField008-22='d'">
+					<targetAudience authority="marctarget">adolescent</targetAudience>
+				</xsl:when>
+				<xsl:when test="$controlField008-22='e'">
+					<targetAudience authority="marctarget">adult</targetAudience>
+				</xsl:when>
+				<xsl:when test="$controlField008-22='g'">
+					<targetAudience authority="marctarget">general</targetAudience>
+				</xsl:when>
+				<xsl:when test="$controlField008-22='b' or $controlField008-22='c' or $controlField008-22='j'">
+					<targetAudience authority="marctarget">juvenile</targetAudience>
+				</xsl:when>
+				<xsl:when test="$controlField008-22='a'">
+					<targetAudience authority="marctarget">preschool</targetAudience>
+				</xsl:when>
+				<xsl:when test="$controlField008-22='f'">
+					<targetAudience authority="marctarget">specialized</targetAudience>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:for-each select="marc:datafield[@tag=245]/marc:subfield[@code='c']">
+			<note type="statement of responsibility">
+				<xsl:value-of select="."></xsl:value-of>
+			</note>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=500]">
+			<note>
+				<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+				<xsl:call-template name="uri"></xsl:call-template>
+			</note>
+		</xsl:for-each>
+		
+		<!--3.2 change tmee additional note fields-->
+		
+		<xsl:for-each select="marc:datafield[@tag=506]">
+			<note type="restrictions">
+				<xsl:call-template name="uri"></xsl:call-template>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."></xsl:value-of>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+			</note>
+		</xsl:for-each>
+		
+		<xsl:for-each select="marc:datafield[@tag=510]">
+			<note  type="citation/reference">
+				<xsl:call-template name="uri"></xsl:call-template>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."></xsl:value-of>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+			</note>
+		</xsl:for-each>
+		
+			
+		<xsl:for-each select="marc:datafield[@tag=511]">
+			<note type="performers">
+				<xsl:call-template name="uri"></xsl:call-template>
+				<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+			</note>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=518]">
+			<note type="venue">
+				<xsl:call-template name="uri"></xsl:call-template>
+				<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+			</note>
+		</xsl:for-each>
+		
+		<xsl:for-each select="marc:datafield[@tag=530]">
+			<note  type="additional physical form">
+				<xsl:call-template name="uri"></xsl:call-template>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."></xsl:value-of>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+			</note>
+		</xsl:for-each>
+		
+		<xsl:for-each select="marc:datafield[@tag=533]">
+			<note  type="reproduction">
+				<xsl:call-template name="uri"></xsl:call-template>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."></xsl:value-of>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+			</note>
+		</xsl:for-each>
+		
+		<xsl:for-each select="marc:datafield[@tag=534]">
+			<note  type="original version">
+				<xsl:call-template name="uri"></xsl:call-template>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."></xsl:value-of>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+			</note>
+		</xsl:for-each>
+		
+		<xsl:for-each select="marc:datafield[@tag=538]">
+			<note  type="system details">
+				<xsl:call-template name="uri"></xsl:call-template>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."></xsl:value-of>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+			</note>
+		</xsl:for-each>
+		
+		<xsl:for-each select="marc:datafield[@tag=583]">
+			<note type="action">
+				<xsl:call-template name="uri"></xsl:call-template>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."></xsl:value-of>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+			</note>
+		</xsl:for-each>
+		
+
+		
+		
+		
+		<xsl:for-each select="marc:datafield[@tag=501 or @tag=502 or @tag=504 or @tag=507 or @tag=508 or  @tag=513 or @tag=514 or @tag=515 or @tag=516 or @tag=522 or @tag=524 or @tag=525 or @tag=526 or @tag=535 or @tag=536 or @tag=540 or @tag=541 or @tag=544 or @tag=545 or @tag=546 or @tag=547 or @tag=550 or @tag=552 or @tag=555 or @tag=556 or @tag=561 or @tag=562 or @tag=565 or @tag=567 or @tag=580 or @tag=581 or @tag=584 or @tag=585 or @tag=586]">
+			<note>
+				<xsl:call-template name="uri"></xsl:call-template>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."></xsl:value-of>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+			</note>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=034][marc:subfield[@code='d' or @code='e' or @code='f' or @code='g']]">
+			<subject>
+				<cartographics>
+					<coordinates>
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">defg</xsl:with-param>
+						</xsl:call-template>
+					</coordinates>
+				</cartographics>
+			</subject>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=043]">
+			<subject>
+				<xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
+					<geographicCode>
+						<xsl:attribute name="authority">
+							<xsl:if test="@code='a'">
+								<xsl:text>marcgac</xsl:text>
+							</xsl:if>
+							<xsl:if test="@code='b'">
+								<xsl:value-of select="following-sibling::marc:subfield[@code=2]"></xsl:value-of>
+							</xsl:if>
+							<xsl:if test="@code='c'">
+								<xsl:text>iso3166</xsl:text>
+							</xsl:if>
+						</xsl:attribute>
+						<xsl:value-of select="self::marc:subfield"></xsl:value-of>
+					</geographicCode>
+				</xsl:for-each>
+			</subject>
+		</xsl:for-each>
+		<!-- tmee 2006/11/27 -->
+		<xsl:for-each select="marc:datafield[@tag=255]">
+			<subject>
+				<xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
+				<cartographics>
+					<xsl:if test="@code='a'">
+						<scale>
+							<xsl:value-of select="."></xsl:value-of>
+						</scale>
+					</xsl:if>
+					<xsl:if test="@code='b'">
+						<projection>
+							<xsl:value-of select="."></xsl:value-of>
+						</projection>
+					</xsl:if>
+					<xsl:if test="@code='c'">
+						<coordinates>
+							<xsl:value-of select="."></xsl:value-of>
+						</coordinates>
+					</xsl:if>
+				</cartographics>
+				</xsl:for-each>
+			</subject>
+		</xsl:for-each>
+				
+		<xsl:apply-templates select="marc:datafield[653 >= @tag and @tag >= 600]"></xsl:apply-templates>
+		<xsl:apply-templates select="marc:datafield[@tag=656]"></xsl:apply-templates>
+		<xsl:for-each select="marc:datafield[@tag=752]">
+			<subject>
+				<hierarchicalGeographic>
+					<xsl:for-each select="marc:subfield[@code='a']">
+						<country>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."></xsl:with-param>
+							</xsl:call-template>
+						</country>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='b']">
+						<state>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."></xsl:with-param>
+							</xsl:call-template>
+						</state>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='c']">
+						<county>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."></xsl:with-param>
+							</xsl:call-template>
+						</county>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='d']">
+						<city>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."></xsl:with-param>
+							</xsl:call-template>
+						</city>
+					</xsl:for-each>
+				</hierarchicalGeographic>
+			</subject>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=045][marc:subfield[@code='b']]">
+			<subject>
+				<xsl:choose>
+					<xsl:when test="@ind1=2">
+						<temporal encoding="iso8601" point="start">
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString">
+									<xsl:value-of select="marc:subfield[@code='b'][1]"></xsl:value-of>
+								</xsl:with-param>
+							</xsl:call-template>
+						</temporal>
+						<temporal encoding="iso8601" point="end">
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString">
+									<xsl:value-of select="marc:subfield[@code='b'][2]"></xsl:value-of>
+								</xsl:with-param>
+							</xsl:call-template>
+						</temporal>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:for-each select="marc:subfield[@code='b']">
+							<temporal encoding="iso8601">
+								<xsl:call-template name="chopPunctuation">
+									<xsl:with-param name="chopString" select="."></xsl:with-param>
+								</xsl:call-template>
+							</temporal>
+						</xsl:for-each>
+					</xsl:otherwise>
+				</xsl:choose>
+			</subject>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=050]">
+			<xsl:for-each select="marc:subfield[@code='b']">
+				<classification authority="lcc">
+					<xsl:if test="../marc:subfield[@code='3']">
+						<xsl:attribute name="displayLabel">
+							<xsl:value-of select="../marc:subfield[@code='3']"></xsl:value-of>
+						</xsl:attribute>
+					</xsl:if>
+					<xsl:value-of select="preceding-sibling::marc:subfield[@code='a'][1]"></xsl:value-of>
+					<xsl:text> </xsl:text>
+					<xsl:value-of select="text()"></xsl:value-of>
+				</classification>
+			</xsl:for-each>
+			<xsl:for-each select="marc:subfield[@code='a'][not(following-sibling::marc:subfield[@code='b'])]">
+				<classification authority="lcc">
+					<xsl:if test="../marc:subfield[@code='3']">
+						<xsl:attribute name="displayLabel">
+							<xsl:value-of select="../marc:subfield[@code='3']"></xsl:value-of>
+						</xsl:attribute>
+					</xsl:if>
+					<xsl:value-of select="text()"></xsl:value-of>
+				</classification>
+			</xsl:for-each>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=082]">
+			<classification authority="ddc">
+				<xsl:if test="marc:subfield[@code='2']">
+					<xsl:attribute name="edition">
+						<xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
+					</xsl:attribute>
+				</xsl:if>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=080]">
+			<classification authority="udc">
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">abx</xsl:with-param>
+				</xsl:call-template>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=060]">
+			<classification authority="nlm">
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=086][@ind1=0]">
+			<classification authority="sudocs">
+				<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=086][@ind1=1]">
+			<classification authority="candoc">
+				<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=086]">
+			<classification>
+				<xsl:attribute name="authority">
+					<xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
+				</xsl:attribute>
+				<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=084]">
+			<classification>
+				<xsl:attribute name="authority">
+					<xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
+				</xsl:attribute>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=440]">
+			<relatedItem type="series">
+				<xsl:variable name="titleChop">
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">av</xsl:with-param>
+							</xsl:call-template>
+						</xsl:with-param>
+					</xsl:call-template>
+				</xsl:variable>
+				<titleInfo>
+					<title>
+						<xsl:value-of select="$titleChop" />
+					</title>
+					<xsl:call-template name="part"></xsl:call-template>
+				</titleInfo>
+				<titleInfo type="nfi">
+					<xsl:choose>
+						<xsl:when test="@ind2>0">
+							<nonSort>
+								<xsl:value-of select="substring($titleChop,1, at ind2)"/>
+							</nonSort>
+							<title>
+								<xsl:value-of select="substring($titleChop, at ind2+1)"/>
+							</title>
+							<xsl:call-template name="part"/>
+						</xsl:when>
+						<xsl:otherwise>
+							<title>
+								<xsl:value-of select="$titleChop" />
+							</title>
+						</xsl:otherwise>
+					</xsl:choose>
+					<xsl:call-template name="part"></xsl:call-template>
+				</titleInfo>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=490][@ind1=0]">
+			<relatedItem type="series">
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="subfieldSelect">
+									<xsl:with-param name="codes">av</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="part"></xsl:call-template>
+				</titleInfo>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=510]">
+			<relatedItem type="isReferencedBy">
+				<note>
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">abcx3</xsl:with-param>
+					</xsl:call-template>
+				</note>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=534]">
+			<relatedItem type="original">
+				<xsl:call-template name="relatedTitle"></xsl:call-template>
+				<xsl:call-template name="relatedName"></xsl:call-template>
+				<xsl:if test="marc:subfield[@code='b' or @code='c']">
+					<originInfo>
+						<xsl:for-each select="marc:subfield[@code='c']">
+							<publisher>
+								<xsl:value-of select="."></xsl:value-of>
+							</publisher>
+						</xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']">
+							<edition>
+								<xsl:value-of select="."></xsl:value-of>
+							</edition>
+						</xsl:for-each>
+					</originInfo>
+				</xsl:if>
+				<xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
+				<xsl:for-each select="marc:subfield[@code='z']">
+					<identifier type="isbn">
+						<xsl:value-of select="."></xsl:value-of>
+					</identifier>
+				</xsl:for-each>
+				<xsl:call-template name="relatedNote"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=700][marc:subfield[@code='t']]">
+			<relatedItem>
+				<xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="afterCodes">g</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="part"></xsl:call-template>
+				</titleInfo>
+				<name type="personal">
+					<namePart>
+						<xsl:call-template name="specialSubfieldSelect">
+							<xsl:with-param name="anyCodes">aq</xsl:with-param>
+							<xsl:with-param name="axis">t</xsl:with-param>
+							<xsl:with-param name="beforeCodes">g</xsl:with-param>
+						</xsl:call-template>
+					</namePart>
+					<xsl:call-template name="termsOfAddress"></xsl:call-template>
+					<xsl:call-template name="nameDate"></xsl:call-template>
+					<xsl:call-template name="role"></xsl:call-template>
+				</name>
+				<xsl:call-template name="relatedForm"></xsl:call-template>
+				<xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=710][marc:subfield[@code='t']]">
+			<relatedItem>
+				<xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="afterCodes">dg</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="relatedPartNumName"></xsl:call-template>
+				</titleInfo>
+				<name type="corporate">
+					<xsl:for-each select="marc:subfield[@code='a']">
+						<namePart>
+							<xsl:value-of select="."></xsl:value-of>
+						</namePart>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='b']">
+						<namePart>
+							<xsl:value-of select="."></xsl:value-of>
+						</namePart>
+					</xsl:for-each>
+					<xsl:variable name="tempNamePart">
+						<xsl:call-template name="specialSubfieldSelect">
+							<xsl:with-param name="anyCodes">c</xsl:with-param>
+							<xsl:with-param name="axis">t</xsl:with-param>
+							<xsl:with-param name="beforeCodes">dgn</xsl:with-param>
+						</xsl:call-template>
+					</xsl:variable>
+					<xsl:if test="normalize-space($tempNamePart)">
+						<namePart>
+							<xsl:value-of select="$tempNamePart"></xsl:value-of>
+						</namePart>
+					</xsl:if>
+					<xsl:call-template name="role"></xsl:call-template>
+				</name>
+				<xsl:call-template name="relatedForm"></xsl:call-template>
+				<xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=711][marc:subfield[@code='t']]">
+			<relatedItem>
+				<xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="afterCodes">g</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="relatedPartNumName"></xsl:call-template>
+				</titleInfo>
+				<name type="conference">
+					<namePart>
+						<xsl:call-template name="specialSubfieldSelect">
+							<xsl:with-param name="anyCodes">aqdc</xsl:with-param>
+							<xsl:with-param name="axis">t</xsl:with-param>
+							<xsl:with-param name="beforeCodes">gn</xsl:with-param>
+						</xsl:call-template>
+					</namePart>
+				</name>
+				<xsl:call-template name="relatedForm"></xsl:call-template>
+				<xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=730][@ind2=2]">
+			<relatedItem>
+				<xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="subfieldSelect">
+									<xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="part"></xsl:call-template>
+				</titleInfo>
+				<xsl:call-template name="relatedForm"></xsl:call-template>
+				<xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=740][@ind2=2]">
+			<relatedItem>
+				<xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
+				<xsl:variable name="titleChop">
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+						</xsl:with-param>
+					</xsl:call-template>
+				</xsl:variable>
+				<titleInfo>
+					<title>
+						<xsl:value-of select="$titleChop" />
+					</title>
+					<xsl:call-template name="part"></xsl:call-template>
+				</titleInfo>
+				<titleInfo type="nfi">
+					<xsl:choose>
+						<xsl:when test="@ind1>0">
+							<nonSort>
+								<xsl:value-of select="substring($titleChop,1, at ind1)"/>
+							</nonSort>
+							<title>
+								<xsl:value-of select="substring($titleChop, at ind1+1)"/>
+							</title>
+						</xsl:when>
+						<xsl:otherwise>
+							<title>
+								<xsl:value-of select="$titleChop" />
+							</title>
+						</xsl:otherwise>
+					</xsl:choose>
+					<xsl:call-template name="part"></xsl:call-template>
+				</titleInfo>
+				<xsl:call-template name="relatedForm"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=760]|marc:datafield[@tag=762]">
+			<relatedItem type="series">
+				<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=765]|marc:datafield[@tag=767]|marc:datafield[@tag=777]|marc:datafield[@tag=787]">
+			<relatedItem>
+				<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=775]">
+			<relatedItem type="otherVersion">
+				<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=770]|marc:datafield[@tag=774]">
+			<relatedItem type="constituent">
+				<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=772]|marc:datafield[@tag=773]">
+			<relatedItem type="host">
+				<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=776]">
+			<relatedItem type="otherFormat">
+				<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=780]">
+			<relatedItem type="preceding">
+				<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=785]">
+			<relatedItem type="succeeding">
+				<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=786]">
+			<relatedItem type="original">
+				<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=800]">
+			<relatedItem type="series">
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="afterCodes">g</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="part"></xsl:call-template>
+				</titleInfo>
+				<name type="personal">
+					<namePart>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">aq</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="beforeCodes">g</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</namePart>
+					<xsl:call-template name="termsOfAddress"></xsl:call-template>
+					<xsl:call-template name="nameDate"></xsl:call-template>
+					<xsl:call-template name="role"></xsl:call-template>
+				</name>
+				<xsl:call-template name="relatedForm"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=810]">
+			<relatedItem type="series">
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="afterCodes">dg</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="relatedPartNumName"></xsl:call-template>
+				</titleInfo>
+				<name type="corporate">
+					<xsl:for-each select="marc:subfield[@code='a']">
+						<namePart>
+							<xsl:value-of select="."></xsl:value-of>
+						</namePart>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='b']">
+						<namePart>
+							<xsl:value-of select="."></xsl:value-of>
+						</namePart>
+					</xsl:for-each>
+					<namePart>
+						<xsl:call-template name="specialSubfieldSelect">
+							<xsl:with-param name="anyCodes">c</xsl:with-param>
+							<xsl:with-param name="axis">t</xsl:with-param>
+							<xsl:with-param name="beforeCodes">dgn</xsl:with-param>
+						</xsl:call-template>
+					</namePart>
+					<xsl:call-template name="role"></xsl:call-template>
+				</name>
+				<xsl:call-template name="relatedForm"></xsl:call-template>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=811]">
+			<relatedItem type="series">
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="afterCodes">g</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="relatedPartNumName"/>
+				</titleInfo>
+				<name type="conference">
+					<namePart>
+						<xsl:call-template name="specialSubfieldSelect">
+							<xsl:with-param name="anyCodes">aqdc</xsl:with-param>
+							<xsl:with-param name="axis">t</xsl:with-param>
+							<xsl:with-param name="beforeCodes">gn</xsl:with-param>
+						</xsl:call-template>
+					</namePart>
+					<xsl:call-template name="role"/>
+				</name>
+				<xsl:call-template name="relatedForm"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='830']">
+			<relatedItem type="series">
+				<xsl:variable name="titleChop">
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
+							</xsl:call-template>
+						</xsl:with-param>
+					</xsl:call-template>
+				</xsl:variable>
+				<titleInfo>
+					<title>
+						<xsl:value-of select="$titleChop" />
+					</title>
+					<xsl:call-template name="part"/>
+				</titleInfo>
+				<titleInfo type="nfi">
+					<xsl:choose>
+						<xsl:when test="@ind2>0">
+							<nonSort>
+								<xsl:value-of select="substring($titleChop,1, at ind2)"/>
+							</nonSort>
+							<title>
+								<xsl:value-of select="substring($titleChop, at ind2+1)"/>
+							</title>
+						</xsl:when>
+						<xsl:otherwise>
+							<title>
+								<xsl:value-of select="$titleChop" />
+							</title>
+						</xsl:otherwise>
+					</xsl:choose>
+					<xsl:call-template name="part"/>
+				</titleInfo>
+				<xsl:call-template name="relatedForm"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='856'][@ind2='2']/marc:subfield[@code='q']">
+			<relatedItem>
+				<internetMediaType>
+					<xsl:value-of select="."/>
+				</internetMediaType>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='020']">
+			<xsl:call-template name="isInvalid">
+				<xsl:with-param name="type">isbn</xsl:with-param>
+			</xsl:call-template>
+			<xsl:if test="marc:subfield[@code='a']">
+				<identifier type="isbn">
+					<xsl:value-of select="marc:subfield[@code='a']"/>
+				</identifier>
+			</xsl:if>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='024'][@ind1='0']">
+			<xsl:call-template name="isInvalid">
+				<xsl:with-param name="type">isrc</xsl:with-param>
+			</xsl:call-template>
+			<xsl:if test="marc:subfield[@code='a']">
+				<identifier type="isrc">
+					<xsl:value-of select="marc:subfield[@code='a']"/>
+				</identifier>
+			</xsl:if>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='024'][@ind1='2']">
+			<xsl:call-template name="isInvalid">
+				<xsl:with-param name="type">ismn</xsl:with-param>
+			</xsl:call-template>
+			<xsl:if test="marc:subfield[@code='a']">
+				<identifier type="ismn">
+					<xsl:value-of select="marc:subfield[@code='a']"/>
+				</identifier>
+			</xsl:if>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='024'][@ind1='4']">
+			<xsl:call-template name="isInvalid">
+				<xsl:with-param name="type">sici</xsl:with-param>
+			</xsl:call-template>
+			<identifier type="sici">
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</identifier>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='022']">
+			<xsl:call-template name="isInvalid">
+				<xsl:with-param name="type">issn</xsl:with-param>
+			</xsl:call-template>
+			<identifier type="issn">
+				<xsl:value-of select="marc:subfield[@code='a']"/>
+			</identifier>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='010']">
+			<xsl:call-template name="isInvalid">
+				<xsl:with-param name="type">lccn</xsl:with-param>
+			</xsl:call-template>
+			<identifier type="lccn">
+				<xsl:value-of select="normalize-space(marc:subfield[@code='a'])"/>
+			</identifier>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='028']">
+			<identifier>
+				<xsl:attribute name="type">
+					<xsl:choose>
+						<xsl:when test="@ind1='0'">issue number</xsl:when>
+						<xsl:when test="@ind1='1'">matrix number</xsl:when>
+						<xsl:when test="@ind1='2'">music plate</xsl:when>
+						<xsl:when test="@ind1='3'">music publisher</xsl:when>
+						<xsl:when test="@ind1='4'">videorecording identifier</xsl:when>
+					</xsl:choose>
+				</xsl:attribute>
+				<!--<xsl:call-template name="isInvalid"/>--> <!-- no $z in 028 -->
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">
+						<xsl:choose>
+							<xsl:when test="@ind1='0'">ba</xsl:when>
+							<xsl:otherwise>ab</xsl:otherwise>
+						</xsl:choose>
+					</xsl:with-param>
+				</xsl:call-template>
+			</identifier>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='037']">
+			<identifier type="stock number">
+				<!--<xsl:call-template name="isInvalid"/>--> <!-- no $z in 037 -->
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</identifier>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='856'][marc:subfield[@code='u']]">
+			<identifier>
+				<xsl:attribute name="type">
+					<xsl:choose>
+						<xsl:when test="starts-with(marc:subfield[@code='u'],'urn:doi') or starts-with(marc:subfield[@code='u'],'doi')">doi</xsl:when>
+						<xsl:when test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl') or starts-with(marc:subfield[@code='u'],'http://hdl.loc.gov')">hdl</xsl:when>
+						<xsl:otherwise>uri</xsl:otherwise>
+					</xsl:choose>
+				</xsl:attribute>
+				<xsl:choose>
+					<xsl:when test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl') or starts-with(marc:subfield[@code='u'],'http://hdl.loc.gov') ">
+						<xsl:value-of select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"></xsl:value-of>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:value-of select="marc:subfield[@code='u']"></xsl:value-of>
+					</xsl:otherwise>
+				</xsl:choose>
+			</identifier>
+			<xsl:if test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl')">
+				<identifier type="hdl">
+					<xsl:if test="marc:subfield[@code='y' or @code='3' or @code='z']">
+						<xsl:attribute name="displayLabel">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">y3z</xsl:with-param>
+							</xsl:call-template>
+						</xsl:attribute>
+					</xsl:if>
+					<xsl:value-of select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"></xsl:value-of>
+				</identifier>
+			</xsl:if>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=024][@ind1=1]">
+			<identifier type="upc">
+				<xsl:call-template name="isInvalid"/>
+				<xsl:value-of select="marc:subfield[@code='a']"/>
+			</identifier>
+		</xsl:for-each>
+		<!-- 1/04 fix added $y -->
+		<xsl:for-each select="marc:datafield[@tag=856][marc:subfield[@code='u']]">
+			<location>
+				<url>
+					<xsl:if test="marc:subfield[@code='y' or @code='3']">
+						<xsl:attribute name="displayLabel">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">y3</xsl:with-param>
+							</xsl:call-template>
+						</xsl:attribute>
+					</xsl:if>
+					<xsl:if test="marc:subfield[@code='z' ]">
+						<xsl:attribute name="note">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">z</xsl:with-param>
+							</xsl:call-template>
+						</xsl:attribute>
+					</xsl:if>
+					<xsl:value-of select="marc:subfield[@code='u']"></xsl:value-of>
+
+				</url>
+			</location>
+		</xsl:for-each>
+			
+			<!-- 3.2 change tmee 856z  -->
+
+		
+		<xsl:for-each select="marc:datafield[@tag=852]">
+			<location>
+				<physicalLocation>
+					<xsl:call-template name="displayLabel"></xsl:call-template>
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">abje</xsl:with-param>
+					</xsl:call-template>
+				</physicalLocation>
+			</location>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=506]">
+			<accessCondition type="restrictionOnAccess">
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">abcd35</xsl:with-param>
+				</xsl:call-template>
+			</accessCondition>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=540]">
+			<accessCondition type="useAndReproduction">
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">abcde35</xsl:with-param>
+				</xsl:call-template>
+			</accessCondition>
+		</xsl:for-each>
+		<recordInfo>
+			<xsl:for-each select="marc:datafield[@tag=040]">
+				<recordContentSource authority="marcorg">
+					<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+				</recordContentSource>
+			</xsl:for-each>
+			<xsl:for-each select="marc:controlfield[@tag=008]">
+				<recordCreationDate encoding="marc">
+					<xsl:value-of select="substring(.,1,6)"></xsl:value-of>
+				</recordCreationDate>
+			</xsl:for-each>
+			<xsl:for-each select="marc:controlfield[@tag=005]">
+				<recordChangeDate encoding="iso8601">
+					<xsl:value-of select="."></xsl:value-of>
+				</recordChangeDate>
+			</xsl:for-each>
+			<xsl:for-each select="marc:controlfield[@tag=001]">
+				<recordIdentifier>
+					<xsl:if test="../marc:controlfield[@tag=003]">
+						<xsl:attribute name="source">
+							<xsl:value-of select="../marc:controlfield[@tag=003]"></xsl:value-of>
+						</xsl:attribute>
+					</xsl:if>
+					<xsl:value-of select="."></xsl:value-of>
+				</recordIdentifier>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=040]/marc:subfield[@code='b']">
+				<languageOfCataloging>
+					<languageTerm authority="iso639-2b" type="code">
+						<xsl:value-of select="."></xsl:value-of>
+					</languageTerm>
+				</languageOfCataloging>
+			</xsl:for-each>
+		</recordInfo>
+	</xsl:template>
+	<xsl:template name="displayForm">
+		<xsl:for-each select="marc:subfield[@code='c']">
+			<displayForm>
+				<xsl:value-of select="."></xsl:value-of>
+			</displayForm>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="affiliation">
+		<xsl:for-each select="marc:subfield[@code='u']">
+			<affiliation>
+				<xsl:value-of select="."></xsl:value-of>
+			</affiliation>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="uri">
+		<xsl:for-each select="marc:subfield[@code='u']">
+			<xsl:attribute name="xlink:href">
+				<xsl:value-of select="."></xsl:value-of>
+			</xsl:attribute>
+		</xsl:for-each>
+		<xsl:for-each select="marc:subfield[@code='0']">
+			<xsl:choose>
+				<xsl:when test="contains(text(), ')')">
+					<xsl:attribute name="xlink:href">
+						<xsl:value-of select="substring-after(text(), ')')"></xsl:value-of>
+					</xsl:attribute>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:attribute name="xlink:href">
+						<xsl:value-of select="."></xsl:value-of>
+					</xsl:attribute>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="role">
+		<xsl:for-each select="marc:subfield[@code='e']">
+			<role>
+				<roleTerm type="text">
+					<xsl:value-of select="."></xsl:value-of>
+				</roleTerm>
+			</role>
+		</xsl:for-each>
+		<xsl:for-each select="marc:subfield[@code='4']">
+			<role>
+				<roleTerm authority="marcrelator" type="code">
+					<xsl:value-of select="."></xsl:value-of>
+				</roleTerm>
+			</role>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="part">
+		<xsl:variable name="partNumber">
+			<xsl:call-template name="specialSubfieldSelect">
+				<xsl:with-param name="axis">n</xsl:with-param>
+				<xsl:with-param name="anyCodes">n</xsl:with-param>
+				<xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:variable name="partName">
+			<xsl:call-template name="specialSubfieldSelect">
+				<xsl:with-param name="axis">p</xsl:with-param>
+				<xsl:with-param name="anyCodes">p</xsl:with-param>
+				<xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:if test="string-length(normalize-space($partNumber))">
+			<partNumber>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="$partNumber"></xsl:with-param>
+				</xsl:call-template>
+			</partNumber>
+		</xsl:if>
+		<xsl:if test="string-length(normalize-space($partName))">
+			<partName>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="$partName"></xsl:with-param>
+				</xsl:call-template>
+			</partName>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="relatedPart">
+		<xsl:if test="@tag=773">
+			<xsl:for-each select="marc:subfield[@code='g']">
+				<part>
+					<text>
+						<xsl:value-of select="."></xsl:value-of>
+					</text>
+				</part>
+			</xsl:for-each>
+			<xsl:for-each select="marc:subfield[@code='q']">
+				<part>
+					<xsl:call-template name="parsePart"></xsl:call-template>
+				</part>
+			</xsl:for-each>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="relatedPartNumName">
+		<xsl:variable name="partNumber">
+			<xsl:call-template name="specialSubfieldSelect">
+				<xsl:with-param name="axis">g</xsl:with-param>
+				<xsl:with-param name="anyCodes">g</xsl:with-param>
+				<xsl:with-param name="afterCodes">pst</xsl:with-param>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:variable name="partName">
+			<xsl:call-template name="specialSubfieldSelect">
+				<xsl:with-param name="axis">p</xsl:with-param>
+				<xsl:with-param name="anyCodes">p</xsl:with-param>
+				<xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:if test="string-length(normalize-space($partNumber))">
+			<partNumber>
+				<xsl:value-of select="$partNumber"></xsl:value-of>
+			</partNumber>
+		</xsl:if>
+		<xsl:if test="string-length(normalize-space($partName))">
+			<partName>
+				<xsl:value-of select="$partName"></xsl:value-of>
+			</partName>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="relatedName">
+		<xsl:for-each select="marc:subfield[@code='a']">
+			<name>
+				<namePart>
+					<xsl:value-of select="."></xsl:value-of>
+				</namePart>
+			</name>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedForm">
+		<xsl:for-each select="marc:subfield[@code='h']">
+			<physicalDescription>
+				<form>
+					<xsl:value-of select="."></xsl:value-of>
+				</form>
+			</physicalDescription>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedExtent">
+		<xsl:for-each select="marc:subfield[@code='h']">
+			<physicalDescription>
+				<extent>
+					<xsl:value-of select="."></xsl:value-of>
+				</extent>
+			</physicalDescription>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedNote">
+		<xsl:for-each select="marc:subfield[@code='n']">
+			<note>
+				<xsl:value-of select="."></xsl:value-of>
+			</note>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedSubject">
+		<xsl:for-each select="marc:subfield[@code='j']">
+			<subject>
+				<temporal encoding="iso8601">
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString" select="."></xsl:with-param>
+					</xsl:call-template>
+				</temporal>
+			</subject>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedIdentifierISSN">
+		<xsl:for-each select="marc:subfield[@code='x']">
+			<identifier type="issn">
+				<xsl:value-of select="."></xsl:value-of>
+			</identifier>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedIdentifierLocal">
+		<xsl:for-each select="marc:subfield[@code='w']">
+			<identifier type="local">
+				<xsl:value-of select="."></xsl:value-of>
+			</identifier>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedIdentifier">
+		<xsl:for-each select="marc:subfield[@code='o']">
+			<identifier>
+				<xsl:value-of select="."></xsl:value-of>
+			</identifier>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedItem76X-78X">
+		<xsl:call-template name="displayLabel"></xsl:call-template>
+		<xsl:call-template name="relatedTitle76X-78X"></xsl:call-template>
+		<xsl:call-template name="relatedName"></xsl:call-template>
+		<xsl:call-template name="relatedOriginInfo"></xsl:call-template>
+		<xsl:call-template name="relatedLanguage"></xsl:call-template>
+		<xsl:call-template name="relatedExtent"></xsl:call-template>
+		<xsl:call-template name="relatedNote"></xsl:call-template>
+		<xsl:call-template name="relatedSubject"></xsl:call-template>
+		<xsl:call-template name="relatedIdentifier"></xsl:call-template>
+		<xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
+		<xsl:call-template name="relatedIdentifierLocal"></xsl:call-template>
+		<xsl:call-template name="relatedPart"></xsl:call-template>
+	</xsl:template>
+	<xsl:template name="subjectGeographicZ">
+		<geographic>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString" select="."></xsl:with-param>
+			</xsl:call-template>
+		</geographic>
+	</xsl:template>
+	<xsl:template name="subjectTemporalY">
+		<temporal>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString" select="."></xsl:with-param>
+			</xsl:call-template>
+		</temporal>
+	</xsl:template>
+	<xsl:template name="subjectTopic">
+		<topic>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString" select="."></xsl:with-param>
+			</xsl:call-template>
+		</topic>
+	</xsl:template>	
+	<!-- 3.2 change tmee 6xx $v genre -->
+	<xsl:template name="subjectGenre">
+		<genre>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString" select="."></xsl:with-param>
+			</xsl:call-template>
+		</genre>
+	</xsl:template>
+	
+	<xsl:template name="nameABCDN">
+		<xsl:for-each select="marc:subfield[@code='a']">
+			<namePart>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="."></xsl:with-param>
+				</xsl:call-template>
+			</namePart>
+		</xsl:for-each>
+		<xsl:for-each select="marc:subfield[@code='b']">
+			<namePart>
+				<xsl:value-of select="."></xsl:value-of>
+			</namePart>
+		</xsl:for-each>
+		<xsl:if test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
+			<namePart>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">cdn</xsl:with-param>
+				</xsl:call-template>
+			</namePart>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="nameABCDQ">
+		<namePart>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString">
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">aq</xsl:with-param>
+					</xsl:call-template>
+				</xsl:with-param>
+				<xsl:with-param name="punctuation">
+					<xsl:text>:,;/ </xsl:text>
+				</xsl:with-param>
+			</xsl:call-template>
+		</namePart>
+		<xsl:call-template name="termsOfAddress"></xsl:call-template>
+		<xsl:call-template name="nameDate"></xsl:call-template>
+	</xsl:template>
+	<xsl:template name="nameACDEQ">
+		<namePart>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">acdeq</xsl:with-param>
+			</xsl:call-template>
+		</namePart>
+	</xsl:template>
+	<xsl:template name="constituentOrRelatedType">
+		<xsl:if test="@ind2=2">
+			<xsl:attribute name="type">constituent</xsl:attribute>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="relatedTitle">
+		<xsl:for-each select="marc:subfield[@code='t']">
+			<titleInfo>
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="."></xsl:value-of>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+			</titleInfo>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedTitle76X-78X">
+		<xsl:for-each select="marc:subfield[@code='t']">
+			<titleInfo>
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="."></xsl:value-of>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
+					<xsl:call-template name="relatedPartNumName"></xsl:call-template>
+				</xsl:if>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:subfield[@code='p']">
+			<titleInfo type="abbreviated">
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="."></xsl:value-of>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
+					<xsl:call-template name="relatedPartNumName"></xsl:call-template>
+				</xsl:if>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:subfield[@code='s']">
+			<titleInfo type="uniform">
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="."></xsl:value-of>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
+					<xsl:call-template name="relatedPartNumName"></xsl:call-template>
+				</xsl:if>
+			</titleInfo>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedOriginInfo">
+		<xsl:if test="marc:subfield[@code='b' or @code='d'] or marc:subfield[@code='f']">
+			<originInfo>
+				<xsl:if test="@tag=775">
+					<xsl:for-each select="marc:subfield[@code='f']">
+						<place>
+							<placeTerm>
+								<xsl:attribute name="type">code</xsl:attribute>
+								<xsl:attribute name="authority">marcgac</xsl:attribute>
+								<xsl:value-of select="."></xsl:value-of>
+							</placeTerm>
+						</place>
+					</xsl:for-each>
+				</xsl:if>
+				<xsl:for-each select="marc:subfield[@code='d']">
+					<publisher>
+						<xsl:value-of select="."></xsl:value-of>
+					</publisher>
+				</xsl:for-each>
+				<xsl:for-each select="marc:subfield[@code='b']">
+					<edition>
+						<xsl:value-of select="."></xsl:value-of>
+					</edition>
+				</xsl:for-each>
+			</originInfo>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="relatedLanguage">
+		<xsl:for-each select="marc:subfield[@code='e']">
+			<xsl:call-template name="getLanguage">
+				<xsl:with-param name="langString">
+					<xsl:value-of select="."></xsl:value-of>
+				</xsl:with-param>
+			</xsl:call-template>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="nameDate">
+		<xsl:for-each select="marc:subfield[@code='d']">
+			<namePart type="date">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="."></xsl:with-param>
+				</xsl:call-template>
+			</namePart>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="subjectAuthority">
+		<xsl:if test="@ind2!=4">
+			<xsl:if test="@ind2!=' '">
+				<xsl:if test="@ind2!=8">
+					<xsl:if test="@ind2!=9">
+						<xsl:attribute name="authority">
+							<xsl:choose>
+								<xsl:when test="@ind2=0">lcsh</xsl:when>
+								<xsl:when test="@ind2=1">lcshac</xsl:when>
+								<xsl:when test="@ind2=2">mesh</xsl:when>
+								<!-- 1/04 fix -->
+								<xsl:when test="@ind2=3">nal</xsl:when>
+								<xsl:when test="@ind2=5">csh</xsl:when>
+								<xsl:when test="@ind2=6">rvm</xsl:when>
+								<xsl:when test="@ind2=7">
+									<xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
+								</xsl:when>
+							</xsl:choose>
+						</xsl:attribute>
+					</xsl:if>
+				</xsl:if>
+			</xsl:if>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="subjectAnyOrder">
+		<xsl:for-each select="marc:subfield[@code='v' or @code='x' or @code='y' or @code='z']">
+			<xsl:choose>
+				<xsl:when test="@code='v'">
+					<xsl:call-template name="subjectGenre"></xsl:call-template>
+				</xsl:when>
+				<xsl:when test="@code='x'">
+					<xsl:call-template name="subjectTopic"></xsl:call-template>
+				</xsl:when>
+				<xsl:when test="@code='y'">
+					<xsl:call-template name="subjectTemporalY"></xsl:call-template>
+				</xsl:when>
+				<xsl:when test="@code='z'">
+					<xsl:call-template name="subjectGeographicZ"></xsl:call-template>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="specialSubfieldSelect">
+		<xsl:param name="anyCodes"></xsl:param>
+		<xsl:param name="axis"></xsl:param>
+		<xsl:param name="beforeCodes"></xsl:param>
+		<xsl:param name="afterCodes"></xsl:param>
+		<xsl:variable name="str">
+			<xsl:for-each select="marc:subfield">
+				<xsl:if test="contains($anyCodes, @code)      or (contains($beforeCodes, at code) and following-sibling::marc:subfield[@code=$axis])      or (contains($afterCodes, at code) and preceding-sibling::marc:subfield[@code=$axis])">
+					<xsl:value-of select="text()"></xsl:value-of>
+					<xsl:text> </xsl:text>
+				</xsl:if>
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
+	</xsl:template>
+	
+	<!-- 3.2 change tmee 6xx $v genre -->
+	<xsl:template match="marc:datafield[@tag=600]">
+		<subject>
+			<xsl:call-template name="subjectAuthority"></xsl:call-template>
+			<name type="personal">
+				<xsl:call-template name="uri" />
+				<xsl:call-template name="termsOfAddress"></xsl:call-template>
+				<namePart>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">aq</xsl:with-param>
+							</xsl:call-template>
+						</xsl:with-param>
+					</xsl:call-template>
+				</namePart>
+				<xsl:call-template name="nameDate"></xsl:call-template>
+				<xsl:call-template name="affiliation"></xsl:call-template>
+				<xsl:call-template name="role"></xsl:call-template>
+			</name>
+			<xsl:call-template name="subjectAnyOrder"></xsl:call-template>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=610]">
+		<subject>
+			<xsl:call-template name="subjectAuthority"></xsl:call-template>
+			<name type="corporate">
+				<xsl:call-template name="uri" />
+				<xsl:for-each select="marc:subfield[@code='a']">
+					<namePart>
+						<xsl:value-of select="."></xsl:value-of>
+					</namePart>
+				</xsl:for-each>
+				<xsl:for-each select="marc:subfield[@code='b']">
+					<namePart>
+						<xsl:value-of select="."></xsl:value-of>
+					</namePart>
+				</xsl:for-each>
+				<xsl:if test="marc:subfield[@code='c' or @code='d' or @code='n' or @code='p']">
+					<namePart>
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">cdnp</xsl:with-param>
+						</xsl:call-template>
+					</namePart>
+				</xsl:if>
+				<xsl:call-template name="role"></xsl:call-template>
+			</name>
+			<xsl:call-template name="subjectAnyOrder"></xsl:call-template>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=611]">
+		<subject>
+			<xsl:call-template name="subjectAuthority"></xsl:call-template>
+			<name type="conference">
+				<xsl:call-template name="uri" />
+				<namePart>
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">abcdeqnp</xsl:with-param>
+					</xsl:call-template>
+				</namePart>
+				<xsl:for-each select="marc:subfield[@code='4']">
+					<role>
+						<roleTerm authority="marcrelator" type="code">
+							<xsl:value-of select="."></xsl:value-of>
+						</roleTerm>
+					</role>
+				</xsl:for-each>
+			</name>
+			<xsl:call-template name="subjectAnyOrder"></xsl:call-template>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=630]">
+		<subject>
+			<xsl:call-template name="subjectAuthority"></xsl:call-template>
+			<xsl:variable name="titleChop">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">adfhklor</xsl:with-param>
+						</xsl:call-template>
+					</xsl:with-param>
+				</xsl:call-template>
+			</xsl:variable>
+			<titleInfo>
+				<title>
+					<xsl:value-of select="$titleChop" />
+				</title>
+				<xsl:call-template name="part"></xsl:call-template>
+			</titleInfo>
+			<titleInfo type="nfi">
+				<xsl:choose>
+					<xsl:when test="@ind1>0">
+						<nonSort>
+							<xsl:value-of select="substring($titleChop,1, at ind1)"/>
+						</nonSort>
+						<title>
+							<xsl:value-of select="substring($titleChop, at ind1+1)"/>
+						</title>
+						<xsl:call-template name="part"/>
+					</xsl:when>
+					<xsl:otherwise>
+						<title>
+							<xsl:value-of select="$titleChop" />
+						</title>
+					</xsl:otherwise>
+				</xsl:choose>
+				<xsl:call-template name="part"></xsl:call-template>
+			</titleInfo>
+			<xsl:call-template name="subjectAnyOrder"></xsl:call-template>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=650]">
+		<subject>
+			<xsl:call-template name="subjectAuthority"></xsl:call-template>
+			<topic>
+				<xsl:call-template name="uri" />
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">abcd</xsl:with-param>
+						</xsl:call-template>
+					</xsl:with-param>
+				</xsl:call-template>
+			</topic>
+			<xsl:call-template name="subjectAnyOrder"></xsl:call-template>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=651]">
+		<subject>
+			<xsl:call-template name="subjectAuthority"></xsl:call-template>
+			<xsl:for-each select="marc:subfield[@code='a']">
+				<geographic>
+					<xsl:call-template name="uri" />
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString" select="."></xsl:with-param>
+					</xsl:call-template>
+				</geographic>
+			</xsl:for-each>
+			<xsl:call-template name="subjectAnyOrder"></xsl:call-template>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=653]">
+		<subject>
+			<xsl:for-each select="marc:subfield[@code='a']">
+				<topic>
+					<xsl:call-template name="uri" />
+					<xsl:value-of select="."></xsl:value-of>
+				</topic>
+			</xsl:for-each>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=656]">
+		<subject>
+			<xsl:if test="marc:subfield[@code=2]">
+				<xsl:attribute name="authority">
+					<xsl:value-of select="marc:subfield[@code=2]"></xsl:value-of>
+				</xsl:attribute>
+			</xsl:if>
+			<occupation>
+				<xsl:call-template name="uri" />
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
+					</xsl:with-param>
+				</xsl:call-template>
+			</occupation>
+		</subject>
+	</xsl:template>
+	<xsl:template name="termsOfAddress">
+		<xsl:if test="marc:subfield[@code='b' or @code='c']">
+			<namePart type="termsOfAddress">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">bc</xsl:with-param>
+						</xsl:call-template>
+					</xsl:with-param>
+				</xsl:call-template>
+			</namePart>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="displayLabel">
+		<xsl:if test="marc:subfield[@code='i']">
+			<xsl:attribute name="displayLabel">
+				<xsl:value-of select="marc:subfield[@code='i']"></xsl:value-of>
+			</xsl:attribute>
+		</xsl:if>
+		<xsl:if test="marc:subfield[@code='3']">
+			<xsl:attribute name="displayLabel">
+				<xsl:value-of select="marc:subfield[@code='3']"></xsl:value-of>
+			</xsl:attribute>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="isInvalid">
+		<xsl:param name="type"/>
+		<xsl:if test="marc:subfield[@code='z'] or marc:subfield[@code='y']">
+			<identifier>
+				<xsl:attribute name="type">
+					<xsl:value-of select="$type"/>
+				</xsl:attribute>
+				<xsl:attribute name="invalid">
+					<xsl:text>yes</xsl:text>
+				</xsl:attribute>
+				<xsl:if test="marc:subfield[@code='z']">
+					<xsl:value-of select="marc:subfield[@code='z']"/>
+				</xsl:if>
+				<xsl:if test="marc:subfield[@code='y']">
+					<xsl:value-of select="marc:subfield[@code='y']"/>
+				</xsl:if>
+			</identifier>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="subtitle">
+		<xsl:if test="marc:subfield[@code='b']">
+			<subTitle>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:value-of select="marc:subfield[@code='b']"/>
+						<!--<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">b</xsl:with-param>									
+						</xsl:call-template>-->
+					</xsl:with-param>
+				</xsl:call-template>
+			</subTitle>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="script">
+		<xsl:param name="scriptCode"></xsl:param>
+		<xsl:attribute name="script">
+			<xsl:choose>
+				<xsl:when test="$scriptCode='(3'">Arabic</xsl:when>
+				<xsl:when test="$scriptCode='(B'">Latin</xsl:when>
+				<xsl:when test="$scriptCode='$1'">Chinese, Japanese, Korean</xsl:when>
+				<xsl:when test="$scriptCode='(N'">Cyrillic</xsl:when>
+				<xsl:when test="$scriptCode='(2'">Hebrew</xsl:when>
+				<xsl:when test="$scriptCode='(S'">Greek</xsl:when>
+			</xsl:choose>
+		</xsl:attribute>
+	</xsl:template>
+	<xsl:template name="parsePart">
+		<!-- assumes 773$q= 1:2:3<4
+		     with up to 3 levels and one optional start page
+		-->
+		<xsl:variable name="level1">
+			<xsl:choose>
+				<xsl:when test="contains(text(),':')">
+					<!-- 1:2 -->
+					<xsl:value-of select="substring-before(text(),':')"></xsl:value-of>
+				</xsl:when>
+				<xsl:when test="not(contains(text(),':'))">
+					<!-- 1 or 1<3 -->
+					<xsl:if test="contains(text(),'&lt;')">
+						<!-- 1<3 -->
+						<xsl:value-of select="substring-before(text(),'&lt;')"></xsl:value-of>
+					</xsl:if>
+					<xsl:if test="not(contains(text(),'&lt;'))">
+						<!-- 1 -->
+						<xsl:value-of select="text()"></xsl:value-of>
+					</xsl:if>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:variable name="sici2">
+			<xsl:choose>
+				<xsl:when test="starts-with(substring-after(text(),$level1),':')">
+					<xsl:value-of select="substring(substring-after(text(),$level1),2)"></xsl:value-of>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="substring-after(text(),$level1)"></xsl:value-of>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:variable name="level2">
+			<xsl:choose>
+				<xsl:when test="contains($sici2,':')">
+					<!--  2:3<4  -->
+					<xsl:value-of select="substring-before($sici2,':')"></xsl:value-of>
+				</xsl:when>
+				<xsl:when test="contains($sici2,'&lt;')">
+					<!-- 1: 2<4 -->
+					<xsl:value-of select="substring-before($sici2,'&lt;')"></xsl:value-of>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="$sici2"></xsl:value-of>
+					<!-- 1:2 -->
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:variable name="sici3">
+			<xsl:choose>
+				<xsl:when test="starts-with(substring-after($sici2,$level2),':')">
+					<xsl:value-of select="substring(substring-after($sici2,$level2),2)"></xsl:value-of>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="substring-after($sici2,$level2)"></xsl:value-of>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:variable name="level3">
+			<xsl:choose>
+				<xsl:when test="contains($sici3,'&lt;')">
+					<!-- 2<4 -->
+					<xsl:value-of select="substring-before($sici3,'&lt;')"></xsl:value-of>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="$sici3"></xsl:value-of>
+					<!-- 3 -->
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:variable name="page">
+			<xsl:if test="contains(text(),'&lt;')">
+				<xsl:value-of select="substring-after(text(),'&lt;')"></xsl:value-of>
+			</xsl:if>
+		</xsl:variable>
+		<xsl:if test="$level1">
+			<detail level="1">
+				<number>
+					<xsl:value-of select="$level1"></xsl:value-of>
+				</number>
+			</detail>
+		</xsl:if>
+		<xsl:if test="$level2">
+			<detail level="2">
+				<number>
+					<xsl:value-of select="$level2"></xsl:value-of>
+				</number>
+			</detail>
+		</xsl:if>
+		<xsl:if test="$level3">
+			<detail level="3">
+				<number>
+					<xsl:value-of select="$level3"></xsl:value-of>
+				</number>
+			</detail>
+		</xsl:if>
+		<xsl:if test="$page">
+			<extent unit="page">
+				<start>
+					<xsl:value-of select="$page"></xsl:value-of>
+				</start>
+			</extent>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="getLanguage">
+		<xsl:param name="langString"></xsl:param>
+		<xsl:param name="controlField008-35-37"></xsl:param>
+		<xsl:variable name="length" select="string-length($langString)"></xsl:variable>
+		<xsl:choose>
+			<xsl:when test="$length=0"></xsl:when>
+			<xsl:when test="$controlField008-35-37=substring($langString,1,3)">
+				<xsl:call-template name="getLanguage">
+					<xsl:with-param name="langString" select="substring($langString,4,$length)"></xsl:with-param>
+					<xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"></xsl:with-param>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:otherwise>
+				<language>
+					<languageTerm authority="iso639-2b" type="code">
+						<xsl:value-of select="substring($langString,1,3)"></xsl:value-of>
+					</languageTerm>
+				</language>
+				<xsl:call-template name="getLanguage">
+					<xsl:with-param name="langString" select="substring($langString,4,$length)"></xsl:with-param>
+					<xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"></xsl:with-param>
+				</xsl:call-template>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+	<xsl:template name="isoLanguage">
+		<xsl:param name="currentLanguage"></xsl:param>
+		<xsl:param name="usedLanguages"></xsl:param>
+		<xsl:param name="remainingLanguages"></xsl:param>
+		<xsl:choose>
+			<xsl:when test="string-length($currentLanguage)=0"></xsl:when>
+			<xsl:when test="not(contains($usedLanguages, $currentLanguage))">
+				<language>
+					<xsl:if test="@code!='a'">
+						<xsl:attribute name="objectPart">
+							<xsl:choose>
+								<xsl:when test="@code='b'">summary or subtitle</xsl:when>
+								<xsl:when test="@code='d'">sung or spoken text</xsl:when>
+								<xsl:when test="@code='e'">libretto</xsl:when>
+								<xsl:when test="@code='f'">table of contents</xsl:when>
+								<xsl:when test="@code='g'">accompanying material</xsl:when>
+								<xsl:when test="@code='h'">translation</xsl:when>
+							</xsl:choose>
+						</xsl:attribute>
+					</xsl:if>
+					<languageTerm authority="iso639-2b" type="code">
+						<xsl:value-of select="$currentLanguage"></xsl:value-of>
+					</languageTerm>
+				</language>
+				<xsl:call-template name="isoLanguage">
+					<xsl:with-param name="currentLanguage">
+						<xsl:value-of select="substring($remainingLanguages,1,3)"></xsl:value-of>
+					</xsl:with-param>
+					<xsl:with-param name="usedLanguages">
+						<xsl:value-of select="concat($usedLanguages,$currentLanguage)"></xsl:value-of>
+					</xsl:with-param>
+					<xsl:with-param name="remainingLanguages">
+						<xsl:value-of select="substring($remainingLanguages,4,string-length($remainingLanguages))"></xsl:value-of>
+					</xsl:with-param>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:call-template name="isoLanguage">
+					<xsl:with-param name="currentLanguage">
+						<xsl:value-of select="substring($remainingLanguages,1,3)"></xsl:value-of>
+					</xsl:with-param>
+					<xsl:with-param name="usedLanguages">
+						<xsl:value-of select="concat($usedLanguages,$currentLanguage)"></xsl:value-of>
+					</xsl:with-param>
+					<xsl:with-param name="remainingLanguages">
+						<xsl:value-of select="substring($remainingLanguages,4,string-length($remainingLanguages))"></xsl:value-of>
+					</xsl:with-param>
+				</xsl:call-template>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+	<xsl:template name="chopBrackets">
+		<xsl:param name="chopString"></xsl:param>
+		<xsl:variable name="string">
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString" select="$chopString"></xsl:with-param>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:if test="substring($string, 1,1)='['">
+			<xsl:value-of select="substring($string,2, string-length($string)-2)"></xsl:value-of>
+		</xsl:if>
+		<xsl:if test="substring($string, 1,1)!='['">
+			<xsl:value-of select="$string"></xsl:value-of>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="rfcLanguages">
+		<xsl:param name="nodeNum"></xsl:param>
+		<xsl:param name="usedLanguages"></xsl:param>
+		<xsl:param name="controlField008-35-37"></xsl:param>
+		<xsl:variable name="currentLanguage" select="."></xsl:variable>
+		<xsl:choose>
+			<xsl:when test="not($currentLanguage)"></xsl:when>
+			<xsl:when test="$currentLanguage!=$controlField008-35-37 and $currentLanguage!='rfc3066'">
+				<xsl:if test="not(contains($usedLanguages,$currentLanguage))">
+					<language>
+						<xsl:if test="@code!='a'">
+							<xsl:attribute name="objectPart">
+								<xsl:choose>
+									<xsl:when test="@code='b'">summary or subtitle</xsl:when>
+									<xsl:when test="@code='d'">sung or spoken text</xsl:when>
+									<xsl:when test="@code='e'">libretto</xsl:when>
+									<xsl:when test="@code='f'">table of contents</xsl:when>
+									<xsl:when test="@code='g'">accompanying material</xsl:when>
+									<xsl:when test="@code='h'">translation</xsl:when>
+								</xsl:choose>
+							</xsl:attribute>
+						</xsl:if>
+						<languageTerm authority="rfc3066" type="code">
+							<xsl:value-of select="$currentLanguage"/>
+						</languageTerm>
+					</language>
+				</xsl:if>
+			</xsl:when>
+			<xsl:otherwise>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+	<xsl:template name="datafield">
+		<xsl:param name="tag"/>
+		<xsl:param name="ind1"><xsl:text> </xsl:text></xsl:param>
+		<xsl:param name="ind2"><xsl:text> </xsl:text></xsl:param>
+		<xsl:param name="subfields"/>
+		<xsl:element name="marc:datafield">
+			<xsl:attribute name="tag">
+				<xsl:value-of select="$tag"/>
+			</xsl:attribute>
+			<xsl:attribute name="ind1">
+				<xsl:value-of select="$ind1"/>
+			</xsl:attribute>
+			<xsl:attribute name="ind2">
+				<xsl:value-of select="$ind2"/>
+			</xsl:attribute>
+			<xsl:copy-of select="$subfields"/>
+		</xsl:element>
+	</xsl:template>
+
+	<xsl:template name="subfieldSelect">
+		<xsl:param name="codes"/>
+		<xsl:param name="delimeter"><xsl:text> </xsl:text></xsl:param>
+		<xsl:variable name="str">
+			<xsl:for-each select="marc:subfield">
+				<xsl:if test="contains($codes, @code)">
+					<xsl:value-of select="text()"/><xsl:value-of select="$delimeter"/>
+				</xsl:if>
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
+	</xsl:template>
+
+	<xsl:template name="buildSpaces">
+		<xsl:param name="spaces"/>
+		<xsl:param name="char"><xsl:text> </xsl:text></xsl:param>
+		<xsl:if test="$spaces>0">
+			<xsl:value-of select="$char"/>
+			<xsl:call-template name="buildSpaces">
+				<xsl:with-param name="spaces" select="$spaces - 1"/>
+				<xsl:with-param name="char" select="$char"/>
+			</xsl:call-template>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name="chopPunctuation">
+		<xsl:param name="chopString"/>
+		<xsl:param name="punctuation"><xsl:text>.:,;/ </xsl:text></xsl:param>
+		<xsl:variable name="length" select="string-length($chopString)"/>
+		<xsl:choose>
+			<xsl:when test="$length=0"/>
+			<xsl:when test="contains($punctuation, substring($chopString,$length,1))">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+					<xsl:with-param name="punctuation" select="$punctuation"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="not($chopString)"/>
+			<xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template name="chopPunctuationFront">
+		<xsl:param name="chopString"/>
+		<xsl:variable name="length" select="string-length($chopString)"/>
+		<xsl:choose>
+			<xsl:when test="$length=0"/>
+			<xsl:when test="contains('.:,;/[ ', substring($chopString,1,1))">
+				<xsl:call-template name="chopPunctuationFront">
+					<xsl:with-param name="chopString" select="substring($chopString,2,$length - 1)"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="not($chopString)"/>
+			<xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+</xsl:stylesheet>$$ WHERE name = 'mods32';
+
+
+-- 954.data.MODS33-xsl.sql
+UPDATE config.xml_transform SET xslt=$$<xsl:stylesheet xmlns="http://www.loc.gov/mods/v3" xmlns:marc="http://www.loc.gov/MARC21/slim"
+	xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+	exclude-result-prefixes="xlink marc" version="1.0">
+	<xsl:output encoding="UTF-8" indent="yes" method="xml"/>
+
+	<xsl:variable name="ascii">
+		<xsl:text> !"#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~</xsl:text>
+	</xsl:variable>
+
+	<xsl:variable name="latin1">
+		<xsl:text> ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ</xsl:text>
+	</xsl:variable>
+	<!-- Characters that usually don't need to be escaped -->
+	<xsl:variable name="safe">
+		<xsl:text>!'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~</xsl:text>
+	</xsl:variable>
+
+	<xsl:variable name="hex">0123456789ABCDEF</xsl:variable>
+
+    <!-- Evergreen specific: revert Revision 1.23, so we can have those authority xlink attributes back. -->
+
+	<!--MARC21slim2MODS3-3.xsl
+Revision 1.27 - Mapped 648 to <subject> 2009/03/13 tmee
+Revision 1.26 - Added subfield $s mapping for 130/240/730  2008/10/16 tmee
+Revision 1.25 - Mapped 040e to <descriptiveStandard> and Leader/18 to <descriptive standard>aacr2  2008/09/18 tmee
+Revision 1.24 - Mapped 852 subfields $h, $i, $j, $k, $l, $m, $t to <shelfLocation> and 852 subfield $u to <physicalLocation> with @xlink 2008/09/17 tmee
+Revision 1.23 - Commented out xlink/uri for subfield 0 for 130/240/730, 100/700, 110/710, 111/711 as these are currently unactionable  2008/09/17  tmee
+Revision 1.22 - Mapped 022 subfield $l to type "issn-l" subfield $m to output identifier element with corresponding @type and @invalid eq 'yes'2008/09/17  tmee
+Revision 1.21 - Mapped 856 ind2=1 or ind2=2 to <relatedItem><location><url>  2008/07/03  tmee
+Revision 1.20 - Added genre w/@auth="contents of 2" and type= "musical composition"  2008/07/01  tmee
+Revision 1.19 - Added genre offprint for 008/24+ BK code 2  2008/07/01  tmee
+Revision 1.18 - Added xlink/uri for subfield 0 for 130/240/730, 100/700, 110/710, 111/711  2008/06/26  tmee
+Revision 1.17 - Added mapping of 662 2008/05/14 tmee	
+Revision 1.16 - Changed @authority from "marc" to "marcgt" for 007 and 008 codes mapped to a term in <genre> 2007/07/10  tmee
+Revision 1.15 - For field 630, moved call to part template outside title element  2007/07/10  tmee
+Revision 1.14 - Fixed template isValid and fields 010, 020, 022, 024, 028, and 037 to output additional identifier elements with corresponding @type and @invalid eq 'yes' when subfields z or y (in the case of 022) exist in the MARCXML ::: 2007/01/04 17:35:20 cred
+Revision 1.13 - Changed order of output under cartographics to reflect schema  2006/11/28  tmee
+Revision 1.12 - Updated to reflect MODS 3.2 Mapping  2006/10/11  tmee
+Revision 1.11 - The attribute objectPart moved from <languageTerm> to <language>  2006/04/08  jrad
+Revision 1.10 - MODS 3.1 revisions to language and classification elements  (plus ability to find marc:collection embedded in wrapper elements such as SRU zs: wrappers)  2006/02/06  ggar
+Revision 1.9 - Subfield $y was added to field 242 2004/09/02 10:57 jrad
+Revision 1.8 - Subject chopPunctuation expanded and attribute fixes 2004/08/12 jrad
+Revision 1.7 - 2004/03/25 08:29 jrad
+Revision 1.6 - Various validation fixes 2004/02/20 ntra
+Revision 1.5 - MODS2 to MODS3 updates, language unstacking and de-duping, chopPunctuation expanded  2003/10/02 16:18:58  ntra
+Revision 1.3 - Additional Changes not related to MODS Version 2.0 by ntra
+Revision 1.2 - Added Log Comment  2003/03/24 19:37:42  ckeith
+-->
+	<xsl:template match="/">
+		<xsl:choose>
+			<xsl:when test="//marc:collection">
+				<modsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+					xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
+					<xsl:for-each select="//marc:collection/marc:record">
+						<mods version="3.3">
+							<xsl:call-template name="marcRecord"/>
+						</mods>
+					</xsl:for-each>
+				</modsCollection>
+			</xsl:when>
+			<xsl:otherwise>
+				<mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3"
+					xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
+					<xsl:for-each select="//marc:record">
+						<xsl:call-template name="marcRecord"/>
+					</xsl:for-each>
+				</mods>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+	<xsl:template name="marcRecord">
+		<xsl:variable name="leader" select="marc:leader"/>
+		<xsl:variable name="leader6" select="substring($leader,7,1)"/>
+		<xsl:variable name="leader7" select="substring($leader,8,1)"/>
+		<xsl:variable name="controlField008" select="marc:controlfield[@tag='008']"/>
+		<xsl:variable name="typeOf008">
+			<xsl:choose>
+				<xsl:when test="$leader6='a'">
+					<xsl:choose>
+						<xsl:when
+							test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">BK</xsl:when>
+						<xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">SE</xsl:when>
+					</xsl:choose>
+				</xsl:when>
+				<xsl:when test="$leader6='t'">BK</xsl:when>
+				<xsl:when test="$leader6='p'">MM</xsl:when>
+				<xsl:when test="$leader6='m'">CF</xsl:when>
+				<xsl:when test="$leader6='e' or $leader6='f'">MP</xsl:when>
+				<xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">VM</xsl:when>
+				<xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'"
+				>MU</xsl:when>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:for-each select="marc:datafield[@tag='245']">
+			<titleInfo>
+				<xsl:variable name="title">
+					<xsl:choose>
+						<xsl:when test="marc:subfield[@code='b']">
+							<xsl:call-template name="specialSubfieldSelect">
+								<xsl:with-param name="axis">b</xsl:with-param>
+								<xsl:with-param name="beforeCodes">afgk</xsl:with-param>
+							</xsl:call-template>
+						</xsl:when>
+						<xsl:otherwise>
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">abfgk</xsl:with-param>
+							</xsl:call-template>
+						</xsl:otherwise>
+					</xsl:choose>
+				</xsl:variable>
+				<xsl:variable name="titleChop">
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="$title"/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</xsl:variable>
+				<xsl:choose>
+					<xsl:when test="@ind2&gt;0">
+						<nonSort>
+							<xsl:value-of select="substring($titleChop,1, at ind2)"/>
+						</nonSort>
+						<title>
+							<xsl:value-of select="substring($titleChop, at ind2+1)"/>
+						</title>
+					</xsl:when>
+					<xsl:otherwise>
+						<title>
+							<xsl:value-of select="$titleChop"/>
+						</title>
+					</xsl:otherwise>
+				</xsl:choose>
+				<xsl:if test="marc:subfield[@code='b']">
+					<subTitle>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="axis">b</xsl:with-param>
+									<xsl:with-param name="anyCodes">b</xsl:with-param>
+									<xsl:with-param name="afterCodes">afgk</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</subTitle>
+				</xsl:if>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='210']">
+			<titleInfo type="abbreviated">
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">a</xsl:with-param>
+							</xsl:call-template>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:call-template name="subtitle"/>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='242']">
+			<titleInfo type="translated">
+				<!--09/01/04 Added subfield $y-->
+				<xsl:for-each select="marc:subfield[@code='y']">
+					<xsl:attribute name="lang">
+						<xsl:value-of select="text()"/>
+					</xsl:attribute>
+				</xsl:for-each>
+				<xsl:for-each select="marc:subfield[@code='i']">
+					<xsl:attribute name="displayLabel">
+						<xsl:value-of select="text()"/>
+					</xsl:attribute>
+				</xsl:for-each>
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:call-template name="subfieldSelect">
+								<!-- 1/04 removed $h, b -->
+								<xsl:with-param name="codes">a</xsl:with-param>
+							</xsl:call-template>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<!-- 1/04 fix -->
+				<xsl:call-template name="subtitle"/>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='246']">
+			<titleInfo type="alternative">
+				<xsl:for-each select="marc:subfield[@code='i']">
+					<xsl:attribute name="displayLabel">
+						<xsl:value-of select="text()"/>
+					</xsl:attribute>
+				</xsl:for-each>
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:call-template name="subfieldSelect">
+								<!-- 1/04 removed $h, $b -->
+								<xsl:with-param name="codes">af</xsl:with-param>
+							</xsl:call-template>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:call-template name="subtitle"/>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each
+			select="marc:datafield[@tag='130']|marc:datafield[@tag='240']|marc:datafield[@tag='730'][@ind2!='2']">
+			<titleInfo type="uniform">
+				<title>
+						<xsl:call-template name="uri"/>
+
+					<xsl:variable name="str">
+						<xsl:for-each select="marc:subfield">
+							<xsl:if
+								test="(contains('adfklmors', at code) and (not(../marc:subfield[@code='n' or @code='p']) or (following-sibling::marc:subfield[@code='n' or @code='p'])))">
+								<xsl:value-of select="text()"/>
+								<xsl:text> </xsl:text>
+							</xsl:if>
+						</xsl:for-each>
+					</xsl:variable>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='740'][@ind2!='2']">
+			<titleInfo type="alternative">
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">ah</xsl:with-param>
+							</xsl:call-template>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='100']">
+			<name type="personal">
+
+				<xsl:call-template name="uri"/>
+
+				<xsl:call-template name="nameABCDQ"/>
+				<xsl:call-template name="affiliation"/>
+				<role>
+					<roleTerm authority="marcrelator" type="text">creator</roleTerm>
+				</role>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='110']">
+			<name type="corporate">
+
+					<xsl:call-template name="uri"/>
+
+				<xsl:call-template name="nameABCDN"/>
+				<role>
+					<roleTerm authority="marcrelator" type="text">creator</roleTerm>
+				</role>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='111']">
+			<name type="conference">
+
+					<xsl:call-template name="uri"/>
+
+				<xsl:call-template name="nameACDEQ"/>
+				<role>
+					<roleTerm authority="marcrelator" type="text">creator</roleTerm>
+				</role>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='700'][not(marc:subfield[@code='t'])]">
+			<name type="personal">
+
+					<xsl:call-template name="uri"/>
+
+				<xsl:call-template name="nameABCDQ"/>
+				<xsl:call-template name="affiliation"/>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='710'][not(marc:subfield[@code='t'])]">
+			<name type="corporate">
+
+					<xsl:call-template name="uri"/>
+
+				<xsl:call-template name="nameABCDN"/>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='711'][not(marc:subfield[@code='t'])]">
+			<name type="conference">
+
+					<xsl:call-template name="uri"/>
+
+				<xsl:call-template name="nameACDEQ"/>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='720'][not(marc:subfield[@code='t'])]">
+			<name>
+				<xsl:if test="@ind1=1">
+					<xsl:attribute name="type">
+						<xsl:text>personal</xsl:text>
+					</xsl:attribute>
+				</xsl:if>
+				<namePart>
+					<xsl:value-of select="marc:subfield[@code='a']"/>
+				</namePart>
+				<xsl:call-template name="role"/>
+			</name>
+		</xsl:for-each>
+		<typeOfResource>
+			<xsl:if test="$leader7='c'">
+				<xsl:attribute name="collection">yes</xsl:attribute>
+			</xsl:if>
+			<xsl:if test="$leader6='d' or $leader6='f' or $leader6='p' or $leader6='t'">
+				<xsl:attribute name="manuscript">yes</xsl:attribute>
+			</xsl:if>
+			<xsl:choose>
+				<xsl:when test="$leader6='a' or $leader6='t'">text</xsl:when>
+				<xsl:when test="$leader6='e' or $leader6='f'">cartographic</xsl:when>
+				<xsl:when test="$leader6='c' or $leader6='d'">notated music</xsl:when>
+				<xsl:when test="$leader6='i'">sound recording-nonmusical</xsl:when>
+				<xsl:when test="$leader6='j'">sound recording-musical</xsl:when>
+				<xsl:when test="$leader6='k'">still image</xsl:when>
+				<xsl:when test="$leader6='g'">moving image</xsl:when>
+				<xsl:when test="$leader6='r'">three dimensional object</xsl:when>
+				<xsl:when test="$leader6='m'">software, multimedia</xsl:when>
+				<xsl:when test="$leader6='p'">mixed material</xsl:when>
+			</xsl:choose>
+		</typeOfResource>
+		<xsl:if test="substring($controlField008,26,1)='d'">
+			<genre authority="marcgt">globe</genre>
+		</xsl:if>
+		<xsl:if
+			test="marc:controlfield[@tag='007'][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
+			<genre authority="marcgt">remote-sensing image</genre>
+		</xsl:if>
+		<xsl:if test="$typeOf008='MP'">
+			<xsl:variable name="controlField008-25" select="substring($controlField008,26,1)"/>
+			<xsl:choose>
+				<xsl:when
+					test="$controlField008-25='a' or $controlField008-25='b' or $controlField008-25='c' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
+					<genre authority="marcgt">map</genre>
+				</xsl:when>
+				<xsl:when
+					test="$controlField008-25='e' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
+					<genre authority="marcgt">atlas</genre>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:if test="$typeOf008='SE'">
+			<xsl:variable name="controlField008-21" select="substring($controlField008,22,1)"/>
+			<xsl:choose>
+				<xsl:when test="$controlField008-21='d'">
+					<genre authority="marcgt">database</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-21='l'">
+					<genre authority="marcgt">loose-leaf</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-21='m'">
+					<genre authority="marcgt">series</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-21='n'">
+					<genre authority="marcgt">newspaper</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-21='p'">
+					<genre authority="marcgt">periodical</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-21='w'">
+					<genre authority="marcgt">web site</genre>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:if test="$typeOf008='BK' or $typeOf008='SE'">
+			<xsl:variable name="controlField008-24" select="substring($controlField008,25,4)"/>
+			<xsl:choose>
+				<xsl:when test="contains($controlField008-24,'a')">
+					<genre authority="marcgt">abstract or summary</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'b')">
+					<genre authority="marcgt">bibliography</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'c')">
+					<genre authority="marcgt">catalog</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'d')">
+					<genre authority="marcgt">dictionary</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'e')">
+					<genre authority="marcgt">encyclopedia</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'f')">
+					<genre authority="marcgt">handbook</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'g')">
+					<genre authority="marcgt">legal article</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'i')">
+					<genre authority="marcgt">index</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'k')">
+					<genre authority="marcgt">discography</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'l')">
+					<genre authority="marcgt">legislation</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'m')">
+					<genre authority="marcgt">theses</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'n')">
+					<genre authority="marcgt">survey of literature</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'o')">
+					<genre authority="marcgt">review</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'p')">
+					<genre authority="marcgt">programmed text</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'q')">
+					<genre authority="marcgt">filmography</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'r')">
+					<genre authority="marcgt">directory</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'s')">
+					<genre authority="marcgt">statistics</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'t')">
+					<genre authority="marcgt">technical report</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'v')">
+					<genre authority="marcgt">legal case and case notes</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'w')">
+					<genre authority="marcgt">law report or digest</genre>
+				</xsl:when>
+				<xsl:when test="contains($controlField008-24,'z')">
+					<genre authority="marcgt">treaty</genre>
+				</xsl:when>
+			</xsl:choose>
+			<xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"/>
+			<xsl:choose>
+				<xsl:when test="$controlField008-29='1'">
+					<genre authority="marcgt">conference publication</genre>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:if test="$typeOf008='CF'">
+			<xsl:variable name="controlField008-26" select="substring($controlField008,27,1)"/>
+			<xsl:choose>
+				<xsl:when test="$controlField008-26='a'">
+					<genre authority="marcgt">numeric data</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-26='e'">
+					<genre authority="marcgt">database</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-26='f'">
+					<genre authority="marcgt">font</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-26='g'">
+					<genre authority="marcgt">game</genre>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:if test="$typeOf008='BK'">
+			<xsl:if test="substring($controlField008,25,1)='j'">
+				<genre authority="marcgt">patent</genre>
+			</xsl:if>
+			<xsl:if test="substring($controlField008,25,1)='2'">
+				<genre authority="marcgt">offprint</genre>
+			</xsl:if>
+			<xsl:if test="substring($controlField008,31,1)='1'">
+				<genre authority="marcgt">festschrift</genre>
+			</xsl:if>
+			<xsl:variable name="controlField008-34" select="substring($controlField008,35,1)"/>
+			<xsl:if
+				test="$controlField008-34='a' or $controlField008-34='b' or $controlField008-34='c' or $controlField008-34='d'">
+				<genre authority="marcgt">biography</genre>
+			</xsl:if>
+			<xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"/>
+			<xsl:choose>
+				<xsl:when test="$controlField008-33='e'">
+					<genre authority="marcgt">essay</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='d'">
+					<genre authority="marcgt">drama</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='c'">
+					<genre authority="marcgt">comic strip</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='l'">
+					<genre authority="marcgt">fiction</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='h'">
+					<genre authority="marcgt">humor, satire</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='i'">
+					<genre authority="marcgt">letter</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='f'">
+					<genre authority="marcgt">novel</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='j'">
+					<genre authority="marcgt">short story</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='s'">
+					<genre authority="marcgt">speech</genre>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:if test="$typeOf008='MU'">
+			<xsl:variable name="controlField008-30-31" select="substring($controlField008,31,2)"/>
+			<xsl:if test="contains($controlField008-30-31,'b')">
+				<genre authority="marcgt">biography</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'c')">
+				<genre authority="marcgt">conference publication</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'d')">
+				<genre authority="marcgt">drama</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'e')">
+				<genre authority="marcgt">essay</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'f')">
+				<genre authority="marcgt">fiction</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'o')">
+				<genre authority="marcgt">folktale</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'h')">
+				<genre authority="marcgt">history</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'k')">
+				<genre authority="marcgt">humor, satire</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'m')">
+				<genre authority="marcgt">memoir</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'p')">
+				<genre authority="marcgt">poetry</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'r')">
+				<genre authority="marcgt">rehearsal</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'g')">
+				<genre authority="marcgt">reporting</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'s')">
+				<genre authority="marcgt">sound</genre>
+			</xsl:if>
+			<xsl:if test="contains($controlField008-30-31,'l')">
+				<genre authority="marcgt">speech</genre>
+			</xsl:if>
+		</xsl:if>
+		<xsl:if test="$typeOf008='VM'">
+			<xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"/>
+			<xsl:choose>
+				<xsl:when test="$controlField008-33='a'">
+					<genre authority="marcgt">art original</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='b'">
+					<genre authority="marcgt">kit</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='c'">
+					<genre authority="marcgt">art reproduction</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='d'">
+					<genre authority="marcgt">diorama</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='f'">
+					<genre authority="marcgt">filmstrip</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='g'">
+					<genre authority="marcgt">legal article</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='i'">
+					<genre authority="marcgt">picture</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='k'">
+					<genre authority="marcgt">graphic</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='l'">
+					<genre authority="marcgt">technical drawing</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='m'">
+					<genre authority="marcgt">motion picture</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='n'">
+					<genre authority="marcgt">chart</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='o'">
+					<genre authority="marcgt">flash card</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='p'">
+					<genre authority="marcgt">microscope slide</genre>
+				</xsl:when>
+				<xsl:when
+					test="$controlField008-33='q' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
+					<genre authority="marcgt">model</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='r'">
+					<genre authority="marcgt">realia</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='s'">
+					<genre authority="marcgt">slide</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='t'">
+					<genre authority="marcgt">transparency</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='v'">
+					<genre authority="marcgt">videorecording</genre>
+				</xsl:when>
+				<xsl:when test="$controlField008-33='w'">
+					<genre authority="marcgt">toy</genre>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+
+		<!-- 1.20 047 genre tmee-->
+
+		<xsl:for-each select="marc:datafield[@tag=047]">
+			<genre authority="marcgt">
+				<xsl:attribute name="authority">
+					<xsl:value-of select="marc:subfield[@code='2']"/>
+				</xsl:attribute>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">abcdef</xsl:with-param>
+					<xsl:with-param name="delimeter">-</xsl:with-param>
+				</xsl:call-template>
+			</genre>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=655]">
+			<genre authority="marcgt">
+				<xsl:attribute name="authority">
+					<xsl:value-of select="marc:subfield[@code='2']"/>
+				</xsl:attribute>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">abvxyz</xsl:with-param>
+					<xsl:with-param name="delimeter">-</xsl:with-param>
+				</xsl:call-template>
+			</genre>
+		</xsl:for-each>
+		<originInfo>
+			<xsl:variable name="MARCpublicationCode"
+				select="normalize-space(substring($controlField008,16,3))"/>
+			<xsl:if test="translate($MARCpublicationCode,'|','')">
+				<place>
+					<placeTerm>
+						<xsl:attribute name="type">code</xsl:attribute>
+						<xsl:attribute name="authority">marccountry</xsl:attribute>
+						<xsl:value-of select="$MARCpublicationCode"/>
+					</placeTerm>
+				</place>
+			</xsl:if>
+			<xsl:for-each select="marc:datafield[@tag=044]/marc:subfield[@code='c']">
+				<place>
+					<placeTerm>
+						<xsl:attribute name="type">code</xsl:attribute>
+						<xsl:attribute name="authority">iso3166</xsl:attribute>
+						<xsl:value-of select="."/>
+					</placeTerm>
+				</place>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='a']">
+				<place>
+					<placeTerm>
+						<xsl:attribute name="type">text</xsl:attribute>
+						<xsl:call-template name="chopPunctuationFront">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="chopPunctuation">
+									<xsl:with-param name="chopString" select="."/>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</placeTerm>
+				</place>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='m']">
+				<dateValid point="start">
+					<xsl:value-of select="."/>
+				</dateValid>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='n']">
+				<dateValid point="end">
+					<xsl:value-of select="."/>
+				</dateValid>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='j']">
+				<dateModified>
+					<xsl:value-of select="."/>
+				</dateModified>
+			</xsl:for-each>
+			<xsl:for-each
+				select="marc:datafield[@tag=260]/marc:subfield[@code='b' or @code='c' or @code='g']">
+				<xsl:choose>
+					<xsl:when test="@code='b'">
+						<publisher>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."/>
+								<xsl:with-param name="punctuation">
+									<xsl:text>:,;/ </xsl:text>
+								</xsl:with-param>
+							</xsl:call-template>
+						</publisher>
+					</xsl:when>
+					<xsl:when test="@code='c'">
+						<dateIssued>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."/>
+							</xsl:call-template>
+						</dateIssued>
+					</xsl:when>
+					<xsl:when test="@code='g'">
+						<dateCreated>
+							<xsl:value-of select="."/>
+						</dateCreated>
+					</xsl:when>
+				</xsl:choose>
+			</xsl:for-each>
+			<xsl:variable name="dataField260c">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString"
+						select="marc:datafield[@tag=260]/marc:subfield[@code='c']"/>
+				</xsl:call-template>
+			</xsl:variable>
+			<xsl:variable name="controlField008-7-10"
+				select="normalize-space(substring($controlField008, 8, 4))"/>
+			<xsl:variable name="controlField008-11-14"
+				select="normalize-space(substring($controlField008, 12, 4))"/>
+			<xsl:variable name="controlField008-6"
+				select="normalize-space(substring($controlField008, 7, 1))"/>
+			<xsl:if
+				test="$controlField008-6='e' or $controlField008-6='p' or $controlField008-6='r' or $controlField008-6='t' or $controlField008-6='s'">
+				<xsl:if test="$controlField008-7-10 and ($controlField008-7-10 != $dataField260c)">
+					<dateIssued encoding="marc">
+						<xsl:value-of select="$controlField008-7-10"/>
+					</dateIssued>
+				</xsl:if>
+			</xsl:if>
+			<xsl:if
+				test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
+				<xsl:if test="$controlField008-7-10">
+					<dateIssued encoding="marc" point="start">
+						<xsl:value-of select="$controlField008-7-10"/>
+					</dateIssued>
+				</xsl:if>
+			</xsl:if>
+			<xsl:if
+				test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
+				<xsl:if test="$controlField008-11-14">
+					<dateIssued encoding="marc" point="end">
+						<xsl:value-of select="$controlField008-11-14"/>
+					</dateIssued>
+				</xsl:if>
+			</xsl:if>
+			<xsl:if test="$controlField008-6='q'">
+				<xsl:if test="$controlField008-7-10">
+					<dateIssued encoding="marc" point="start" qualifier="questionable">
+						<xsl:value-of select="$controlField008-7-10"/>
+					</dateIssued>
+				</xsl:if>
+			</xsl:if>
+			<xsl:if test="$controlField008-6='q'">
+				<xsl:if test="$controlField008-11-14">
+					<dateIssued encoding="marc" point="end" qualifier="questionable">
+						<xsl:value-of select="$controlField008-11-14"/>
+					</dateIssued>
+				</xsl:if>
+			</xsl:if>
+			<xsl:if test="$controlField008-6='t'">
+				<xsl:if test="$controlField008-11-14">
+					<copyrightDate encoding="marc">
+						<xsl:value-of select="$controlField008-11-14"/>
+					</copyrightDate>
+				</xsl:if>
+			</xsl:if>
+			<xsl:for-each
+				select="marc:datafield[@tag=033][@ind1=0 or @ind1=1]/marc:subfield[@code='a']">
+				<dateCaptured encoding="iso8601">
+					<xsl:value-of select="."/>
+				</dateCaptured>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][1]">
+				<dateCaptured encoding="iso8601" point="start">
+					<xsl:value-of select="."/>
+				</dateCaptured>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][2]">
+				<dateCaptured encoding="iso8601" point="end">
+					<xsl:value-of select="."/>
+				</dateCaptured>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=250]/marc:subfield[@code='a']">
+				<edition>
+					<xsl:value-of select="."/>
+				</edition>
+			</xsl:for-each>
+			<xsl:for-each select="marc:leader">
+				<issuance>
+					<xsl:choose>
+						<xsl:when
+							test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'"
+							>monographic</xsl:when>
+						<xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'"
+						>continuing</xsl:when>
+					</xsl:choose>
+				</issuance>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=310]|marc:datafield[@tag=321]">
+				<frequency>
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">ab</xsl:with-param>
+					</xsl:call-template>
+				</frequency>
+			</xsl:for-each>
+		</originInfo>
+		<xsl:variable name="controlField008-35-37"
+			select="normalize-space(translate(substring($controlField008,36,3),'|#',''))"/>
+		<xsl:if test="$controlField008-35-37">
+			<language>
+				<languageTerm authority="iso639-2b" type="code">
+					<xsl:value-of select="substring($controlField008,36,3)"/>
+				</languageTerm>
+			</language>
+		</xsl:if>
+		<xsl:for-each select="marc:datafield[@tag=041]">
+			<xsl:for-each
+				select="marc:subfield[@code='a' or @code='b' or @code='d' or @code='e' or @code='f' or @code='g' or @code='h']">
+				<xsl:variable name="langCodes" select="."/>
+				<xsl:choose>
+					<xsl:when test="../marc:subfield[@code='2']='rfc3066'">
+						<!-- not stacked but could be repeated -->
+						<xsl:call-template name="rfcLanguages">
+							<xsl:with-param name="nodeNum">
+								<xsl:value-of select="1"/>
+							</xsl:with-param>
+							<xsl:with-param name="usedLanguages">
+								<xsl:text/>
+							</xsl:with-param>
+							<xsl:with-param name="controlField008-35-37">
+								<xsl:value-of select="$controlField008-35-37"/>
+							</xsl:with-param>
+						</xsl:call-template>
+					</xsl:when>
+					<xsl:otherwise>
+						<!-- iso -->
+						<xsl:variable name="allLanguages">
+							<xsl:copy-of select="$langCodes"/>
+						</xsl:variable>
+						<xsl:variable name="currentLanguage">
+							<xsl:value-of select="substring($allLanguages,1,3)"/>
+						</xsl:variable>
+						<xsl:call-template name="isoLanguage">
+							<xsl:with-param name="currentLanguage">
+								<xsl:value-of select="substring($allLanguages,1,3)"/>
+							</xsl:with-param>
+							<xsl:with-param name="remainingLanguages">
+								<xsl:value-of
+									select="substring($allLanguages,4,string-length($allLanguages)-3)"
+								/>
+							</xsl:with-param>
+							<xsl:with-param name="usedLanguages">
+								<xsl:if test="$controlField008-35-37">
+									<xsl:value-of select="$controlField008-35-37"/>
+								</xsl:if>
+							</xsl:with-param>
+						</xsl:call-template>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:for-each>
+		</xsl:for-each>
+		<xsl:variable name="physicalDescription">
+			<!--3.2 change tmee 007/11 -->
+			<xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='a']">
+				<digitalOrigin>reformatted digital</digitalOrigin>
+			</xsl:if>
+			<xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='b']">
+				<digitalOrigin>digitized microfilm</digitalOrigin>
+			</xsl:if>
+			<xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='d']">
+				<digitalOrigin>digitized other analog</digitalOrigin>
+			</xsl:if>
+			<xsl:variable name="controlField008-23" select="substring($controlField008,24,1)"/>
+			<xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"/>
+			<xsl:variable name="check008-23">
+				<xsl:if
+					test="$typeOf008='BK' or $typeOf008='MU' or $typeOf008='SE' or $typeOf008='MM'">
+					<xsl:value-of select="true()"/>
+				</xsl:if>
+			</xsl:variable>
+			<xsl:variable name="check008-29">
+				<xsl:if test="$typeOf008='MP' or $typeOf008='VM'">
+					<xsl:value-of select="true()"/>
+				</xsl:if>
+			</xsl:variable>
+			<xsl:choose>
+				<xsl:when
+					test="($check008-23 and $controlField008-23='f') or ($check008-29 and $controlField008-29='f')">
+					<form authority="marcform">braille</form>
+				</xsl:when>
+				<xsl:when
+					test="($controlField008-23=' ' and ($leader6='c' or $leader6='d')) or (($typeOf008='BK' or $typeOf008='SE') and ($controlField008-23=' ' or $controlField008='r'))">
+					<form authority="marcform">print</form>
+				</xsl:when>
+				<xsl:when
+					test="$leader6 = 'm' or ($check008-23 and $controlField008-23='s') or ($check008-29 and $controlField008-29='s')">
+					<form authority="marcform">electronic</form>
+				</xsl:when>
+				<xsl:when
+					test="($check008-23 and $controlField008-23='b') or ($check008-29 and $controlField008-29='b')">
+					<form authority="marcform">microfiche</form>
+				</xsl:when>
+				<xsl:when
+					test="($check008-23 and $controlField008-23='a') or ($check008-29 and $controlField008-29='a')">
+					<form authority="marcform">microfilm</form>
+				</xsl:when>
+			</xsl:choose>
+			<!-- 1/04 fix -->
+			<xsl:if test="marc:datafield[@tag=130]/marc:subfield[@code='h']">
+				<form authority="gmd">
+					<xsl:call-template name="chopBrackets">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:datafield[@tag=130]/marc:subfield[@code='h']"
+							/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</form>
+			</xsl:if>
+			<xsl:if test="marc:datafield[@tag=240]/marc:subfield[@code='h']">
+				<form authority="gmd">
+					<xsl:call-template name="chopBrackets">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:datafield[@tag=240]/marc:subfield[@code='h']"
+							/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</form>
+			</xsl:if>
+			<xsl:if test="marc:datafield[@tag=242]/marc:subfield[@code='h']">
+				<form authority="gmd">
+					<xsl:call-template name="chopBrackets">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:datafield[@tag=242]/marc:subfield[@code='h']"
+							/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</form>
+			</xsl:if>
+			<xsl:if test="marc:datafield[@tag=245]/marc:subfield[@code='h']">
+				<form authority="gmd">
+					<xsl:call-template name="chopBrackets">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='h']"
+							/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</form>
+			</xsl:if>
+			<xsl:if test="marc:datafield[@tag=246]/marc:subfield[@code='h']">
+				<form authority="gmd">
+					<xsl:call-template name="chopBrackets">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:datafield[@tag=246]/marc:subfield[@code='h']"
+							/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</form>
+			</xsl:if>
+			<xsl:if test="marc:datafield[@tag=730]/marc:subfield[@code='h']">
+				<form authority="gmd">
+					<xsl:call-template name="chopBrackets">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="marc:datafield[@tag=730]/marc:subfield[@code='h']"
+							/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</form>
+			</xsl:if>
+			<xsl:for-each select="marc:datafield[@tag=256]/marc:subfield[@code='a']">
+				<form>
+					<xsl:value-of select="."/>
+				</form>
+			</xsl:for-each>
+			<xsl:for-each select="marc:controlfield[@tag=007][substring(text(),1,1)='c']">
+				<xsl:choose>
+					<xsl:when test="substring(text(),14,1)='a'">
+						<reformattingQuality>access</reformattingQuality>
+					</xsl:when>
+					<xsl:when test="substring(text(),14,1)='p'">
+						<reformattingQuality>preservation</reformattingQuality>
+					</xsl:when>
+					<xsl:when test="substring(text(),14,1)='r'">
+						<reformattingQuality>replacement</reformattingQuality>
+					</xsl:when>
+				</xsl:choose>
+			</xsl:for-each>
+			<!--3.2 change tmee 007/01 -->
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='b']">
+				<form authority="smd">chip cartridge</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='c']">
+				<form authority="smd">computer optical disc cartridge</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='j']">
+				<form authority="smd">magnetic disc</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='m']">
+				<form authority="smd">magneto-optical disc</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='o']">
+				<form authority="smd">optical disc</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='r']">
+				<form authority="smd">remote</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='a']">
+				<form authority="smd">tape cartridge</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='f']">
+				<form authority="smd">tape cassette</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='h']">
+				<form authority="smd">tape reel</form>
+			</xsl:if>
+
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='a']">
+				<form authority="smd">celestial globe</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='e']">
+				<form authority="smd">earth moon globe</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='b']">
+				<form authority="smd">planetary or lunar globe</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='c']">
+				<form authority="smd">terrestrial globe</form>
+			</xsl:if>
+
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='o'][substring(text(),2,1)='o']">
+				<form authority="smd">kit</form>
+			</xsl:if>
+
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
+				<form authority="smd">atlas</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='g']">
+				<form authority="smd">diagram</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
+				<form authority="smd">map</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
+				<form authority="smd">model</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='k']">
+				<form authority="smd">profile</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
+				<form authority="smd">remote-sensing image</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='s']">
+				<form authority="smd">section</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='y']">
+				<form authority="smd">view</form>
+			</xsl:if>
+
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='a']">
+				<form authority="smd">aperture card</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='e']">
+				<form authority="smd">microfiche</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='f']">
+				<form authority="smd">microfiche cassette</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='b']">
+				<form authority="smd">microfilm cartridge</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='c']">
+				<form authority="smd">microfilm cassette</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='d']">
+				<form authority="smd">microfilm reel</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='g']">
+				<form authority="smd">microopaque</form>
+			</xsl:if>
+
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='c']">
+				<form authority="smd">film cartridge</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='f']">
+				<form authority="smd">film cassette</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='r']">
+				<form authority="smd">film reel</form>
+			</xsl:if>
+
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='n']">
+				<form authority="smd">chart</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='c']">
+				<form authority="smd">collage</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='d']">
+				<form authority="smd">drawing</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='o']">
+				<form authority="smd">flash card</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='e']">
+				<form authority="smd">painting</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='f']">
+				<form authority="smd">photomechanical print</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='g']">
+				<form authority="smd">photonegative</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='h']">
+				<form authority="smd">photoprint</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='i']">
+				<form authority="smd">picture</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='j']">
+				<form authority="smd">print</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='l']">
+				<form authority="smd">technical drawing</form>
+			</xsl:if>
+
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='q'][substring(text(),2,1)='q']">
+				<form authority="smd">notated music</form>
+			</xsl:if>
+
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='d']">
+				<form authority="smd">filmslip</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='c']">
+				<form authority="smd">filmstrip cartridge</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='o']">
+				<form authority="smd">filmstrip roll</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='f']">
+				<form authority="smd">other filmstrip type</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='s']">
+				<form authority="smd">slide</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='t']">
+				<form authority="smd">transparency</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='r'][substring(text(),2,1)='r']">
+				<form authority="smd">remote-sensing image</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='e']">
+				<form authority="smd">cylinder</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='q']">
+				<form authority="smd">roll</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='g']">
+				<form authority="smd">sound cartridge</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='s']">
+				<form authority="smd">sound cassette</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='d']">
+				<form authority="smd">sound disc</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='t']">
+				<form authority="smd">sound-tape reel</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='i']">
+				<form authority="smd">sound-track film</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='w']">
+				<form authority="smd">wire recording</form>
+			</xsl:if>
+
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='c']">
+				<form authority="smd">braille</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='b']">
+				<form authority="smd">combination</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='a']">
+				<form authority="smd">moon</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='d']">
+				<form authority="smd">tactile, with no writing system</form>
+			</xsl:if>
+
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='c']">
+				<form authority="smd">braille</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='b']">
+				<form authority="smd">large print</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='a']">
+				<form authority="smd">regular print</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='d']">
+				<form authority="smd">text in looseleaf binder</form>
+			</xsl:if>
+
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='c']">
+				<form authority="smd">videocartridge</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='f']">
+				<form authority="smd">videocassette</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='d']">
+				<form authority="smd">videodisc</form>
+			</xsl:if>
+			<xsl:if
+				test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='r']">
+				<form authority="smd">videoreel</form>
+			</xsl:if>
+
+			<xsl:for-each
+				select="marc:datafield[@tag=856]/marc:subfield[@code='q'][string-length(.)&gt;1]">
+				<internetMediaType>
+					<xsl:value-of select="."/>
+				</internetMediaType>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=300]">
+				<extent>
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">abce</xsl:with-param>
+					</xsl:call-template>
+				</extent>
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:if test="string-length(normalize-space($physicalDescription))">
+			<physicalDescription>
+				<xsl:copy-of select="$physicalDescription"/>
+			</physicalDescription>
+		</xsl:if>
+		<xsl:for-each select="marc:datafield[@tag=520]">
+			<abstract>
+				<xsl:call-template name="uri"/>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</abstract>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=505]">
+			<tableOfContents>
+				<xsl:call-template name="uri"/>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">agrt</xsl:with-param>
+				</xsl:call-template>
+			</tableOfContents>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=521]">
+			<targetAudience>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</targetAudience>
+		</xsl:for-each>
+		<xsl:if test="$typeOf008='BK' or $typeOf008='CF' or $typeOf008='MU' or $typeOf008='VM'">
+			<xsl:variable name="controlField008-22" select="substring($controlField008,23,1)"/>
+			<xsl:choose>
+				<!-- 01/04 fix -->
+				<xsl:when test="$controlField008-22='d'">
+					<targetAudience authority="marctarget">adolescent</targetAudience>
+				</xsl:when>
+				<xsl:when test="$controlField008-22='e'">
+					<targetAudience authority="marctarget">adult</targetAudience>
+				</xsl:when>
+				<xsl:when test="$controlField008-22='g'">
+					<targetAudience authority="marctarget">general</targetAudience>
+				</xsl:when>
+				<xsl:when
+					test="$controlField008-22='b' or $controlField008-22='c' or $controlField008-22='j'">
+					<targetAudience authority="marctarget">juvenile</targetAudience>
+				</xsl:when>
+				<xsl:when test="$controlField008-22='a'">
+					<targetAudience authority="marctarget">preschool</targetAudience>
+				</xsl:when>
+				<xsl:when test="$controlField008-22='f'">
+					<targetAudience authority="marctarget">specialized</targetAudience>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:for-each select="marc:datafield[@tag=245]/marc:subfield[@code='c']">
+			<note type="statement of responsibility">
+				<xsl:value-of select="."/>
+			</note>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=500]">
+			<note>
+				<xsl:value-of select="marc:subfield[@code='a']"/>
+				<xsl:call-template name="uri"/>
+			</note>
+		</xsl:for-each>
+
+		<!--3.2 change tmee additional note fields-->
+
+		<xsl:for-each select="marc:datafield[@tag=506]">
+			<note type="restrictions">
+				<xsl:call-template name="uri"/>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."/>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+			</note>
+		</xsl:for-each>
+
+		<xsl:for-each select="marc:datafield[@tag=510]">
+			<note type="citation/reference">
+				<xsl:call-template name="uri"/>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."/>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+			</note>
+		</xsl:for-each>
+
+
+		<xsl:for-each select="marc:datafield[@tag=511]">
+			<note type="performers">
+				<xsl:call-template name="uri"/>
+				<xsl:value-of select="marc:subfield[@code='a']"/>
+			</note>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=518]">
+			<note type="venue">
+				<xsl:call-template name="uri"/>
+				<xsl:value-of select="marc:subfield[@code='a']"/>
+			</note>
+		</xsl:for-each>
+
+		<xsl:for-each select="marc:datafield[@tag=530]">
+			<note type="additional physical form">
+				<xsl:call-template name="uri"/>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."/>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+			</note>
+		</xsl:for-each>
+
+		<xsl:for-each select="marc:datafield[@tag=533]">
+			<note type="reproduction">
+				<xsl:call-template name="uri"/>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."/>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+			</note>
+		</xsl:for-each>
+
+		<xsl:for-each select="marc:datafield[@tag=534]">
+			<note type="original version">
+				<xsl:call-template name="uri"/>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."/>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+			</note>
+		</xsl:for-each>
+
+		<xsl:for-each select="marc:datafield[@tag=538]">
+			<note type="system details">
+				<xsl:call-template name="uri"/>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."/>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+			</note>
+		</xsl:for-each>
+
+		<xsl:for-each select="marc:datafield[@tag=583]">
+			<note type="action">
+				<xsl:call-template name="uri"/>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."/>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+			</note>
+		</xsl:for-each>
+
+		<xsl:for-each
+			select="marc:datafield[@tag=501 or @tag=502 or @tag=504 or @tag=507 or @tag=508 or  @tag=513 or @tag=514 or @tag=515 or @tag=516 or @tag=522 or @tag=524 or @tag=525 or @tag=526 or @tag=535 or @tag=536 or @tag=540 or @tag=541 or @tag=544 or @tag=545 or @tag=546 or @tag=547 or @tag=550 or @tag=552 or @tag=555 or @tag=556 or @tag=561 or @tag=562 or @tag=565 or @tag=567 or @tag=580 or @tag=581 or @tag=584 or @tag=585 or @tag=586]">
+			<note>
+				<xsl:call-template name="uri"/>
+				<xsl:variable name="str">
+					<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
+						<xsl:value-of select="."/>
+						<xsl:text> </xsl:text>
+					</xsl:for-each>
+				</xsl:variable>
+				<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+			</note>
+		</xsl:for-each>
+		<xsl:for-each
+			select="marc:datafield[@tag=034][marc:subfield[@code='d' or @code='e' or @code='f' or @code='g']]">
+			<subject>
+				<cartographics>
+					<coordinates>
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">defg</xsl:with-param>
+						</xsl:call-template>
+					</coordinates>
+				</cartographics>
+			</subject>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=043]">
+			<subject>
+				<xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
+					<geographicCode>
+						<xsl:attribute name="authority">
+							<xsl:if test="@code='a'">
+								<xsl:text>marcgac</xsl:text>
+							</xsl:if>
+							<xsl:if test="@code='b'">
+								<xsl:value-of select="following-sibling::marc:subfield[@code=2]"/>
+							</xsl:if>
+							<xsl:if test="@code='c'">
+								<xsl:text>iso3166</xsl:text>
+							</xsl:if>
+						</xsl:attribute>
+						<xsl:value-of select="self::marc:subfield"/>
+					</geographicCode>
+				</xsl:for-each>
+			</subject>
+		</xsl:for-each>
+		<!-- tmee 2006/11/27 -->
+		<xsl:for-each select="marc:datafield[@tag=255]">
+			<subject>
+				<xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
+					<cartographics>
+						<xsl:if test="@code='a'">
+							<scale>
+								<xsl:value-of select="."/>
+							</scale>
+						</xsl:if>
+						<xsl:if test="@code='b'">
+							<projection>
+								<xsl:value-of select="."/>
+							</projection>
+						</xsl:if>
+						<xsl:if test="@code='c'">
+							<coordinates>
+								<xsl:value-of select="."/>
+							</coordinates>
+						</xsl:if>
+					</cartographics>
+				</xsl:for-each>
+			</subject>
+		</xsl:for-each>
+
+		<xsl:apply-templates select="marc:datafield[653 &gt;= @tag and @tag &gt;= 600]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=656]"/>
+		<xsl:for-each select="marc:datafield[@tag=752 or @tag=662]">
+			<subject>
+				<hierarchicalGeographic>
+					<xsl:for-each select="marc:subfield[@code='a']">
+						<country>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."/>
+							</xsl:call-template>
+						</country>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='b']">
+						<state>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."/>
+							</xsl:call-template>
+						</state>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='c']">
+						<county>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."/>
+							</xsl:call-template>
+						</county>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='d']">
+						<city>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."/>
+							</xsl:call-template>
+						</city>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='e']">
+						<citySection>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."/>
+							</xsl:call-template>
+						</citySection>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='g']">
+						<region>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."/>
+							</xsl:call-template>
+						</region>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='h']">
+						<extraterrestrialArea>
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString" select="."/>
+							</xsl:call-template>
+						</extraterrestrialArea>
+					</xsl:for-each>
+				</hierarchicalGeographic>
+			</subject>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=045][marc:subfield[@code='b']]">
+			<subject>
+				<xsl:choose>
+					<xsl:when test="@ind1=2">
+						<temporal encoding="iso8601" point="start">
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString">
+									<xsl:value-of select="marc:subfield[@code='b'][1]"/>
+								</xsl:with-param>
+							</xsl:call-template>
+						</temporal>
+						<temporal encoding="iso8601" point="end">
+							<xsl:call-template name="chopPunctuation">
+								<xsl:with-param name="chopString">
+									<xsl:value-of select="marc:subfield[@code='b'][2]"/>
+								</xsl:with-param>
+							</xsl:call-template>
+						</temporal>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:for-each select="marc:subfield[@code='b']">
+							<temporal encoding="iso8601">
+								<xsl:call-template name="chopPunctuation">
+									<xsl:with-param name="chopString" select="."/>
+								</xsl:call-template>
+							</temporal>
+						</xsl:for-each>
+					</xsl:otherwise>
+				</xsl:choose>
+			</subject>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=050]">
+			<xsl:for-each select="marc:subfield[@code='b']">
+				<classification authority="lcc">
+					<xsl:if test="../marc:subfield[@code='3']">
+						<xsl:attribute name="displayLabel">
+							<xsl:value-of select="../marc:subfield[@code='3']"/>
+						</xsl:attribute>
+					</xsl:if>
+					<xsl:value-of select="preceding-sibling::marc:subfield[@code='a'][1]"/>
+					<xsl:text> </xsl:text>
+					<xsl:value-of select="text()"/>
+				</classification>
+			</xsl:for-each>
+			<xsl:for-each
+				select="marc:subfield[@code='a'][not(following-sibling::marc:subfield[@code='b'])]">
+				<classification authority="lcc">
+					<xsl:if test="../marc:subfield[@code='3']">
+						<xsl:attribute name="displayLabel">
+							<xsl:value-of select="../marc:subfield[@code='3']"/>
+						</xsl:attribute>
+					</xsl:if>
+					<xsl:value-of select="text()"/>
+				</classification>
+			</xsl:for-each>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=082]">
+			<classification authority="ddc">
+				<xsl:if test="marc:subfield[@code='2']">
+					<xsl:attribute name="edition">
+						<xsl:value-of select="marc:subfield[@code='2']"/>
+					</xsl:attribute>
+				</xsl:if>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=080]">
+			<classification authority="udc">
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">abx</xsl:with-param>
+				</xsl:call-template>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=060]">
+			<classification authority="nlm">
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=086][@ind1=0]">
+			<classification authority="sudocs">
+				<xsl:value-of select="marc:subfield[@code='a']"/>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=086][@ind1=1]">
+			<classification authority="candoc">
+				<xsl:value-of select="marc:subfield[@code='a']"/>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=086]">
+			<classification>
+				<xsl:attribute name="authority">
+					<xsl:value-of select="marc:subfield[@code='2']"/>
+				</xsl:attribute>
+				<xsl:value-of select="marc:subfield[@code='a']"/>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=084]">
+			<classification>
+				<xsl:attribute name="authority">
+					<xsl:value-of select="marc:subfield[@code='2']"/>
+				</xsl:attribute>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</classification>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=440]">
+			<relatedItem type="series">
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="subfieldSelect">
+									<xsl:with-param name="codes">av</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="part"/>
+				</titleInfo>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=490][@ind1=0]">
+			<relatedItem type="series">
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="subfieldSelect">
+									<xsl:with-param name="codes">av</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="part"/>
+				</titleInfo>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=510]">
+			<relatedItem type="isReferencedBy">
+				<note>
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">abcx3</xsl:with-param>
+					</xsl:call-template>
+				</note>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=534]">
+			<relatedItem type="original">
+				<xsl:call-template name="relatedTitle"/>
+				<xsl:call-template name="relatedName"/>
+				<xsl:if test="marc:subfield[@code='b' or @code='c']">
+					<originInfo>
+						<xsl:for-each select="marc:subfield[@code='c']">
+							<publisher>
+								<xsl:value-of select="."/>
+							</publisher>
+						</xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']">
+							<edition>
+								<xsl:value-of select="."/>
+							</edition>
+						</xsl:for-each>
+					</originInfo>
+				</xsl:if>
+				<xsl:call-template name="relatedIdentifierISSN"/>
+				<xsl:for-each select="marc:subfield[@code='z']">
+					<identifier type="isbn">
+						<xsl:value-of select="."/>
+					</identifier>
+				</xsl:for-each>
+				<xsl:call-template name="relatedNote"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=700][marc:subfield[@code='t']]">
+			<relatedItem>
+				<xsl:call-template name="constituentOrRelatedType"/>
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="afterCodes">g</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="part"/>
+				</titleInfo>
+				<name type="personal">
+					<namePart>
+						<xsl:call-template name="specialSubfieldSelect">
+							<xsl:with-param name="anyCodes">aq</xsl:with-param>
+							<xsl:with-param name="axis">t</xsl:with-param>
+							<xsl:with-param name="beforeCodes">g</xsl:with-param>
+						</xsl:call-template>
+					</namePart>
+					<xsl:call-template name="termsOfAddress"/>
+					<xsl:call-template name="nameDate"/>
+					<xsl:call-template name="role"/>
+				</name>
+				<xsl:call-template name="relatedForm"/>
+				<xsl:call-template name="relatedIdentifierISSN"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=710][marc:subfield[@code='t']]">
+			<relatedItem>
+				<xsl:call-template name="constituentOrRelatedType"/>
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="afterCodes">dg</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="relatedPartNumName"/>
+				</titleInfo>
+				<name type="corporate">
+					<xsl:for-each select="marc:subfield[@code='a']">
+						<namePart>
+							<xsl:value-of select="."/>
+						</namePart>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='b']">
+						<namePart>
+							<xsl:value-of select="."/>
+						</namePart>
+					</xsl:for-each>
+					<xsl:variable name="tempNamePart">
+						<xsl:call-template name="specialSubfieldSelect">
+							<xsl:with-param name="anyCodes">c</xsl:with-param>
+							<xsl:with-param name="axis">t</xsl:with-param>
+							<xsl:with-param name="beforeCodes">dgn</xsl:with-param>
+						</xsl:call-template>
+					</xsl:variable>
+					<xsl:if test="normalize-space($tempNamePart)">
+						<namePart>
+							<xsl:value-of select="$tempNamePart"/>
+						</namePart>
+					</xsl:if>
+					<xsl:call-template name="role"/>
+				</name>
+				<xsl:call-template name="relatedForm"/>
+				<xsl:call-template name="relatedIdentifierISSN"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=711][marc:subfield[@code='t']]">
+			<relatedItem>
+				<xsl:call-template name="constituentOrRelatedType"/>
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="afterCodes">g</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="relatedPartNumName"/>
+				</titleInfo>
+				<name type="conference">
+					<namePart>
+						<xsl:call-template name="specialSubfieldSelect">
+							<xsl:with-param name="anyCodes">aqdc</xsl:with-param>
+							<xsl:with-param name="axis">t</xsl:with-param>
+							<xsl:with-param name="beforeCodes">gn</xsl:with-param>
+						</xsl:call-template>
+					</namePart>
+				</name>
+				<xsl:call-template name="relatedForm"/>
+				<xsl:call-template name="relatedIdentifierISSN"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=730][@ind2=2]">
+			<relatedItem>
+				<xsl:call-template name="constituentOrRelatedType"/>
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="subfieldSelect">
+									<xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="part"/>
+				</titleInfo>
+				<xsl:call-template name="relatedForm"/>
+				<xsl:call-template name="relatedIdentifierISSN"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=740][@ind2=2]">
+			<relatedItem>
+				<xsl:call-template name="constituentOrRelatedType"/>
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:value-of select="marc:subfield[@code='a']"/>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="part"/>
+				</titleInfo>
+				<xsl:call-template name="relatedForm"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=760]|marc:datafield[@tag=762]">
+			<relatedItem type="series">
+				<xsl:call-template name="relatedItem76X-78X"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each
+			select="marc:datafield[@tag=765]|marc:datafield[@tag=767]|marc:datafield[@tag=777]|marc:datafield[@tag=787]">
+			<relatedItem>
+				<xsl:call-template name="relatedItem76X-78X"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=775]">
+			<relatedItem type="otherVersion">
+				<xsl:call-template name="relatedItem76X-78X"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=770]|marc:datafield[@tag=774]">
+			<relatedItem type="constituent">
+				<xsl:call-template name="relatedItem76X-78X"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=772]|marc:datafield[@tag=773]">
+			<relatedItem type="host">
+				<xsl:call-template name="relatedItem76X-78X"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=776]">
+			<relatedItem type="otherFormat">
+				<xsl:call-template name="relatedItem76X-78X"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=780]">
+			<relatedItem type="preceding">
+				<xsl:call-template name="relatedItem76X-78X"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=785]">
+			<relatedItem type="succeeding">
+				<xsl:call-template name="relatedItem76X-78X"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=786]">
+			<relatedItem type="original">
+				<xsl:call-template name="relatedItem76X-78X"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=800]">
+			<relatedItem type="series">
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="afterCodes">g</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="part"/>
+				</titleInfo>
+				<name type="personal">
+					<namePart>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">aq</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="beforeCodes">g</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</namePart>
+					<xsl:call-template name="termsOfAddress"/>
+					<xsl:call-template name="nameDate"/>
+					<xsl:call-template name="role"/>
+				</name>
+				<xsl:call-template name="relatedForm"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=810]">
+			<relatedItem type="series">
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="afterCodes">dg</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="relatedPartNumName"/>
+				</titleInfo>
+				<name type="corporate">
+					<xsl:for-each select="marc:subfield[@code='a']">
+						<namePart>
+							<xsl:value-of select="."/>
+						</namePart>
+					</xsl:for-each>
+					<xsl:for-each select="marc:subfield[@code='b']">
+						<namePart>
+							<xsl:value-of select="."/>
+						</namePart>
+					</xsl:for-each>
+					<namePart>
+						<xsl:call-template name="specialSubfieldSelect">
+							<xsl:with-param name="anyCodes">c</xsl:with-param>
+							<xsl:with-param name="axis">t</xsl:with-param>
+							<xsl:with-param name="beforeCodes">dgn</xsl:with-param>
+						</xsl:call-template>
+					</namePart>
+					<xsl:call-template name="role"/>
+				</name>
+				<xsl:call-template name="relatedForm"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=811]">
+			<relatedItem type="series">
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="specialSubfieldSelect">
+									<xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
+									<xsl:with-param name="axis">t</xsl:with-param>
+									<xsl:with-param name="afterCodes">g</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="relatedPartNumName"/>
+				</titleInfo>
+				<name type="conference">
+					<namePart>
+						<xsl:call-template name="specialSubfieldSelect">
+							<xsl:with-param name="anyCodes">aqdc</xsl:with-param>
+							<xsl:with-param name="axis">t</xsl:with-param>
+							<xsl:with-param name="beforeCodes">gn</xsl:with-param>
+						</xsl:call-template>
+					</namePart>
+					<xsl:call-template name="role"/>
+				</name>
+				<xsl:call-template name="relatedForm"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='830']">
+			<relatedItem type="series">
+				<titleInfo>
+					<title>
+						<xsl:call-template name="chopPunctuation">
+							<xsl:with-param name="chopString">
+								<xsl:call-template name="subfieldSelect">
+									<xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
+								</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+					</title>
+					<xsl:call-template name="part"/>
+				</titleInfo>
+				<xsl:call-template name="relatedForm"/>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='856'][@ind2='2']/marc:subfield[@code='q']">
+			<relatedItem>
+				<internetMediaType>
+					<xsl:value-of select="."/>
+				</internetMediaType>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='020']">
+			<xsl:call-template name="isInvalid">
+				<xsl:with-param name="type">isbn</xsl:with-param>
+			</xsl:call-template>
+			<xsl:if test="marc:subfield[@code='a']">
+				<identifier type="isbn">
+					<xsl:value-of select="marc:subfield[@code='a']"/>
+				</identifier>
+			</xsl:if>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='024'][@ind1='0']">
+			<xsl:call-template name="isInvalid">
+				<xsl:with-param name="type">isrc</xsl:with-param>
+			</xsl:call-template>
+			<xsl:if test="marc:subfield[@code='a']">
+				<identifier type="isrc">
+					<xsl:value-of select="marc:subfield[@code='a']"/>
+				</identifier>
+			</xsl:if>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='024'][@ind1='2']">
+			<xsl:call-template name="isInvalid">
+				<xsl:with-param name="type">ismn</xsl:with-param>
+			</xsl:call-template>
+			<xsl:if test="marc:subfield[@code='a']">
+				<identifier type="ismn">
+					<xsl:value-of select="marc:subfield[@code='a']"/>
+				</identifier>
+			</xsl:if>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='024'][@ind1='4']">
+			<xsl:call-template name="isInvalid">
+				<xsl:with-param name="type">sici</xsl:with-param>
+			</xsl:call-template>
+			<identifier type="sici">
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</identifier>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='022']">
+			<xsl:if test="marc:subfield[@code='a']">
+				<xsl:call-template name="isInvalid">
+					<xsl:with-param name="type">issn</xsl:with-param>
+				</xsl:call-template>
+				<identifier type="issn">
+					<xsl:value-of select="marc:subfield[@code='a']"/>
+				</identifier>
+			</xsl:if>
+			<xsl:if test="marc:subfield[@code='l']">
+				<xsl:call-template name="isInvalid">
+					<xsl:with-param name="type">issn-l</xsl:with-param>
+				</xsl:call-template>
+				<identifier type="issn-l">
+					<xsl:value-of select="marc:subfield[@code='l']"/>
+				</identifier>
+			</xsl:if>
+		</xsl:for-each>
+
+
+
+		<xsl:for-each select="marc:datafield[@tag='010']">
+			<xsl:call-template name="isInvalid">
+				<xsl:with-param name="type">lccn</xsl:with-param>
+			</xsl:call-template>
+			<identifier type="lccn">
+				<xsl:value-of select="normalize-space(marc:subfield[@code='a'])"/>
+			</identifier>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='028']">
+			<identifier>
+				<xsl:attribute name="type">
+					<xsl:choose>
+						<xsl:when test="@ind1='0'">issue number</xsl:when>
+						<xsl:when test="@ind1='1'">matrix number</xsl:when>
+						<xsl:when test="@ind1='2'">music plate</xsl:when>
+						<xsl:when test="@ind1='3'">music publisher</xsl:when>
+						<xsl:when test="@ind1='4'">videorecording identifier</xsl:when>
+					</xsl:choose>
+				</xsl:attribute>
+				<!--<xsl:call-template name="isInvalid"/>-->
+				<!-- no $z in 028 -->
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">
+						<xsl:choose>
+							<xsl:when test="@ind1='0'">ba</xsl:when>
+							<xsl:otherwise>ab</xsl:otherwise>
+						</xsl:choose>
+					</xsl:with-param>
+				</xsl:call-template>
+			</identifier>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='037']">
+			<identifier type="stock number">
+				<!--<xsl:call-template name="isInvalid"/>-->
+				<!-- no $z in 037 -->
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</identifier>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag='856'][marc:subfield[@code='u']]">
+			<identifier>
+				<xsl:attribute name="type">
+					<xsl:choose>
+						<xsl:when
+							test="starts-with(marc:subfield[@code='u'],'urn:doi') or starts-with(marc:subfield[@code='u'],'doi')"
+							>doi</xsl:when>
+						<xsl:when
+							test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl') or starts-with(marc:subfield[@code='u'],'http://hdl.loc.gov')"
+							>hdl</xsl:when>
+						<xsl:otherwise>uri</xsl:otherwise>
+					</xsl:choose>
+				</xsl:attribute>
+				<xsl:choose>
+					<xsl:when
+						test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl') or starts-with(marc:subfield[@code='u'],'http://hdl.loc.gov') ">
+						<xsl:value-of
+							select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"
+						/>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:value-of select="marc:subfield[@code='u']"/>
+					</xsl:otherwise>
+				</xsl:choose>
+			</identifier>
+			<xsl:if
+				test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl')">
+				<identifier type="hdl">
+					<xsl:if test="marc:subfield[@code='y' or @code='3' or @code='z']">
+						<xsl:attribute name="displayLabel">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">y3z</xsl:with-param>
+							</xsl:call-template>
+						</xsl:attribute>
+					</xsl:if>
+					<xsl:value-of
+						select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"
+					/>
+				</identifier>
+			</xsl:if>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=024][@ind1=1]">
+			<identifier type="upc">
+				<xsl:call-template name="isInvalid"/>
+				<xsl:value-of select="marc:subfield[@code='a']"/>
+			</identifier>
+		</xsl:for-each>
+
+		<!-- 1/04 fix added $y -->
+
+		<!-- 1.21  tmee-->
+		<xsl:for-each select="marc:datafield[@tag=856][@ind2=1][marc:subfield[@code='u']]">
+			<relatedItem type="otherVersion">
+				<location>
+					<url>
+						<xsl:if test="marc:subfield[@code='y' or @code='3']">
+							<xsl:attribute name="displayLabel">
+								<xsl:call-template name="subfieldSelect">
+									<xsl:with-param name="codes">y3</xsl:with-param>
+								</xsl:call-template>
+							</xsl:attribute>
+						</xsl:if>
+						<xsl:if test="marc:subfield[@code='z' ]">
+							<xsl:attribute name="note">
+								<xsl:call-template name="subfieldSelect">
+									<xsl:with-param name="codes">z</xsl:with-param>
+								</xsl:call-template>
+							</xsl:attribute>
+						</xsl:if>
+						<xsl:value-of select="marc:subfield[@code='u']"/>
+					</url>
+				</location>
+			</relatedItem>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=856][@ind2=2][marc:subfield[@code='u']]">
+			<relatedItem>
+				<location>
+					<url>
+						<xsl:if test="marc:subfield[@code='y' or @code='3']">
+							<xsl:attribute name="displayLabel">
+								<xsl:call-template name="subfieldSelect">
+									<xsl:with-param name="codes">y3</xsl:with-param>
+								</xsl:call-template>
+							</xsl:attribute>
+						</xsl:if>
+						<xsl:if test="marc:subfield[@code='z' ]">
+							<xsl:attribute name="note">
+								<xsl:call-template name="subfieldSelect">
+									<xsl:with-param name="codes">z</xsl:with-param>
+								</xsl:call-template>
+							</xsl:attribute>
+						</xsl:if>
+						<xsl:value-of select="marc:subfield[@code='u']"/>
+					</url>
+				</location>
+			</relatedItem>
+		</xsl:for-each>
+
+		<!-- 3.2 change tmee 856z  -->
+
+		<!-- 1.24  tmee  -->
+		<xsl:for-each select="marc:datafield[@tag=852]">
+			<location>
+				<xsl:if test="marc:subfield[@code='a' or @code='b' or @code='e']">
+					<physicalLocation>
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">abe</xsl:with-param>
+						</xsl:call-template>
+					</physicalLocation>
+				</xsl:if>
+
+				<xsl:if test="marc:subfield[@code='u']">
+					<physicalLocation>
+						<xsl:call-template name="uri"/>
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">u</xsl:with-param>
+						</xsl:call-template>
+					</physicalLocation>
+				</xsl:if>
+
+				<xsl:if
+					test="marc:subfield[@code='h' or @code='i' or @code='j' or @code='k' or @code='l' or @code='m' or @code='t']">
+					<shelfLocation>
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">hijklmt</xsl:with-param>
+						</xsl:call-template>
+					</shelfLocation>
+				</xsl:if>
+			</location>
+		</xsl:for-each>
+
+		<xsl:for-each select="marc:datafield[@tag=506]">
+			<accessCondition type="restrictionOnAccess">
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">abcd35</xsl:with-param>
+				</xsl:call-template>
+			</accessCondition>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=540]">
+			<accessCondition type="useAndReproduction">
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">abcde35</xsl:with-param>
+				</xsl:call-template>
+			</accessCondition>
+		</xsl:for-each>
+
+		<recordInfo>
+			<!-- 1.25  tmee-->
+
+
+			<xsl:for-each select="marc:leader[substring($leader,19,1)='a']">
+				<descriptionStandard>aacr2</descriptionStandard>
+			</xsl:for-each>
+
+			<xsl:for-each select="marc:datafield[@tag=040]">
+				<xsl:if test="marc:subfield[@code='e']">
+					<descriptionStandard>
+						<xsl:value-of select="marc:subfield[@code='e']"/>
+					</descriptionStandard>
+				</xsl:if>
+				<recordContentSource authority="marcorg">
+					<xsl:value-of select="marc:subfield[@code='a']"/>
+				</recordContentSource>
+			</xsl:for-each>
+			<xsl:for-each select="marc:controlfield[@tag=008]">
+				<recordCreationDate encoding="marc">
+					<xsl:value-of select="substring(.,1,6)"/>
+				</recordCreationDate>
+			</xsl:for-each>
+
+			<xsl:for-each select="marc:controlfield[@tag=005]">
+				<recordChangeDate encoding="iso8601">
+					<xsl:value-of select="."/>
+				</recordChangeDate>
+			</xsl:for-each>
+			<xsl:for-each select="marc:controlfield[@tag=001]">
+				<recordIdentifier>
+					<xsl:if test="../marc:controlfield[@tag=003]">
+						<xsl:attribute name="source">
+							<xsl:value-of select="../marc:controlfield[@tag=003]"/>
+						</xsl:attribute>
+					</xsl:if>
+					<xsl:value-of select="."/>
+				</recordIdentifier>
+			</xsl:for-each>
+			<xsl:for-each select="marc:datafield[@tag=040]/marc:subfield[@code='b']">
+				<languageOfCataloging>
+					<languageTerm authority="iso639-2b" type="code">
+						<xsl:value-of select="."/>
+					</languageTerm>
+				</languageOfCataloging>
+			</xsl:for-each>
+		</recordInfo>
+	</xsl:template>
+	<xsl:template name="displayForm">
+		<xsl:for-each select="marc:subfield[@code='c']">
+			<displayForm>
+				<xsl:value-of select="."/>
+			</displayForm>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="affiliation">
+		<xsl:for-each select="marc:subfield[@code='u']">
+			<affiliation>
+				<xsl:value-of select="."/>
+			</affiliation>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="uri">
+		<xsl:for-each select="marc:subfield[@code='u']">
+			<xsl:attribute name="xlink:href">
+				<xsl:value-of select="."/>
+			</xsl:attribute>
+		</xsl:for-each>
+		<xsl:for-each select="marc:subfield[@code='0']">
+			<xsl:choose>
+				<xsl:when test="contains(text(), ')')">
+					<xsl:attribute name="xlink:href">
+						<xsl:value-of select="substring-after(text(), ')')"></xsl:value-of>
+					</xsl:attribute>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:attribute name="xlink:href">
+						<xsl:value-of select="."></xsl:value-of>
+					</xsl:attribute>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="role">
+		<xsl:for-each select="marc:subfield[@code='e']">
+			<role>
+				<roleTerm type="text">
+					<xsl:value-of select="."/>
+				</roleTerm>
+			</role>
+		</xsl:for-each>
+		<xsl:for-each select="marc:subfield[@code='4']">
+			<role>
+				<roleTerm authority="marcrelator" type="code">
+					<xsl:value-of select="."/>
+				</roleTerm>
+			</role>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="part">
+		<xsl:variable name="partNumber">
+			<xsl:call-template name="specialSubfieldSelect">
+				<xsl:with-param name="axis">n</xsl:with-param>
+				<xsl:with-param name="anyCodes">n</xsl:with-param>
+				<xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:variable name="partName">
+			<xsl:call-template name="specialSubfieldSelect">
+				<xsl:with-param name="axis">p</xsl:with-param>
+				<xsl:with-param name="anyCodes">p</xsl:with-param>
+				<xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:if test="string-length(normalize-space($partNumber))">
+			<partNumber>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="$partNumber"/>
+				</xsl:call-template>
+			</partNumber>
+		</xsl:if>
+		<xsl:if test="string-length(normalize-space($partName))">
+			<partName>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="$partName"/>
+				</xsl:call-template>
+			</partName>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="relatedPart">
+		<xsl:if test="@tag=773">
+			<xsl:for-each select="marc:subfield[@code='g']">
+				<part>
+					<text>
+						<xsl:value-of select="."/>
+					</text>
+				</part>
+			</xsl:for-each>
+			<xsl:for-each select="marc:subfield[@code='q']">
+				<part>
+					<xsl:call-template name="parsePart"/>
+				</part>
+			</xsl:for-each>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="relatedPartNumName">
+		<xsl:variable name="partNumber">
+			<xsl:call-template name="specialSubfieldSelect">
+				<xsl:with-param name="axis">g</xsl:with-param>
+				<xsl:with-param name="anyCodes">g</xsl:with-param>
+				<xsl:with-param name="afterCodes">pst</xsl:with-param>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:variable name="partName">
+			<xsl:call-template name="specialSubfieldSelect">
+				<xsl:with-param name="axis">p</xsl:with-param>
+				<xsl:with-param name="anyCodes">p</xsl:with-param>
+				<xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:if test="string-length(normalize-space($partNumber))">
+			<partNumber>
+				<xsl:value-of select="$partNumber"/>
+			</partNumber>
+		</xsl:if>
+		<xsl:if test="string-length(normalize-space($partName))">
+			<partName>
+				<xsl:value-of select="$partName"/>
+			</partName>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="relatedName">
+		<xsl:for-each select="marc:subfield[@code='a']">
+			<name>
+				<namePart>
+					<xsl:value-of select="."/>
+				</namePart>
+			</name>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedForm">
+		<xsl:for-each select="marc:subfield[@code='h']">
+			<physicalDescription>
+				<form>
+					<xsl:value-of select="."/>
+				</form>
+			</physicalDescription>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedExtent">
+		<xsl:for-each select="marc:subfield[@code='h']">
+			<physicalDescription>
+				<extent>
+					<xsl:value-of select="."/>
+				</extent>
+			</physicalDescription>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedNote">
+		<xsl:for-each select="marc:subfield[@code='n']">
+			<note>
+				<xsl:value-of select="."/>
+			</note>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedSubject">
+		<xsl:for-each select="marc:subfield[@code='j']">
+			<subject>
+				<temporal encoding="iso8601">
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString" select="."/>
+					</xsl:call-template>
+				</temporal>
+			</subject>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedIdentifierISSN">
+		<xsl:for-each select="marc:subfield[@code='x']">
+			<identifier type="issn">
+				<xsl:value-of select="."/>
+			</identifier>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedIdentifierLocal">
+		<xsl:for-each select="marc:subfield[@code='w']">
+			<identifier type="local">
+				<xsl:value-of select="."/>
+			</identifier>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedIdentifier">
+		<xsl:for-each select="marc:subfield[@code='o']">
+			<identifier>
+				<xsl:value-of select="."/>
+			</identifier>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedItem76X-78X">
+		<xsl:call-template name="displayLabel"/>
+		<xsl:call-template name="relatedTitle76X-78X"/>
+		<xsl:call-template name="relatedName"/>
+		<xsl:call-template name="relatedOriginInfo"/>
+		<xsl:call-template name="relatedLanguage"/>
+		<xsl:call-template name="relatedExtent"/>
+		<xsl:call-template name="relatedNote"/>
+		<xsl:call-template name="relatedSubject"/>
+		<xsl:call-template name="relatedIdentifier"/>
+		<xsl:call-template name="relatedIdentifierISSN"/>
+		<xsl:call-template name="relatedIdentifierLocal"/>
+		<xsl:call-template name="relatedPart"/>
+	</xsl:template>
+	<xsl:template name="subjectGeographicZ">
+		<geographic>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString" select="."/>
+			</xsl:call-template>
+		</geographic>
+	</xsl:template>
+	<xsl:template name="subjectTemporalY">
+		<temporal>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString" select="."/>
+			</xsl:call-template>
+		</temporal>
+	</xsl:template>
+	<xsl:template name="subjectTopic">
+		<topic>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString" select="."/>
+			</xsl:call-template>
+		</topic>
+	</xsl:template>
+	<!-- 3.2 change tmee 6xx $v genre -->
+	<xsl:template name="subjectGenre">
+		<genre>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString" select="."/>
+			</xsl:call-template>
+		</genre>
+	</xsl:template>
+
+	<xsl:template name="nameABCDN">
+		<xsl:for-each select="marc:subfield[@code='a']">
+			<namePart>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="."/>
+				</xsl:call-template>
+			</namePart>
+		</xsl:for-each>
+		<xsl:for-each select="marc:subfield[@code='b']">
+			<namePart>
+				<xsl:value-of select="."/>
+			</namePart>
+		</xsl:for-each>
+		<xsl:if
+			test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
+			<namePart>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">cdn</xsl:with-param>
+				</xsl:call-template>
+			</namePart>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="nameABCDQ">
+		<namePart>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString">
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">aq</xsl:with-param>
+					</xsl:call-template>
+				</xsl:with-param>
+				<xsl:with-param name="punctuation">
+					<xsl:text>:,;/ </xsl:text>
+				</xsl:with-param>
+			</xsl:call-template>
+		</namePart>
+		<xsl:call-template name="termsOfAddress"/>
+		<xsl:call-template name="nameDate"/>
+	</xsl:template>
+	<xsl:template name="nameACDEQ">
+		<namePart>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">acdeq</xsl:with-param>
+			</xsl:call-template>
+		</namePart>
+	</xsl:template>
+	<xsl:template name="constituentOrRelatedType">
+		<xsl:if test="@ind2=2">
+			<xsl:attribute name="type">constituent</xsl:attribute>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="relatedTitle">
+		<xsl:for-each select="marc:subfield[@code='t']">
+			<titleInfo>
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="."/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+			</titleInfo>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedTitle76X-78X">
+		<xsl:for-each select="marc:subfield[@code='t']">
+			<titleInfo>
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="."/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
+					<xsl:call-template name="relatedPartNumName"/>
+				</xsl:if>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:subfield[@code='p']">
+			<titleInfo type="abbreviated">
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="."/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
+					<xsl:call-template name="relatedPartNumName"/>
+				</xsl:if>
+			</titleInfo>
+		</xsl:for-each>
+		<xsl:for-each select="marc:subfield[@code='s']">
+			<titleInfo type="uniform">
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="."/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
+					<xsl:call-template name="relatedPartNumName"/>
+				</xsl:if>
+			</titleInfo>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="relatedOriginInfo">
+		<xsl:if test="marc:subfield[@code='b' or @code='d'] or marc:subfield[@code='f']">
+			<originInfo>
+				<xsl:if test="@tag=775">
+					<xsl:for-each select="marc:subfield[@code='f']">
+						<place>
+							<placeTerm>
+								<xsl:attribute name="type">code</xsl:attribute>
+								<xsl:attribute name="authority">marcgac</xsl:attribute>
+								<xsl:value-of select="."/>
+							</placeTerm>
+						</place>
+					</xsl:for-each>
+				</xsl:if>
+				<xsl:for-each select="marc:subfield[@code='d']">
+					<publisher>
+						<xsl:value-of select="."/>
+					</publisher>
+				</xsl:for-each>
+				<xsl:for-each select="marc:subfield[@code='b']">
+					<edition>
+						<xsl:value-of select="."/>
+					</edition>
+				</xsl:for-each>
+			</originInfo>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="relatedLanguage">
+		<xsl:for-each select="marc:subfield[@code='e']">
+			<xsl:call-template name="getLanguage">
+				<xsl:with-param name="langString">
+					<xsl:value-of select="."/>
+				</xsl:with-param>
+			</xsl:call-template>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="nameDate">
+		<xsl:for-each select="marc:subfield[@code='d']">
+			<namePart type="date">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="."/>
+				</xsl:call-template>
+			</namePart>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="subjectAuthority">
+		<xsl:if test="@ind2!=4">
+			<xsl:if test="@ind2!=' '">
+				<xsl:if test="@ind2!=8">
+					<xsl:if test="@ind2!=9">
+						<xsl:attribute name="authority">
+							<xsl:choose>
+								<xsl:when test="@ind2=0">lcsh</xsl:when>
+								<xsl:when test="@ind2=1">lcshac</xsl:when>
+								<xsl:when test="@ind2=2">mesh</xsl:when>
+								<!-- 1/04 fix -->
+								<xsl:when test="@ind2=3">nal</xsl:when>
+								<xsl:when test="@ind2=5">csh</xsl:when>
+								<xsl:when test="@ind2=6">rvm</xsl:when>
+								<xsl:when test="@ind2=7">
+									<xsl:value-of select="marc:subfield[@code='2']"/>
+								</xsl:when>
+							</xsl:choose>
+						</xsl:attribute>
+					</xsl:if>
+				</xsl:if>
+			</xsl:if>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="subjectAnyOrder">
+		<xsl:for-each select="marc:subfield[@code='v' or @code='x' or @code='y' or @code='z']">
+			<xsl:choose>
+				<xsl:when test="@code='v'">
+					<xsl:call-template name="subjectGenre"/>
+				</xsl:when>
+				<xsl:when test="@code='x'">
+					<xsl:call-template name="subjectTopic"/>
+				</xsl:when>
+				<xsl:when test="@code='y'">
+					<xsl:call-template name="subjectTemporalY"/>
+				</xsl:when>
+				<xsl:when test="@code='z'">
+					<xsl:call-template name="subjectGeographicZ"/>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template name="specialSubfieldSelect">
+		<xsl:param name="anyCodes"/>
+		<xsl:param name="axis"/>
+		<xsl:param name="beforeCodes"/>
+		<xsl:param name="afterCodes"/>
+		<xsl:variable name="str">
+			<xsl:for-each select="marc:subfield">
+				<xsl:if
+					test="contains($anyCodes, @code)      or (contains($beforeCodes, at code) and following-sibling::marc:subfield[@code=$axis])      or (contains($afterCodes, at code) and preceding-sibling::marc:subfield[@code=$axis])">
+					<xsl:value-of select="text()"/>
+					<xsl:text> </xsl:text>
+				</xsl:if>
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+	</xsl:template>
+
+	<!-- 3.2 change tmee 6xx $v genre -->
+	<xsl:template match="marc:datafield[@tag=600]">
+		<subject>
+			<xsl:call-template name="subjectAuthority"/>
+			<name type="personal">
+				<xsl:call-template name="termsOfAddress"/>
+				<namePart>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">aq</xsl:with-param>
+							</xsl:call-template>
+						</xsl:with-param>
+					</xsl:call-template>
+				</namePart>
+				<xsl:call-template name="nameDate"/>
+				<xsl:call-template name="affiliation"/>
+				<xsl:call-template name="role"/>
+			</name>
+			<xsl:call-template name="subjectAnyOrder"/>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=610]">
+		<subject>
+			<xsl:call-template name="subjectAuthority"/>
+			<name type="corporate">
+				<xsl:for-each select="marc:subfield[@code='a']">
+					<namePart>
+						<xsl:value-of select="."/>
+					</namePart>
+				</xsl:for-each>
+				<xsl:for-each select="marc:subfield[@code='b']">
+					<namePart>
+						<xsl:value-of select="."/>
+					</namePart>
+				</xsl:for-each>
+				<xsl:if test="marc:subfield[@code='c' or @code='d' or @code='n' or @code='p']">
+					<namePart>
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">cdnp</xsl:with-param>
+						</xsl:call-template>
+					</namePart>
+				</xsl:if>
+				<xsl:call-template name="role"/>
+			</name>
+			<xsl:call-template name="subjectAnyOrder"/>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=611]">
+		<subject>
+			<xsl:call-template name="subjectAuthority"/>
+			<name type="conference">
+				<namePart>
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">abcdeqnp</xsl:with-param>
+					</xsl:call-template>
+				</namePart>
+				<xsl:for-each select="marc:subfield[@code='4']">
+					<role>
+						<roleTerm authority="marcrelator" type="code">
+							<xsl:value-of select="."/>
+						</roleTerm>
+					</role>
+				</xsl:for-each>
+			</name>
+			<xsl:call-template name="subjectAnyOrder"/>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=630]">
+		<subject>
+			<xsl:call-template name="subjectAuthority"/>
+			<titleInfo>
+				<title>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">adfhklor</xsl:with-param>
+							</xsl:call-template>
+						</xsl:with-param>
+					</xsl:call-template>
+				</title>
+				<xsl:call-template name="part"/>
+			</titleInfo>
+			<xsl:call-template name="subjectAnyOrder"/>
+		</subject>
+	</xsl:template>
+	<!-- 1.27 648 tmee-->
+	<xsl:template match="marc:datafield[@tag=648]">
+		<subject>
+			<xsl:if test="marc:subfield[@code=2]">
+				<xsl:attribute name="authority">
+					<xsl:value-of select="marc:subfield[@code=2]"/>
+				</xsl:attribute>
+			</xsl:if>
+			<xsl:call-template name="uri"/>
+
+			<xsl:call-template name="subjectAuthority"/>
+			<temporal>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">abcd</xsl:with-param>
+						</xsl:call-template>
+					</xsl:with-param>
+				</xsl:call-template>
+			</temporal>
+			<xsl:call-template name="subjectAnyOrder"/>
+
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=650]">
+		<subject>
+			<xsl:call-template name="subjectAuthority"/>
+			<topic>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">abcd</xsl:with-param>
+						</xsl:call-template>
+					</xsl:with-param>
+				</xsl:call-template>
+			</topic>
+			<xsl:call-template name="subjectAnyOrder"/>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=651]">
+		<subject>
+			<xsl:call-template name="subjectAuthority"/>
+			<xsl:for-each select="marc:subfield[@code='a']">
+				<geographic>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString" select="."/>
+					</xsl:call-template>
+				</geographic>
+			</xsl:for-each>
+			<xsl:call-template name="subjectAnyOrder"/>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=653]">
+		<subject>
+			<xsl:for-each select="marc:subfield[@code='a']">
+				<topic>
+					<xsl:value-of select="."/>
+				</topic>
+			</xsl:for-each>
+		</subject>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=656]">
+		<subject>
+			<xsl:if test="marc:subfield[@code=2]">
+				<xsl:attribute name="authority">
+					<xsl:value-of select="marc:subfield[@code=2]"/>
+				</xsl:attribute>
+			</xsl:if>
+			<occupation>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:value-of select="marc:subfield[@code='a']"/>
+					</xsl:with-param>
+				</xsl:call-template>
+			</occupation>
+		</subject>
+	</xsl:template>
+	<xsl:template name="termsOfAddress">
+		<xsl:if test="marc:subfield[@code='b' or @code='c']">
+			<namePart type="termsOfAddress">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">bc</xsl:with-param>
+						</xsl:call-template>
+					</xsl:with-param>
+				</xsl:call-template>
+			</namePart>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="displayLabel">
+		<xsl:if test="marc:subfield[@code='i']">
+			<xsl:attribute name="displayLabel">
+				<xsl:value-of select="marc:subfield[@code='i']"/>
+			</xsl:attribute>
+		</xsl:if>
+		<xsl:if test="marc:subfield[@code='3']">
+			<xsl:attribute name="displayLabel">
+				<xsl:value-of select="marc:subfield[@code='3']"/>
+			</xsl:attribute>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="isInvalid">
+		<xsl:param name="type"/>
+		<xsl:if
+			test="marc:subfield[@code='z'] or marc:subfield[@code='y']  or marc:subfield[@code='m']">
+			<identifier>
+				<xsl:attribute name="type">
+					<xsl:value-of select="$type"/>
+				</xsl:attribute>
+				<xsl:attribute name="invalid">
+					<xsl:text>yes</xsl:text>
+				</xsl:attribute>
+				<xsl:if test="marc:subfield[@code='z']">
+					<xsl:value-of select="marc:subfield[@code='z']"/>
+				</xsl:if>
+				<xsl:if test="marc:subfield[@code='y']">
+					<xsl:value-of select="marc:subfield[@code='y']"/>
+				</xsl:if>
+				<xsl:if test="marc:subfield[@code='m']">
+					<xsl:value-of select="marc:subfield[@code='m']"/>
+				</xsl:if>
+			</identifier>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="subtitle">
+		<xsl:if test="marc:subfield[@code='b']">
+			<subTitle>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:value-of select="marc:subfield[@code='b']"/>
+						<!--<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">b</xsl:with-param>									
+						</xsl:call-template>-->
+					</xsl:with-param>
+				</xsl:call-template>
+			</subTitle>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="script">
+		<xsl:param name="scriptCode"/>
+		<xsl:attribute name="script">
+			<xsl:choose>
+				<xsl:when test="$scriptCode='(3'">Arabic</xsl:when>
+				<xsl:when test="$scriptCode='(B'">Latin</xsl:when>
+				<xsl:when test="$scriptCode='$1'">Chinese, Japanese, Korean</xsl:when>
+				<xsl:when test="$scriptCode='(N'">Cyrillic</xsl:when>
+				<xsl:when test="$scriptCode='(2'">Hebrew</xsl:when>
+				<xsl:when test="$scriptCode='(S'">Greek</xsl:when>
+			</xsl:choose>
+		</xsl:attribute>
+	</xsl:template>
+	<xsl:template name="parsePart">
+		<!-- assumes 773$q= 1:2:3<4
+		     with up to 3 levels and one optional start page
+		-->
+		<xsl:variable name="level1">
+			<xsl:choose>
+				<xsl:when test="contains(text(),':')">
+					<!-- 1:2 -->
+					<xsl:value-of select="substring-before(text(),':')"/>
+				</xsl:when>
+				<xsl:when test="not(contains(text(),':'))">
+					<!-- 1 or 1<3 -->
+					<xsl:if test="contains(text(),'&lt;')">
+						<!-- 1<3 -->
+						<xsl:value-of select="substring-before(text(),'&lt;')"/>
+					</xsl:if>
+					<xsl:if test="not(contains(text(),'&lt;'))">
+						<!-- 1 -->
+						<xsl:value-of select="text()"/>
+					</xsl:if>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:variable name="sici2">
+			<xsl:choose>
+				<xsl:when test="starts-with(substring-after(text(),$level1),':')">
+					<xsl:value-of select="substring(substring-after(text(),$level1),2)"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="substring-after(text(),$level1)"/>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:variable name="level2">
+			<xsl:choose>
+				<xsl:when test="contains($sici2,':')">
+					<!--  2:3<4  -->
+					<xsl:value-of select="substring-before($sici2,':')"/>
+				</xsl:when>
+				<xsl:when test="contains($sici2,'&lt;')">
+					<!-- 1: 2<4 -->
+					<xsl:value-of select="substring-before($sici2,'&lt;')"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="$sici2"/>
+					<!-- 1:2 -->
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:variable name="sici3">
+			<xsl:choose>
+				<xsl:when test="starts-with(substring-after($sici2,$level2),':')">
+					<xsl:value-of select="substring(substring-after($sici2,$level2),2)"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="substring-after($sici2,$level2)"/>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:variable name="level3">
+			<xsl:choose>
+				<xsl:when test="contains($sici3,'&lt;')">
+					<!-- 2<4 -->
+					<xsl:value-of select="substring-before($sici3,'&lt;')"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="$sici3"/>
+					<!-- 3 -->
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:variable name="page">
+			<xsl:if test="contains(text(),'&lt;')">
+				<xsl:value-of select="substring-after(text(),'&lt;')"/>
+			</xsl:if>
+		</xsl:variable>
+		<xsl:if test="$level1">
+			<detail level="1">
+				<number>
+					<xsl:value-of select="$level1"/>
+				</number>
+			</detail>
+		</xsl:if>
+		<xsl:if test="$level2">
+			<detail level="2">
+				<number>
+					<xsl:value-of select="$level2"/>
+				</number>
+			</detail>
+		</xsl:if>
+		<xsl:if test="$level3">
+			<detail level="3">
+				<number>
+					<xsl:value-of select="$level3"/>
+				</number>
+			</detail>
+		</xsl:if>
+		<xsl:if test="$page">
+			<extent unit="page">
+				<start>
+					<xsl:value-of select="$page"/>
+				</start>
+			</extent>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="getLanguage">
+		<xsl:param name="langString"/>
+		<xsl:param name="controlField008-35-37"/>
+		<xsl:variable name="length" select="string-length($langString)"/>
+		<xsl:choose>
+			<xsl:when test="$length=0"/>
+			<xsl:when test="$controlField008-35-37=substring($langString,1,3)">
+				<xsl:call-template name="getLanguage">
+					<xsl:with-param name="langString" select="substring($langString,4,$length)"/>
+					<xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:otherwise>
+				<language>
+					<languageTerm authority="iso639-2b" type="code">
+						<xsl:value-of select="substring($langString,1,3)"/>
+					</languageTerm>
+				</language>
+				<xsl:call-template name="getLanguage">
+					<xsl:with-param name="langString" select="substring($langString,4,$length)"/>
+					<xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"/>
+				</xsl:call-template>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+	<xsl:template name="isoLanguage">
+		<xsl:param name="currentLanguage"/>
+		<xsl:param name="usedLanguages"/>
+		<xsl:param name="remainingLanguages"/>
+		<xsl:choose>
+			<xsl:when test="string-length($currentLanguage)=0"/>
+			<xsl:when test="not(contains($usedLanguages, $currentLanguage))">
+				<language>
+					<xsl:if test="@code!='a'">
+						<xsl:attribute name="objectPart">
+							<xsl:choose>
+								<xsl:when test="@code='b'">summary or subtitle</xsl:when>
+								<xsl:when test="@code='d'">sung or spoken text</xsl:when>
+								<xsl:when test="@code='e'">libretto</xsl:when>
+								<xsl:when test="@code='f'">table of contents</xsl:when>
+								<xsl:when test="@code='g'">accompanying material</xsl:when>
+								<xsl:when test="@code='h'">translation</xsl:when>
+							</xsl:choose>
+						</xsl:attribute>
+					</xsl:if>
+					<languageTerm authority="iso639-2b" type="code">
+						<xsl:value-of select="$currentLanguage"/>
+					</languageTerm>
+				</language>
+				<xsl:call-template name="isoLanguage">
+					<xsl:with-param name="currentLanguage">
+						<xsl:value-of select="substring($remainingLanguages,1,3)"/>
+					</xsl:with-param>
+					<xsl:with-param name="usedLanguages">
+						<xsl:value-of select="concat($usedLanguages,$currentLanguage)"/>
+					</xsl:with-param>
+					<xsl:with-param name="remainingLanguages">
+						<xsl:value-of
+							select="substring($remainingLanguages,4,string-length($remainingLanguages))"
+						/>
+					</xsl:with-param>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:call-template name="isoLanguage">
+					<xsl:with-param name="currentLanguage">
+						<xsl:value-of select="substring($remainingLanguages,1,3)"/>
+					</xsl:with-param>
+					<xsl:with-param name="usedLanguages">
+						<xsl:value-of select="concat($usedLanguages,$currentLanguage)"/>
+					</xsl:with-param>
+					<xsl:with-param name="remainingLanguages">
+						<xsl:value-of
+							select="substring($remainingLanguages,4,string-length($remainingLanguages))"
+						/>
+					</xsl:with-param>
+				</xsl:call-template>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+	<xsl:template name="chopBrackets">
+		<xsl:param name="chopString"/>
+		<xsl:variable name="string">
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString" select="$chopString"/>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:if test="substring($string, 1,1)='['">
+			<xsl:value-of select="substring($string,2, string-length($string)-2)"/>
+		</xsl:if>
+		<xsl:if test="substring($string, 1,1)!='['">
+			<xsl:value-of select="$string"/>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="rfcLanguages">
+		<xsl:param name="nodeNum"/>
+		<xsl:param name="usedLanguages"/>
+		<xsl:param name="controlField008-35-37"/>
+		<xsl:variable name="currentLanguage" select="."/>
+		<xsl:choose>
+			<xsl:when test="not($currentLanguage)"/>
+			<xsl:when
+				test="$currentLanguage!=$controlField008-35-37 and $currentLanguage!='rfc3066'">
+				<xsl:if test="not(contains($usedLanguages,$currentLanguage))">
+					<language>
+						<xsl:if test="@code!='a'">
+							<xsl:attribute name="objectPart">
+								<xsl:choose>
+									<xsl:when test="@code='b'">summary or subtitle</xsl:when>
+									<xsl:when test="@code='d'">sung or spoken text</xsl:when>
+									<xsl:when test="@code='e'">libretto</xsl:when>
+									<xsl:when test="@code='f'">table of contents</xsl:when>
+									<xsl:when test="@code='g'">accompanying material</xsl:when>
+									<xsl:when test="@code='h'">translation</xsl:when>
+								</xsl:choose>
+							</xsl:attribute>
+						</xsl:if>
+						<languageTerm authority="rfc3066" type="code">
+							<xsl:value-of select="$currentLanguage"/>
+						</languageTerm>
+					</language>
+				</xsl:if>
+			</xsl:when>
+			<xsl:otherwise> </xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+    <xsl:template name="datafield">
+		<xsl:param name="tag"/>
+		<xsl:param name="ind1">
+			<xsl:text> </xsl:text>
+		</xsl:param>
+		<xsl:param name="ind2">
+			<xsl:text> </xsl:text>
+		</xsl:param>
+		<xsl:param name="subfields"/>
+		<xsl:element name="marc:datafield">
+			<xsl:attribute name="tag">
+				<xsl:value-of select="$tag"/>
+			</xsl:attribute>
+			<xsl:attribute name="ind1">
+				<xsl:value-of select="$ind1"/>
+			</xsl:attribute>
+			<xsl:attribute name="ind2">
+				<xsl:value-of select="$ind2"/>
+			</xsl:attribute>
+			<xsl:copy-of select="$subfields"/>
+		</xsl:element>
+	</xsl:template>
+
+	<xsl:template name="subfieldSelect">
+		<xsl:param name="codes">abcdefghijklmnopqrstuvwxyz</xsl:param>
+		<xsl:param name="delimeter">
+			<xsl:text> </xsl:text>
+		</xsl:param>
+		<xsl:variable name="str">
+			<xsl:for-each select="marc:subfield">
+				<xsl:if test="contains($codes, @code)">
+					<xsl:value-of select="text()"/>
+					<xsl:value-of select="$delimeter"/>
+				</xsl:if>
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
+	</xsl:template>
+
+	<xsl:template name="buildSpaces">
+		<xsl:param name="spaces"/>
+		<xsl:param name="char">
+			<xsl:text> </xsl:text>
+		</xsl:param>
+		<xsl:if test="$spaces>0">
+			<xsl:value-of select="$char"/>
+			<xsl:call-template name="buildSpaces">
+				<xsl:with-param name="spaces" select="$spaces - 1"/>
+				<xsl:with-param name="char" select="$char"/>
+			</xsl:call-template>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name="chopPunctuation">
+		<xsl:param name="chopString"/>
+		<xsl:param name="punctuation">
+			<xsl:text>.:,;/ </xsl:text>
+		</xsl:param>
+		<xsl:variable name="length" select="string-length($chopString)"/>
+		<xsl:choose>
+			<xsl:when test="$length=0"/>
+			<xsl:when test="contains($punctuation, substring($chopString,$length,1))">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+					<xsl:with-param name="punctuation" select="$punctuation"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="not($chopString)"/>
+			<xsl:otherwise>
+				<xsl:value-of select="$chopString"/>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template name="chopPunctuationFront">
+		<xsl:param name="chopString"/>
+		<xsl:variable name="length" select="string-length($chopString)"/>
+		<xsl:choose>
+			<xsl:when test="$length=0"/>
+			<xsl:when test="contains('.:,;/[ ', substring($chopString,1,1))">
+				<xsl:call-template name="chopPunctuationFront">
+					<xsl:with-param name="chopString" select="substring($chopString,2,$length - 1)"
+					/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="not($chopString)"/>
+			<xsl:otherwise>
+				<xsl:value-of select="$chopString"/>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template name="chopPunctuationBack">
+		<xsl:param name="chopString"/>
+		<xsl:param name="punctuation">
+			<xsl:text>.:,;/] </xsl:text>
+		</xsl:param>
+		<xsl:variable name="length" select="string-length($chopString)"/>
+		<xsl:choose>
+			<xsl:when test="$length=0"/>
+			<xsl:when test="contains($punctuation, substring($chopString,$length,1))">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+					<xsl:with-param name="punctuation" select="$punctuation"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="not($chopString)"/>
+			<xsl:otherwise>
+				<xsl:value-of select="$chopString"/>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<!-- nate added 12/14/2007 for lccn.loc.gov: url encode ampersand, etc. -->
+	<xsl:template name="url-encode">
+
+		<xsl:param name="str"/>
+
+		<xsl:if test="$str">
+			<xsl:variable name="first-char" select="substring($str,1,1)"/>
+			<xsl:choose>
+				<xsl:when test="contains($safe,$first-char)">
+					<xsl:value-of select="$first-char"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:variable name="codepoint">
+						<xsl:choose>
+							<xsl:when test="contains($ascii,$first-char)">
+								<xsl:value-of
+									select="string-length(substring-before($ascii,$first-char)) + 32"
+								/>
+							</xsl:when>
+							<xsl:when test="contains($latin1,$first-char)">
+								<xsl:value-of
+									select="string-length(substring-before($latin1,$first-char)) + 160"/>
+								<!-- was 160 -->
+							</xsl:when>
+							<xsl:otherwise>
+								<xsl:message terminate="no">Warning: string contains a character
+									that is out of range! Substituting "?".</xsl:message>
+								<xsl:text>63</xsl:text>
+							</xsl:otherwise>
+						</xsl:choose>
+					</xsl:variable>
+					<xsl:variable name="hex-digit1"
+						select="substring($hex,floor($codepoint div 16) + 1,1)"/>
+					<xsl:variable name="hex-digit2" select="substring($hex,$codepoint mod 16 + 1,1)"/>
+					<!-- <xsl:value-of select="concat('%',$hex-digit2)"/> -->
+					<xsl:value-of select="concat('%',$hex-digit1,$hex-digit2)"/>
+				</xsl:otherwise>
+			</xsl:choose>
+			<xsl:if test="string-length($str) &gt; 1">
+				<xsl:call-template name="url-encode">
+					<xsl:with-param name="str" select="substring($str,2)"/>
+				</xsl:call-template>
+			</xsl:if>
+		</xsl:if>
+	</xsl:template>
+</xsl:stylesheet>$$ WHERE name = 'mods33';
+
+
+INSERT INTO config.global_flag (name, value, enabled, label) VALUES
+(
+    'opac.browse.warnable_regexp_per_class',
+    '{"title": "^(a|the|an)\\s"}',
+    FALSE,
+    oils_i18n_gettext(
+        'opac.browse.warnable_regexp_per_class',
+        'Map of search classes to regular expressions to warn user about leading articles.',
+        'cgf',
+        'label'
+    )
+),
+(
+    'opac.browse.holdings_visibility_test_limit',
+    '100',
+    TRUE,
+    oils_i18n_gettext(
+        'opac.browse.holdings_visibility_test_limit',
+        'Don''t look for more than this number of records with holdings when displaying browse headings with visible record counts.',
+        'cgf',
+        'label'
+    )
+);
+
+ALTER TABLE metabib.browse_entry DROP CONSTRAINT browse_entry_value_key;
+ALTER TABLE metabib.browse_entry ADD COLUMN sort_value TEXT;
+DELETE FROM metabib.browse_entry_def_map; -- Yeah.
+DELETE FROM metabib.browse_entry WHERE sort_value IS NULL;
+ALTER TABLE metabib.browse_entry ALTER COLUMN sort_value SET NOT NULL;
+ALTER TABLE metabib.browse_entry ADD UNIQUE (sort_value, value);
+DROP TRIGGER IF EXISTS mbe_sort_value ON metabib.browse_entry;
+
+CREATE INDEX browse_entry_sort_value_idx
+    ON metabib.browse_entry USING BTREE (sort_value);
+
+-- NOTE If I understand ordered indices correctly, an index on sort_value DESC
+-- is not actually needed, even though we do have a query that does ORDER BY
+-- on this column in that direction.  The previous index serves for both
+-- directions, and ordering in an index is only helpful for multi-column
+-- indices, I think. See http://www.postgresql.org/docs/9.1/static/indexes-ordering.html
+
+-- CREATE INDEX CONCURRENTLY browse_entry_sort_value_idx_desc
+--     ON metabib.browse_entry USING BTREE (sort_value DESC);
+
+CREATE TYPE metabib.flat_browse_entry_appearance AS (
+    browse_entry    BIGINT,
+    value           TEXT,
+    fields          TEXT,
+    authorities     TEXT,
+    sources         INT,        -- visible ones, that is
+    row_number      INT,        -- internal use, sort of
+    accurate        BOOL,       -- Count in sources field is accurate? Not
+                                -- if we had more than a browse superpage
+                                -- of records to look at.
+    pivot_point     BIGINT
+);
+
+
+CREATE OR REPLACE FUNCTION metabib.browse_pivot(
+    search_field        INT[],
+    browse_term         TEXT
+) RETURNS BIGINT AS $p$
+DECLARE
+    id                  BIGINT;
+BEGIN
+    SELECT INTO id mbe.id FROM metabib.browse_entry mbe
+        JOIN metabib.browse_entry_def_map mbedm ON (
+            mbedm.entry = mbe.id AND
+            mbedm.def = ANY(search_field)
+        )
+        WHERE mbe.sort_value >= public.search_normalize(browse_term)
+        ORDER BY mbe.sort_value, mbe.value LIMIT 1;
+
+    RETURN id;
+END;
+$p$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION metabib.staged_browse(
+    query                   TEXT,
+    fields                  INT[],
+    context_org             INT,
+    context_locations       INT[],
+    staff                   BOOL,
+    browse_superpage_size   INT,
+    count_up_from_zero      BOOL,   -- if false, count down from -1
+    result_limit            INT,
+    next_pivot_pos          INT
+) RETURNS SETOF metabib.flat_browse_entry_appearance AS $p$
+DECLARE
+    curs                    REFCURSOR;
+    rec                     RECORD;
+    qpfts_query             TEXT;
+    result_row              metabib.flat_browse_entry_appearance%ROWTYPE;
+    results_skipped         INT := 0;
+    row_counter             INT := 0;
+    row_number              INT;
+    slice_start             INT;
+    slice_end               INT;
+    full_end                INT;
+    all_records             BIGINT[];
+    superpage_of_records    BIGINT[];
+    superpage_size          INT;
+BEGIN
+    IF count_up_from_zero THEN
+        row_number := 0;
+    ELSE
+        row_number := -1;
+    END IF;
+
+    OPEN curs FOR EXECUTE query;
+
+    LOOP
+        FETCH curs INTO rec;
+        IF NOT FOUND THEN
+            IF result_row.pivot_point IS NOT NULL THEN
+                RETURN NEXT result_row;
+            END IF;
+            RETURN;
+        END IF;
+
+        -- Gather aggregate data based on the MBE row we're looking at now
+        SELECT INTO all_records, result_row.authorities, result_row.fields
+                ARRAY_AGG(DISTINCT source),
+                ARRAY_TO_STRING(ARRAY_AGG(DISTINCT authority), $$,$$),
+                ARRAY_TO_STRING(ARRAY_AGG(DISTINCT def), $$,$$)
+          FROM  metabib.browse_entry_def_map
+          WHERE entry = rec.id
+                AND def = ANY(fields);
+
+        result_row.sources := 0;
+
+        full_end := ARRAY_LENGTH(all_records, 1);
+        superpage_size := COALESCE(browse_superpage_size, full_end);
+        slice_start := 1;
+        slice_end := superpage_size;
+
+        WHILE result_row.sources = 0 AND slice_start <= full_end LOOP
+            superpage_of_records := all_records[slice_start:slice_end];
+            qpfts_query :=
+                'SELECT NULL::BIGINT AS id, ARRAY[r] AS records, ' ||
+                '1::INT AS rel FROM (SELECT UNNEST(' ||
+                quote_literal(superpage_of_records) || '::BIGINT[]) AS r) rr';
+
+            -- We use search.query_parser_fts() for visibility testing.
+            -- We're calling it once per browse-superpage worth of records
+            -- out of the set of records related to a given mbe, until we've
+            -- either exhausted that set of records or found at least 1
+            -- visible record.
+
+            SELECT INTO result_row.sources visible
+                FROM search.query_parser_fts(
+                    context_org, NULL, qpfts_query, NULL,
+                    context_locations, 0, NULL, NULL, FALSE, staff, FALSE
+                ) qpfts
+                WHERE qpfts.rel IS NULL;
+
+            slice_start := slice_start + superpage_size;
+            slice_end := slice_end + superpage_size;
+        END LOOP;
+
+        -- Accurate?  Well, probably.
+        result_row.accurate := browse_superpage_size IS NULL OR
+            browse_superpage_size >= full_end;
+
+        IF result_row.sources > 0 THEN
+            -- We've got a browse entry with visible holdings. Yay.
+
+
+            -- The function that calls this function needs row_number in order
+            -- to correctly order results from two different runs of this
+            -- functions.
+            result_row.row_number := row_number;
+
+            -- Now, if row_counter is still less than limit, return a row.  If
+            -- not, but it is less than next_pivot_pos, continue on without
+            -- returning actual result rows until we find
+            -- that next pivot, and return it.
+
+            IF row_counter < result_limit THEN
+                result_row.browse_entry := rec.id;
+                result_row.value := rec.value;
+
+                RETURN NEXT result_row;
+            ELSE
+                result_row.browse_entry := NULL;
+                result_row.authorities := NULL;
+                result_row.fields := NULL;
+                result_row.value := NULL;
+                result_row.sources := NULL;
+                result_row.accurate := NULL;
+                result_row.pivot_point := rec.id;
+
+                IF row_counter >= next_pivot_pos THEN
+                    RETURN NEXT result_row;
+                    RETURN;
+                END IF;
+            END IF;
+
+            IF count_up_from_zero THEN
+                row_number := row_number + 1;
+            ELSE
+                row_number := row_number - 1;
+            END IF;
+
+            -- row_counter is different from row_number.
+            -- It simply counts up from zero so that we know when
+            -- we've reached our limit.
+            row_counter := row_counter + 1;
+        END IF;
+    END LOOP;
+END;
+$p$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION metabib.browse(
+    search_field            INT[],
+    browse_term             TEXT,
+    context_org             INT DEFAULT NULL,
+    context_loc_group       INT DEFAULT NULL,
+    staff                   BOOL DEFAULT FALSE,
+    pivot_id                BIGINT DEFAULT NULL,
+    result_limit            INT DEFAULT 10
+) RETURNS SETOF metabib.flat_browse_entry_appearance AS $p$
+DECLARE
+    core_query              TEXT;
+    back_query              TEXT;
+    forward_query           TEXT;
+    pivot_sort_value        TEXT;
+    pivot_sort_fallback     TEXT;
+    context_locations       INT[];
+    browse_superpage_size   INT;
+    results_skipped         INT := 0;
+    back_limit              INT;
+    back_to_pivot           INT;
+    forward_limit           INT;
+    forward_to_pivot        INT;
+BEGIN
+    -- First, find the pivot if we were given a browse term but not a pivot.
+    IF pivot_id IS NULL THEN
+        pivot_id := metabib.browse_pivot(search_field, browse_term);
+    END IF;
+
+    SELECT INTO pivot_sort_value, pivot_sort_fallback
+        sort_value, value FROM metabib.browse_entry WHERE id = pivot_id;
+
+    -- Bail if we couldn't find a pivot.
+    IF pivot_sort_value IS NULL THEN
+        RETURN;
+    END IF;
+
+    -- Transform the context_loc_group argument (if any) (logc at the
+    -- TPAC layer) into a form we'll be able to use.
+    IF context_loc_group IS NOT NULL THEN
+        SELECT INTO context_locations ARRAY_AGG(location)
+            FROM asset.copy_location_group_map
+            WHERE lgroup = context_loc_group;
+    END IF;
+
+    -- Get the configured size of browse superpages.
+    SELECT INTO browse_superpage_size value     -- NULL ok
+        FROM config.global_flag
+        WHERE enabled AND name = 'opac.browse.holdings_visibility_test_limit';
+
+    -- First we're going to search backward from the pivot, then we're going
+    -- to search forward.  In each direction, we need two limits.  At the
+    -- lesser of the two limits, we delineate the edge of the result set
+    -- we're going to return.  At the greater of the two limits, we find the
+    -- pivot value that would represent an offset from the current pivot
+    -- at a distance of one "page" in either direction, where a "page" is a
+    -- result set of the size specified in the "result_limit" argument.
+    --
+    -- The two limits in each direction make four derived values in total,
+    -- and we calculate them now.
+    back_limit := CEIL(result_limit::FLOAT / 2);
+    back_to_pivot := result_limit;
+    forward_limit := result_limit / 2;
+    forward_to_pivot := result_limit - 1;
+
+    -- This is the meat of the SQL query that finds browse entries.  We'll
+    -- pass this to a function which uses it with a cursor, so that individual
+    -- rows may be fetched in a loop until some condition is satisfied, without
+    -- waiting for a result set of fixed size to be collected all at once.
+    core_query := '
+    SELECT
+        mbe.id,
+        mbe.value,
+        mbe.sort_value
+    FROM metabib.browse_entry mbe
+    WHERE EXISTS (SELECT 1 FROM  metabib.browse_entry_def_map mbedm WHERE
+        mbedm.entry = mbe.id AND
+        mbedm.def = ANY(' || quote_literal(search_field) || ')
+    ) AND ';
+
+    -- This is the variant of the query for browsing backward.
+    back_query := core_query ||
+        ' mbe.sort_value <= ' || quote_literal(pivot_sort_value) ||
+    ' ORDER BY mbe.sort_value DESC, mbe.value DESC ';
+
+    -- This variant browses forward.
+    forward_query := core_query ||
+        ' mbe.sort_value > ' || quote_literal(pivot_sort_value) ||
+    ' ORDER BY mbe.sort_value, mbe.value ';
+
+    -- We now call the function which applies a cursor to the provided
+    -- queries, stopping at the appropriate limits and also giving us
+    -- the next page's pivot.
+    RETURN QUERY
+        SELECT * FROM metabib.staged_browse(
+            back_query, search_field, context_org, context_locations,
+            staff, browse_superpage_size, TRUE, back_limit, back_to_pivot
+        ) UNION
+        SELECT * FROM metabib.staged_browse(
+            forward_query, search_field, context_org, context_locations,
+            staff, browse_superpage_size, FALSE, forward_limit, forward_to_pivot
+        ) ORDER BY row_number DESC;
+
+END;
+$p$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION metabib.browse(
+    search_class        TEXT,
+    browse_term         TEXT,
+    context_org         INT DEFAULT NULL,
+    context_loc_group   INT DEFAULT NULL,
+    staff               BOOL DEFAULT FALSE,
+    pivot_id            BIGINT DEFAULT NULL,
+    result_limit        INT DEFAULT 10
+) RETURNS SETOF metabib.flat_browse_entry_appearance AS $p$
+BEGIN
+    RETURN QUERY SELECT * FROM metabib.browse(
+        (SELECT COALESCE(ARRAY_AGG(id), ARRAY[]::INT[])
+            FROM config.metabib_field WHERE field_class = search_class),
+        browse_term,
+        context_org,
+        context_loc_group,
+        staff,
+        pivot_id,
+        result_limit
+    );
+END;
+$p$ LANGUAGE PLPGSQL;
+
+UPDATE config.metabib_field
+SET
+    xpath = $$//mods32:mods/mods32:relatedItem[@type="series"]/mods32:titleInfo[@type="nfi"]$$,
+    browse_sort_xpath = $$*[local-name() != "nonSort"]$$,
+    browse_xpath = NULL
+WHERE
+    field_class = 'series' AND name = 'seriestitle' ;
+
+UPDATE config.metabib_field
+SET
+    xpath = $$//mods32:mods/mods32:titleInfo[mods32:title and not (@type)]$$,
+    browse_sort_xpath = $$*[local-name() != "nonSort"]$$,
+    browse_xpath = NULL,
+    browse_field = TRUE
+WHERE
+    field_class = 'title' AND name = 'proper' ;
+
+UPDATE config.metabib_field
+SET
+    xpath = $$//mods32:mods/mods32:titleInfo[mods32:title and (@type='alternative-nfi')]$$,
+    browse_sort_xpath = $$*[local-name() != "nonSort"]$$,
+    browse_xpath = NULL
+WHERE
+    field_class = 'title' AND name = 'alternative' ;
+
+UPDATE config.metabib_field
+SET
+    xpath = $$//mods32:mods/mods32:titleInfo[mods32:title and (@type='uniform-nfi')]$$,
+    browse_sort_xpath = $$*[local-name() != "nonSort"]$$,
+    browse_xpath = NULL
+WHERE
+    field_class = 'title' AND name = 'uniform' ;
+
+UPDATE config.metabib_field
+SET
+    xpath = $$//mods32:mods/mods32:titleInfo[mods32:title and (@type='translated-nfi')]$$,
+    browse_sort_xpath = $$*[local-name() != "nonSort"]$$,
+    browse_xpath = NULL
+WHERE
+    field_class = 'title' AND name = 'translated' ;
+
+-- This keeps extra terms like "creator" out of browse headings.
+UPDATE config.metabib_field
+    SET browse_xpath = $$//*[local-name()='namePart']$$     -- vim */
+    WHERE
+        browse_field AND
+        browse_xpath IS NULL AND
+        field_class = 'author';
+
+INSERT INTO config.org_unit_setting_type (
+    name, label, grp, description, datatype
+) VALUES (
+    'opac.browse.pager_shortcuts',
+    'Paging shortcut links for OPAC Browse',
+    'opac',
+    'The characters in this string, in order, will be used as shortcut links for quick paging in the OPAC browse interface. Any sequence surrounded by asterisks will be taken as a whole label, not split into individual labels at the character level, but only the first character will serve as the basis of the search.',
+    'string'
+);
+
+
+-- NOTE: very IDs are still correct for perms and event_def data at merge.
+
+SELECT evergreen.upgrade_deps_block_check('0817', :eg_version);
+
+-- copy status
+
+INSERT INTO config.copy_status
+    (id, name, holdable, opac_visible, copy_active, restrict_copy_delete)
+    VALUES (16, oils_i18n_gettext(16, 'Long Overdue', 'ccs', 'name'), 'f', 'f', 'f', 't');
+
+-- checkin override perm
+
+INSERT INTO permission.perm_list (id, code, description) VALUES (
+    549, -- VERIFY
+    'COPY_STATUS_LONGOVERDUE.override',
+    oils_i18n_gettext(
+        549, -- VERIFY
+        'Allows the user to check-in long-overdue items, prompting ' ||
+            'long-overdue check-in processing',
+        'ppl',
+        'code'
+    )
+), (
+    550, -- VERIFY
+    'SET_CIRC_LONG_OVERDUE',
+    oils_i18n_gettext(
+        550, -- VERIFY
+        'Allows the user to mark a circulation as long-overdue',
+        'ppl',
+        'code'
+    )
+);
+
+-- billing types
+
+INSERT INTO config.billing_type (id, owner, name) VALUES
+    (10, 1, oils_i18n_gettext(
+        10, 'Long-Overdue Materials', 'cbt', 'name')),
+    (11, 1, oils_i18n_gettext(
+        11, 'Long-Overdue Materials Processing Fee', 'cbt', 'name'));
+
+-- org settings
+
+INSERT INTO config.org_unit_setting_type 
+    (name, grp, datatype, label, description) VALUES 
+(
+    'circ.longoverdue_immediately_available',
+    'circ', 'bool',
+    oils_i18n_gettext(
+        'circ.longoverdue_immediately_available',
+        'Long-Overdue Items Usable on Checkin',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'circ.longoverdue_immediately_available',
+        'Long-overdue items are usable on checkin instead of going "home" first',
+        'coust',
+        'description'
+    )
+), (
+    'circ.longoverdue_materials_processing_fee',
+    'finance', 'currency',
+    oils_i18n_gettext(
+        'circ.longoverdue_materials_processing_fee',
+        'Long-Overdue Materials Processing Fee',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'circ.longoverdue_materials_processing_fee',
+        'Long-Overdue Materials Processing Fee',
+        'coust',
+        'description'
+    )
+), (
+    'circ.max_accept_return_of_longoverdue',
+    'circ', 'interval',
+    oils_i18n_gettext(
+        'circ.max_accept_return_of_longoverdue',
+        'Long-Overdue Max Return Interval',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'circ.max_accept_return_of_longoverdue',
+        'Long-overdue check-in processing (voiding fees, re-instating ' ||
+            'overdues, etc.) will not take place for items that have been ' ||
+            'overdue for (or have last activity older than) this amount of time',
+        'coust',
+        'description'
+    )
+), (
+    'circ.restore_overdue_on_longoverdue_return',
+    'circ', 'bool',
+    oils_i18n_gettext(
+        'circ.restore_overdue_on_longoverdue_return',
+        'Restore Overdues on Long-Overdue Item Return',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'circ.restore_overdue_on_longoverdue_return',
+        'Restore Overdues on Long-Overdue Item Return',
+        'coust',
+        'description'
+    )
+), (
+    'circ.void_longoverdue_on_checkin',
+    'circ', 'bool',
+    oils_i18n_gettext(
+        'circ.void_longoverdue_on_checkin',
+        'Void Long-Overdue Item Billing When Returned',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'circ.void_longoverdue_on_checkin',
+        'Void Long-Overdue Item Billing When Returned',
+        'coust',
+        'description'
+    )
+), (
+    'circ.void_longoverdue_proc_fee_on_checkin',
+    'circ', 'bool',
+    oils_i18n_gettext(
+        'circ.void_longoverdue_proc_fee_on_checkin',
+        'Void Processing Fee on Long-Overdue Item Return',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'circ.void_longoverdue_proc_fee_on_checkin',
+        'Void Processing Fee on Long-Overdue Item Return',
+        'coust',
+        'description'
+    )
+), (
+    'circ.void_overdue_on_longoverdue',
+    'finance', 'bool',
+    oils_i18n_gettext(
+        'circ.void_overdue_on_longoverdue',
+        'Void Overdue Fines When Items are Marked Long-Overdue',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'circ.void_overdue_on_longoverdue',
+        'Void Overdue Fines When Items are Marked Long-Overdue',
+        'coust',
+        'description'
+    )
+), (
+    'circ.longoverdue.xact_open_on_zero',
+    'finance', 'bool',
+    oils_i18n_gettext(
+        'circ.longoverdue.xact_open_on_zero',
+        'Leave transaction open when long overdue balance equals zero',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'circ.longoverdue.xact_open_on_zero',
+        'Leave transaction open when long-overdue balance equals zero.  ' ||
+            'This leaves the lost copy on the patron record when it is paid',
+        'coust',
+        'description'
+    )
+), (
+    'circ.longoverdue.use_last_activity_date_on_return',
+    'circ', 'bool',
+    oils_i18n_gettext(
+        'circ.longoverdue.use_last_activity_date_on_return',
+        'Long-Overdue Check-In Interval Uses Last Activity Date',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'circ.longoverdue.use_last_activity_date_on_return',
+        'Use the long-overdue last-activity date instead of the due_date to ' ||
+            'determine whether the item has been checked out too long to ' ||
+            'perform long-overdue check-in processing.  If set, the system ' ||
+            'will first check the last payment time, followed by the last ' ||
+            'billing time, followed by the due date.  See also ' ||
+            'circ.max_accept_return_of_longoverdue',
+        'coust',
+        'description'
+    )
+);
+
+-- mark long-overdue reactor
+
+INSERT INTO action_trigger.reactor (module, description) VALUES
+(   'MarkItemLongOverdue',
+    oils_i18n_gettext(
+        'MarkItemLongOverdue',
+        'Marks a circulating item as long-overdue and applies configured ' ||
+        'penalties.  Also creates events for the longoverdue.auto hook',
+        'atreact',
+        'description'
+    )
+);
+
+INSERT INTO action_trigger.validator (module, description) VALUES (
+    'PatronNotInCollections', 
+    'Event is valid if the linked patron is not in collections processing ' ||
+        'at the context org unit'
+);
+
+-- VERIFY ID
+INSERT INTO action_trigger.event_definition 
+    (id, active, owner, name, hook, validator, reactor, delay, delay_field) 
+VALUES ( 
+    49, FALSE, 1, '6 Month Overdue Mark Long-Overdue', 
+    'checkout.due', 'PatronNotInCollections', 
+    'MarkItemLongOverdue', '6 months', 'due_date'
+);
+
+-- VERIFY ID
+INSERT INTO action_trigger.event_params (event_def, param, value) VALUES
+    (49, 'editor', '''1'''); 
+
+-- new longoverdue and longervdue.auto hook.
+
+INSERT INTO action_trigger.hook (key,core_type,description) VALUES (
+    'longoverdue',
+    'circ',
+    'Circulating Item marked long-overdue'
+);
+
+INSERT INTO action_trigger.hook (key,core_type,description) VALUES (
+    'longoverdue.auto',
+    'circ',
+    'Circulating Item automatically marked long-overdue'
+);
+
+-- sample longoverdue.auto notification reactor
+
+-- VERIFY ID
+INSERT INTO action_trigger.event_definition 
+    (id, active, owner, name, hook, validator, reactor, group_field, template) 
+    VALUES ( 
+        50, FALSE, 1, '6 Month Long Overdue Notice', 
+        'longoverdue.auto', 'NOOP_True', 'SendEmail', 'usr',
+$$
+[%- USE date -%]
+[%- user = target.0.usr -%]
+To: [%- params.recipient_email || user.email %]
+From: [%- params.sender_email || default_sender %]
+Subject: Overdue Items Marked Long Overdue
+
+Dear [% user.family_name %], [% user.first_given_name %]
+The following items are 6 months overdue and have been marked Long Overdue.
+
+[% FOR circ IN target %]
+    [%- copy_details = helpers.get_copy_bib_basics(circ.target_copy.id) -%]
+    Title: [% copy_details.title %], by [% copy_details.author %]
+    Call Number: [% circ.target_copy.call_number.label %]
+    Shelving Location: [% circ.target_copy.location.name %]
+    Barcode: [% circ.target_copy.barcode %]
+    Due: [% date.format(helpers.format_date(circ.due_date), '%Y-%m-%d') %]
+    Item Cost: [% helpers.get_copy_price(circ.target_copy) %]
+    Total Owed For Transaction: [% circ.billable_transaction.summary.balance_owed %]
+    Library: [% circ.circ_lib.name %]
+
+[% END %]
+$$);
+
+-- ENV for above
+
+-- VERIFY IDs
+INSERT INTO action_trigger.environment (event_def, path) VALUES 
+    (50, 'target_copy.call_number'),
+    (50, 'usr'),
+    (50, 'billable_transaction.summary'),
+    (50, 'circ_lib.billing_address'),
+    (50, 'target_copy.location');
+
+
+--ROLLBACK;
+
+SELECT evergreen.upgrade_deps_block_check('0822', :eg_version);
+
+ALTER TABLE action.hold_request 
+    ADD COLUMN behind_desk BOOLEAN NOT NULL DEFAULT FALSE;
+
+-- The value on the hold is the new arbiter of whether a 
+-- hold should be held behind the desk and reported as such
+-- Update existing holds that would in the current regime
+-- be considered behind-the-desk holds to use the new column
+
+UPDATE action.hold_request ahr
+    SET behind_desk = TRUE
+    FROM actor.usr_setting aus
+    WHERE 
+        ahr.cancel_time IS NULL AND
+        ahr.fulfillment_time IS NULL AND
+        aus.usr = ahr.usr AND
+        aus.name = 'circ.holds_behind_desk' AND
+        aus.value = 'true' AND
+        EXISTS (
+            SELECT 1 
+            FROM actor.org_unit_ancestor_setting(
+                'circ.holds.behind_desk_pickup_supported', 
+                ahr.pickup_lib
+            ) 
+            WHERE value = 'true'
+        );
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0823', :eg_version);
+
+-- Track the requesting user
+ALTER TABLE staging.user_stage
+    ADD COLUMN requesting_usr INTEGER 
+        REFERENCES actor.usr(id) ON DELETE SET NULL;
+
+-- add county column to staged address tables and 
+-- drop state requirement to match actor.usr_address
+ALTER TABLE staging.mailing_address_stage 
+    ADD COLUMN county TEXT,
+    ALTER COLUMN state DROP DEFAULT,
+    ALTER COLUMN state DROP NOT NULL;
+
+ALTER TABLE staging.billing_address_stage 
+    ADD COLUMN county TEXT,
+    ALTER COLUMN state DROP DEFAULT,
+    ALTER COLUMN state DROP NOT NULL;
+
+-- stored procedure for deleting expired pending patrons
+CREATE OR REPLACE FUNCTION staging.purge_pending_users() RETURNS VOID AS $$
+DECLARE
+    org_id INT;
+    intvl TEXT;
+BEGIN
+    FOR org_id IN SELECT DISTINCT(home_ou) FROM staging.user_stage LOOP
+
+        SELECT INTO intvl value FROM 
+            actor.org_unit_ancestor_setting(
+                'opac.pending_user_expire_interval', org_id);
+
+        CONTINUE WHEN intvl IS NULL OR intvl ILIKE 'null';
+
+        -- de-JSON-ify the string
+        SELECT INTO intvl TRIM(BOTH '"' FROM intvl);
+
+        DELETE FROM staging.user_stage 
+            WHERE home_ou = org_id AND row_date + intvl::INTERVAL < NOW();
+
+    END LOOP;
+END;
+$$ LANGUAGE PLPGSQL;
+
+
+INSERT INTO config.org_unit_setting_type
+    (name, grp, datatype, label, description)
+VALUES (
+    'opac.allow_pending_user',
+    'opac',
+    'bool',
+    oils_i18n_gettext(
+        'opac.allow_pending_user',
+        'Allow Patron Self-Registration',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'opac.allow_pending_user',
+        'Allow patrons to self-register, creating pending user accounts',
+        'coust',
+        'description'
+    )
+), (
+    'opac.pending_user_expire_interval',
+    'opac',
+    'interval',
+    oils_i18n_gettext(
+        'opac.pending_user_expire_interval',
+        'Patron Self-Reg. Expire Interval',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'opac.pending_user_expire_interval',
+        'If set, this is the amount of time a pending user account will ' ||
+        'be allowed to sit in the database.  After this time, the pending ' ||
+        'user information will be purged',
+        'coust',
+        'description'
+    )
+), (
+    'ui.patron.edit.aua.county.show',
+    'gui',
+    'bool',
+    oils_i18n_gettext(
+        'ui.patron.edit.aua.county.require',
+        'Show county field on patron registration',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'ui.patron.edit.aua.county.require',
+        'The county field will be shown on the patron registration screen',
+        'coust',
+        'description'
+    )
+);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0824', :eg_version);
+
+INSERT INTO config.org_unit_setting_type
+    (grp, name, label, description, datatype, fm_class)
+VALUES (
+    'vandelay',
+    'vandelay.item.barcode.auto',
+    oils_i18n_gettext(
+        'vandelay.item.barcode.auto',
+        'Vandelay Generate Default Barcodes',
+        'coust', 'label'),
+    oils_i18n_gettext(
+        'vandelay.item.barcode.auto',
+        'Auto-generate deault item barcodes when no item barcode is present',
+        'coust', 'label'),
+    'bool',
+    NULL
+), (
+    'vandelay',
+    'vandelay.item.barcode.prefix',
+    oils_i18n_gettext(
+        'vandelay.item.barcode.prefix',
+        'Vandelay Default Barcode Prefix',
+        'coust', 'label'),
+    oils_i18n_gettext(
+        'vandelay.item.barcode.prefix',
+        'Apply this prefix to any auto-generated item barcodes',
+        'coust', 'label'),
+    'string',
+    NULL
+), (
+    'vandelay',
+    'vandelay.item.call_number.auto',
+    oils_i18n_gettext(
+        'vandelay.item.call_number.auto',
+        'Vandelay Generate Default Call Numbers',
+        'coust', 'label'),
+    oils_i18n_gettext(
+        'vandelay.item.call_number.auto',
+        'Auto-generate default item call numbers when no item call number is present',
+        'coust', 'label'),
+    'bool',
+    NULL
+), (
+    'vandelay',
+    'vandelay.item.call_number.prefix',
+    oils_i18n_gettext(
+        'vandelay.item.call_number.prefix',
+        'Vandelay Default Call Number Prefix',
+        'coust', 'label'),
+    oils_i18n_gettext(
+        'vandelay.item.call_number.prefix',
+        'Apply this prefix to any auto-generated item call numbers',
+        'coust', 'label'),
+    'string',
+    NULL
+), (
+    'vandelay',
+    'vandelay.item.copy_location.default',
+    oils_i18n_gettext(
+        'vandelay.item.copy_location.default',
+        'Vandelay Default Copy Location',
+        'coust', 'label'),
+    oils_i18n_gettext(
+        'vandelay.item.copy_location.default',
+        'Default copy location value for imported items',
+        'coust', 'label'),
+    'link',
+    'acpl'
+), (
+    'vandelay',
+    'vandelay.item.circ_modifier.default',
+    oils_i18n_gettext(
+        'vandelay.item.circ_modifier.default',
+        'Vandelay Default Circulation Modifier',
+        'coust', 'label'),
+    oils_i18n_gettext(
+        'vandelay.item.circ_modifier.default',
+        'Default circulation modifier value for imported items',
+        'coust', 'label'),
+    'link',
+    'ccm'
+);
+
+
+CREATE OR REPLACE FUNCTION vandelay.ingest_items ( import_id BIGINT, attr_def_id BIGINT ) RETURNS SETOF vandelay.import_item AS $$
+DECLARE
+
+    owning_lib      TEXT;
+    circ_lib        TEXT;
+    call_number     TEXT;
+    copy_number     TEXT;
+    status          TEXT;
+    location        TEXT;
+    circulate       TEXT;
+    deposit         TEXT;
+    deposit_amount  TEXT;
+    ref             TEXT;
+    holdable        TEXT;
+    price           TEXT;
+    barcode         TEXT;
+    circ_modifier   TEXT;
+    circ_as_type    TEXT;
+    alert_message   TEXT;
+    opac_visible    TEXT;
+    pub_note        TEXT;
+    priv_note       TEXT;
+    internal_id     TEXT;
+
+    attr_def        RECORD;
+    tmp_attr_set    RECORD;
+    attr_set        vandelay.import_item%ROWTYPE;
+
+    xpath           TEXT;
+    tmp_str         TEXT;
+
+BEGIN
+
+    SELECT * INTO attr_def FROM vandelay.import_item_attr_definition WHERE id = attr_def_id;
+
+    IF FOUND THEN
+
+        attr_set.definition := attr_def.id;
+
+        -- Build the combined XPath
+
+        owning_lib :=
+            CASE
+                WHEN attr_def.owning_lib IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.owning_lib ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.owning_lib || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.owning_lib
+            END;
+
+        circ_lib :=
+            CASE
+                WHEN attr_def.circ_lib IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.circ_lib ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.circ_lib || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.circ_lib
+            END;
+
+        call_number :=
+            CASE
+                WHEN attr_def.call_number IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.call_number ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.call_number || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.call_number
+            END;
+
+        copy_number :=
+            CASE
+                WHEN attr_def.copy_number IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.copy_number ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.copy_number || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.copy_number
+            END;
+
+        status :=
+            CASE
+                WHEN attr_def.status IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.status ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.status || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.status
+            END;
+
+        location :=
+            CASE
+                WHEN attr_def.location IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.location ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.location || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.location
+            END;
+
+        circulate :=
+            CASE
+                WHEN attr_def.circulate IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.circulate ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.circulate || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.circulate
+            END;
+
+        deposit :=
+            CASE
+                WHEN attr_def.deposit IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.deposit ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.deposit || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.deposit
+            END;
+
+        deposit_amount :=
+            CASE
+                WHEN attr_def.deposit_amount IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.deposit_amount ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.deposit_amount || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.deposit_amount
+            END;
+
+        ref :=
+            CASE
+                WHEN attr_def.ref IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.ref ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.ref || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.ref
+            END;
+
+        holdable :=
+            CASE
+                WHEN attr_def.holdable IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.holdable ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.holdable || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.holdable
+            END;
+
+        price :=
+            CASE
+                WHEN attr_def.price IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.price ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.price || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.price
+            END;
+
+        barcode :=
+            CASE
+                WHEN attr_def.barcode IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.barcode ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.barcode || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.barcode
+            END;
+
+        circ_modifier :=
+            CASE
+                WHEN attr_def.circ_modifier IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.circ_modifier ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.circ_modifier || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.circ_modifier
+            END;
+
+        circ_as_type :=
+            CASE
+                WHEN attr_def.circ_as_type IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.circ_as_type ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.circ_as_type || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.circ_as_type
+            END;
+
+        alert_message :=
+            CASE
+                WHEN attr_def.alert_message IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.alert_message ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.alert_message || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.alert_message
+            END;
+
+        opac_visible :=
+            CASE
+                WHEN attr_def.opac_visible IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.opac_visible ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.opac_visible || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.opac_visible
+            END;
+
+        pub_note :=
+            CASE
+                WHEN attr_def.pub_note IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.pub_note ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.pub_note || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.pub_note
+            END;
+        priv_note :=
+            CASE
+                WHEN attr_def.priv_note IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.priv_note ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.priv_note || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.priv_note
+            END;
+
+        internal_id :=
+            CASE
+                WHEN attr_def.internal_id IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.internal_id ) = 1 THEN '//*[@tag="' || attr_def.tag || '"]/*[@code="' || attr_def.internal_id || '"]'
+                ELSE '//*[@tag="' || attr_def.tag || '"]/*' || attr_def.internal_id
+            END;
+
+
+
+        xpath :=
+            owning_lib      || '|' ||
+            circ_lib        || '|' ||
+            call_number     || '|' ||
+            copy_number     || '|' ||
+            status          || '|' ||
+            location        || '|' ||
+            circulate       || '|' ||
+            deposit         || '|' ||
+            deposit_amount  || '|' ||
+            ref             || '|' ||
+            holdable        || '|' ||
+            price           || '|' ||
+            barcode         || '|' ||
+            circ_modifier   || '|' ||
+            circ_as_type    || '|' ||
+            alert_message   || '|' ||
+            pub_note        || '|' ||
+            priv_note       || '|' ||
+            internal_id     || '|' ||
+            opac_visible;
+
+        FOR tmp_attr_set IN
+                SELECT  *
+                  FROM  oils_xpath_table( 'id', 'marc', 'vandelay.queued_bib_record', xpath, 'id = ' || import_id )
+                            AS t( id INT, ol TEXT, clib TEXT, cn TEXT, cnum TEXT, cs TEXT, cl TEXT, circ TEXT,
+                                  dep TEXT, dep_amount TEXT, r TEXT, hold TEXT, pr TEXT, bc TEXT, circ_mod TEXT,
+                                  circ_as TEXT, amessage TEXT, note TEXT, pnote TEXT, internal_id TEXT, opac_vis TEXT )
+        LOOP
+
+            attr_set.import_error := NULL;
+            attr_set.error_detail := NULL;
+            attr_set.deposit_amount := NULL;
+            attr_set.copy_number := NULL;
+            attr_set.price := NULL;
+            attr_set.circ_modifier := NULL;
+            attr_set.location := NULL;
+            attr_set.barcode := NULL;
+            attr_set.call_number := NULL;
+
+            IF tmp_attr_set.pr != '' THEN
+                tmp_str = REGEXP_REPLACE(tmp_attr_set.pr, E'[^0-9\\.]', '', 'g');
+                IF tmp_str = '' THEN 
+                    attr_set.import_error := 'import.item.invalid.price';
+                    attr_set.error_detail := tmp_attr_set.pr; -- original value
+                    RETURN NEXT attr_set; CONTINUE; 
+                END IF;
+                attr_set.price := tmp_str::NUMERIC(8,2); 
+            END IF;
+
+            IF tmp_attr_set.dep_amount != '' THEN
+                tmp_str = REGEXP_REPLACE(tmp_attr_set.dep_amount, E'[^0-9\\.]', '', 'g');
+                IF tmp_str = '' THEN 
+                    attr_set.import_error := 'import.item.invalid.deposit_amount';
+                    attr_set.error_detail := tmp_attr_set.dep_amount; 
+                    RETURN NEXT attr_set; CONTINUE; 
+                END IF;
+                attr_set.deposit_amount := tmp_str::NUMERIC(8,2); 
+            END IF;
+
+            IF tmp_attr_set.cnum != '' THEN
+                tmp_str = REGEXP_REPLACE(tmp_attr_set.cnum, E'[^0-9]', '', 'g');
+                IF tmp_str = '' THEN 
+                    attr_set.import_error := 'import.item.invalid.copy_number';
+                    attr_set.error_detail := tmp_attr_set.cnum; 
+                    RETURN NEXT attr_set; CONTINUE; 
+                END IF;
+                attr_set.copy_number := tmp_str::INT; 
+            END IF;
+
+            IF tmp_attr_set.ol != '' THEN
+                SELECT id INTO attr_set.owning_lib FROM actor.org_unit WHERE shortname = UPPER(tmp_attr_set.ol); -- INT
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.owning_lib';
+                    attr_set.error_detail := tmp_attr_set.ol;
+                    RETURN NEXT attr_set; CONTINUE; 
+                END IF;
+            END IF;
+
+            IF tmp_attr_set.clib != '' THEN
+                SELECT id INTO attr_set.circ_lib FROM actor.org_unit WHERE shortname = UPPER(tmp_attr_set.clib); -- INT
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.circ_lib';
+                    attr_set.error_detail := tmp_attr_set.clib;
+                    RETURN NEXT attr_set; CONTINUE; 
+                END IF;
+            END IF;
+
+            IF tmp_attr_set.cs != '' THEN
+                SELECT id INTO attr_set.status FROM config.copy_status WHERE LOWER(name) = LOWER(tmp_attr_set.cs); -- INT
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.status';
+                    attr_set.error_detail := tmp_attr_set.cs;
+                    RETURN NEXT attr_set; CONTINUE; 
+                END IF;
+            END IF;
+
+            IF COALESCE(tmp_attr_set.circ_mod, '') = '' THEN
+
+                -- no circ mod defined, see if we should apply a default
+                SELECT INTO attr_set.circ_modifier TRIM(BOTH '"' FROM value) 
+                    FROM actor.org_unit_ancestor_setting(
+                        'vandelay.item.circ_modifier.default', 
+                        attr_set.owning_lib
+                    );
+
+                -- make sure the value from the org setting is still valid
+                PERFORM 1 FROM config.circ_modifier WHERE code = attr_set.circ_modifier;
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.circ_modifier';
+                    attr_set.error_detail := tmp_attr_set.circ_mod;
+                    RETURN NEXT attr_set; CONTINUE; 
+                END IF;
+
+            ELSE 
+
+                SELECT code INTO attr_set.circ_modifier FROM config.circ_modifier WHERE code = tmp_attr_set.circ_mod;
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.circ_modifier';
+                    attr_set.error_detail := tmp_attr_set.circ_mod;
+                    RETURN NEXT attr_set; CONTINUE; 
+                END IF;
+            END IF;
+
+            IF tmp_attr_set.circ_as != '' THEN
+                SELECT code INTO attr_set.circ_as_type FROM config.coded_value_map WHERE ctype = 'item_type' AND code = tmp_attr_set.circ_as;
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.circ_as_type';
+                    attr_set.error_detail := tmp_attr_set.circ_as;
+                    RETURN NEXT attr_set; CONTINUE; 
+                END IF;
+            END IF;
+
+            IF COALESCE(tmp_attr_set.cl, '') = '' THEN
+                -- no location specified, see if we should apply a default
+
+                SELECT INTO attr_set.location TRIM(BOTH '"' FROM value) 
+                    FROM actor.org_unit_ancestor_setting(
+                        'vandelay.item.copy_location.default', 
+                        attr_set.owning_lib
+                    );
+
+                -- make sure the value from the org setting is still valid
+                PERFORM 1 FROM asset.copy_location WHERE id = attr_set.location;
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.location';
+                    attr_set.error_detail := tmp_attr_set.cs;
+                    RETURN NEXT attr_set; CONTINUE; 
+                END IF;
+            ELSE
+
+                -- search up the org unit tree for a matching copy location
+                WITH RECURSIVE anscestor_depth AS (
+                    SELECT  ou.id,
+                        out.depth AS depth,
+                        ou.parent_ou
+                    FROM  actor.org_unit ou
+                        JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+                    WHERE ou.id = COALESCE(attr_set.owning_lib, attr_set.circ_lib)
+                        UNION ALL
+                    SELECT  ou.id,
+                        out.depth,
+                        ou.parent_ou
+                    FROM  actor.org_unit ou
+                        JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+                        JOIN anscestor_depth ot ON (ot.parent_ou = ou.id)
+                ) SELECT  cpl.id INTO attr_set.location
+                    FROM  anscestor_depth a
+                        JOIN asset.copy_location cpl ON (cpl.owning_lib = a.id)
+                    WHERE LOWER(cpl.name) = LOWER(tmp_attr_set.cl)
+                    ORDER BY a.depth DESC
+                    LIMIT 1; 
+
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.location';
+                    attr_set.error_detail := tmp_attr_set.cs;
+                    RETURN NEXT attr_set; CONTINUE; 
+                END IF;
+            END IF;
+
+            attr_set.circulate      :=
+                LOWER( SUBSTRING( tmp_attr_set.circ, 1, 1)) IN ('t','y','1')
+                OR LOWER(tmp_attr_set.circ) = 'circulating'; -- BOOL
+
+            attr_set.deposit        :=
+                LOWER( SUBSTRING( tmp_attr_set.dep, 1, 1 ) ) IN ('t','y','1')
+                OR LOWER(tmp_attr_set.dep) = 'deposit'; -- BOOL
+
+            attr_set.holdable       :=
+                LOWER( SUBSTRING( tmp_attr_set.hold, 1, 1 ) ) IN ('t','y','1')
+                OR LOWER(tmp_attr_set.hold) = 'holdable'; -- BOOL
+
+            attr_set.opac_visible   :=
+                LOWER( SUBSTRING( tmp_attr_set.opac_vis, 1, 1 ) ) IN ('t','y','1')
+                OR LOWER(tmp_attr_set.opac_vis) = 'visible'; -- BOOL
+
+            attr_set.ref            :=
+                LOWER( SUBSTRING( tmp_attr_set.r, 1, 1 ) ) IN ('t','y','1')
+                OR LOWER(tmp_attr_set.r) = 'reference'; -- BOOL
+
+            attr_set.call_number    := tmp_attr_set.cn; -- TEXT
+            attr_set.barcode        := tmp_attr_set.bc; -- TEXT,
+            attr_set.alert_message  := tmp_attr_set.amessage; -- TEXT,
+            attr_set.pub_note       := tmp_attr_set.note; -- TEXT,
+            attr_set.priv_note      := tmp_attr_set.pnote; -- TEXT,
+            attr_set.alert_message  := tmp_attr_set.amessage; -- TEXT,
+            attr_set.internal_id    := tmp_attr_set.internal_id::BIGINT;
+
+            RETURN NEXT attr_set;
+
+        END LOOP;
+
+    END IF;
+
+    RETURN;
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+
+-- Evergreen DB patch 0825.data.bre_format.sql
+--
+-- Fix some templates that loop over bibs to not have duplicated/run-on titles
+--
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0825', :eg_version);
+
+-- I think we shy away from modifying templates on existing systems, but this seems pretty safe...
+UPDATE
+    action_trigger.event_definition
+SET
+    template = replace(template,'[% FOR cbreb IN target %]','[% FOR cbreb IN target %][% title = '''' %]')
+WHERE
+    id IN (31,32);
+
+
+SELECT evergreen.upgrade_deps_block_check('0826', :eg_version);
+
+INSERT INTO permission.perm_list ( id, code, description ) VALUES (
+    551,
+    'ADMIN_SERVER_ADDON_FOR_WORKSTATION',
+    oils_i18n_gettext(
+        551,
+        'Allows a user to specify which Server Add-ons get invoked at the current workstation',
+        'ppl',
+        'description'
+    )
+);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0828', :eg_version);
+
+INSERT into config.org_unit_setting_type 
+    (name, grp, label, description, datatype)
+VALUES ( 
+    'opac.holds.org_unit_not_pickup_lib', 
+    'opac',
+    oils_i18n_gettext('opac.holds.org_unit_not_pickup_lib',
+        'OPAC: Org Unit is not a hold pickup library',
+        'coust', 'label'),
+    oils_i18n_gettext('opac.holds.org_unit_not_pickup_lib',
+        'If set, this org unit will not be offered to the patron as an '||
+        'option for a hold pickup location.  This setting has no affect '||
+        'on searching or hold targeting',
+        'coust', 'description'),
+    'bool'
+);
+
+
+--
+-- Adds a setting for selecting the number of items per page of a my list.
+--
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0829', :eg_version);
+
+INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatype)
+    VALUES (
+        'opac.list_items_per_page',
+        TRUE,
+        oils_i18n_gettext(
+            'opac.list_items_per_page',
+            'List Items per Page',
+            'cust',
+            'label'
+        ),
+        oils_i18n_gettext(
+            'opac.list_items_per_page',
+            'A number designating the amount of list items displayed per page of a selected list.',
+            'cust',
+            'description'
+        ),
+        'string'
+    );
+
+--
+-- Adds a setting for selecting the number of lists per page for my list.
+--
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0830', :eg_version);
+
+INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatype)
+    VALUES (
+        'opac.lists_per_page',
+        TRUE,
+        oils_i18n_gettext(
+            'opac.lists_per_page',
+            'Lists per Page',
+            'cust',
+            'label'
+        ),
+        oils_i18n_gettext(
+            'opac.lists_per_page',
+            'A number designating the amount of lists displayed per page.',
+            'cust',
+            'description'
+        ),
+        'string'
+    );
+    
+
+SELECT evergreen.upgrade_deps_block_check('0831', :eg_version);
+
+-- TODO: check for penalty ID collision before master merge; affects 
+-- config.standing_penalty and actor.calculate_system_penalties
+
+INSERT INTO config.standing_penalty
+    (id, name, label, block_list, staff_alert)
+VALUES (
+    35,
+    'PATRON_EXCEEDS_LONGOVERDUE_COUNT',
+    oils_i18n_gettext(
+        35,
+        'Patron Exceeds Max Long-Overdue Threshold',
+        'csp',
+        'label'
+    ),
+    'CIRC|FULFILL|HOLD|CAPTURE|RENEW',
+    TRUE
+);
+
+
+CREATE OR REPLACE FUNCTION actor.calculate_system_penalties( match_user INT, context_org INT ) RETURNS SETOF actor.usr_standing_penalty AS $func$
+DECLARE
+    user_object         actor.usr%ROWTYPE;
+    new_sp_row          actor.usr_standing_penalty%ROWTYPE;
+    existing_sp_row     actor.usr_standing_penalty%ROWTYPE;
+    collections_fines   permission.grp_penalty_threshold%ROWTYPE;
+    max_fines           permission.grp_penalty_threshold%ROWTYPE;
+    max_overdue         permission.grp_penalty_threshold%ROWTYPE;
+    max_items_out       permission.grp_penalty_threshold%ROWTYPE;
+    max_lost            permission.grp_penalty_threshold%ROWTYPE;
+    max_longoverdue     permission.grp_penalty_threshold%ROWTYPE;
+    tmp_grp             INT;
+    items_overdue       INT;
+    items_out           INT;
+    items_lost          INT;
+    items_longoverdue   INT;
+    context_org_list    INT[];
+    current_fines        NUMERIC(8,2) := 0.0;
+    tmp_fines            NUMERIC(8,2);
+    tmp_groc            RECORD;
+    tmp_circ            RECORD;
+    tmp_org             actor.org_unit%ROWTYPE;
+    tmp_penalty         config.standing_penalty%ROWTYPE;
+    tmp_depth           INTEGER;
+BEGIN
+    SELECT INTO user_object * FROM actor.usr WHERE id = match_user;
+
+    -- Max fines
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has a high fine balance
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+            SELECT * INTO max_fines FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 1 AND org_unit = tmp_org.id;
+
+            IF max_fines.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_fines.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT * INTO tmp_org FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_fines.threshold IS NOT NULL THEN
+
+        RETURN QUERY
+            SELECT  *
+              FROM  actor.usr_standing_penalty
+              WHERE usr = match_user
+                    AND org_unit = max_fines.org_unit
+                    AND (stop_date IS NULL or stop_date > NOW())
+                    AND standing_penalty = 1;
+
+        SELECT INTO context_org_list ARRAY_ACCUM(id) FROM actor.org_unit_full_path( max_fines.org_unit );
+
+        SELECT  SUM(f.balance_owed) INTO current_fines
+          FROM  money.materialized_billable_xact_summary f
+                JOIN (
+                    SELECT  r.id
+                      FROM  booking.reservation r
+                      WHERE r.usr = match_user
+                            AND r.pickup_lib IN (SELECT * FROM unnest(context_org_list))
+                            AND xact_finish IS NULL
+                                UNION ALL
+                    SELECT  g.id
+                      FROM  money.grocery g
+                      WHERE g.usr = match_user
+                            AND g.billing_location IN (SELECT * FROM unnest(context_org_list))
+                            AND xact_finish IS NULL
+                                UNION ALL
+                    SELECT  circ.id
+                      FROM  action.circulation circ
+                      WHERE circ.usr = match_user
+                            AND circ.circ_lib IN (SELECT * FROM unnest(context_org_list))
+                            AND xact_finish IS NULL ) l USING (id);
+
+        IF current_fines >= max_fines.threshold THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_fines.org_unit;
+            new_sp_row.standing_penalty := 1;
+            RETURN NEXT new_sp_row;
+        END IF;
+    END IF;
+
+    -- Start over for max overdue
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has too many overdue items
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+
+            SELECT * INTO max_overdue FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 2 AND org_unit = tmp_org.id;
+
+            IF max_overdue.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_overdue.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT INTO tmp_org * FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_overdue.threshold IS NOT NULL THEN
+
+        RETURN QUERY
+            SELECT  *
+              FROM  actor.usr_standing_penalty
+              WHERE usr = match_user
+                    AND org_unit = max_overdue.org_unit
+                    AND (stop_date IS NULL or stop_date > NOW())
+                    AND standing_penalty = 2;
+
+        SELECT  INTO items_overdue COUNT(*)
+          FROM  action.circulation circ
+                JOIN  actor.org_unit_full_path( max_overdue.org_unit ) fp ON (circ.circ_lib = fp.id)
+          WHERE circ.usr = match_user
+            AND circ.checkin_time IS NULL
+            AND circ.due_date < NOW()
+            AND (circ.stop_fines = 'MAXFINES' OR circ.stop_fines IS NULL);
+
+        IF items_overdue >= max_overdue.threshold::INT THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_overdue.org_unit;
+            new_sp_row.standing_penalty := 2;
+            RETURN NEXT new_sp_row;
+        END IF;
+    END IF;
+
+    -- Start over for max out
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has too many checked out items
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+            SELECT * INTO max_items_out FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 3 AND org_unit = tmp_org.id;
+
+            IF max_items_out.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_items_out.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT INTO tmp_org * FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+
+    -- Fail if the user has too many items checked out
+    IF max_items_out.threshold IS NOT NULL THEN
+
+        RETURN QUERY
+            SELECT  *
+              FROM  actor.usr_standing_penalty
+              WHERE usr = match_user
+                    AND org_unit = max_items_out.org_unit
+                    AND (stop_date IS NULL or stop_date > NOW())
+                    AND standing_penalty = 3;
+
+        SELECT  INTO items_out COUNT(*)
+          FROM  action.circulation circ
+                JOIN  actor.org_unit_full_path( max_items_out.org_unit ) fp ON (circ.circ_lib = fp.id)
+          WHERE circ.usr = match_user
+                AND circ.checkin_time IS NULL
+                AND (circ.stop_fines IN (
+                    SELECT 'MAXFINES'::TEXT
+                    UNION ALL
+                    SELECT 'LONGOVERDUE'::TEXT
+                    UNION ALL
+                    SELECT 'LOST'::TEXT
+                    WHERE 'true' ILIKE
+                    (
+                        SELECT CASE
+                            WHEN (SELECT value FROM actor.org_unit_ancestor_setting('circ.tally_lost', circ.circ_lib)) ILIKE 'true' THEN 'true'
+                            ELSE 'false'
+                        END
+                    )
+                    UNION ALL
+                    SELECT 'CLAIMSRETURNED'::TEXT
+                    WHERE 'false' ILIKE
+                    (
+                        SELECT CASE
+                            WHEN (SELECT value FROM actor.org_unit_ancestor_setting('circ.do_not_tally_claims_returned', circ.circ_lib)) ILIKE 'true' THEN 'true'
+                            ELSE 'false'
+                        END
+                    )
+                    ) OR circ.stop_fines IS NULL)
+                AND xact_finish IS NULL;
+
+           IF items_out >= max_items_out.threshold::INT THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_items_out.org_unit;
+            new_sp_row.standing_penalty := 3;
+            RETURN NEXT new_sp_row;
+           END IF;
+    END IF;
+
+    -- Start over for max lost
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has too many lost items
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+
+            SELECT * INTO max_lost FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 5 AND org_unit = tmp_org.id;
+
+            IF max_lost.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_lost.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT INTO tmp_org * FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_lost.threshold IS NOT NULL THEN
+
+        RETURN QUERY
+            SELECT  *
+            FROM  actor.usr_standing_penalty
+            WHERE usr = match_user
+                AND org_unit = max_lost.org_unit
+                AND (stop_date IS NULL or stop_date > NOW())
+                AND standing_penalty = 5;
+
+        SELECT  INTO items_lost COUNT(*)
+        FROM  action.circulation circ
+            JOIN  actor.org_unit_full_path( max_lost.org_unit ) fp ON (circ.circ_lib = fp.id)
+        WHERE circ.usr = match_user
+            AND circ.checkin_time IS NULL
+            AND (circ.stop_fines = 'LOST')
+            AND xact_finish IS NULL;
+
+        IF items_lost >= max_lost.threshold::INT AND 0 < max_lost.threshold::INT THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_lost.org_unit;
+            new_sp_row.standing_penalty := 5;
+            RETURN NEXT new_sp_row;
+        END IF;
+    END IF;
+
+    -- Start over for max longoverdue
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has too many longoverdue items
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+
+            SELECT * INTO max_longoverdue 
+                FROM permission.grp_penalty_threshold 
+                WHERE grp = tmp_grp AND 
+                    penalty = 35 AND 
+                    org_unit = tmp_org.id;
+
+            IF max_longoverdue.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp 
+                    FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_longoverdue.threshold IS NOT NULL 
+                OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT INTO tmp_org * FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_longoverdue.threshold IS NOT NULL THEN
+
+        RETURN QUERY
+            SELECT  *
+            FROM  actor.usr_standing_penalty
+            WHERE usr = match_user
+                AND org_unit = max_longoverdue.org_unit
+                AND (stop_date IS NULL or stop_date > NOW())
+                AND standing_penalty = 35;
+
+        SELECT INTO items_longoverdue COUNT(*)
+        FROM action.circulation circ
+            JOIN actor.org_unit_full_path( max_longoverdue.org_unit ) fp 
+                ON (circ.circ_lib = fp.id)
+        WHERE circ.usr = match_user
+            AND circ.checkin_time IS NULL
+            AND (circ.stop_fines = 'LONGOVERDUE')
+            AND xact_finish IS NULL;
+
+        IF items_longoverdue >= max_longoverdue.threshold::INT 
+                AND 0 < max_longoverdue.threshold::INT THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_longoverdue.org_unit;
+            new_sp_row.standing_penalty := 35;
+            RETURN NEXT new_sp_row;
+        END IF;
+    END IF;
+
+
+    -- Start over for collections warning
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has a collections-level fine balance
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+            SELECT * INTO max_fines FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 4 AND org_unit = tmp_org.id;
+
+            IF max_fines.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_fines.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT * INTO tmp_org FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_fines.threshold IS NOT NULL THEN
+
+        RETURN QUERY
+            SELECT  *
+              FROM  actor.usr_standing_penalty
+              WHERE usr = match_user
+                    AND org_unit = max_fines.org_unit
+                    AND (stop_date IS NULL or stop_date > NOW())
+                    AND standing_penalty = 4;
+
+        SELECT INTO context_org_list ARRAY_ACCUM(id) FROM actor.org_unit_full_path( max_fines.org_unit );
+
+        SELECT  SUM(f.balance_owed) INTO current_fines
+          FROM  money.materialized_billable_xact_summary f
+                JOIN (
+                    SELECT  r.id
+                      FROM  booking.reservation r
+                      WHERE r.usr = match_user
+                            AND r.pickup_lib IN (SELECT * FROM unnest(context_org_list))
+                            AND r.xact_finish IS NULL
+                                UNION ALL
+                    SELECT  g.id
+                      FROM  money.grocery g
+                      WHERE g.usr = match_user
+                            AND g.billing_location IN (SELECT * FROM unnest(context_org_list))
+                            AND g.xact_finish IS NULL
+                                UNION ALL
+                    SELECT  circ.id
+                      FROM  action.circulation circ
+                      WHERE circ.usr = match_user
+                            AND circ.circ_lib IN (SELECT * FROM unnest(context_org_list))
+                            AND circ.xact_finish IS NULL ) l USING (id);
+
+        IF current_fines >= max_fines.threshold THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_fines.org_unit;
+            new_sp_row.standing_penalty := 4;
+            RETURN NEXT new_sp_row;
+        END IF;
+    END IF;
+
+    -- Start over for in collections
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Remove the in-collections penalty if the user has paid down enough
+    -- This penalty is different, because this code is not responsible for creating 
+    -- new in-collections penalties, only for removing them
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+            SELECT * INTO max_fines FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 30 AND org_unit = tmp_org.id;
+
+            IF max_fines.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_fines.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT * INTO tmp_org FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_fines.threshold IS NOT NULL THEN
+
+        SELECT INTO context_org_list ARRAY_ACCUM(id) FROM actor.org_unit_full_path( max_fines.org_unit );
+
+        -- first, see if the user had paid down to the threshold
+        SELECT  SUM(f.balance_owed) INTO current_fines
+          FROM  money.materialized_billable_xact_summary f
+                JOIN (
+                    SELECT  r.id
+                      FROM  booking.reservation r
+                      WHERE r.usr = match_user
+                            AND r.pickup_lib IN (SELECT * FROM unnest(context_org_list))
+                            AND r.xact_finish IS NULL
+                                UNION ALL
+                    SELECT  g.id
+                      FROM  money.grocery g
+                      WHERE g.usr = match_user
+                            AND g.billing_location IN (SELECT * FROM unnest(context_org_list))
+                            AND g.xact_finish IS NULL
+                                UNION ALL
+                    SELECT  circ.id
+                      FROM  action.circulation circ
+                      WHERE circ.usr = match_user
+                            AND circ.circ_lib IN (SELECT * FROM unnest(context_org_list))
+                            AND circ.xact_finish IS NULL ) l USING (id);
+
+        IF current_fines IS NULL OR current_fines <= max_fines.threshold THEN
+            -- patron has paid down enough
+
+            SELECT INTO tmp_penalty * FROM config.standing_penalty WHERE id = 30;
+
+            IF tmp_penalty.org_depth IS NOT NULL THEN
+
+                -- since this code is not responsible for applying the penalty, it can't 
+                -- guarantee the current context org will match the org at which the penalty 
+                --- was applied.  search up the org tree until we hit the configured penalty depth
+                SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+                SELECT INTO tmp_depth depth FROM actor.org_unit_type WHERE id = tmp_org.ou_type;
+
+                WHILE tmp_depth >= tmp_penalty.org_depth LOOP
+
+                    RETURN QUERY
+                        SELECT  *
+                          FROM  actor.usr_standing_penalty
+                          WHERE usr = match_user
+                                AND org_unit = tmp_org.id
+                                AND (stop_date IS NULL or stop_date > NOW())
+                                AND standing_penalty = 30;
+
+                    IF tmp_org.parent_ou IS NULL THEN
+                        EXIT;
+                    END IF;
+
+                    SELECT * INTO tmp_org FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+                    SELECT INTO tmp_depth depth FROM actor.org_unit_type WHERE id = tmp_org.ou_type;
+                END LOOP;
+
+            ELSE
+
+                -- no penalty depth is defined, look for exact matches
+
+                RETURN QUERY
+                    SELECT  *
+                      FROM  actor.usr_standing_penalty
+                      WHERE usr = match_user
+                            AND org_unit = max_fines.org_unit
+                            AND (stop_date IS NULL or stop_date > NOW())
+                            AND standing_penalty = 30;
+            END IF;
+    
+        END IF;
+
+    END IF;
+
+    RETURN;
+END;
+$func$ LANGUAGE plpgsql;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0832', :eg_version);
+
+ALTER TABLE serial.subscription_note
+	ADD COLUMN alert BOOL NOT NULL DEFAULT FALSE;
+
+ALTER TABLE serial.distribution_note
+	ADD COLUMN alert BOOL NOT NULL DEFAULT FALSE;
+
+ALTER TABLE serial.item_note
+	ADD COLUMN alert BOOL NOT NULL DEFAULT FALSE;
+
+
+SELECT evergreen.upgrade_deps_block_check('0833', :eg_version);
+
+INSERT INTO config.org_unit_setting_type
+    (name, grp, datatype, label, description)
+VALUES (
+    'opac.self_register.timeout',
+    'opac',
+    'integer',
+    oils_i18n_gettext(
+        'opac.self_register.timeout',
+        'Patron Self-Reg. Display Timeout',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'opac.self_register.timeout',
+        'Number of seconds to wait before reloading the patron self-'||
+        'registration interface to clear sensitive data',
+        'coust',
+        'description'
+    )
+);
+
+
+SELECT evergreen.upgrade_deps_block_check('0834', :eg_version);
+
+INSERT INTO config.org_unit_setting_type 
+    (name, grp, datatype, label, description)
+VALUES (
+    'ui.circ.items_out.longoverdue', 'gui', 'integer',
+    oils_i18n_gettext(
+        'ui.circ.items_out.longoverdue',
+        'Items Out Long-Overdue display setting',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'ui.circ.items_out.longoverdue',
+'Value is a numeric code, describing which list the circulation '||
+'should appear while checked out and whether the circulation should '||
+'continue to appear in the bottom list, when checked in with '||
+'oustanding fines.  '||
+'1 = top list, bottom list.  2 = bottom list, bottom list.  ' ||
+'5 = top list, do not display.  6 = bottom list, do not display.',
+        'coust',
+        'description'
+    )
+), (
+    'ui.circ.items_out.lost', 'gui', 'integer',
+    oils_i18n_gettext(
+        'ui.circ.items_out.lost',
+        'Items Out Lost display setting',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'ui.circ.items_out.lost',
+'Value is a numeric code, describing which list the circulation '||
+'should appear while checked out and whether the circulation should '||
+'continue to appear in the bottom list, when checked in with '||
+'oustanding fines.  '||
+'1 = top list, bottom list.  2 = bottom list, bottom list.  ' ||
+'5 = top list, do not display.  6 = bottom list, do not display.',
+        'coust',
+        'description'
+    )
+), (
+    'ui.circ.items_out.claimsreturned', 'gui', 'integer',
+    oils_i18n_gettext(
+        'ui.circ.items_out.claimsreturned',
+        'Items Out Claims Returned display setting',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'ui.circ.items_out.claimsreturned',
+'Value is a numeric code, describing which list the circulation '||
+'should appear while checked out and whether the circulation should '||
+'continue to appear in the bottom list, when checked in with '||
+'oustanding fines.  '||
+'1 = top list, bottom list.  2 = bottom list, bottom list.  ' ||
+'5 = top list, do not display.  6 = bottom list, do not display.',
+        'coust',
+        'description'
+    )
+);
+
+
+SELECT evergreen.upgrade_deps_block_check('0835', :eg_version);
+
+INSERT INTO config.org_unit_setting_type 
+    (grp, name, datatype, label, description) 
+VALUES (
+    'finance',
+    'circ.disable_patron_credit',
+    'bool',
+    oils_i18n_gettext(
+        'circ.disable_patron_credit',
+        'Disable Patron Credit',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'circ.disable_patron_credit',
+        'Do not allow patrons to accrue credit or pay fines/fees with accrued credit',
+        'coust',
+        'description'
+    )
+);
+
+
+SELECT evergreen.upgrade_deps_block_check('0836', :eg_version);
+
+CREATE TABLE config.floating_group (
+    id      SERIAL PRIMARY KEY, 
+    name    TEXT UNIQUE NOT NULL,
+    manual  BOOL NOT NULL DEFAULT FALSE
+    );
+
+CREATE TABLE config.floating_group_member (
+    id              SERIAL PRIMARY KEY,
+    floating_group  INT NOT NULL REFERENCES config.floating_group (id),
+    org_unit        INT NOT NULL REFERENCES actor.org_unit (id),
+    stop_depth      INT NOT NULL DEFAULT 0,
+    max_depth       INT,
+    exclude         BOOL NOT NULL DEFAULT FALSE
+    );
+
+CREATE OR REPLACE FUNCTION evergreen.can_float( copy_floating_group integer, from_ou integer, to_ou integer ) RETURNS BOOL AS $f$
+DECLARE
+    float_member config.floating_group_member%ROWTYPE;
+    shared_ou_depth INT;
+    to_ou_depth INT;
+BEGIN
+    -- Grab the shared OU depth. If this is less than the stop depth later we ignore the entry.
+    SELECT INTO shared_ou_depth max(depth) FROM actor.org_unit_common_ancestors( from_ou, to_ou ) aou JOIN actor.org_unit_type aout ON aou.ou_type = aout.id;
+    -- Grab the to ou depth. If this is greater than max depth we ignore the entry.
+    SELECT INTO to_ou_depth depth FROM actor.org_unit aou JOIN actor.org_unit_type aout ON aou.ou_type = aout.id WHERE aou.id = to_ou;
+    -- Grab float members that apply. We don't care what we get beyond wanting excluded ones first.
+    SELECT INTO float_member *
+        FROM
+            config.floating_group_member cfgm
+            JOIN actor.org_unit aou ON cfgm.org_unit = aou.id
+            JOIN actor.org_unit_type aout ON aou.ou_type = aout.id
+        WHERE
+            cfgm.floating_group = copy_floating_group
+            AND to_ou IN (SELECT id FROM actor.org_unit_descendants(aou.id))
+            AND cfgm.stop_depth <= shared_ou_depth
+            AND (cfgm.max_depth IS NULL OR to_ou_depth <= max_depth)
+        ORDER BY
+            exclude DESC;
+    -- If we found something then we want to return the opposite of the exclude flag
+    IF FOUND THEN
+        RETURN NOT float_member.exclude;
+    END IF;
+    -- Otherwise no floating.
+    RETURN false;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+INSERT INTO config.floating_group(name) VALUES ('Everywhere');
+INSERT INTO config.floating_group_member(floating_group, org_unit) VALUES (1, 1);
+
+-- We need to drop these before we can update asset.copy
+DROP VIEW auditor.asset_copy_lifecycle;
+DROP VIEW auditor.serial_unit_lifecycle;
+
+-- Update the appropriate auditor tables
+ALTER TABLE auditor.asset_copy_history
+    ALTER COLUMN floating DROP DEFAULT,
+    ALTER COLUMN floating DROP NOT NULL,
+    ALTER COLUMN floating TYPE int USING CASE WHEN floating THEN 1 ELSE NULL END;
+ALTER TABLE auditor.serial_unit_history
+    ALTER COLUMN floating DROP DEFAULT,
+    ALTER COLUMN floating DROP NOT NULL,
+    ALTER COLUMN floating TYPE int USING CASE WHEN floating THEN 1 ELSE NULL END;
+
+-- Update asset.copy itself (does not appear to trigger update triggers!)
+ALTER TABLE asset.copy
+    ALTER COLUMN floating DROP DEFAULT,
+    ALTER COLUMN floating DROP NOT NULL,
+    ALTER COLUMN floating TYPE int USING CASE WHEN floating THEN 1 ELSE NULL END;
+
+ALTER TABLE asset.copy ADD CONSTRAINT asset_copy_floating_fkey FOREIGN KEY (floating) REFERENCES config.floating_group (id) DEFERRABLE INITIALLY DEFERRED;
+
+-- Update asset.copy_template too
+ALTER TABLE asset.copy_template
+    ALTER COLUMN floating TYPE int USING CASE WHEN floating THEN 1 ELSE NULL END;
+ALTER TABLE asset.copy_template ADD CONSTRAINT asset_copy_template_floating_fkey FOREIGN KEY (floating) REFERENCES config.floating_group (id) DEFERRABLE INITIALLY DEFERRED;
+
+INSERT INTO permission.perm_list( code, description) VALUES
+('ADMIN_FLOAT_GROUPS', 'Allows administration of floating groups');
+
+-- And lets just update all auditors to re-create those lifecycle views
+SELECT auditor.update_auditors();
+
+-- Evergreen DB patch 0837.schema.browse-auth-linking.plus-joiner.sql
+--
+-- In this upgrade script we complete inter-subfield joiner support, so that
+-- subject components can be separated by " -- ", for instance.  That's the
+-- easy part.
+--
+-- We also add the ability to browse by in-use authority main entries and find
+-- bibs that use unauthorized versions of the authority's value, by string matching.
+--
+
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0837', :eg_version);
+
+ALTER TABLE config.metabib_field ADD COLUMN joiner TEXT;
+UPDATE config.metabib_field SET joiner = ' -- ' WHERE field_class = 'subject' AND name NOT IN ('name', 'complete');
+
+-- To avoid problems with altering a table column after doing an
+-- update.
+ALTER TABLE authority.control_set_authority_field DISABLE TRIGGER ALL;
+
+ALTER TABLE authority.control_set_authority_field ADD COLUMN joiner TEXT;
+UPDATE authority.control_set_authority_field SET joiner = ' -- ' WHERE tag LIKE ANY (ARRAY['_4_','_5_','_8_']);
+
+ALTER TABLE authority.control_set_authority_field ENABLE TRIGGER ALL;
+
+-- Seed data will be generated from class <-> axis mapping
+CREATE TABLE authority.control_set_bib_field_metabib_field_map (
+    id              SERIAL  PRIMARY KEY,
+    bib_field       INT     NOT NULL REFERENCES authority.control_set_bib_field (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    metabib_field   INT     NOT NULL REFERENCES config.metabib_field (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    CONSTRAINT a_bf_mf_map_once UNIQUE (bib_field, metabib_field)
+);
+
+CREATE VIEW authority.control_set_auth_field_metabib_field_map_main AS
+    SELECT  DISTINCT b.authority_field, m.metabib_field
+      FROM  authority.control_set_bib_field_metabib_field_map m JOIN authority.control_set_bib_field b ON (b.id = m.bib_field);
+COMMENT ON VIEW authority.control_set_auth_field_metabib_field_map_main IS $$metabib fields for main entry auth fields$$;
+
+CREATE VIEW authority.control_set_auth_field_metabib_field_map_refs_only AS
+    SELECT  DISTINCT a.id AS authority_field, m.metabib_field
+      FROM  authority.control_set_authority_field a
+            JOIN authority.control_set_authority_field ame ON (a.main_entry = ame.id)
+            JOIN authority.control_set_bib_field b ON (b.authority_field = ame.id)
+            JOIN authority.control_set_bib_field_metabib_field_map mf ON (mf.bib_field = b.id)
+            JOIN authority.control_set_auth_field_metabib_field_map_main m ON (ame.id = m.authority_field);
+COMMENT ON VIEW authority.control_set_auth_field_metabib_field_map_refs_only IS $$metabib fields for NON-main entry auth fields$$;
+
+CREATE VIEW authority.control_set_auth_field_metabib_field_map_refs AS
+    SELECT * FROM authority.control_set_auth_field_metabib_field_map_main
+        UNION
+    SELECT * FROM authority.control_set_auth_field_metabib_field_map_refs_only;
+COMMENT ON VIEW authority.control_set_auth_field_metabib_field_map_refs IS $$metabib fields for all auth fields$$;
+
+
+-- blind refs only is probably what we want for lookup in bib/auth browse
+CREATE VIEW authority.control_set_auth_field_metabib_field_map_blind_refs_only AS
+    SELECT  r.*
+      FROM  authority.control_set_auth_field_metabib_field_map_refs_only r
+            JOIN authority.control_set_authority_field a ON (r.authority_field = a.id)
+      WHERE linking_subfield IS NULL;
+COMMENT ON VIEW authority.control_set_auth_field_metabib_field_map_blind_refs_only IS $$metabib fields for NON-main entry auth fields that can't be linked to other records$$; -- '
+
+CREATE VIEW authority.control_set_auth_field_metabib_field_map_blind_refs AS
+    SELECT  r.*
+      FROM  authority.control_set_auth_field_metabib_field_map_refs r
+            JOIN authority.control_set_authority_field a ON (r.authority_field = a.id)
+      WHERE linking_subfield IS NULL;
+COMMENT ON VIEW authority.control_set_auth_field_metabib_field_map_blind_refs IS $$metabib fields for all auth fields that can't be linked to other records$$; -- '
+
+CREATE VIEW authority.control_set_auth_field_metabib_field_map_blind_main AS
+    SELECT  r.*
+      FROM  authority.control_set_auth_field_metabib_field_map_main r
+            JOIN authority.control_set_authority_field a ON (r.authority_field = a.id)
+      WHERE linking_subfield IS NULL;
+COMMENT ON VIEW authority.control_set_auth_field_metabib_field_map_blind_main IS $$metabib fields for main entry auth fields that can't be linked to other records$$; -- '
+
+CREATE OR REPLACE FUNCTION authority.normalize_heading( marcxml TEXT, no_thesaurus BOOL ) RETURNS TEXT AS $func$
+DECLARE
+    acsaf           authority.control_set_authority_field%ROWTYPE;
+    tag_used        TEXT;
+    nfi_used        TEXT;
+    sf              TEXT;
+    sf_node         TEXT;
+    tag_node        TEXT;
+    thes_code       TEXT;
+    cset            INT;
+    heading_text    TEXT;
+    tmp_text        TEXT;
+    first_sf        BOOL;
+    auth_id         INT DEFAULT COALESCE(NULLIF(oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml), ''), '0')::INT;
+BEGIN
+    SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
+
+    IF cset IS NULL THEN
+        SELECT  control_set INTO cset
+          FROM  authority.control_set_authority_field
+          WHERE tag IN ( SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]))
+          LIMIT 1;
+    END IF;
+
+    thes_code := vandelay.marc21_extract_fixed_field(marcxml,'Subj');
+    IF thes_code IS NULL THEN
+        thes_code := '|';
+    ELSIF thes_code = 'z' THEN
+        thes_code := COALESCE( oils_xpath_string('//*[@tag="040"]/*[@code="f"][1]', marcxml), '' );
+    END IF;
+
+    heading_text := '';
+    FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset AND main_entry IS NULL LOOP
+        tag_used := acsaf.tag;
+        nfi_used := acsaf.nfi;
+        first_sf := TRUE;
+
+        FOR tag_node IN SELECT unnest(oils_xpath('//*[@tag="'||tag_used||'"]',marcxml)) LOOP
+            FOR sf_node IN SELECT unnest(oils_xpath('./*[contains("'||acsaf.sf_list||'", at code)]',tag_node)) LOOP
+
+                tmp_text := oils_xpath_string('.', sf_node);
+                sf := oils_xpath_string('./@code', sf_node);
+
+                IF first_sf AND tmp_text IS NOT NULL AND nfi_used IS NOT NULL THEN
+
+                    tmp_text := SUBSTRING(
+                        tmp_text FROM
+                        COALESCE(
+                            NULLIF(
+                                REGEXP_REPLACE(
+                                    oils_xpath_string('./@ind'||nfi_used, tag_node),
+                                    $$\D+$$,
+                                    '',
+                                    'g'
+                                ),
+                                ''
+                            )::INT,
+                            0
+                        ) + 1
+                    );
+
+                END IF;
+
+                first_sf := FALSE;
+
+                IF tmp_text IS NOT NULL AND tmp_text <> '' THEN
+                    heading_text := heading_text || E'\u2021' || sf || ' ' || tmp_text;
+                END IF;
+            END LOOP;
+
+            EXIT WHEN heading_text <> '';
+        END LOOP;
+
+        EXIT WHEN heading_text <> '';
+    END LOOP;
+
+    IF heading_text <> '' THEN
+        IF no_thesaurus IS TRUE THEN
+            heading_text := tag_used || ' ' || public.naco_normalize(heading_text);
+        ELSE
+            heading_text := tag_used || '_' || COALESCE(nfi_used,'-') || '_' || thes_code || ' ' || public.naco_normalize(heading_text);
+        END IF;
+    ELSE
+        heading_text := 'NOHEADING_' || thes_code || ' ' || MD5(marcxml);
+    END IF;
+
+    RETURN heading_text;
+END;
+$func$ LANGUAGE PLPGSQL IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION authority.simple_heading_set( marcxml TEXT ) RETURNS SETOF authority.simple_heading AS $func$
+DECLARE
+    res             authority.simple_heading%ROWTYPE;
+    acsaf           authority.control_set_authority_field%ROWTYPE;
+    tag_used        TEXT;
+    nfi_used        TEXT;
+    sf              TEXT;
+    cset            INT;
+    heading_text    TEXT;
+    joiner_text    TEXT;
+    sort_text       TEXT;
+    tmp_text        TEXT;
+    tmp_xml         TEXT;
+    first_sf        BOOL;
+    auth_id         INT DEFAULT COALESCE(NULLIF(oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml), ''), '0')::INT;
+BEGIN
+
+    SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
+
+    IF cset IS NULL THEN
+        SELECT  control_set INTO cset
+          FROM  authority.control_set_authority_field
+          WHERE tag IN ( SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]))
+          LIMIT 1;
+    END IF;
+
+    res.record := auth_id;
+
+    FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset LOOP
+
+        res.atag := acsaf.id;
+        tag_used := acsaf.tag;
+        nfi_used := acsaf.nfi;
+        joiner_text := COALESCE(acsaf.joiner, ' ');
+
+        FOR tmp_xml IN SELECT UNNEST(XPATH('//*[@tag="'||tag_used||'"]', marcxml::XML)) LOOP
+
+            heading_text := COALESCE(
+                oils_xpath_string('./*[contains("'||acsaf.sf_list||'", at code)]', tmp_xml::TEXT, joiner_text),
+                ''
+            );
+
+            IF nfi_used IS NOT NULL THEN
+
+                sort_text := SUBSTRING(
+                    heading_text FROM
+                    COALESCE(
+                        NULLIF(
+                            REGEXP_REPLACE(
+                                oils_xpath_string('./@ind'||nfi_used, tmp_xml::TEXT),
+                                $$\D+$$,
+                                '',
+                                'g'
+                            ),
+                            ''
+                        )::INT,
+                        0
+                    ) + 1
+                );
+
+            ELSE
+                sort_text := heading_text;
+            END IF;
+
+            IF heading_text IS NOT NULL AND heading_text <> '' THEN
+                res.value := heading_text;
+                res.sort_value := public.naco_normalize(sort_text);
+                res.index_vector = to_tsvector('keyword'::regconfig, res.sort_value);
+                RETURN NEXT res;
+            END IF;
+
+        END LOOP;
+
+    END LOOP;
+
+    RETURN;
+END;
+$func$ LANGUAGE PLPGSQL IMMUTABLE;
+
+CREATE TABLE metabib.browse_entry_simple_heading_map (
+    id BIGSERIAL PRIMARY KEY,
+    entry BIGINT REFERENCES metabib.browse_entry (id),
+    simple_heading BIGINT REFERENCES authority.simple_heading (id) ON DELETE CASCADE
+);
+CREATE INDEX browse_entry_sh_map_entry_idx ON metabib.browse_entry_simple_heading_map (entry);
+CREATE INDEX browse_entry_sh_map_sh_idx ON metabib.browse_entry_simple_heading_map (simple_heading);
+
+CREATE OR REPLACE FUNCTION biblio.extract_metabib_field_entry ( rid BIGINT, default_joiner TEXT ) RETURNS SETOF metabib.field_entry_template AS $func$
+DECLARE
+    bib     biblio.record_entry%ROWTYPE;
+    idx     config.metabib_field%ROWTYPE;
+    xfrm        config.xml_transform%ROWTYPE;
+    prev_xfrm   TEXT;
+    transformed_xml TEXT;
+    xml_node    TEXT;
+    xml_node_list   TEXT[];
+    facet_text  TEXT;
+    browse_text TEXT;
+    sort_value  TEXT;
+    raw_text    TEXT;
+    curr_text   TEXT;
+    joiner      TEXT := default_joiner; -- XXX will index defs supply a joiner?
+    authority_text TEXT;
+    authority_link BIGINT;
+    output_row  metabib.field_entry_template%ROWTYPE;
+BEGIN
+
+    -- Start out with no field-use bools set
+    output_row.browse_field = FALSE;
+    output_row.facet_field = FALSE;
+    output_row.search_field = FALSE;
+
+    -- Get the record
+    SELECT INTO bib * FROM biblio.record_entry WHERE id = rid;
+
+    -- Loop over the indexing entries
+    FOR idx IN SELECT * FROM config.metabib_field ORDER BY format LOOP
+
+        joiner := COALESCE(idx.joiner, default_joiner);
+
+        SELECT INTO xfrm * from config.xml_transform WHERE name = idx.format;
+
+        -- See if we can skip the XSLT ... it's expensive
+        IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
+            -- Can't skip the transform
+            IF xfrm.xslt <> '---' THEN
+                transformed_xml := oils_xslt_process(bib.marc,xfrm.xslt);
+            ELSE
+                transformed_xml := bib.marc;
+            END IF;
+
+            prev_xfrm := xfrm.name;
+        END IF;
+
+        xml_node_list := oils_xpath( idx.xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+
+        raw_text := NULL;
+        FOR xml_node IN SELECT x FROM unnest(xml_node_list) AS x LOOP
+            CONTINUE WHEN xml_node !~ E'^\\s*<';
+
+            -- XXX much of this should be moved into oils_xpath_string...
+            curr_text := ARRAY_TO_STRING(evergreen.array_remove_item_by_value(evergreen.array_remove_item_by_value(
+                oils_xpath( '//text()',
+                    REGEXP_REPLACE(
+                        REGEXP_REPLACE( -- This escapes all &s not followed by "amp;".  Data ise returned from oils_xpath (above) in UTF-8, not entity encoded
+                            REGEXP_REPLACE( -- This escapes embeded <s
+                                xml_node,
+                                $re$(>[^<]+)(<)([^>]+<)$re$,
+                                E'\\1&lt;\\3',
+                                'g'
+                            ),
+                            '&(?!amp;)',
+                            '&amp;',
+                            'g'
+                        ),
+                        E'\\s+',
+                        ' ',
+                        'g'
+                    )
+                ), ' '), ''),
+                joiner
+            );
+
+            CONTINUE WHEN curr_text IS NULL OR curr_text = '';
+
+            IF raw_text IS NOT NULL THEN
+                raw_text := raw_text || joiner;
+            END IF;
+
+            raw_text := COALESCE(raw_text,'') || curr_text;
+
+            -- autosuggest/metabib.browse_entry
+            IF idx.browse_field THEN
+
+                IF idx.browse_xpath IS NOT NULL AND idx.browse_xpath <> '' THEN
+                    browse_text := oils_xpath_string( idx.browse_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+                ELSE
+                    browse_text := curr_text;
+                END IF;
+
+                IF idx.browse_sort_xpath IS NOT NULL AND
+                    idx.browse_sort_xpath <> '' THEN
+
+                    sort_value := oils_xpath_string(
+                        idx.browse_sort_xpath, xml_node, joiner,
+                        ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]
+                    );
+                ELSE
+                    sort_value := browse_text;
+                END IF;
+
+                output_row.field_class = idx.field_class;
+                output_row.field = idx.id;
+                output_row.source = rid;
+                output_row.value = BTRIM(REGEXP_REPLACE(browse_text, E'\\s+', ' ', 'g'));
+                output_row.sort_value :=
+                    public.naco_normalize(sort_value);
+
+                output_row.authority := NULL;
+
+                IF idx.authority_xpath IS NOT NULL AND idx.authority_xpath <> '' THEN
+                    authority_text := oils_xpath_string(
+                        idx.authority_xpath, xml_node, joiner,
+                        ARRAY[
+                            ARRAY[xfrm.prefix, xfrm.namespace_uri],
+                            ARRAY['xlink','http://www.w3.org/1999/xlink']
+                        ]
+                    );
+
+                    IF authority_text ~ '^\d+$' THEN
+                        authority_link := authority_text::BIGINT;
+                        PERFORM * FROM authority.record_entry WHERE id = authority_link;
+                        IF FOUND THEN
+                            output_row.authority := authority_link;
+                        END IF;
+                    END IF;
+
+                END IF;
+
+                output_row.browse_field = TRUE;
+                RETURN NEXT output_row;
+                output_row.browse_field = FALSE;
+                output_row.sort_value := NULL;
+            END IF;
+
+            -- insert raw node text for faceting
+            IF idx.facet_field THEN
+
+                IF idx.facet_xpath IS NOT NULL AND idx.facet_xpath <> '' THEN
+                    facet_text := oils_xpath_string( idx.facet_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+                ELSE
+                    facet_text := curr_text;
+                END IF;
+
+                output_row.field_class = idx.field_class;
+                output_row.field = -1 * idx.id;
+                output_row.source = rid;
+                output_row.value = BTRIM(REGEXP_REPLACE(facet_text, E'\\s+', ' ', 'g'));
+
+                output_row.facet_field = TRUE;
+                RETURN NEXT output_row;
+                output_row.facet_field = FALSE;
+            END IF;
+
+        END LOOP;
+
+        CONTINUE WHEN raw_text IS NULL OR raw_text = '';
+
+        -- insert combined node text for searching
+        IF idx.search_field THEN
+            output_row.field_class = idx.field_class;
+            output_row.field = idx.id;
+            output_row.source = rid;
+            output_row.value = BTRIM(REGEXP_REPLACE(raw_text, E'\\s+', ' ', 'g'));
+
+            output_row.search_field = TRUE;
+            RETURN NEXT output_row;
+            output_row.search_field = FALSE;
+        END IF;
+
+    END LOOP;
+
+END;
+
+$func$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE
+    FUNCTION metabib.autosuggest_prepare_tsquery(orig TEXT) RETURNS TEXT[] AS
+$$
+DECLARE
+    orig_ended_in_space     BOOLEAN;
+    result                  RECORD;
+    plain                   TEXT;
+    normalized              TEXT;
+BEGIN
+    orig_ended_in_space := orig ~ E'\\s$';
+
+    orig := ARRAY_TO_STRING(
+        evergreen.regexp_split_to_array(orig, E'\\W+'), ' '
+    );
+
+    normalized := public.naco_normalize(orig); -- also trim()s
+    plain := trim(orig);
+
+    IF NOT orig_ended_in_space THEN
+        plain := plain || ':*';
+        normalized := normalized || ':*';
+    END IF;
+
+    plain := ARRAY_TO_STRING(
+        evergreen.regexp_split_to_array(plain, E'\\s+'), ' & '
+    );
+    normalized := ARRAY_TO_STRING(
+        evergreen.regexp_split_to_array(normalized, E'\\s+'), ' & '
+    );
+
+    RETURN ARRAY[normalized, plain];
+END;
+$$ LANGUAGE PLPGSQL;
+
+ALTER TYPE metabib.flat_browse_entry_appearance ADD ATTRIBUTE sees TEXT;
+ALTER TYPE metabib.flat_browse_entry_appearance ADD ATTRIBUTE asources INT;
+ALTER TYPE metabib.flat_browse_entry_appearance ADD ATTRIBUTE aaccurate TEXT;
+
+CREATE OR REPLACE FUNCTION metabib.browse_bib_pivot(
+    INT[],
+    TEXT
+) RETURNS BIGINT AS $p$
+    SELECT  mbe.id
+      FROM  metabib.browse_entry mbe
+            JOIN metabib.browse_entry_def_map mbedm ON (
+                mbedm.entry = mbe.id
+                AND mbedm.def = ANY($1)
+            )
+      WHERE mbe.sort_value >= public.naco_normalize($2)
+      ORDER BY mbe.sort_value, mbe.value LIMIT 1;
+$p$ LANGUAGE SQL;
+
+CREATE OR REPLACE FUNCTION metabib.browse_authority_pivot(
+    INT[],
+    TEXT
+) RETURNS BIGINT AS $p$
+    SELECT  mbe.id
+      FROM  metabib.browse_entry mbe
+            JOIN metabib.browse_entry_simple_heading_map mbeshm ON ( mbeshm.entry = mbe.id )
+            JOIN authority.simple_heading ash ON ( mbeshm.simple_heading = ash.id )
+            JOIN authority.control_set_auth_field_metabib_field_map_refs map ON (
+                ash.atag = map.authority_field
+                AND map.metabib_field = ANY($1)
+            )
+      WHERE mbe.sort_value >= public.naco_normalize($2)
+      ORDER BY mbe.sort_value, mbe.value LIMIT 1;
+$p$ LANGUAGE SQL;
+
+CREATE OR REPLACE FUNCTION metabib.browse_authority_refs_pivot(
+    INT[],
+    TEXT
+) RETURNS BIGINT AS $p$
+    SELECT  mbe.id
+      FROM  metabib.browse_entry mbe
+            JOIN metabib.browse_entry_simple_heading_map mbeshm ON ( mbeshm.entry = mbe.id )
+            JOIN authority.simple_heading ash ON ( mbeshm.simple_heading = ash.id )
+            JOIN authority.control_set_auth_field_metabib_field_map_refs_only map ON (
+                ash.atag = map.authority_field
+                AND map.metabib_field = ANY($1)
+            )
+      WHERE mbe.sort_value >= public.naco_normalize($2)
+      ORDER BY mbe.sort_value, mbe.value LIMIT 1;
+$p$ LANGUAGE SQL;
+
+-- The drop is necessary because the language change from PLPGSQL to SQL
+-- carries with it name changes to the parameters
+DROP FUNCTION metabib.browse_pivot(INT[], TEXT);
+CREATE FUNCTION metabib.browse_pivot(
+    INT[],
+    TEXT
+) RETURNS BIGINT AS $p$
+    SELECT  id FROM metabib.browse_entry
+      WHERE id IN (
+                metabib.browse_bib_pivot($1, $2),
+                metabib.browse_authority_refs_pivot($1,$2) -- only look in 4xx, 5xx, 7xx of authority
+            )
+      ORDER BY sort_value, value LIMIT 1;
+$p$ LANGUAGE SQL;
+
+CREATE OR REPLACE FUNCTION metabib.staged_browse(
+    query                   TEXT,
+    fields                  INT[],
+    context_org             INT,
+    context_locations       INT[],
+    staff                   BOOL,
+    browse_superpage_size   INT,
+    count_up_from_zero      BOOL,   -- if false, count down from -1
+    result_limit            INT,
+    next_pivot_pos          INT
+) RETURNS SETOF metabib.flat_browse_entry_appearance AS $p$
+DECLARE
+    curs                    REFCURSOR;
+    rec                     RECORD;
+    qpfts_query             TEXT;
+    aqpfts_query            TEXT;
+    afields                 INT[];
+    bfields                 INT[];
+    result_row              metabib.flat_browse_entry_appearance%ROWTYPE;
+    results_skipped         INT := 0;
+    row_counter             INT := 0;
+    row_number              INT;
+    slice_start             INT;
+    slice_end               INT;
+    full_end                INT;
+    all_records             BIGINT[];
+    all_brecords             BIGINT[];
+    all_arecords            BIGINT[];
+    superpage_of_records    BIGINT[];
+    superpage_size          INT;
+BEGIN
+    IF count_up_from_zero THEN
+        row_number := 0;
+    ELSE
+        row_number := -1;
+    END IF;
+
+    OPEN curs FOR EXECUTE query;
+
+    LOOP
+        FETCH curs INTO rec;
+        IF NOT FOUND THEN
+            IF result_row.pivot_point IS NOT NULL THEN
+                RETURN NEXT result_row;
+            END IF;
+            RETURN;
+        END IF;
+
+
+        -- Gather aggregate data based on the MBE row we're looking at now, authority axis
+        SELECT INTO all_arecords, result_row.sees, afields
+                ARRAY_AGG(DISTINCT abl.bib), -- bibs to check for visibility
+                ARRAY_TO_STRING(ARRAY_AGG(DISTINCT aal.source), $$,$$), -- authority record ids
+                ARRAY_AGG(DISTINCT map.metabib_field) -- authority-tag-linked CMF rows
+
+          FROM  metabib.browse_entry_simple_heading_map mbeshm
+                JOIN authority.simple_heading ash ON ( mbeshm.simple_heading = ash.id )
+                JOIN authority.authority_linking aal ON ( ash.record = aal.source )
+                JOIN authority.bib_linking abl ON ( aal.target = abl.authority )
+                JOIN authority.control_set_auth_field_metabib_field_map_refs map ON (
+                    ash.atag = map.authority_field
+                    AND map.metabib_field = ANY(fields)
+                )
+          WHERE mbeshm.entry = rec.id;
+
+
+        -- Gather aggregate data based on the MBE row we're looking at now, bib axis
+        SELECT INTO all_brecords, result_row.authorities, bfields
+                ARRAY_AGG(DISTINCT source),
+                ARRAY_TO_STRING(ARRAY_AGG(DISTINCT authority), $$,$$),
+                ARRAY_AGG(DISTINCT def)
+          FROM  metabib.browse_entry_def_map
+          WHERE entry = rec.id
+                AND def = ANY(fields);
+
+        SELECT INTO result_row.fields ARRAY_TO_STRING(ARRAY_AGG(DISTINCT x), $$,$$) FROM UNNEST(afields || bfields) x;
+
+        result_row.sources := 0;
+        result_row.asources := 0;
+
+        -- Bib-linked vis checking
+        IF ARRAY_UPPER(all_brecords,1) IS NOT NULL THEN
+
+            full_end := ARRAY_LENGTH(all_brecords, 1);
+            superpage_size := COALESCE(browse_superpage_size, full_end);
+            slice_start := 1;
+            slice_end := superpage_size;
+
+            WHILE result_row.sources = 0 AND slice_start <= full_end LOOP
+                superpage_of_records := all_brecords[slice_start:slice_end];
+                qpfts_query :=
+                    'SELECT NULL::BIGINT AS id, ARRAY[r] AS records, ' ||
+                    '1::INT AS rel FROM (SELECT UNNEST(' ||
+                    quote_literal(superpage_of_records) || '::BIGINT[]) AS r) rr';
+
+                -- We use search.query_parser_fts() for visibility testing.
+                -- We're calling it once per browse-superpage worth of records
+                -- out of the set of records related to a given mbe, until we've
+                -- either exhausted that set of records or found at least 1
+                -- visible record.
+
+                SELECT INTO result_row.sources visible
+                    FROM search.query_parser_fts(
+                        context_org, NULL, qpfts_query, NULL,
+                        context_locations, 0, NULL, NULL, FALSE, staff, FALSE
+                    ) qpfts
+                    WHERE qpfts.rel IS NULL;
+
+                slice_start := slice_start + superpage_size;
+                slice_end := slice_end + superpage_size;
+            END LOOP;
+
+            -- Accurate?  Well, probably.
+            result_row.accurate := browse_superpage_size IS NULL OR
+                browse_superpage_size >= full_end;
+
+        END IF;
+
+        -- Authority-linked vis checking
+        IF ARRAY_UPPER(all_arecords,1) IS NOT NULL THEN
+
+            full_end := ARRAY_LENGTH(all_arecords, 1);
+            superpage_size := COALESCE(browse_superpage_size, full_end);
+            slice_start := 1;
+            slice_end := superpage_size;
+
+            WHILE result_row.asources = 0 AND slice_start <= full_end LOOP
+                superpage_of_records := all_arecords[slice_start:slice_end];
+                qpfts_query :=
+                    'SELECT NULL::BIGINT AS id, ARRAY[r] AS records, ' ||
+                    '1::INT AS rel FROM (SELECT UNNEST(' ||
+                    quote_literal(superpage_of_records) || '::BIGINT[]) AS r) rr';
+
+                -- We use search.query_parser_fts() for visibility testing.
+                -- We're calling it once per browse-superpage worth of records
+                -- out of the set of records related to a given mbe, via
+                -- authority until we've either exhausted that set of records
+                -- or found at least 1 visible record.
+
+                SELECT INTO result_row.asources visible
+                    FROM search.query_parser_fts(
+                        context_org, NULL, qpfts_query, NULL,
+                        context_locations, 0, NULL, NULL, FALSE, staff, FALSE
+                    ) qpfts
+                    WHERE qpfts.rel IS NULL;
+
+                slice_start := slice_start + superpage_size;
+                slice_end := slice_end + superpage_size;
+            END LOOP;
+
+
+            -- Accurate?  Well, probably.
+            result_row.aaccurate := browse_superpage_size IS NULL OR
+                browse_superpage_size >= full_end;
+
+        END IF;
+
+        IF result_row.sources > 0 OR result_row.asources > 0 THEN
+
+            -- The function that calls this function needs row_number in order
+            -- to correctly order results from two different runs of this
+            -- functions.
+            result_row.row_number := row_number;
+
+            -- Now, if row_counter is still less than limit, return a row.  If
+            -- not, but it is less than next_pivot_pos, continue on without
+            -- returning actual result rows until we find
+            -- that next pivot, and return it.
+
+            IF row_counter < result_limit THEN
+                result_row.browse_entry := rec.id;
+                result_row.value := rec.value;
+
+                RETURN NEXT result_row;
+            ELSE
+                result_row.browse_entry := NULL;
+                result_row.authorities := NULL;
+                result_row.fields := NULL;
+                result_row.value := NULL;
+                result_row.sources := NULL;
+                result_row.sees := NULL;
+                result_row.accurate := NULL;
+                result_row.aaccurate := NULL;
+                result_row.pivot_point := rec.id;
+
+                IF row_counter >= next_pivot_pos THEN
+                    RETURN NEXT result_row;
+                    RETURN;
+                END IF;
+            END IF;
+
+            IF count_up_from_zero THEN
+                row_number := row_number + 1;
+            ELSE
+                row_number := row_number - 1;
+            END IF;
+
+            -- row_counter is different from row_number.
+            -- It simply counts up from zero so that we know when
+            -- we've reached our limit.
+            row_counter := row_counter + 1;
+        END IF;
+    END LOOP;
+END;
+$p$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION metabib.browse(
+    search_field            INT[],
+    browse_term             TEXT,
+    context_org             INT DEFAULT NULL,
+    context_loc_group       INT DEFAULT NULL,
+    staff                   BOOL DEFAULT FALSE,
+    pivot_id                BIGINT DEFAULT NULL,
+    result_limit            INT DEFAULT 10
+) RETURNS SETOF metabib.flat_browse_entry_appearance AS $p$
+DECLARE
+    core_query              TEXT;
+    back_query              TEXT;
+    forward_query           TEXT;
+    pivot_sort_value        TEXT;
+    pivot_sort_fallback     TEXT;
+    context_locations       INT[];
+    browse_superpage_size   INT;
+    results_skipped         INT := 0;
+    back_limit              INT;
+    back_to_pivot           INT;
+    forward_limit           INT;
+    forward_to_pivot        INT;
+BEGIN
+    -- First, find the pivot if we were given a browse term but not a pivot.
+    IF pivot_id IS NULL THEN
+        pivot_id := metabib.browse_pivot(search_field, browse_term);
+    END IF;
+
+    SELECT INTO pivot_sort_value, pivot_sort_fallback
+        sort_value, value FROM metabib.browse_entry WHERE id = pivot_id;
+
+    -- Bail if we couldn't find a pivot.
+    IF pivot_sort_value IS NULL THEN
+        RETURN;
+    END IF;
+
+    -- Transform the context_loc_group argument (if any) (logc at the
+    -- TPAC layer) into a form we'll be able to use.
+    IF context_loc_group IS NOT NULL THEN
+        SELECT INTO context_locations ARRAY_AGG(location)
+            FROM asset.copy_location_group_map
+            WHERE lgroup = context_loc_group;
+    END IF;
+
+    -- Get the configured size of browse superpages.
+    SELECT INTO browse_superpage_size value     -- NULL ok
+        FROM config.global_flag
+        WHERE enabled AND name = 'opac.browse.holdings_visibility_test_limit';
+
+    -- First we're going to search backward from the pivot, then we're going
+    -- to search forward.  In each direction, we need two limits.  At the
+    -- lesser of the two limits, we delineate the edge of the result set
+    -- we're going to return.  At the greater of the two limits, we find the
+    -- pivot value that would represent an offset from the current pivot
+    -- at a distance of one "page" in either direction, where a "page" is a
+    -- result set of the size specified in the "result_limit" argument.
+    --
+    -- The two limits in each direction make four derived values in total,
+    -- and we calculate them now.
+    back_limit := CEIL(result_limit::FLOAT / 2);
+    back_to_pivot := result_limit;
+    forward_limit := result_limit / 2;
+    forward_to_pivot := result_limit - 1;
+
+    -- This is the meat of the SQL query that finds browse entries.  We'll
+    -- pass this to a function which uses it with a cursor, so that individual
+    -- rows may be fetched in a loop until some condition is satisfied, without
+    -- waiting for a result set of fixed size to be collected all at once.
+    core_query := '
+SELECT  mbe.id,
+        mbe.value,
+        mbe.sort_value
+  FROM  metabib.browse_entry mbe
+  WHERE (
+            EXISTS ( -- are there any bibs using this mbe via the requested fields?
+                SELECT  1
+                  FROM  metabib.browse_entry_def_map mbedm
+                  WHERE mbedm.entry = mbe.id AND mbedm.def = ANY(' || quote_literal(search_field) || ')
+                  LIMIT 1
+            ) OR EXISTS ( -- are there any authorities using this mbe via the requested fields?
+                SELECT  1
+                  FROM  metabib.browse_entry_simple_heading_map mbeshm
+                        JOIN authority.simple_heading ash ON ( mbeshm.simple_heading = ash.id )
+                        JOIN authority.control_set_auth_field_metabib_field_map_refs map ON (
+                            ash.atag = map.authority_field
+                            AND map.metabib_field = ANY(' || quote_literal(search_field) || ')
+                        )
+                  WHERE mbeshm.entry = mbe.id
+            )
+        ) AND ';
+
+    -- This is the variant of the query for browsing backward.
+    back_query := core_query ||
+        ' mbe.sort_value <= ' || quote_literal(pivot_sort_value) ||
+    ' ORDER BY mbe.sort_value DESC, mbe.value DESC ';
+
+    -- This variant browses forward.
+    forward_query := core_query ||
+        ' mbe.sort_value > ' || quote_literal(pivot_sort_value) ||
+    ' ORDER BY mbe.sort_value, mbe.value ';
+
+    -- We now call the function which applies a cursor to the provided
+    -- queries, stopping at the appropriate limits and also giving us
+    -- the next page's pivot.
+    RETURN QUERY
+        SELECT * FROM metabib.staged_browse(
+            back_query, search_field, context_org, context_locations,
+            staff, browse_superpage_size, TRUE, back_limit, back_to_pivot
+        ) UNION
+        SELECT * FROM metabib.staged_browse(
+            forward_query, search_field, context_org, context_locations,
+            staff, browse_superpage_size, FALSE, forward_limit, forward_to_pivot
+        ) ORDER BY row_number DESC;
+
+END;
+$p$ LANGUAGE PLPGSQL;
+
+-- No 4XX inter-authority linking
+UPDATE authority.control_set_authority_field SET linking_subfield = NULL;
+UPDATE authority.control_set_authority_field SET linking_subfield = '0' WHERE tag LIKE ANY (ARRAY['5%','7%']);
+
+-- Map between authority controlled bib fields and stock indexing metabib fields
+INSERT INTO authority.control_set_bib_field_metabib_field_map (bib_field, metabib_field)
+    SELECT  DISTINCT b.id AS bib_field, m.id AS metabib_field
+      FROM  authority.control_set_bib_field b JOIN authority.control_set_authority_field a ON (b.authority_field = a.id), config.metabib_field m
+      WHERE a.tag = '100' AND m.name = 'personal'
+
+        UNION
+
+    SELECT  DISTINCT b.id AS bib_field, m.id AS metabib_field
+      FROM  authority.control_set_bib_field b JOIN authority.control_set_authority_field a ON (b.authority_field = a.id), config.metabib_field m
+      WHERE a.tag = '110' AND m.name = 'corporate'
+
+        UNION
+
+    SELECT  DISTINCT b.id AS bib_field, m.id AS metabib_field
+      FROM  authority.control_set_bib_field b JOIN authority.control_set_authority_field a ON (b.authority_field = a.id), config.metabib_field m
+      WHERE a.tag = '111' AND m.name = 'conference'
+
+        UNION
+
+    SELECT  DISTINCT b.id AS bib_field, m.id AS metabib_field
+      FROM  authority.control_set_bib_field b JOIN authority.control_set_authority_field a ON (b.authority_field = a.id), config.metabib_field m
+      WHERE a.tag = '130' AND m.name = 'uniform'
+
+        UNION
+
+    SELECT  DISTINCT b.id AS bib_field, m.id AS metabib_field
+      FROM  authority.control_set_bib_field b JOIN authority.control_set_authority_field a ON (b.authority_field = a.id), config.metabib_field m
+      WHERE a.tag = '148' AND m.name = 'temporal'
+
+        UNION
+
+    SELECT  DISTINCT b.id AS bib_field, m.id AS metabib_field
+      FROM  authority.control_set_bib_field b JOIN authority.control_set_authority_field a ON (b.authority_field = a.id), config.metabib_field m
+      WHERE a.tag = '150' AND m.name = 'topic'
+
+        UNION
+
+    SELECT  DISTINCT b.id AS bib_field, m.id AS metabib_field
+      FROM  authority.control_set_bib_field b JOIN authority.control_set_authority_field a ON (b.authority_field = a.id), config.metabib_field m
+      WHERE a.tag = '151' AND m.name = 'geographic'
+
+        UNION
+
+    SELECT  DISTINCT b.id AS bib_field, m.id AS metabib_field
+      FROM  authority.control_set_bib_field b JOIN authority.control_set_authority_field a ON (b.authority_field = a.id), config.metabib_field m
+      WHERE a.tag = '155' AND m.name = 'genre' -- Just in case...
+;
+
+CREATE OR REPLACE FUNCTION authority.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$
+DECLARE
+    ashs    authority.simple_heading%ROWTYPE;
+    mbe_row metabib.browse_entry%ROWTYPE;
+    mbe_id  BIGINT;
+    ash_id  BIGINT;
+BEGIN
+
+    IF NEW.deleted IS TRUE THEN -- If this authority is deleted
+        DELETE FROM authority.bib_linking WHERE authority = NEW.id; -- Avoid updating fields in bibs that are no longer visible
+        DELETE FROM authority.full_rec WHERE record = NEW.id; -- Avoid validating fields against deleted authority records
+        DELETE FROM authority.simple_heading WHERE record = NEW.id;
+          -- Should remove matching $0 from controlled fields at the same time?
+
+        -- XXX What do we about the actual linking subfields present in
+        -- authority records that target this one when this happens?
+        DELETE FROM authority.authority_linking
+            WHERE source = NEW.id OR target = NEW.id;
+
+        RETURN NEW; -- and we're done
+    END IF;
+
+    IF TG_OP = 'UPDATE' THEN -- re-ingest?
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled;
+
+        IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change
+            RETURN NEW;
+        END IF;
+
+        -- Propagate these updates to any linked bib records
+        PERFORM authority.propagate_changes(NEW.id) FROM authority.record_entry WHERE id = NEW.id;
+
+        DELETE FROM authority.simple_heading WHERE record = NEW.id;
+        DELETE FROM authority.authority_linking WHERE source = NEW.id;
+    END IF;
+
+    INSERT INTO authority.authority_linking (source, target, field)
+        SELECT source, target, field FROM authority.calculate_authority_linking(
+            NEW.id, NEW.control_set, NEW.marc::XML
+        );
+
+    FOR ashs IN SELECT * FROM authority.simple_heading_set(NEW.marc) LOOP
+
+        INSERT INTO authority.simple_heading (record,atag,value,sort_value)
+            VALUES (ashs.record, ashs.atag, ashs.value, ashs.sort_value);
+        ash_id := CURRVAL('authority.simple_heading_id_seq'::REGCLASS);
+
+        SELECT INTO mbe_row * FROM metabib.browse_entry
+            WHERE value = ashs.value AND sort_value = ashs.sort_value;
+
+        IF FOUND THEN
+            mbe_id := mbe_row.id;
+        ELSE
+            INSERT INTO metabib.browse_entry
+                ( value, sort_value ) VALUES
+                ( ashs.value, ashs.sort_value );
+
+            mbe_id := CURRVAL('metabib.browse_entry_id_seq'::REGCLASS);
+        END IF;
+
+        INSERT INTO metabib.browse_entry_simple_heading_map (entry,simple_heading) VALUES (mbe_id,ash_id);
+
+    END LOOP;
+
+    -- Flatten and insert the afr data
+    PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_full_rec' AND enabled;
+    IF NOT FOUND THEN
+        PERFORM authority.reingest_authority_full_rec(NEW.id);
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_rec_descriptor' AND enabled;
+        IF NOT FOUND THEN
+            PERFORM authority.reingest_authority_rec_descriptor(NEW.id);
+        END IF;
+    END IF;
+
+    RETURN NEW;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+SELECT evergreen.upgrade_deps_block_check('0827', :eg_version);
+-- otherwise, the ALTER TABLE statement below
+-- will fail with pending trigger events.
+SET CONSTRAINTS ALL IMMEDIATE;
+ALTER TABLE action_trigger.event_definition ADD COLUMN repeat_delay INTERVAL;
+
+
+
+COMMIT;
+
+\qecho
+\qecho
+\qecho **** Certain improvements in 2.5, particularly browse, require a reingest
+\qecho **** of all records.  In order to allow this to continue without locking
+\qecho **** your entire bibliographic data set, consider generating SQL scripts
+\qecho **** with the following queries, then running those via psql:
+\qecho
+\qecho **** If you require a more responsive catalog/database while reingesting,
+\qecho **** consider adding 'pg_sleep()' calls between each reingest select or
+\qecho **** update.
+\qecho
+\qecho '\\t'
+\qecho '\\o /tmp/reingest_2.5_bib_recs.sql'
+\qecho 'SELECT ''select metabib.reingest_metabib_field_entries('' || id || '');'' FROM biblio.record_entry WHERE NOT DELETED AND id > 0;'
+\qecho
+\qecho '\\o /tmp/reingest_2.5_auth_recs.sql'
+\qecho 'SELECT ''-- Grab current setting'';'
+\qecho 'SELECT ''\\set force_reingest '' || enabled FROM config.internal_flag WHERE name = ''ingest.reingest.force_on_same_marc'';'
+\qecho 'SELECT ''update config.internal_flag set enabled = true where name = ''''ingest.reingest.force_on_same_marc'''';'';'
+\qecho 'SELECT ''update authority.record_entry set id = id where id = '' || id || '';'' FROM authority.record_entry WHERE NOT DELETED;'
+\qecho 'SELECT ''-- Restore previous setting'';'
+\qecho 'SELECT ''update config.internal_flag set enabled = :force_reingest where name = \'\'ingest.reingest.force_on_same_marc\'\';'';'
+\qecho '\\o'
+\qecho '\\t'
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 2737f47..26ede9d 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/rel_2_5_beta1</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..a2efa94 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/rel_2_5_beta1");
 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..5ba81df 100644
--- a/Open-ILS/xul/staff_client/windowssetup.nsi
+++ b/Open-ILS/xul/staff_client/windowssetup.nsi
@@ -3,7 +3,7 @@
 ; HM NIS Edit Wizard helper defines
 ; Old versions of makensis don't like this, moved to Makefile
 ;!define /file PRODUCT_VERSION "client/VERSION"
-!define PRODUCT_TAG "Master"
+!define PRODUCT_TAG "2.5"
 !define PRODUCT_INSTALL_TAG "${PRODUCT_TAG}"
 !define UI_IMAGESET "beta"
 ;!define UI_IMAGESET "release"
diff --git a/README b/README
deleted file mode 120000
index b57451a..0000000
--- a/README
+++ /dev/null
@@ -1 +0,0 @@
-docs/installation/server_installation.txt
\ No newline at end of file
diff --git a/README b/README
new file mode 100644
index 0000000..badf2a6
--- /dev/null
+++ b/README
@@ -0,0 +1,538 @@
+Installing the Evergreen server
+===============================
+:toc:
+:numbered:
+
+Preamble: referenced user accounts
+----------------------------------
+
+In subsequent sections, we will refer to a number of different accounts, as
+follows:
+
+  * Linux user accounts:
+    ** The *user* Linux account is the account that you use to log onto the
+       Linux system as a regular user.
+    ** The *root* Linux account is an account that has system administrator
+       privileges. On Debian and Fedora you can switch to this account from
+       your *user* account by issuing the `su -` command and entering the
+       password for the *root* account when prompted. On Ubuntu you can switch
+       to this account from your *user* account using the `sudo su -` command
+       and entering the password for your *user* account when prompted.
+    ** The *opensrf* Linux account is an account that you create when installing
+       OpenSRF. You can switch to this account from the *root* account by
+       issuing the `su - opensrf` command.
+    ** The *postgres* Linux account is created automatically when you install
+       the PostgreSQL database server. You can switch to this account from the
+       *root* account by issuing the `su - postgres` command.
+  * PostgreSQL user accounts:
+    ** The *evergreen* PostgreSQL account is a superuser account that you will
+       create to connect to the PostgreSQL database server.
+  * Evergreen administrator account:
+    ** The *egadmin* Evergreen account is an administrator account for
+       Evergreen that you will use to test connectivity and configure your
+       Evergreen instance.
+
+Preamble: developer instructions
+--------------------------------
+
+[NOTE]
+Skip this section if you are using an official release tarball downloaded
+from http://evergreen-ils.org/downloads
+
+Developers working directly with the source code from the Git repository,
+rather than an official release tarball, must install some extra packages
+and perform one step before they can proceed with the `./configure` step.
+
+As the *root* Linux account, install the following packages:
+
+  * autoconf
+  * automake
+  * libtool
+
+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
+------------------------------------------------------------------------------
+
+After running `make install`, developers also 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/.
+------------------------------------------------------------------------------
+
+Installing prerequisites
+------------------------
+
+Evergreen has a number of prerequisite packages that must be installed
+before you can successfully configure, compile, and install Evergreen.
+
+1. Begin by installing the most recent version of OpenSRF (2.2 or later).
+   You can download OpenSRF releases from http://evergreen-ils.org/opensrf.php
+2. On many distributions, it is necessary to install PostgreSQL 9 from external
+   repositories.
++
+  * On Debian Squeeze, open `/etc/apt/sources.list` in a text editor as the
+    *root* Linux account and add the following line:
++
+[source, bash]
+------------------------------------------------------------------------------
+deb http://backports.debian.org/debian-backports squeeze-backports main contrib
+------------------------------------------------------------------------------
++
+  * On Ubuntu Lucid, you can use a PPA (personal package archive), which are 
+    package sources hosted on Launchpad. The one most commonly used by Evergreen
+    Community members is maintained by Martin Pitt, who also maintains the
+    official PostgreSQL packages for Ubuntu. As the *root* Linux account, issue
+    the following commands to add the PPA source:
++
+[source, bash]
+------------------------------------------------------------------------------
+apt-get install python-software-properties
+add-apt-repository ppa:pitti/postgresql
+------------------------------------------------------------------------------
++
+  * Ubuntu Precise comes with PostgreSQL 9, so no additional steps are required.
++
+  * Fedora comes with PostgreSQL 9, so no additional steps are required.
++
+3. On Debian and Ubuntu, run `aptitude update` as the *root* Linux account to
+   retrieve the new packages from the backports repository.
+4. Issue the following commands as the *root* Linux account to install
+   prerequisites using the `Makefile.install` prerequisite installer,
+   substituting `debian-squeeze`, `fedora`, `ubuntu-lucid`, or
+   `ubuntu-precise` for <osname> below:
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>
+------------------------------------------------------------------------------
++
+5. Add the libdbi-libdbd libraries to the system dynamic library path by
+   issuing the following commands as the *root* Linux account:
++
+[NOTE]
+You should skip this step if installing on Ubuntu Precise. The ubuntu-precise
+target uses libdbd-pgsql from packages.
++
+.Debian / Ubuntu Lucid
+[source, bash]
+------------------------------------------------------------------------------
+echo "/usr/local/lib/dbd" > /etc/ld.so.conf.d/eg.conf
+ldconfig
+------------------------------------------------------------------------------
++
+.Fedora
+[source, bash]
+------------------------------------------------------------------------------
+echo "/usr/lib64/dbd" > /etc/ld.so.conf.d/eg.conf
+ldconfig
+------------------------------------------------------------------------------
+
+Configuration and compilation instructions
+------------------------------------------
+
+For the time being, we are still installing everything in the `/openils/`
+directory. From the Evergreen source directory, issue the following commands as
+the *user* Linux account to configure and build Evergreen:
+
+[source, bash]
+------------------------------------------------------------------------------
+PATH=/openils/bin:$PATH ./configure --prefix=/openils --sysconfdir=/openils/conf
+make
+------------------------------------------------------------------------------
+
+These instructions assume that you have also installed OpenSRF under `/openils/`.
+If not, please adjust PATH as needed so that the Evergreen `configure` script
+can find `osrf_config`.
+
+Installation instructions
+-------------------------
+
+1. Once you have configured and compiled Evergreen, issue the following
+   command as the *root* Linux account to install Evergreen, build the server
+   portion of the staff client, and copy example configuration files to
+   `/openils/conf`.
+   Change the value of the `STAFF_CLIENT_STAMP_ID` variable to match the version
+   of the staff client that you will use to connect to the Evergreen server.
++
+[source, bash]
+------------------------------------------------------------------------------
+make STAFF_CLIENT_STAMP_ID=rel_2_5_beta1 install
+------------------------------------------------------------------------------
++
+2. The server portion of the staff client expects `http://hostname/xul/server`
+   to resolve. Issue the following commands as the *root* Linux account to
+   create a symbolic link pointing to the `server` subdirectory of the server
+   portion of the staff client that we just built using the staff client ID
+   'rel_name':
++
+[source, bash]
+------------------------------------------------------------------------------
+cd /openils/var/web/xul
+ln -sf rel_name/server server
+------------------------------------------------------------------------------
+
+Change ownership of the Evergreen files
+---------------------------------------
+
+All files in the `/openils/` directory and subdirectories must be owned by the
+`opensrf` user. Issue the following command as the *root* Linux account to
+change the ownership on the files:
+
+[source, bash]
+------------------------------------------------------------------------------
+chown -R opensrf:opensrf /openils
+------------------------------------------------------------------------------
+
+Configure the Apache Web server
+-------------------------------
+
+1. Use the example configuration files in `Open-ILS/examples/apache/` (for
+Apache versions below 2.4) or `Open-ILS/examples/apache_24/` (for Apache
+versions 2.4 or greater) to configure your Web server for the Evergreen
+catalog, staff client, Web services, and administration interfaces. Issue the
+following commands as the *root* Linux account:
++
+.Debian and Ubuntu
+[source,bash]
+------------------------------------------------------------------------------
+cp Open-ILS/examples/apache/eg.conf       /etc/apache2/sites-available/
+cp Open-ILS/examples/apache/eg_vhost.conf /etc/apache2/
+cp Open-ILS/examples/apache/eg_startup    /etc/apache2/
+# Now set up SSL
+mkdir /etc/apache2/ssl
+cd /etc/apache2/ssl
+------------------------------------------------------------------------------
++
+.Fedora
+[source,bash]
+------------------------------------------------------------------------------
+cp Open-ILS/examples/apache_24/eg_24.conf       /etc/httpd/conf.d/
+cp Open-ILS/examples/apache_24/eg_vhost_24.conf /etc/httpd/eg_vhost.conf
+cp Open-ILS/examples/apache/eg_startup          /etc/httpd/
+# Now set up SSL
+mkdir /etc/httpd/ssl
+cd /etc/httpd/ssl
+------------------------------------------------------------------------------
++
+2. The `openssl` command cuts a new SSL key for your Apache server. For a
+production server, you should purchase a signed SSL certificate, but you can
+just use a self-signed certificate and accept the warnings in the staff client
+and browser during testing and development. Create an SSL key for the Apache
+server by issuing the following command as the *root* Linux account:
++
+[source,bash]
+------------------------------------------------------------------------------
+openssl req -new -x509 -days 365 -nodes -out server.crt -keyout server.key
+------------------------------------------------------------------------------
++
+3. As the *root* Linux account, edit the `eg.conf` file that you copied into
+place.
+  a. To enable access to the offline upload / execute interface from any
+     workstation on any network, make the following change (and note that
+     you *must* secure this for a production instance):
+     * (Apache 2.2): Replace `Allow from 10.0.0.0/8` with `Allow from all`
+     * (Apache 2.4): Replace `Require host 10.0.0.0/8` with `Require all granted`
+  b. (Fedora): Change references from the non-existent `/etc/apache2/` directory
+     to `/etc/httpd/`.
+4. Change the user for the Apache server.
+  * (Debian and Ubuntu): As the *root* Linux account, edit
+    `/etc/apache2/envvars`.  Change `export APACHE_RUN_USER=www-data` to 
+    `export APACHE_RUN_USER=opensrf`.
+  * (Fedora): As the *root* Linux account , edit `/etc/httpd/conf/httpd.conf`.
+    Change `User apache` to `User opensrf`.
+5. Configure Apache with performance settings appropriate for Evergreen:
+  * (Debian and Ubuntu): As the *root* Linux account, edit
+    `/etc/apache2/apache2.conf`:
+  * (Fedora): As the *root* Linux account, edit `/etc/httpd/conf/httpd.conf`:
+    a. Change `KeepAliveTimeout` to `1`. Higher values reduce the chance of
+       a request timing out unexpectedly, but increase the risk of using up
+       all available Apache child processes.
+    b. 'Optional': Change `MaxKeepAliveRequests` to `100`
+    c. Update the prefork configuration section to suit your environment. The
+       following settings apply to a busy system:
++
+[source,bash]
+------------------------------------------------------------------------------
+<IfModule mpm_prefork_module>
+   StartServers           20
+   MinSpareServers         5
+   MaxSpareServers        15
+   MaxClients            150
+   MaxRequestsPerChild 10000
+</IfModule>
+------------------------------------------------------------------------------
++
+6. (Fedora): As the *root* Linux account, edit the `/etc/httpd/eg_vhost.conf`
+   file to change references from the non-existent `/etc/apache2/` directory
+   to `/etc/httpd/`.
+7. (Debian and Ubuntu): As the *root* Linux account, enable the Evergreen site:
++
+[source,bash]
+------------------------------------------------------------------------------
+a2dissite default  # OPTIONAL: disable the default site (the "It Works" page)
+a2ensite eg.conf
+------------------------------------------------------------------------------
+
+Configure OpenSRF for the Evergreen application
+-----------------------------------------------
+There are a number of example OpenSRF configuration files in `/openils/conf/`
+that you can use as a template for your Evergreen installation. Issue the
+following commands as the *opensrf* Linux account:
+
+[source, bash]
+------------------------------------------------------------------------------
+cp -b /openils/conf/opensrf_core.xml.example /openils/conf/opensrf_core.xml
+cp -b /openils/conf/opensrf.xml.example /openils/conf/opensrf.xml
+------------------------------------------------------------------------------
+
+When you installed OpenSRF, you created four Jabber users on two
+separate domains and edited the `opensrf_core.xml` file accordingly. Please
+refer back to the OpenSRF README and, as the *opensrf* Linux account, edit the
+Evergreen version of the `opensrf_core.xml` file using the same Jabber users
+and domains as you used while installing and testing OpenSRF.
+
+[NOTE]
+The `-b` flag tells the `cp` command to create a backup version of the
+destination file. The backup version of the destination file has a tilde (`~`)
+appended to the file name, so if you have forgotten the Jabber users and
+domains, you can retrieve the settings from the backup version of the files.
+
+`eg_db_config`, described in the following section, sets the database
+connection information in `opensrf.xml` for you.
+
+Creating the Evergreen database
+-------------------------------
+
+By default, the `Makefile.install` prerequisite installer does not install
+the PostgreSQL 9 database server required by every Evergreen system;
+for production use, most libraries install the PostgreSQL database server on a
+dedicated machine. You can install the packages required by Debian or Ubuntu Lucid
+on the machine of your choice using the following commands as the *root*
+Linux account:
+
+.(Debian / Ubuntu / Fedora) Installing PostgreSQL server packages
+
+Each OS build target provides the postgres server installation packages
+required for each operating system.  To install Postgres server packages, 
+use the make target 'postgres-server-<OSTYPE>'.  Choose the most appropriate 
+command below based on your operating system.
+
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-wheezy
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-squeeze
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-lucid
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-precise
+make -f Open-ILS/src/extras/Makefile.install postgres-server-fedora
+------------------------------------------------------------------------------
+
+.(Fedora) Postgres initialization
+
+Installing Postgres on Fedora requires one additional step.
+
+[source, bash]
+------------------------------------------------------------------------------
+postgresql-setup initdb
+------------------------------------------------------------------------------
+
+For a standalone PostgreSQL server, install the following Perl modules as the
+*root* Linux account:
+
+.(Debian / Ubuntu) Installing additional Perl modules on a standalone PostgreSQL 9 server
+[source, bash]
+------------------------------------------------------------------------------
+aptitude install gcc libxml-libxml-perl libxml-libxslt-perl
+cpan Business::ISBN
+cpan JSON::XS
+cpan Library::CallNumber::LC
+cpan MARC::Record
+cpan MARC::File::XML
+cpan UUID::Tiny
+cpan Rose::URI
+------------------------------------------------------------------------------
+
+.(Fedora) Installing additional Perl modules on a standalone PostgreSQL 9 server
+[source, bash]
+------------------------------------------------------------------------------
+yum install gcc perl-XML-LibXML perl-XML-LibXSLT perl-Business-ISBN
+yum install perl-Library-CallNumber-LC perl-MARC-Record perl-MARC-Charset
+yum install perl-MARC-File-XML perl-UUID-Tiny
+------------------------------------------------------------------------------
+
+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
+------------------------------------------------------------------------------
+
+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.
+
+Creating the database on a remote server
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+In a production instance of Evergreen, your PostgreSQL server should be
+installed on a dedicated server.
+
+PostgreSQL 9.1 and later
+^^^^^^^^^^^^^^^^^^^^^^^^
+To create the database instance on a remote database server running PostgreSQL
+9.1 or later, simply use the `--create-database` flag on `eg_db_config`.
+
+Starting Evergreen
+------------------
+1. As the *root* Linux account, start the `memcached` and `ejabberd` services
+(if they aren't already running):
++
+[source, bash]
+------------------------------------------------------------------------------
+/etc/init.d/ejabberd start
+/etc/init.d/memcached start
+------------------------------------------------------------------------------
++
+2. As the *opensrf* Linux account, start Evergreen. The `-l` flag in the
+following command is only necessary if you want to force Evergreen to treat the
+hostname as `localhost`; if you configured `opensrf.xml` using the real
+hostname of your machine as returned by `perl -ENet::Domain 'print
+Net::Domain::hostfqdn() . "\n";'`, you should not use the `-l` flag.
++
+[source, bash]
+------------------------------------------------------------------------------
+osrf_ctl.sh -l -a start_all
+------------------------------------------------------------------------------
++
+  ** If you receive the error message `bash: osrf_ctl.sh: command not found`,
+     then your environment variable `PATH` does not include the `/openils/bin`
+     directory; this should have been set in the *opensrf* Linux account's
+     `.bashrc` configuration file. To manually set the `PATH` variable, edit the
+     configuration file `~/.bashrc` as the *opensrf* Linux account and add the
+     following line:
++
+[source, bash]
+------------------------------------------------------------------------------
+export PATH=$PATH:/openils/bin
+------------------------------------------------------------------------------
++
+3. As the *opensrf* Linux account, generate the Web files needed by the staff
+   client and catalogue and update the organization unit proximity (you need to do
+   this the first time you start Evergreen, and after that each time you change
+   the library hierarchy in `config.cgi`):
++
+[source, bash]
+------------------------------------------------------------------------------
+autogen.sh -u
+------------------------------------------------------------------------------
++
+4. As the *root* Linux account, restart the Apache Web server:
++
+[source, bash]
+------------------------------------------------------------------------------
+/etc/init.d/apache2 restart
+------------------------------------------------------------------------------
++
+If the Apache Web server was running when you started the OpenSRF services, you
+might not be able to successfully log in to the OPAC or staff client until the
+Apache Web server is restarted.
+
+Testing connections to Evergreen
+--------------------------------
+
+Once you have installed and started Evergreen, test your connection to
+Evergreen via `srfsh`. As the *opensrf* Linux account, issue the following
+commands to start `srfsh` and try to log onto the Evergreen server using the
+*egadmin* Evergreen administrator user name and password that you set using the
+`eg_db_config` command:
+
+[source, bash]
+------------------------------------------------------------------------------
+/openils/bin/srfsh
+srfsh% login <admin-user> <admin-pass>
+------------------------------------------------------------------------------
+
+You should see a result like:
+
+    Received Data: "250bf1518c7527a03249858687714376"
+    ------------------------------------
+    Request Completed Successfully
+    Request Time in seconds: 0.045286
+    ------------------------------------
+
+    Received Data: {
+       "ilsevent":0,
+       "textcode":"SUCCESS",
+       "desc":" ",
+       "pid":21616,
+       "stacktrace":"oils_auth.c:304",
+       "payload":{
+          "authtoken":"e5f9827cc0f93b503a1cc66bee6bdd1a",
+          "authtime":420
+       }
+
+    }
+
+    ------------------------------------
+    Request Completed Successfully
+    Request Time in seconds: 1.336568
+    ------------------------------------
+
+If this does not work, it's time to do some troubleshooting.
+
+  * As the *opensrf* Linux acccount, 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://open-ils.org/listserv.php[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/listserv.php 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/build/tools/make_release b/build/tools/make_release
index c141ca7..6db6e51 100755
--- a/build/tools/make_release
+++ b/build/tools/make_release
@@ -2,7 +2,7 @@
 
 GIT_ABS=`git rev-parse --show-toplevel`
 GIT_BRANCH=`git rev-parse --abbrev-ref HEAD | sed 's|.*/||'`
-HEADURLBASE="http://git.evergreen-ils.org/Evergreen.git?h=refs/heads/"
+HEADURLBASE="http://git.evergreen-ils.org/?p=Evergreen.git;a=shortlog;h=refs/heads/"
 HEADURL="$HEADURLBASE$GIT_BRANCH"
 
 # Drop to the root of the checkout
@@ -305,7 +305,7 @@ cd Evergreen-ILS-$VERSION/
 
 echo "Building Release Staff Clients"
 cd Open-ILS/xul/staff_client
-make rigrelease
+make rigbeta
 make STAFF_CLIENT_STAMP_ID=rel_$UNDER_VERSION build
 make win-client
 mv evergreen_staff_client_setup.exe ../../../../evergreen-setup-$VERSION.exe
diff --git a/configure.ac b/configure.ac
index 99370e4..0e798ee 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,8 +20,8 @@
 
 export PATH=${PATH}:/usr/sbin
 AC_PREREQ(2.61)
-AC_INIT(Open-ILS, trunk, open-ils-dev at list.georgialibraries.org)
-AM_INIT_AUTOMAKE([OpenILS], [trunk])
+AC_INIT(Open-ILS, 2.5-beta1, open-ils-dev at list.georgialibraries.org)
+AM_INIT_AUTOMAKE([OpenILS], [2.5-beta1])
 AC_REVISION($Revision: 0.1 $)
 AC_CONFIG_SRCDIR([configure.ac])
 AC_CONFIG_SUBDIRS([Open-ILS/xul/staff_client/external/libmar])
diff --git a/docs/RELEASE_NOTES_2_5.txt b/docs/RELEASE_NOTES_2_5.txt
new file mode 100644
index 0000000..4471fd3
--- /dev/null
+++ b/docs/RELEASE_NOTES_2_5.txt
@@ -0,0 +1,1095 @@
+Evergreen 2.5 Release Notes
+===========================
+:toc:
+:numbered:
+
+Upgrade notes
+-------------
+
+
+
+Acquisitions
+~~~~~~~~~~~~
+
+
+
+Support PO activation without requiring items
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A new _Activate PO Without Loading Items_ option in the PO allows staff to
+activate the PO without loading copies into the catalog.
+
+
+
+
+New Feature: Differentiate between cancelled and "delayed" lineitems
+====================================================================
+In the ACQ user interface, it is now more clear to users when a lineitem has
+been fully cancelled or if it has been cancelled temporarily (e.g. back-
+ordered).  
+
+When a lineitem is cancelled, but "keep_debits" is true on the cancel reason,
+the lineitem is in effect delayed instead of truly cancelled.  This is now
+more obvious in the interface with different row styling for cancelled vs
+delayed lineitems.  We also always show the lineitem cancel reason (label) 
+next to the non-title attributes in the lineitem list display.
+
+
+
+
+Administration
+~~~~~~~~~~~~~~
+
+
+
+Upgrade Notes : IDL2js Locale Support
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The following Apache configuration changes are required to support the 
+locale-aware IDL2js module.  
+
+// note: there's no Apache conf highlighting.  'bash' works well enough.
+[source, bash]
+-----------------------------------------------------------------
+# file: eg_vhost.conf
+
+# this is the new part
+# capture locale CGI param for /reports/fm_IDL.xml
+RewriteCond %{REQUEST_URI} ^/reports/fm_IDL.xml
+RewriteCond %{QUERY_STRING} locale=([^&;]*)
+RewriteRule . - [E=locale:%1]
+
+# it should be placed just above this existing config section
+<LocationMatch /reports/fm_IDL.xml>
+    IDLChunkStripPI "yes"
+    IDLChunkEscapeScript "no"
+    IDLChunkStripComments "yes"
+    IDLChunkStripDoctype "yes"
+    IDLChunkContentType "application/xml; charset=utf-8"
+    AddOutputFilter INCLUDES;IDLCHUNK .xml
+</LocationMatch>
+-----------------------------------------------------------------
+
+
+
+
+
+New Updates Tools
+^^^^^^^^^^^^^^^^^
+
+Source code for tools to generate the staff clients updates tools were
+added to Open-ILS/xul/staff_client/external/libmar.  These tools
+replace the downloadable tools from Mozilla.org that were previously
+used to generate the staff client updates files.
+
+They come with their own configuration script and are condfigured
+automatically as a subpackage when you configure Evergreen for
+installation.  They are also built and ready for use when you make
+Evergreen during the installation or upgrade process.
+
+The make_updates.sh script that is run when you tell Evergreen to make
+the staff client updates has been modified to use the new tools.
+
+These tools introduce a dependency on libbz2.  This is often only
+available when installing the libbz2-dev or libbz2-devel packages.
+Thus this branch introduces a new depency on the development packages
+for libbz2 in Evergreen.
+
+Nothing in the user facing behavior of building updates changes with
+these tools.  They are drop-in replacements for the previous tools and
+other than the new dependency on libbz2, you don't even need to know
+that they are there.
+
+These tools were added to Evergreen to be an aid in portability to
+operating systems other than Linux.  They also remove a dependency on
+a third-party tool, that is typically downloaded as a binary.
+
+
+
+
+Action Trigger Event Repeatability
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Action Trigger Event Definitions have a new field, "Event Repeatability
+Delay". This feature allows events to be repeated after the designated
+delay interval. An example of this is sending a notification email when a
+patron's library card expires. If the library extends the expiration date
+on that card, we then need a way to send another notification email when
+that same card expires again. Before, the Action Trigger processor only
+created a new event if the event definition for that target had never
+been run before. But now it allows repeating of the event after the delay
+interval, if present.
+
+
+
+
+Cataloging
+~~~~~~~~~~
+
+
+
+New Feature: Vandelay Item Import Defaults
+==========================================
+
+Via org settings, support auto-generation of call numbers and barcodes
+for items imported via Vandelay's Item Import interface.  Support
+settings for applying a local prefix string to auto-generated call
+numbers and barcodes.  For both, the prefix defaults to "VAN".
+
+Similarly, support default copy location and circ modifiers.
+
+New Org Unit Settings
+---------------------
+
+ * vandelay.item.barcode.auto
+ * vandelay.item.barcode.prefix
+ * vandelay.item.call_number.auto
+ * vandelay.item.call_number.prefix
+ * vandelay.item.copy_location.default
+ * vandelay.item.circ_modifier.default
+
+
+
+
+
+
+Circulation
+~~~~~~~~~~~
+
+
+
+Setting for Desk Renewal to use original circulating library
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A new global flag option has been added to allow the circulating library of 
+a desk renewal (aka a renewal using the staff client) to reuse the original 
+circulation library for circ rule behaviors rather than using the workstation.
+This new setting is similar to existing options to use the originating 
+circulation library in OPAC renewals.
+
+
+
+
+Floating Groups
+===============
+Thomas Berezansky <tsbere at mvlc.org>
+:Date: 2012-04-22
+
+Before floating groups copies could float or not. If they floated then they floated everywhere, with no restrictions.
+
+After floating groups where a copy will float is defined by what group it has been assigned to.
+
+== Floating Groups
+
+Each floating group comes with a name and a manual flag, plus zero or more group members. The name is used solely for selection and display purposes.
+
+The manual flag dictates whether or not the "Manual Floating Active" checkin modifier needs to be active for a copy to float. This allows for greater control over when items float. It also prevents automated checkins via SIP2 from triggering floats.
+
+== Floating Group Members
+
+Each member of a floating group references an org unit and has a stop depth, an optional max depth, and an exclude flag.
+
+=== Org Unit
+
+The org unit and all descendants are included, unless max depth is set, in which case the tree is cut off at the max depth.
+
+=== Stop Depth
+
+The stop depth is the highest point from the current copy circ library to the checkin library for the item that will be traversed. If the item has to go higher than the stop depth on the tree the member rule in question is ignored.
+
+=== Max Depth
+
+As mentioned with the org unit, the max depth is the furthest down on the tree from the org unit that gets included. This is based on the entire tree, not just off of the org unit. So in the default tree a max depth of 1 will stop at the system level no matter if org unit is set to CONS or SYS1.
+
+=== Exclude
+
+Exclude, if set, causes floating to not happen for the member. Excludes always take priority, so you can remove an org unit from floating without having to worry about other rules overriding it.
+
+== Examples
+
+=== Float Everywhere
+
+This is a default floating rule to emulate the previous floating behavior for new installs and upgrades.
+
+One member:
+
+* Org Unit: CONS
+* Stop Depth: 0
+* Max Depth: Unset
+* Exclude: Off
+
+=== Float Within System
+
+This would permit a copy to float anywhere within a system, but would return to the system if it was returned elsewhere.
+
+One member:
+
+* Org Unit: CONS
+* Stop Depth: 1
+* Max Depth: Unset
+* Exclude: Off
+
+=== Float To All Branches
+
+This would permit a copy to float to any branch, but not to sublibraries or bookmobiles.
+
+One member:
+
+* Org Unit: CONS
+* Stop Depth: 0
+* Max Depth: 2
+* Exclude: Off
+
+=== Float To All Branches Within System
+
+This would permit a copy to float to any branch in a system, but not to sublibraries or bookmobiles, and returning to the system if returned elsewhere.
+
+One member:
+
+* Org Unit: CONS
+* Stop Depth: 1
+* Max Depth: 2
+* Exclude: Off
+
+=== Float Between BR1 and BR3
+
+This would permit a copy to float between BR1 and BR3 specifically, excluding sublibraries and bookmobiles.
+
+It would consist of two members, identical other than the org unit:
+
+* Org Unit: BR1 / BR3
+* Stop Depth: 0
+* Max Depth: 2
+* Exclude: Off
+
+=== Float Everywhere Except BM1
+
+This would allow an item to float anywhere except for BM1. It accomplishes this with two members.
+
+The first includes all org units, just like Float Everywhere:
+
+* Org Unit: CONS
+* Stop Depth: 0
+* Max Depth: Unset
+* Exclude: Off
+
+The second excludes BM1:
+
+* Org Unit: BM1
+* Stop Depth: 0
+* Max Depth: Unset
+* Exclude: On
+
+That works because excludes are applied first.
+
+=== Float into, but not out of, BR2
+
+This would allow an item to float into BR2, but once there it would never leave. Why you would want to allow items to float to but not from a single library I dunno, but here it is. This takes advantage of the fact that the rules say where we can float *to*, but outside of stop depth don't care where we are floating *from*.
+
+One member:
+
+* Org Unit: BR2
+* Stop Depth: 0
+* Max Depth: Unset
+* Exclude: Off 
+
+
+
+
+New Feature: Long-Overdue Patron Standing Penalty
+=================================================
+
+This is the long-overdue version of the existing PATRON_EXCEEDS_LOST_COUNT 
+standing penalty.  When a patron exceeds the configured threshold for open
+long-overdue (i.e. non-zero balance) circulations, the penalty is applied. 
+When the number once again goes below the threshold, the penalty is removed.
+
+The penalty name is PATRON_EXCEEDS_LONGOVERDUE_COUNT / "Patron Exceeds Max 
+Long-Overdue Threshold"
+
+
+
+
+Long Overdue Circulations Management
+====================================
+
+This is a two-part feature, which covers marking circulations as long
+overdue via automated processing and check-in of long overdue circulations.
+
+Marking Circulations Long Overdue
+---------------------------------
+
+A new Action/Trigger reactor (MarkItemLongOverdue) and sample event 
+definition (6 Month Overdue Mark Long-Overdue) are included for 
+marking circulations and their associated copies as long overdue.  New org
+unit settings determine whether the item price and/or a processing fee is
+applied.  
+
+A secondary Action/Trigger hook (longoverdue.auto) and sample event 
+definition (6 Month Long Overdue Notice) are added so that (email, etc.) 
+notifications can be sent when a circulation is marked long overdue via
+this new automated process.
+
+Also included is a new Action/Trigger validator PatronNotInCollections, which
+can be used to prevent long overdue processing (or any circ-based event 
+definition) for patrons that are in collections processing at (or above) the 
+circulating library.
+
+New Org Unit Settings
+~~~~~~~~~~~~~~~~~~~~~
+
+ * Long-Overdue Materials Processing Fee
+ * Void Overdue Fines When Items are Marked Long-Overdue
+ * Leave transaction open when long overdue balance equals zero
+
+A combination of 'Charge lost on zero' and 'Default Item Price' are used to
+determine the amount to charge for the item price when a circulation is 
+marked as long overdue.
+
+New Billing Types
+~~~~~~~~~~~~~~~~~
+
+ * Long-Overdue Materials
+ * Long-Overdue Materials Processing Fee
+
+New Permissions
+~~~~~~~~~~~~~~~
+
+ * SET_CIRC_LONG_OVERDUE
+
+New Copy Status
+~~~~~~~~~~~~~~~
+
+ * Long Overdue
+
+Check-in of Long Overdue Circulations
+-------------------------------------
+
+Check-in of long overdue items may result in any of the following actions, 
+depending on configuration.
+
+ * Void the copy price billing 
+ * Void the long-overdue processing fee billing 
+ * Reinstate voided overdue fines 
+
+The process is practically identical to Lost processing.  However, one
+difference between Lost and Long Overdue check-in is that the window
+of time during which a long overdue item may be returned may be based on the
+due date (like Lost) or the last billing activity date (last payment, last 
+billing).  This is controlled with the "Long-Overdue Check-In Interval Uses 
+Last Activity Date" org unit setting.
+
+New Org Unit Settings
+~~~~~~~~~~~~~~~~~~~~~
+
+ * Long-Overdue Items Usable on Checkin
+ * Long-Overdue Max Return Interval
+ * Restore Overdues on Long-Overdue Item Return
+ * Void Long-Overdue Item Billing When Returned
+ * Void Processing Fee on Long-Overdue Item Return
+ * Long-Overdue Check-In Interval Uses Last Activity Date
+
+New Permissions
+~~~~~~~~~~~~~~~
+
+ * COPY_STATUS_LONGOVERDUE.override
+
+Upgrade Notes
+-------------
+
+If you are using a custom version of the 
+'/openils/conf/action_trigger_filters.json.example' file, you will need to 
+merge the changes made by this feature into your file.  The change in 
+question alters the 'checkout.due' hook such that LONGOVERDUE circulations 
+are no longer treated as regular overdue items.
+
+
+
+
+Patron blocking by lost items and include lost as items out
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This feature has two main parts, both of which are to improve the staff's
+ability to assist patrons in regards to lost items.
+
+* Patron blocking by lost items.  This will add a group penalty threshold
+that will alert staff when a patron has too many lost items.  This
+setting is modified through the Group Penalty Thresholds page.
+
+* Include lost items as items out.  Through a new library setting,
+'Include Lost circulations in lump sum tallies in Patron Display',
+the staff have the ability to determine if lost items will be included
+in items out.
+
+
+
+
+Per-Hold Behind Desk Setting
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The value for behind-the-desk pickup is now stored directly on each
+hold request.  This allows the system to better track the true location 
+of captured hold items in cases where the patron setting has changed since
+hold capture.
+
+For these features to be accessible, the "Behind Desk Pickup Supported" 
+(circ.holds.behind_desk_pickup_supported) org unit setting must be set 
+to true.
+
+Staff Client
+++++++++++++
+
+In addition to the counts of ready for pickup and available holds, the
+staff client now also displays the number of behind the desk holds ready 
+for pickup at the staff's working location.  If no items are held behind
+the desk, this information does not display, in particular, because this 
+information is useless if behind the desk holds are not supported at the 
+staff's working location.
+
+TPAC Changes
+++++++++++++
+
+The system also allows patrons to set their own behind-the-desk 
+pickup preferences in the TPAC settings interface.  To activate this
+feature, admins need to set the Opac Visible flag to "true" for the 
+"Hold is behind Circ Desk" (circ.holds_behind_desk) user setting and
+"Behind Desk Pickup Supported" must be set to true for the patron's
+home library.
+
+
+
+
+
+Print Single Item Receipt
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Add ability to print a receipt for just a single selected item from the patron 
+interface for Items Out or Lost, Claims Returned, Long Overdue, Has Unpaid 
+Billings. This can be used via right-click or using the 'Actions for Selected 
+Items' button.
+
+
+
+
+Checkout: Trim whitespace from beginning and end of barcode
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In checkout, when pasting a barcode into the lookup field, one may accidentally
+include spaces or tabs in the beginning or end of the barcode string. Trim 
+those away to avoid potential mis-scans.
+
+
+
+
+Client
+~~~~~~
+
+
+
+New Feature: Customize Items Out Display for Lost, etc.
+=======================================================
+
+Items which are LOST, LONGOVERDUE, or CLAIMSRETURNED may now be displayed 
+in the top/main list of circulations instead of the bottom list in the
+staff client patron Items Out interface.  Similarly, such items can be 
+removed from the display once the items are checked in even if the 
+transaction is still open (fines are owed, etc.).
+
+Apart from organization, this has two additional effects:
+
+ * If all 3 types are hidden once checked in, the interface becomes a true
+   items out interface, instead of a combination of items out and 
+   special circumstance checked-in circs.
+ * If, in addition, all types are configured to be displayed in the top
+   list, the bottom list is hidden from the UI (since nothing would display
+   there), which creates more screen space for the main items out list.
+
+New Org Unit Settings
+---------------------
+
+ * ui.circ.items_out.longoverdue    | Items Out Long-Overdue display setting
+ * ui.circ.items_out.lost           | Items Out Lost display setting
+ * ui.circ.items_out.claimsreturned | Items Out Claims Returned display setting
+
+The value for each is a numeric code, describing which list the circulation
+should appear while checked out and whether the circulation should continue 
+to appear in the bottom list, when checked in, regardless of the state of
+the transaction.
+
+Value Codes
+~~~~~~~~~~~
+
+ * 1 = top list, then bottom list 
+ * 2 = bottom list, then bottom list
+ * 5 = top list, then do not display
+ * 6 = bottom list, then do not display
+
+Hint: to hide the bottom list entirely, set the value for all three settings 
+to '5'.
+
+
+
+
+Standalone Mode Shortcut
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+The Evergreen installer now includes a shortcut that launches the staff client 
+directly into standalone (offline) mode.
+
+
+
+
+User Setting Defaults
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+For use during Patron Registration, we can now supply default values for User Settings, under Admin -> Server Administration -> User Setting Types.
+
+
+
+
+OPAC
+~~~~
+
+
+
+Added Content by Record ID
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+Traditionally, Evergreen has supported Added Content lookups by ISBN
+only, or (more recently) by one of ISBN or UPC.
+
+This enhancement adds support for Added Content lookups by record
+ID, while still supporting the previous URL format for lookups by
+ISBN.
+
+The JSPAC and TPAC skins, as well as the web-based Self Checkout
+interface templates are updated to use jacket images / cover art by
+record ID by default.
+
+By using record identifiers, the Added Content handler has the
+opportnity to examine additional identifiers in the bib record.
+Currently, these include:
+
+ * ISBN
+ * UPC
+ * ISSN
+
+Currently, only the OpenILS::WWW::AddedContent::Syndetic provider
+makes use of the new identifiers.
+
+
+Local Content Overrides
++++++++++++++++++++++++
+Just as with ISBN lookups, there is support for local overrides in
+the form of a file created on disk which short-circuits any external
+Added Content lookup.
+
+
+Apache Configuration
+++++++++++++++++++++
+
+The example Apache configs have been updated to support serving
+blank.png when added content jacket URLs return a 404. This prevents
+"broken image" placeholders in browsers, without requiring a
+Javascript onerror handler on each img tag.
+
+The changes are as follows:
+
+In the eg.conf VirtualHost declaration for SSL, add:
+
+[source]
+SSLProxyEngine on # required for ErrorDocument 404 on SSL connections
+
+In the eg_vhost.conf file, add:
+
+[source]
+<Location /opac/extras/ac/jacket>
+        ErrorDocument 404 /opac/images/blank.png
+</Location>
+
+
+
+
+Bib record browser with linked authorities
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This feature provides a patron-oriented OPAC interface for browsing
+bibliographic records.
+
+Users choose to browse by Author, Title, Subject, or Series. They then
+enter a browse term, and the nearest match from a left-anchored search
+on the headings extracted for browse purposes will be displayed in a
+typical backwards/forwards paging display. Headings link to search
+results pages showing the related records. If the browse heading is
+linked to any authority records, and if any *other* authority records
+point to those with "See also" or other non-main entry headings, those
+alternative headings are displayed a linked to a search results page
+showing related bib records related to the alternate heading.
+
+The counts of holdings displayed next to headings from bibliographic
+records are subject to the same visiibility tests as search. This means
+that the org unit (and copy location group) dropdown on the browse
+interface affects counds, and it further means that whether or not
+you're looking at the browse interface through the staff client makes a
+difference.
+
+Configuration considerations for site administrators
+++++++++++++++++++++++++++++++++++++++++++++++++++++
+There are two off-by-default features that site administrators may wish
+to enable.
+
+  * Quick paging links: By adding a value for the org unit setting
+    ''opac.browse.pager_shortcuts'' , you can make shortcut browsing
+    links such as ''0-9 A B C D ...'' appear between the Back and Next
+    buttons on the browse page. The set of shortcuts should be chosen
+    based on the languages in use at your site, but a reasonable value
+    for English might be the string "*0-9*ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+    which will yield a link for 0-9 and one for each letter A-Z.  The
+    use of asterisks in the string group a shortcut whose label is more
+    than a single letter in length.  Such longer shortcuts have the multi-
+    character string for the shortcut label, and the link just goes to the
+    first heading matching the first character of the label.  The letters
+    not enclosed in asterisks just lead to individual letter shortcuts.
+
+
+  * There is a global flag by the name
+    ''opac.browse.warnable_regexp_per_class'' to control what leading
+    articles in users' entered browse terms trigger a warning about how
+    it might be better to search for "Rolling Stones" instead of "The
+    Rolling Stones" (or whatever). This is off by default, but can be
+    enabled if it suits your catalog, and can even be customized per
+    search class (author, title, series, subject).
+
+Also, by default, authors are indexed for browse in such a way that
+relator roles like "creator" are dropped off the end of their headings.
+This was an aesthetic choice. If a site wanted to display those kinds
+of terms, they would update the 'config.metabib_field' table in
+the database, setting 'browse_xpath' to NULL where 'field_class' =
+''author'' and 'browse_field' is true.
+
+
+
+
+Linked library names in copy details
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A patron may find one or more available copies of an item that they want to
+retrieve, but may not be familiar with the location, hours of operation, or
+contact information for each branch of their local library system. To enable
+the patron to quickly access information about a given library branch, the TPAC
+and KPAC can link the name of the branch in the copy details display to a URL
+associated with that branch.
+
+To set the URL for a given branch, use the *Local Administration -> Library
+Settings Editor* and edit the *Library Information URL* setting for that
+branch. Any branches that do not have a library information URL setting display
+as normal text.
+
+
+
+
+New Feature: Web-Based Patron Self-Registration
+===============================================
+
+Feature Summary
+---------------
+
+Patrons may now fill out a web-based form from within the TPAC to create 
+pending user accounts.  The goal is to make the registration process more 
+efficient by allowing the patron to provide much of the registration 
+details in advance of registering with staff.  
+
+Pending user accounts have no privileges.  
+
+The form supports hiding fields, requiring fields, applying format
+validation, and displaying example text for selected fields by inspecting the 
+relevant patron registration org unit settings.
+
+The "Request Library Card" link appears as the second default "bottom link"
+in the TPAC.  
+
+If a user is logged in when clicking the register link, the logged in
+user will be tracked as the requesting user for the pending account.
+Additionally, the home org unit and some address fields will be pre-populated
+for convenience (with the assumption that these will likely be the same for
+the pending user -- they can of course be changed).  When a requesting user
+is present on the pending user, a link to the requesting user will be 
+displayed within the patron registration form in the staff client.
+
+Pending patron accounts which sit unattended in the database for too long
+are purged via a regularly running (CRON) script.
+
+Technical Details
+-----------------
+
+  * To activate the web form and allow pending patrons to be created, set
+    the 'opac.allow_pending_user' org unit setting to true where appropriate.
+  * To purge old pending user accounts, set an interval value for the new
+    'opac.pending_user_expire_interval' org unit setting.
+  * The org unit settings to indicate show/require/regex/example are 
+    loaded dynamically, so any similar org unit settings added in the future
+    will also be honored.  Any setting matching the following format is used:
+    ** ui.patron.edit.[au|aua].*.show
+    ** ui.patron.edit.[au|aua].*.require
+    ** ui.patron.edit.[au|aua].*.regex
+    ** ui.patron.edit.[au|aua].*.example
+
+Upgrade Notes
+-------------
+
+  * If a value is set for the 'opac.pending_user_expire_interval' for
+    any org units, the new /openils/bin/purge_pending_users.srfsh script 
+    should also be added the opensrf user's crontab.  Running the script once 
+    per day should suffice.
+
+
+
+
+Serials
+~~~~~~~
+
+
+
+Serial Alerts At Receive Time
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+In the Serial Control View, you can now flag a note as an "alert" to
+make it more visible on the receiving interface. This flag is available
+on subscription, distribution and item notes. The new "Alerts" button
+on the Items tab displays the number of alert notes that are available
+for the selected items, and clicking this button opens a window which
+displays all applicable alert notes, sorted by type. Notes can also be
+edited or deleted from this window.
+
+
+
+Miscellaneous
+-------------
+
+Release Notes for the Phonelist.pm Module
+=========================================
+
+PhoneList.pm is a mod_perl module for Apache that works with Evergreen
+to generate callings lists for patron holds. It outputs a csv file
+that can be fed into an auto-dialer script to call patrons with little
+or no staff intervention.  It is accessed and configured via a special
+URL and passing any parameters as a ``Query String'' on the URL.  The
+parameters are listed in the table below.
+
+.Parameters for the phonelist program:
+|=====================================
+| user |  Your Evergreen login. Typically your library's circ account. If you leave this off, you will be prompted to login.
+| passwd | The password for your Evergreen login. If you leave this off you will be prompted to login.
+| ws_ou | The ID of the system or branch you want to generate the list for (optional). If your account does not have the appropriate permissions for the location whose ID number you have entered, you will get an error.
+| skipemail | If present, skip patrons with email notification (optional).
+| addcount | Add a count of items on hold (optional). Only makes sense for holds.
+| overdue | Makes a list of patrons with overdues instead of holds. If an additional, numeric parameter is supplied, it will be used as the number of days overdue. If no such extra parameter is supplied, then the default of 14 days is used.
+|=====================================
+
+The URL is
+
+`https://your.evergreen-server.tld/phonelist`
+
+A couple of examples follow:
+
+`https://your.evergreen-server.tld/phonelist?user=circuser&passwd=password&skipemail
+
+The above example would sign in as user circuser with password of
+``password'' and get a list of patrons with holds to call who do not
+have email notification turned on. It would run at whatever branch is
+normally associated with circuser, which would likely be MVC or
+central site. (Note: There is no actual circuser account, it is used
+here for illustration purposes only.)
+
+`https://your.evergreen-server.tld/phonelist?skipemail`
+
+The above example would do more or less the same, but you would be
+prompted by your browser for the user name and password.
+
+If your browser or download script support it, you may also use
+conventional HTTP authentication parameters.
+
+`https://user:password@your.evergreen-server.tld/phonelist?overdue&ws_ou=2`
+
+The above logs in as ``user'' with ``password'' and runs overdues for location ID 2.
+
+The following sections provide more information on getting what you want in your output.
+
+Adding Parameters
+-----------------
+
+If you are not familiar with HTTP/URL query strings, the format is
+quite simple.
+
+You add parameters to the end of the URL, the first parameter is
+separated from the URL page with a question mark (``?'') character. If
+the parameter is to be given an extra value, then that value follows
+the parameter name after an equals sign (``=''). Subsequent parameters
+are separated from the previous parameter by an ampersand (``&'').
+
+Here is an example with 1 parameter that has no value:
+
+`https://your.evergreen-server.tld/phonelist?skipemail`
+
+An example of 1 argument with a value:
+
+`https://your.evergreen-server.tld/phonelist?overdue=21`
+
+An example of 2 arguments, 1 with a value and 1 without:
+
+`https://your.evergreen-server.tld/phonelist?overdue=21&skipemail`
+
+Any misspelled or parameters not listed in the table above will be
+ignored by the program.
+
+Output
+------
+
+On a successful run, the program will return a CSV file named
+phone.csv. Depending on your browser or settings you will alternately
+be prompted to open or save the file. Your browser may also
+automatically save the file in your Downloads or other designated
+folder. You should be able to open this CSV file in Excel, LibreOffice
+Base, any other spread sheet program, or a text editor.
+
+If you have made a mistake and have mistyped your user name or
+password, or if you supply a ws_ou parameter with an ID where your
+user name does not have permission to look up holds or overdue
+information, then you will get an error returned in your browser.
+
+Should your browser appear to do absolutely nothing at all. This is
+normal. When there is no information for you to download, the server
+will return a 200 NO CONTENT message to your browser. Most browsers
+respond to this message by doing nothing at all. It is possible for
+there to be no information for you to retrieve if you added the
+`skipemail` option and all of your notices for that day were sent via
+email, or if you ran this in the morning and then again in the
+afternoon and there was no new information to gather.
+
+The program does indicate that it has already looked at a particular
+hold or overdue and will skip it on later runs. This prevents
+duplicates to the same patron in the same run. It will, however,
+create a ``duplicate'' for the same patron if a different copy is put
+on hold for that patron in between two runs.
+
+The specific content of the CSV file will vary if you are looking at
+holds or overdues. The specific contents are described in the
+appropriate sections below.
+
+Holds
+-----
+
+The `phonelist` program will return a list of patrons with copies on
+hold by default, so long as you do not use the `overdue`
+parameter. You may optionally get a number of items that patron
+currently has on hold by adding the `addcount` parameter.
+
+As always, you can add the skipemail parameter to skip patrons with
+email notifications of their overdues, [#0.5.Skipping patrons with
+email notification of holds|outline as described below].
+
+.Columns in the holds CSV file:
+|=====================================
+| Name | Patron's name first and last.
+| Phone | Patron's phone number.
+| Barcode | Patron's barcode.
+| Count | Number of copies on hold, if `addcount` parameter is used, otherwise this column is not present in the file.
+|=====================================
+
+Overdues
+--------
+
+If you add the `overdue` parameter, you can get a list of patrons with
+overdue copies instead of a list of patrons with copies on the hold
+shelf. By default, this will give you a list of patrons with copies
+that are 14 days overdue. If you'd like to specify a different number
+of days you can add the number after the parameter with an equals
+sign:
+
+`https://your.evergreen-server.tld/phonelist?overdue=21&ws_ou=2`
+
+The above will retrieve a list of patrons who have items that are 21
+days overdue at the location with ID of 2.
+
+The number of days is an exact lookup. This means that the program
+will look only at patrons who have items exactly 14 days or exactly
+the number of days specified overdue. It does not pull up any that are
+less than or greater than the number of days specified.
+
+As always, you can add the skipemail parameter to skip patrons with
+email notifications of their overdues, [#0.5.Skipping patrons with
+email notification of holds|outline as described below].
+
+.Columns in the overdues CSV file:
+|=================================
+| Name | Patron's name first and last.
+| Phone | Patron's phone number.
+| Barcode | Patron's barcode.
+| Titles | A colon-separated list of titles that the patron has overdue.
+|=================================
+
+Skipping patrons with email notification of holds
+-------------------------------------------------
+
+Skipping patrons who have email notification for their holds or
+overdues is very simple. You just need to add the `skipemail`
+parameter on the URL query string. Doing so will produce the list
+without the patrons who have email notification for overdues, or for
+all of their holds. Please note that if a patron has multiple holds
+available, and even one of these holds requests a phone-only
+notification, then that patron will still show on the list. For this
+option to exclude a patron from the holds list, the patron must
+request email notification on all of their current holds. In practice,
+we find that this is usually the case.
+
+Using the ws_ou parameter
+-------------------------
+
+Generally, you will not need to use the ws_ou parameter when using the
+phonelist program. The phonelist will look up the branch where your
+login account works and use that location when generating the list.
+However, if you are part of a multi-branch systems in a consortium,
+then the ws_ou parameter will be of interest to you.  You can use it
+to specify which branch, or the whole system, you wish to search when
+running the program.
+
+Automating the download
+-----------------------
+
+If you'd like to automate the download of these files, you should be
+able to do so using any HTTP programming toolkit. Your client must
+accept cookies and follow any redirects in order to function.
+New Feature: "Purge Holds"
+==========================
+Similar to purging circulations one may wish to purge old (filled or canceled) hold information. This feature adds a database function and settings for doing so.
+
+Purged holds are moved to the action.aged_hold_request table with patron identifying information scrubbed, much like circulations are moved to action.aged_circulation.
+
+The settings allow for a default retention age as well as filled, canceled, and canceled by cancel cause ages. The most specific one wins unless a patron is retaining their hold history. In the latter case the patron's holds are retained either way.
+
+Note that the function still needs to be called, which could be set up as a cron job or done more manually, say after statistics collection. A new script, purge_holds.srfsh, is added that can be used to purge holds from cron.
+Upgrade Notes
+-------------
+P.V. SUPA GoodStuff Integration
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+There is now a "Server Add-ons" module for integrating P.V. Supa's RFID product
+known as GoodStuff with the Evergreen staff client.
+
+To activate it, you should add the identifier "pv_supa_goodstaff" (without the
+quotes) to the list managed by the Admin->Workstation Administration->Server
+Add-ons menu action within the staff client.  You will need the
+ADMIN_SERVER_ADDON_FOR_WORKSTATION permission to do this.
+
+After doing this and clicking the Update Active Add-Ons button, the interface
+will refresh and show a GoodStuff tab in the Add-on Preferences section.  Within
+this tab you will have the option of specifying the hostname and port for the
+Goodstaff hardware. There is also an "Enabled" setting that needs to be checked.
+
+Currently three interfaces have been integrated:
+* Circulation -> Check In Items
+* Circulation -> Check Out Items (where you scan the patron barcode)
+* Circulation -> Check Out Items (where you scan the item barcodes)
+
+Each interface gets an RFID checkbox if the "Enabled" preference has been set,
+that can activate/deactivate the functionality on a per interface basis.  The
+checkbox states persist (i.e. are sticky).
+
+Upgrade Notes
+-------------
+Server Add-ons
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+This adds a "Server Add-ons" menu entry under Admin -> Workstation
+Administration in the staff client.  Choosing this allows you to edit or set a
+list of identifiers that correspond to JSAN-style modules found in
+/server/addons/, and is meant mainly for activating 3rd party modules within the
+staff client on a per-workstation basis.  You need the
+ADMIN_SERVER_ADDON_FOR_WORKSTATION permission to use it.
+
+Configuration options for activated add-ons may also show up in this interface.
+Z39.50 Batch Search and Queue
+=============================
+
+Staff Work Flow
+---------------
+
+ * Staff add records to bib record buckets
+ * Staff select the new "Locate Z39.50 Matches" action for a selected bucket.
+ * Staff choose which Z39.50 sources and indexes to search and the destination 
+   queue.
+ * Submitting the search fires a series of parallel Z39.50 searches across
+   all selected Z39.50 sources.
+ * Matches are added to the selected (Vandelay) queue.
+ * Matched records may be manually or automatically overlaid to existing 
+   catalog records using the existing Vandelay import/merge/overlay features.
+
+Vandelay Limit to Bucket
+------------------------
+
+As a side effect of this feature, Vandelay now has a new option in the 
+interface which allows staff to limit which catalog records to which an 
+inbound record matches to bib records within a record bucket.  When a record
+bucket and match set are chosen, only the records in the bucket can act as
+merge/overlay targets for the inbound Vandelay records.
+
+Configuration
+-------------
+
+Z39.50 Index Field Maps
+~~~~~~~~~~~~~~~~~~~~~~~
+
+These map bib record indexes (Metabib Fields and Record Attributes) to Z39.50
+search attributes.  The purpose of the mapping is to allow the server to
+determine which values to use for the automated Z39.50 searches.  For example,
+if the Z39.50 "title" attribute is mapped to the "Uniform Title" Metabib Field,
+the extracted value for "Uniform Title" for each record in the bucket will be
+used as the "title" value in the Z39.50 search.
+
+Mappings can be applied to specific Z39.50 attributes, which define an attribute
+type and a Z39.50 source, or to generic attribute types (e.g. "title").  When
+a specific attribute is used, the mapping will only be applied to searches 
+directed at the Z39.50 source linked to the attribute.
+
+The management interface can be found in the staff client under 
+
+Admin => Server Administration => Z39.50 Index Field Maps
+
+Metabib Field Additions
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Stock config.metabib_field entries for author include additional author-
+related data, like dates.  For example, a value for Personal Author might 
+look like this:
+
+'girdlestone cuthbert morton 1895 1975 creator'
+
+In the context of searching Z39.50 servers, the extraneous data can be 
+detrimental.  Creating a separate field definition without the extra data
+is recommended.
+
+[source,sql]
+--------------------------------------------
+INSERT INTO config.metabib_field 
+    (field_class, name, label, format, xpath, search_field)
+    VALUES (
+        'author', 
+        'personal - trimmed', 
+        'Personal Author (trimmed)', 
+        'mods32',
+        '//mods32:mods/mods32:name[@type=''personal'' and mods32:role/mods32:roleTerm[text()=''creator'']]/mods32:namePart[not (@type)]',
+        FALSE
+    );
+
+-- FULL BIB (OR INDEX-TARGETED) RE-INGEST REQUIRED
+--------------------------------------------
+
+
+Org Unit Settings
+~~~~~~~~~~~~~~~~~
+
+ * cat.z3950.batch.max_parallel 
+  ** Maximum Parallel Z39.50 Batch Searches
+  ** The maximum number of Z39.50 searches that can be in-flight at any given 
+     time when performing batch Z39.50 searches
+ * cat.z3950.batch.max_results
+  ** Maximum Z39.50 Batch Search Results
+  ** The maximum number of search results to retrieve and queue for each 
+     record + Z39 source during batch Z39.50 searches
+    

commit a1b9fe7e2a53483cfffbc7c8e24125cd446d03ab
Author: Dan Wells <dbw2 at calvin.edu>
Date:   Thu Sep 26 19:21:43 2013 -0400

    Bump OpenILS.pm version
    
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>

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

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


hooks/post-receive
-- 
Evergreen ILS


More information about the open-ils-commits mailing list