diff --git a/build.xml b/build.xml
index 16723cbd14199f2cb06bbaca4fd5a16f160017f2..b85aba585e6fe1b5ef53b5dbbe48663fb822c411 100644
--- a/build.xml
+++ b/build.xml
@@ -26,7 +26,7 @@
   <property name="php-cs-fixers" value="no_blank_lines_before_namespaces,function_call_space,trailing_spaces,unused_use,lowercase_keywords,encoding,parenthesis,php_closing_tag,visibility,duplicate_semicolon,extra_empty_lines,no_blank_lines_after_class_opening,no_empty_lines_after_phpdocs,operators_spaces,spaces_before_semicolon,ternary_spaces,concat_with_spaces,short_array_syntax,phpdoc_no_access,remove_leading_slash_use,eof_ending" />
 
 
-  <property name="version" value="3.0.1" />
+  <property name="version" value="3.0.3" />
 
   <!-- We only need the -p switch if the password is non-blank -->
   <if><not><equals arg1="${mysqlrootpass}" arg2="" /></not><then>
diff --git a/composer.json b/composer.json
index 083b6976e4885d7dc29035bcf4de234dc59ddd16..10946e1864ff029d5bd43e9e37cabdc58e4bf91a 100644
--- a/composer.json
+++ b/composer.json
@@ -1,41 +1,41 @@
-{
-    "name": "vufind/vufind",
-    "description": "A flexible discovery layer.",
-    "authors": [
-        {
-            "name": "Demian Katz",
-            "email": "demian.katz@villanova.edu"
-        }
-    ],
-    "license": "GPL-2.0",
-    "repositories": [
-        {
-            "type": "composer",
-            "url": "https://packages.zendframework.com/"
-        }
-    ],
-    "require": {
-        "aferrandini/phpqrcode": "1.0.1",
-        "jasig/phpcas": "1.3.3",
-        "cap60552/php-sip2": "1.0.0",
-        "los/losrecaptcha": "1.0.0",
-        "ahand/mobileesp": "dev-master",
-        "ocramius/proxy-manager": "1.0.2",
-        "oyejorge/less.php": "1.7.0.9",
-        "pear/file_marc": "1.1.2",
-        "pear/validate_ispn": "dev-master",
-        "serialssolutions/summon": "1.0.0",
-        "symfony/yaml": "2.7.6",
-        "vufind-org/vufindcode": "1.0.2",
-        "vufind-org/vufindhttp": "2.0.0",
-        "zendframework/zendframework": "2.4.6",
-        "zendframework/zendrest": "2.0.2",
-        "zendframework/zendservice-amazon": "2.0.4",
-        "zf-commons/zfc-rbac": "2.5.2"
-    },
-    "require-dev": {
-        "behat/mink": "1.7.0",
-        "behat/mink-selenium2-driver": "1.3.0",
-        "behat/mink-zombie-driver": "1.3.0"
-    }
-}
+{
+    "name": "vufind/vufind",
+    "description": "A flexible discovery layer.",
+    "authors": [
+        {
+            "name": "Demian Katz",
+            "email": "demian.katz@villanova.edu"
+        }
+    ],
+    "license": "GPL-2.0",
+    "repositories": [
+        {
+            "type": "vcs",
+            "url": "https://github.com/zendframework/zendservice_amazon"
+        }
+    ],
+    "require": {
+        "aferrandini/phpqrcode": "1.0.1",
+        "jasig/phpcas": "1.3.3",
+        "cap60552/php-sip2": "1.0.0",
+        "los/losrecaptcha": "1.0.0",
+        "ahand/mobileesp": "dev-master",
+        "ocramius/proxy-manager": "1.0.2",
+        "oyejorge/less.php": "1.7.0.9",
+        "pear/file_marc": "1.1.2",
+        "pear/validate_ispn": "dev-master",
+        "serialssolutions/summon": "1.0.0",
+        "symfony/yaml": "2.7.6",
+        "vufind-org/vufindcode": "1.0.2",
+        "vufind-org/vufindhttp": "2.0.0",
+        "zendframework/zendframework": "2.4.6",
+        "zendframework/zendrest": "2.0.2",
+        "zendframework/zendservice-amazon": "2.0.4",
+        "zf-commons/zfc-rbac": "2.5.2"
+    },
+    "require-dev": {
+        "behat/mink": "1.7.0",
+        "behat/mink-selenium2-driver": "1.3.0",
+        "behat/mink-zombie-driver": "1.3.0"
+    }
+}
diff --git a/config/vufind/config.ini b/config/vufind/config.ini
index 3dd16f70d0e71dc738dea46a5d16a1ac7c2d9d56..87ec3126e2804bdfe89d27dc96e6130d6670c19e 100644
--- a/config/vufind/config.ini
+++ b/config/vufind/config.ini
@@ -103,7 +103,7 @@ showBulkOptions = false
 ; Should users be allowed to save searches in their accounts?
 allowSavedSearches = true
 ; Generator value to display in an HTML header <meta> tag:
-generator = "VuFind 3.0.1"
+generator = "VuFind 3.0.3"
 
 ; This section allows you to configure the mechanism used for storing user
 ; sessions.  Available types: File, Memcache, Database.
@@ -674,7 +674,36 @@ authors         = Wikipedia
 
 ; You can select from Google, OpenLibrary, HathiTrust.  You should consult
 ; http://code.google.com/apis/books/branding.html before using Google Book Search.
-; previews       = Google,OpenLibrary,HathiTrust
+;previews       = Google,OpenLibrary,HathiTrust
+
+; Possible HathiRights options = pd,ic,op,orph,und,umall,ic-world,nobody,pdus,cc-by,cc-by-nd,
+; cc-by-nc-nd,cc-by-nc,cc-by-nc-sa,cc-by-sa,orphcand,cc-zero,und-world,icus
+; Default is "pd,ic-world" if unset here.
+; See www.hathitrust.org/rights_database#Attributes for full details
+;HathiRights    = pd,ic-world,cc-by,cc-by-nd,cc-by-nc-nd,cc-by-nc,cc-by-nc-sa,cc-by-sa,cc-zero,und-world
+
+; Possible GoogleBooks options full,partial,noview
+; options can be set for each / either of link or tab
+; Link makes a button appear in search results / record view
+; Tab makes a tab with an embedded preview appear on record view
+; Default is "GoogleOptions['link'] = full,partial" if nothing
+; is set here.
+; see https://developers.google.com/books/docs/dynamic-links#json-results-format
+;GoogleOptions['link']  = full,partial
+;GoogleOptions['tab']  = partial
+
+; OpenLibrary currently offers the same options/default as GoogleBooks (above):
+;OpenLibraryOptions  = full,partial
+
+; An API key is needed to interact with the Europeana API (see the EuropeanaResults
+; recommendation module in searches.ini for more information)
+;europeanaAPI = INSERTKEY
+
+; If this is set, a new map tab will show on the record page for records which
+; have long_lat data (see import/marc_local.properties for more information).
+; The setting specifies the type of map; currently, the only supported value is
+; "google"
+;recordMap = google
 
 ; This section controls the behavior of the cover generator when makeDynamicCovers
 ; above is non-false.
@@ -754,35 +783,6 @@ authors         = Wikipedia
 url = "https://api.vlb.de/api/v1/cover/"
 ; token = "XXXXXX-XXXX-XXXXX-XXXXXXXXXXXX"
 
-; Possible HathiRights options = pd,ic,op,orph,und,umall,ic-world,nobody,pdus,cc-by,cc-by-nd,
-; cc-by-nc-nd,cc-by-nc,cc-by-nc-sa,cc-by-sa,orphcand,cc-zero,und-world,icus
-; Default is "pd,ic-world" if unset here.
-; See www.hathitrust.org/rights_database#Attributes for full details
-;HathiRights    = pd,ic-world,cc-by,cc-by-nd,cc-by-nc-nd,cc-by-nc,cc-by-nc-sa,cc-by-sa,cc-zero,und-world
-
-; Possible GoogleBooks options full,partial,noview
-; options can be set for each / either of link or tab
-; Link makes a button appear in search results / record view
-; Tab makes a tab with an embedded preview appear on record view
-; Default is "GoogleOptions['link'] = full,partial" if nothing
-; is set here.
-; see https://developers.google.com/books/docs/dynamic-links#json-results-format
-;GoogleOptions['link']  = full,partial
-;GoogleOptions['tab']  = partial
-
-; OpenLibrary currently offers the same options/default as GoogleBooks (above):
-;OpenLibraryOptions  = full,partial
-
-; An API key is needed to interact with the Europeana API (see the EuropeanaResults
-; recommendation module in searches.ini for more information)
-;europeanaAPI = INSERTKEY
-
-; If this is set, a new map tab will show on the record page for records which
-; have long_lat data (see import/marc_local.properties for more information).
-; The setting specifies the type of map; currently, the only supported value is
-; "google"
-;recordMap = google
-
 [QRCode]
 ; This setting controls the image to display when no qrcode is available.
 ; The path is relative to the base of your theme directory.
diff --git a/import/index_scripts/author.bsh b/import/index_scripts/author.bsh
index c0cc4f1d1d9fe75cc768fdc43bd273349f236dd8..bfe5f7cd12c4b985ea20b65ee67ed78dbe5f4f65 100644
--- a/import/index_scripts/author.bsh
+++ b/import/index_scripts/author.bsh
@@ -375,9 +375,9 @@ public String processInitials(String authorName) {
         if (name.length() > 0) {
             String initial = name.substring(0,1);
             // if there is a hyphenated name, use both initials
-            if (name.indexOf('-') > 0) {
-                int pos = name.indexOf('-');
-                String extra = name.substring(pos+1,pos+2);
+            int pos = name.indexOf('-');
+            if (pos > 0 && pos < name.length() - 1) {
+                String extra = name.substring(pos+1, pos+2);
                 initial = initial + " " + extra;
             }
             result += " " + initial; 
diff --git a/local/config/vufind/config.ini b/local/config/vufind/config.ini
index c869b5c1bdbb5ad80865e4505ea2e6175a0b84a9..0d862505eb3611723425342c9b579dcfe2ba2f2d 100644
--- a/local/config/vufind/config.ini
+++ b/local/config/vufind/config.ini
@@ -103,7 +103,7 @@ showBulkOptions = false
 ; Should users be allowed to save searches in their accounts?
 allowSavedSearches = true
 ; Generator value to display in an HTML header <meta> tag:
-generator = "VuFind 3.0.1"
+generator = "VuFind 3.0.3"
 
 ; This section allows you to configure the mechanism used for storing user
 ; sessions.  Available types: File, Memcache, Database.
@@ -678,6 +678,35 @@ noCoverAvailableImage = images/noCover2.gif
 ; http://code.google.com/apis/books/branding.html before using Google Book Search.
 ; previews       = Google,OpenLibrary,HathiTrust
  
+; Possible HathiRights options = pd,ic,op,orph,und,umall,ic-world,nobody,pdus,cc-by,cc-by-nd,
+; cc-by-nc-nd,cc-by-nc,cc-by-nc-sa,cc-by-sa,orphcand,cc-zero,und-world,icus
+; Default is "pd,ic-world" if unset here.
+; See www.hathitrust.org/rights_database#Attributes for full details
+;HathiRights    = pd,ic-world,cc-by,cc-by-nd,cc-by-nc-nd,cc-by-nc,cc-by-nc-sa,cc-by-sa,cc-zero,und-world
+
+; Possible GoogleBooks options full,partial,noview
+; options can be set for each / either of link or tab
+; Link makes a button appear in search results / record view
+; Tab makes a tab with an embedded preview appear on record view
+; Default is "GoogleOptions['link'] = full,partial" if nothing
+; is set here.
+; see https://developers.google.com/books/docs/dynamic-links#json-results-format
+;GoogleOptions['link']  = full,partial
+;GoogleOptions['tab']  = partial
+
+; OpenLibrary currently offers the same options/default as GoogleBooks (above):
+;OpenLibraryOptions  = full,partial
+
+; An API key is needed to interact with the Europeana API (see the EuropeanaResults
+; recommendation module in searches.ini for more information)
+;europeanaAPI = INSERTKEY
+
+; If this is set, a new map tab will show on the record page for records which
+; have long_lat data (see import/marc_local.properties for more information).
+; The setting specifies the type of map; currently, the only supported value is
+; "google"
+;recordMap = google
+
 ; This section controls the behavior of the cover generator when makeDynamicCovers
 ; above is non-false.
 [DynamicCovers]
@@ -756,35 +785,6 @@ noCoverAvailableImage = images/noCover2.gif
 url = "https://api.vlb.de/api/v1/cover/"
 ; token = "XXXXXX-XXXX-XXXXX-XXXXXXXXXXXX" 
 
-; Possible HathiRights options = pd,ic,op,orph,und,umall,ic-world,nobody,pdus,cc-by,cc-by-nd,
-; cc-by-nc-nd,cc-by-nc,cc-by-nc-sa,cc-by-sa,orphcand,cc-zero,und-world,icus
-; Default is "pd,ic-world" if unset here.
-; See www.hathitrust.org/rights_database#Attributes for full details
-;HathiRights    = pd,ic-world,cc-by,cc-by-nd,cc-by-nc-nd,cc-by-nc,cc-by-nc-sa,cc-by-sa,cc-zero,und-world
-
-; Possible GoogleBooks options full,partial,noview
-; options can be set for each / either of link or tab
-; Link makes a button appear in search results / record view
-; Tab makes a tab with an embedded preview appear on record view
-; Default is "GoogleOptions['link'] = full,partial" if nothing
-; is set here.
-; see https://developers.google.com/books/docs/dynamic-links#json-results-format
-;GoogleOptions['link']  = full,partial
-;GoogleOptions['tab']  = partial
-
-; OpenLibrary currently offers the same options/default as GoogleBooks (above):
-;OpenLibraryOptions  = full,partial
-
-; An API key is needed to interact with the Europeana API (see the EuropeanaResults
-; recommendation module in searches.ini for more information)
-;europeanaAPI = INSERTKEY
-
-; If this is set, a new map tab will show on the record page for records which
-; have long_lat data (see import/marc_local.properties for more information).
-; The setting specifies the type of map; currently, the only supported value is
-; "google"
-;recordMap = google
-
 [QRCode]
 ; This setting controls the image to display when no qrcode is available.
 ; The path is relative to the base of your theme directory.
diff --git a/module/VuFind/sql/migrations/pgsql/3.0/003-add-record-table.sql b/module/VuFind/sql/migrations/pgsql/3.0/003-add-record-table.sql
index 92cf3273944c91677dee3f32c628faa343e3c83b..8d13fb781077c8ba64bb858c7b00f2b5d779d0de 100644
--- a/module/VuFind/sql/migrations/pgsql/3.0/003-add-record-table.sql
+++ b/module/VuFind/sql/migrations/pgsql/3.0/003-add-record-table.sql
@@ -1,8 +1,8 @@
 --
--- Table structure for table `record`
+-- Table structure for table record
 --
 
-CREATE TABLE `record` (
+CREATE TABLE record (
   id serial NOT NULL,
   record_id varchar(255),
   source varchar(50),
diff --git a/module/VuFind/sql/pgsql.sql b/module/VuFind/sql/pgsql.sql
index 1b54218b220b2aa466b453e1c03f3b2d5cb92364..94b949066dd4225a0cd9d6419776ec9f0da65e4b 100644
--- a/module/VuFind/sql/pgsql.sql
+++ b/module/VuFind/sql/pgsql.sql
@@ -22,6 +22,8 @@ CREATE INDEX comments_resource_id_idx ON comments (resource_id);
 -- Table structure for table resource
 --
 
+DROP TABLE IF EXISTS "resource";
+
 CREATE TABLE resource (
 id SERIAL,
 record_id varchar(255) NOT NULL DEFAULT '',
@@ -40,6 +42,8 @@ CREATE INDEX resource_record_id_idx ON resource (record_id);
 -- Table structure for table resource_tags
 --
 
+DROP TABLE IF EXISTS "resource_tags";
+
 CREATE TABLE resource_tags (
 id SERIAL,
 resource_id int NOT NULL DEFAULT '0',
@@ -61,6 +65,8 @@ CREATE INDEX resource_tags_list_id_idx ON resource_tags (list_id);
 -- Table structure for table search. Than fixed created column default value. Old value is 0000-00-00.
 --
 
+DROP TABLE IF EXISTS "search";
+
 CREATE TABLE search (
 id SERIAL,
 user_id int NOT NULL DEFAULT '0',
@@ -84,6 +90,8 @@ CREATE INDEX session_id_idx ON search (session_id);
 -- Table structure for table tags
 --
 
+DROP TABLE IF EXISTS "tags";
+
 CREATE TABLE tags (
 id SERIAL,
 tag varchar(64) NOT NULL DEFAULT '',
@@ -96,6 +104,8 @@ PRIMARY KEY (id)
 -- Table structure for table user
 --
 
+DROP TABLE IF EXISTS "user";
+
 CREATE TABLE "user"(
 id SERIAL,
 username varchar(255) NOT NULL DEFAULT '',
@@ -123,6 +133,8 @@ UNIQUE (username)
 -- Table structure for table user_list
 --
 
+DROP TABLE IF EXISTS "user_list";
+
 CREATE TABLE user_list (
 id SERIAL,
 user_id int NOT NULL,
@@ -141,6 +153,8 @@ CREATE INDEX user_list_user_id_idx ON user_list (user_id);
 -- Table structure for table user_resource
 --
 
+DROP TABLE IF EXISTS "user_resource";
+
 CREATE TABLE user_resource (
 id SERIAL,
 user_id int NOT NULL,
@@ -175,7 +189,7 @@ UNIQUE (session_id)
 CREATE INDEX last_used_idx on session(last_used);
 
 --
--- Table structure for table `change_tracker`
+-- Table structure for table change_tracker
 --
 
 DROP TABLE IF EXISTS "change_tracker";
@@ -192,7 +206,7 @@ PRIMARY KEY (core, id)
 CREATE INDEX change_tracker_deleted_idx on change_tracker(deleted);
 
 --
--- Table structure for table `oai_resumption`
+-- Table structure for table oai_resumption
 --
 
 DROP TABLE IF EXISTS "oai_resumption";
@@ -211,7 +225,7 @@ PRIMARY KEY (id)
 --
 
 --
--- Table structure for table `statistics`
+-- Table structure for table statistics
 --
 
 DROP TABLE IF EXISTS "user_stats_fields";
@@ -226,7 +240,7 @@ PRIMARY KEY (id, field)
 -- --------------------------------------------------------
 
 --
--- Table structure for table `user_stats`
+-- Table structure for table user_stats
 --
 
 DROP TABLE IF EXISTS "user_stats";
@@ -246,12 +260,12 @@ PRIMARY KEY (id)
 -- --------------------------------------------------------
 
 --
--- Table structure for table `record`
+-- Table structure for table record
 --
 
 DROP TABLE IF EXISTS "record";
 
-CREATE TABLE `record` (
+CREATE TABLE record (
   id serial NOT NULL,
   record_id varchar(255),
   source varchar(50),
@@ -265,12 +279,12 @@ CREATE TABLE `record` (
 -- --------------------------------------------------------
 
 -- 
--- Table structure for table `user_card`
+-- Table structure for table user_card
 --
 
 DROP TABLE IF EXISTS "user_card";
 
-CREATE TABLE `user_card` (
+CREATE TABLE user_card (
 id SERIAL,
 user_id int NOT NULL,
 card_name varchar(255) NOT NULL DEFAULT '',
diff --git a/module/VuFind/src/VuFind/Auth/CAS.php b/module/VuFind/src/VuFind/Auth/CAS.php
index 4fd2a760327c00afee1e65216f00bdd58657fca2..a6c76571738c1cf847e28ae736b06c7a0368372e 100644
--- a/module/VuFind/src/VuFind/Auth/CAS.php
+++ b/module/VuFind/src/VuFind/Auth/CAS.php
@@ -142,7 +142,7 @@ class CAS extends AbstractBase
             if (isset($cas->$attribute)) {
                 $value = $casauth->getAttribute($cas->$attribute);
                 if ($attribute != 'cat_password') {
-                    $user->$attribute = $value;
+                    $user->$attribute = ($value === null) ? '' : $value;
                 } else {
                     $catPassword = $value;
                 }
diff --git a/module/VuFind/src/VuFind/Auth/LDAP.php b/module/VuFind/src/VuFind/Auth/LDAP.php
index 6b24fcb654b1b7a52b909e685da0007415b08418..e006e17f15490afc75e8064f90fe2d56ee08d45d 100644
--- a/module/VuFind/src/VuFind/Auth/LDAP.php
+++ b/module/VuFind/src/VuFind/Auth/LDAP.php
@@ -280,7 +280,7 @@ class LDAP extends AbstractBase
                         $value = $data[$i][$configValue][0];
                         $this->debug("found $field = $value");
                         if ($field != "cat_password") {
-                            $user->$field = $value;
+                            $user->$field = ($value === null) ? '' : $value;
                         } else {
                             $catPassword = $value;
                         }
diff --git a/module/VuFind/src/VuFind/Auth/Shibboleth.php b/module/VuFind/src/VuFind/Auth/Shibboleth.php
index e837f5089c9b8ab4bf77a2f5b372a8dbbf3d182b..9a948e56a881a837a6c7d699aa5651df6009894f 100644
--- a/module/VuFind/src/VuFind/Auth/Shibboleth.php
+++ b/module/VuFind/src/VuFind/Auth/Shibboleth.php
@@ -114,7 +114,7 @@ class Shibboleth extends AbstractBase
             if (isset($shib->$attribute)) {
                 $value = $request->getServer()->get($shib->$attribute);
                 if ($attribute != 'cat_password') {
-                    $user->$attribute = $value;
+                    $user->$attribute = ($value === null) ? '' : $value;
                 } else {
                     $catPassword = $value;
                 }
diff --git a/module/VuFind/src/VuFind/Content/Covers/Factory.php b/module/VuFind/src/VuFind/Content/Covers/Factory.php
index 51bfa872808ee1919e582d018c4c7cf9c12f0de3..d6834ba6b086da4df2c9e4ea7ecb407cb46365eb 100644
--- a/module/VuFind/src/VuFind/Content/Covers/Factory.php
+++ b/module/VuFind/src/VuFind/Content/Covers/Factory.php
@@ -69,7 +69,7 @@ class Factory
     {
         $config = $sm->getServiceLocator()->get('VuFind\Config')->get('config');
         $url = isset($config->Booksite->url)
-            ? $config->Booksite->url  : 'https://api.booksite.com';
+            ? $config->Booksite->url : 'https://api.booksite.com';
         if (!isset($config->Booksite->key)) {
             throw new \Exception("Booksite 'key' not set in VuFind config");
         }
diff --git a/module/VuFind/src/VuFind/Content/Reviews/Factory.php b/module/VuFind/src/VuFind/Content/Reviews/Factory.php
index 67f8591e003fa1d3018c6a13d488ab01c5f96e35..e791a326ffdae5c18f29887dd05abb16e938196a 100644
--- a/module/VuFind/src/VuFind/Content/Reviews/Factory.php
+++ b/module/VuFind/src/VuFind/Content/Reviews/Factory.php
@@ -110,7 +110,7 @@ class Factory
     {
         $config = $sm->getServiceLocator()->get('VuFind\Config')->get('config');
         $url = isset($config->Booksite->url)
-            ? $config->Booksite->url  : 'https://api.booksite.com';
+            ? $config->Booksite->url : 'https://api.booksite.com';
         if (!isset($config->Booksite->key)) {
             throw new \Exception("Booksite 'key' not set in VuFind config");
         }
diff --git a/module/VuFind/src/VuFind/Cover/Generator.php b/module/VuFind/src/VuFind/Cover/Generator.php
index 9cf248bcc39b262caef83e32d2b26429b109150a..aa859f70473a889208fdd09d35e7baa083d8dbd8 100644
--- a/module/VuFind/src/VuFind/Cover/Generator.php
+++ b/module/VuFind/src/VuFind/Cover/Generator.php
@@ -712,9 +712,9 @@ class Generator
 
         $bc = str_split($bc);
         for ($k = 0;$k < 4;$k++) {
-            $x = $k % 2   ? $halfWidth : $halfWidth - $boxWidth;
+            $x = $k % 2 ? $halfWidth : $halfWidth - $boxWidth;
             $y = $k / 2 < 1 ? $halfHeight : $halfHeight - $boxHeight;
-            $u = $k % 2   ? $boxWidth : -$boxWidth;
+            $u = $k % 2 ? $boxWidth : -$boxWidth;
             $v = $k / 2 < 1 ? $boxHeight : -$boxHeight;
             for ($i = 0;$i < 16;$i++) {
                 if ($bc[$i] == "1") {
diff --git a/module/VuFind/src/VuFind/Db/Table/ResourceTags.php b/module/VuFind/src/VuFind/Db/Table/ResourceTags.php
index e42704dadc74a7ac8d3b18c6316ceebd130b4348..c7c2be073c15f59572058575cc400d65162aa25f 100644
--- a/module/VuFind/src/VuFind/Db/Table/ResourceTags.php
+++ b/module/VuFind/src/VuFind/Db/Table/ResourceTags.php
@@ -299,6 +299,30 @@ class ResourceTags extends Gateway
         $userId = null, $resourceId = null, $tagId = null
     ) {
         $callback = function ($select) use ($userId, $resourceId, $tagId) {
+            $select->columns(
+                [
+                    'resource_id' => new Expression(
+                        'MAX(?)', ['resource_tags.resource_id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    ),
+                    'tag_id' => new Expression(
+                        'MAX(?)', ['resource_tags.tag_id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    ),
+                    'list_id' => new Expression(
+                        'MAX(?)', ['resource_tags.list_id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    ),
+                    'user_id' => new Expression(
+                        'MAX(?)', ['resource_tags.user_id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    ),
+                    'id' => new Expression(
+                        'MAX(?)', ['resource_tags.id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    )
+                ]
+            );
             $select->join(
                 ['r' => 'resource'],
                 'resource_tags.resource_id = r.id',
@@ -313,8 +337,8 @@ class ResourceTags extends Gateway
             if (!is_null($tagId)) {
                 $select->where->equalTo('resource_tags.tag_id', $tagId);
             }
-            $select->group(["resource_id"]);
-            $select->order(["title"]);
+            $select->group(['resource_id', 'title']);
+            $select->order(['title']);
         };
         return $this->select($callback);
     }
@@ -332,6 +356,30 @@ class ResourceTags extends Gateway
     {
 
         $callback = function ($select) use ($userId, $resourceId, $tagId) {
+            $select->columns(
+                [
+                    'resource_id' => new Expression(
+                        'MAX(?)', ['resource_tags.resource_id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    ),
+                    'tag_id' => new Expression(
+                        'MAX(?)', ['resource_tags.tag_id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    ),
+                    'list_id' => new Expression(
+                        'MAX(?)', ['resource_tags.list_id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    ),
+                    'user_id' => new Expression(
+                        'MAX(?)', ['resource_tags.user_id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    ),
+                    'id' => new Expression(
+                        'MAX(?)', ['resource_tags.id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    )
+                ]
+            );
             $select->join(
                 ['t' => 'tags'],
                 'resource_tags.tag_id = t.id',
@@ -346,8 +394,8 @@ class ResourceTags extends Gateway
             if (!is_null($tagId)) {
                 $select->where->equalTo('resource_tags.tag_id', $tagId);
             }
-            $select->group(["tag_id"]);
-            $select->order(["tag"]);
+            $select->group(['tag_id', 'tag']);
+            $select->order(['tag']);
         };
         return $this->select($callback);
     }
@@ -364,6 +412,30 @@ class ResourceTags extends Gateway
     public function getUniqueUsers($userId = null, $resourceId = null, $tagId = null)
     {
         $callback = function ($select) use ($userId, $resourceId, $tagId) {
+            $select->columns(
+                [
+                    'resource_id' => new Expression(
+                        'MAX(?)', ['resource_tags.resource_id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    ),
+                    'tag_id' => new Expression(
+                        'MAX(?)', ['resource_tags.tag_id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    ),
+                    'list_id' => new Expression(
+                        'MAX(?)', ['resource_tags.list_id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    ),
+                    'user_id' => new Expression(
+                        'MAX(?)', ['resource_tags.user_id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    ),
+                    'id' => new Expression(
+                        'MAX(?)', ['resource_tags.id'],
+                        [Expression::TYPE_IDENTIFIER]
+                    )
+                ]
+            );
             $select->join(
                 ['u' => 'user'],
                 'resource_tags.user_id = u.id',
@@ -378,8 +450,8 @@ class ResourceTags extends Gateway
             if (!is_null($tagId)) {
                 $select->where->equalTo('resource_tags.tag_id', $tagId);
             }
-            $select->group(["user_id"]);
-            $select->order(["username"]);
+            $select->group(['user_id', 'username']);
+            $select->order(['username']);
         };
         return $this->select($callback);
     }
diff --git a/module/VuFind/src/VuFind/ILS/Driver/DAIA.php b/module/VuFind/src/VuFind/ILS/Driver/DAIA.php
index 6dbdd76f062bd88c769700b3a76d908577ff3892..f76e83471926585fe0968354b92dc3a39b89d293 100644
--- a/module/VuFind/src/VuFind/ILS/Driver/DAIA.php
+++ b/module/VuFind/src/VuFind/ILS/Driver/DAIA.php
@@ -362,7 +362,7 @@ class DAIA extends AbstractBase implements
     {
         $http_headers = [
             'Content-type: ' . $this->contentTypesRequest[$this->daiaResponseFormat],
-            'Accept: ' .  $this->contentTypesRequest[$this->daiaResponseFormat],
+            'Accept: ' . $this->contentTypesRequest[$this->daiaResponseFormat],
         ];
 
         $params = [
diff --git a/module/VuFind/src/VuFind/ILS/Driver/Unicorn.php b/module/VuFind/src/VuFind/ILS/Driver/Unicorn.php
index 139f90a487882ba7d5ebbeb0ca3e31402d903727..429f40e4f35d1447bff9055adb50f913d58b4dc8 100644
--- a/module/VuFind/src/VuFind/ILS/Driver/Unicorn.php
+++ b/module/VuFind/src/VuFind/ILS/Driver/Unicorn.php
@@ -322,7 +322,7 @@ class Unicorn extends AbstractBase implements \VuFindHttp\HttpServiceAwareInterf
             $cmp = create_function(
                 '$a,$b',
                 'if ($a["shelving_key"] == $b["shelving_key"]) '
-                .     'return $a["number"] - $b["number"];'
+                . 'return $a["number"] - $b["number"];'
                 . 'return $a["shelving_key"] < $b["shelving_key"] ? 1 : -1;'
             );
             usort($items, $cmp);
diff --git a/module/VuFind/src/VuFind/ILS/Driver/Virtua.php b/module/VuFind/src/VuFind/ILS/Driver/Virtua.php
index 2b957a8c4a802d37db28f347dad711895881b131..ec816b65964f521e63de5afa8b003a60e6c18121 100644
--- a/module/VuFind/src/VuFind/ILS/Driver/Virtua.php
+++ b/module/VuFind/src/VuFind/ILS/Driver/Virtua.php
@@ -1764,24 +1764,24 @@ class Virtua extends AbstractBase implements \VuFindHttp\HttpServiceAwareInterfa
 
         // Have to use raw post data because of the way
         //   virtua expects the barcodes to come across.
-        $post_data  = "function="      . "RENEWAL";
-        $post_data .= "&search="       . "PATRON";
-        $post_data .= "&sessionid="    . "$session_id";
-        $post_data .= "&skin="         . "homepage";
-        $post_data .= "&lng="          . $this->getConfiguredLanguage();
-        $post_data .= "&inst="         . "consortium";
-        $post_data .= "&conf="         . urlencode(".&#047;chameleon.conf");
-        $post_data .= "&u1="           . "12";
+        $post_data  = "function=" . "RENEWAL";
+        $post_data .= "&search=" . "PATRON";
+        $post_data .= "&sessionid=" . "$session_id";
+        $post_data .= "&skin=" . "homepage";
+        $post_data .= "&lng=" . $this->getConfiguredLanguage();
+        $post_data .= "&inst=" . "consortium";
+        $post_data .= "&conf=" . urlencode(".&#047;chameleon.conf");
+        $post_data .= "&u1=" . "12";
         $post_data .= "&SourceScreen=" . "PATRONACTIVITY";
-        $post_data .= "&pos="          . "1";
-        $post_data .= "&patronid="     . $patron['cat_username'];
+        $post_data .= "&pos=" . "1";
+        $post_data .= "&patronid=" . $patron['cat_username'];
         $post_data .= "&patronhost="
             . urlencode($this->config['Catalog']['patron_host']);
         $post_data .= "&host="
             . urlencode($this->config['Catalog']['host_string']);
-        $post_data .= "&itembarcode="  . implode("&itembarcode=", $item_list);
-        $post_data .= "&submit="       . "Renew";
-        $post_data .= "&reset="        . "Clear";
+        $post_data .= "&itembarcode=" . implode("&itembarcode=", $item_list);
+        $post_data .= "&submit=" . "Renew";
+        $post_data .= "&reset=" . "Clear";
 
         $result = $this->httpRequest($virtua_url, null, $post_data);
 
@@ -1832,7 +1832,7 @@ class Virtua extends AbstractBase implements \VuFindHttp\HttpServiceAwareInterfa
         }
 
         foreach ($result as $row) {
-            $list[] = 'vtls' .  str_pad($row['AUTH_ID'], 9, "0", STR_PAD_LEFT);
+            $list[] = 'vtls' . str_pad($row['AUTH_ID'], 9, "0", STR_PAD_LEFT);
         }
         return $list;
     }
diff --git a/module/VuFind/src/VuFind/ILS/Driver/VoyagerRestful.php b/module/VuFind/src/VuFind/ILS/Driver/VoyagerRestful.php
index f5f509923747adc9eda732c03dc53dff38fad281..1a89aab9a4154432e32767edddcda6d63d3d91fc 100644
--- a/module/VuFind/src/VuFind/ILS/Driver/VoyagerRestful.php
+++ b/module/VuFind/src/VuFind/ILS/Driver/VoyagerRestful.php
@@ -2449,7 +2449,7 @@ EOT;
             ? $details['level'] : 'copy';
         $itemId = isset($details['item_id']) ? $details['item_id'] : false;
         $mfhdId = isset($details['holdings_id']) ? $details['holdings_id'] : false;
-        $comment = $details['comment'];
+        $comment = isset($details['comment']) ? $details['comment'] : '';
         $bibId = $details['id'];
 
         // Make Sure Pick Up Location is Valid
diff --git a/module/VuFind/src/VuFind/Search/Tags/Results.php b/module/VuFind/src/VuFind/Search/Tags/Results.php
index abcd59608fa3d69cd5564d923148273bfb245511..fd69d91e2d632dbbe1163c7b23f5b25880f19007 100644
--- a/module/VuFind/src/VuFind/Search/Tags/Results.php
+++ b/module/VuFind/src/VuFind/Search/Tags/Results.php
@@ -48,7 +48,7 @@ class Results extends BaseResults
     protected function performSearch()
     {
         $table = $this->getTable('Tags');
-        $tag = $table->getByText($this->getParams()->getDisplayQuery());
+        $tag = $table->getByText($this->getParams()->getDisplayQuery(), false);
         if (!empty($tag)) {
             $rawResults = $tag->getResources(null, $this->getParams()->getSort());
         } else {
diff --git a/module/VuFind/src/VuFind/Service/Factory.php b/module/VuFind/src/VuFind/Service/Factory.php
index dd7ca59983f8ac5704cbbf251fab49c5c7e4a667..13ad96c8f6668dfb413fc2381bd9e9f4c94484eb 100644
--- a/module/VuFind/src/VuFind/Service/Factory.php
+++ b/module/VuFind/src/VuFind/Service/Factory.php
@@ -859,7 +859,7 @@ class Factory
         // Set up the ExtendedIni plugin:
         $config = $sm->get('VuFind\Config')->get('config');
         $pathStack = [
-            APPLICATION_PATH  . '/languages',
+            APPLICATION_PATH . '/languages',
             LOCAL_OVERRIDE_DIR . '/languages'
         ];
         $fallbackLocales = $config->Site->language == 'en'
diff --git a/module/VuFind/src/VuFind/XSLT/Import/VuFind.php b/module/VuFind/src/VuFind/XSLT/Import/VuFind.php
index 2a507eaed2c77cfffe84a1ff6690584d69b8b676..4862649f466a7a3ea3a0ee1cabfda80476c28ce7 100644
--- a/module/VuFind/src/VuFind/XSLT/Import/VuFind.php
+++ b/module/VuFind/src/VuFind/XSLT/Import/VuFind.php
@@ -366,7 +366,9 @@ class VuFind
     {
         static $articles = ['a', 'an', 'the'];
 
-        $text = strtolower(trim($in));
+        $text = is_callable('mb_strtolower')
+            ? mb_strtolower(trim($in), 'UTF-8')
+            : strtolower(trim($in));
 
         foreach ($articles as $a) {
             if (substr($text, 0, strlen($a) + 1) == ($a . ' ')) {
diff --git a/module/VuFindDevTools/src/VuFindDevTools/Controller/DevtoolsController.php b/module/VuFindDevTools/src/VuFindDevTools/Controller/DevtoolsController.php
index 3003ae5c32c9055ea5f26731f0cf9abbec171714..752bb3eb3a175a122652088a64a90bd63f3736a3 100644
--- a/module/VuFindDevTools/src/VuFindDevTools/Controller/DevtoolsController.php
+++ b/module/VuFindDevTools/src/VuFindDevTools/Controller/DevtoolsController.php
@@ -89,7 +89,7 @@ class DevtoolsController extends \VuFind\Controller\AbstractBase
     public function languageAction()
     {
         // Test languages with no local overrides and no fallback:
-        $loader = new ExtendedIni([APPLICATION_PATH  . '/languages']);
+        $loader = new ExtendedIni([APPLICATION_PATH . '/languages']);
         $helper = new LanguageHelper($loader, $this->getConfig());
         return $helper->getAllDetails($this->params()->fromQuery('main', 'en'));
     }
diff --git a/module/VuFindDevTools/src/VuFindDevTools/LanguageHelper.php b/module/VuFindDevTools/src/VuFindDevTools/LanguageHelper.php
index 222b746d9c525ec1f130c8d6b5418e167d192a6c..6628e741680c9496a1c71eb322a33aa2857afbdb 100644
--- a/module/VuFindDevTools/src/VuFindDevTools/LanguageHelper.php
+++ b/module/VuFindDevTools/src/VuFindDevTools/LanguageHelper.php
@@ -178,7 +178,7 @@ class LanguageHelper
     {
         static $domains = false;
         if (!$domains) {
-            $base = APPLICATION_PATH  . '/languages';
+            $base = APPLICATION_PATH . '/languages';
             $dir = opendir($base);
             $domains = [];
             while ($current = readdir($dir)) {
diff --git a/module/VuFindTheme/src/VuFindTheme/LessCompiler.php b/module/VuFindTheme/src/VuFindTheme/LessCompiler.php
index cdcd2ba2b99b07a5ee8ede49d2cd7658c3bc113b..17c4b3830cd8afa17c946ea6185d92821df0e1cb 100644
--- a/module/VuFindTheme/src/VuFindTheme/LessCompiler.php
+++ b/module/VuFindTheme/src/VuFindTheme/LessCompiler.php
@@ -181,7 +181,7 @@ class LessCompiler
         list($fileName, ) = explode('.', $less);
         $finalFile = $finalOutDir . $fileName . '.css';
 
-        $this->logMessage("\tcompiling '" . $less .  "' into '" . $finalFile . "'");
+        $this->logMessage("\tcompiling '" . $less . "' into '" . $finalFile . "'");
         $start = microtime(true);
 
         $directories = [];
diff --git a/packages/DEBIAN/changelog b/packages/DEBIAN/changelog
index 8524042a4452492bdf92b24e9c862c9bd62ca08a..06dce5e387af115f9d83a202d0b134fbda5306c1 100644
--- a/packages/DEBIAN/changelog
+++ b/packages/DEBIAN/changelog
@@ -1,3 +1,15 @@
+vufind 3.0.3 distribution; urgency=low
+
+  * VuFind 3.0.3 release (see http://vufind.org/wiki/changelog for details) 
+
+ -- maintainer VuFind Project Administration Team <vufind-admins@lists.sourceforge.net>  Mo 1 Aug 2016 09:01:21 UTC
+
+vufind 3.0.2 distribution; urgency=low
+
+  * VuFind 3.0.2 release (see http://vufind.org/wiki/changelog for details) 
+
+ -- maintainer VuFind Project Administration Team <vufind-admins@lists.sourceforge.net>  Tu 5 Jul 2016 12:02:33 UTC
+
 vufind 3.0.1 distribution; urgency=low
 
   * VuFind 3.0.1 release (see http://vufind.org/wiki/changelog for details) 
diff --git a/packages/DEBIAN/control b/packages/DEBIAN/control
index 9016c826dd19a96e416cca31060f97c4b9b82eca..059764350cc8d0b5fb97766472d0dfbfa932ea55 100644
--- a/packages/DEBIAN/control
+++ b/packages/DEBIAN/control
@@ -1,5 +1,5 @@
 Package: vufind
-Version: 3.0.1
+Version: 3.0.3
 Section: World Wide Web
 Priority: Optional
 Architecture: all
diff --git a/themes/bootstrap3/templates/admin/tags/list.phtml b/themes/bootstrap3/templates/admin/tags/list.phtml
index dac9f69aa2c79909cb4baeb22b07ddf11f81b69a..b6eb25e25951845b834526ac9fc1f4c39c686a92 100644
--- a/themes/bootstrap3/templates/admin/tags/list.phtml
+++ b/themes/bootstrap3/templates/admin/tags/list.phtml
@@ -53,7 +53,8 @@
               </select>
             </div>
             <div class="col-sm-3">
-              <input type="submit" value="<?=$this->transEsc('Filter')?>" class="btn btn-primary">
+              <label for="taglistsubmit">&nbsp;</label><br />
+              <input type="submit" id="taglistsubmit" value="<?=$this->transEsc('Filter')?>" class="btn btn-primary">
               <? if((isset($this->params['user_id']) && !is_null($this->params['user_id'])) || (isset($this->params['tag_id']) && !is_null($this->params['tag_id'])) || (isset($this->params['resource_id']) && !is_null($this->params['resource_id']))):?>
                 <a href="<?= $this->url('admin/tags', array('action' => 'List')); ?>"><?=$this->translate('clear_tag_filter')?></a>
               <? endif;?>
diff --git a/themes/bootstrap3/templates/cart/export.phtml b/themes/bootstrap3/templates/cart/export.phtml
index fc66aa6a5c3f5fa3a309007153244d97b8a5729a..bc064adfe8b7bb4b8b6522af771fc7bbd78c293c 100644
--- a/themes/bootstrap3/templates/cart/export.phtml
+++ b/themes/bootstrap3/templates/cart/export.phtml
@@ -39,15 +39,17 @@
       <label for="format" class="col-sm-3 control-label"><?=$this->transEsc('Format')?>:</label>
       <div class="col-sm-9">
         <select name="format" id="format" class="form-control">
+          <? $firstOption = null; ?>
           <? foreach ($this->exportOptions as $exportOption): ?>
-            <option value="<?=$this->escapeHtmlAttr($exportOption)?>"><?=$this->transEsc($this->export()->getLabelForFormat($exportOption))?></option>
+            <? if ($firstOption == null) $firstOption = $exportOption; ?>
+            <option value="<?=$this->escapeHtmlAttr($exportOption)?>"<? if($this->export()->needsRedirect($exportOption)): ?> data-redirect<? endif; ?>><?=$this->transEsc($this->export()->getLabelForFormat($exportOption))?></option>
           <? endforeach; ?>
         </select>
       </div>
     </div>
     <div class="form-group">
       <div class="col-sm-9 col-sm-offset-3">
-        <input class="btn btn-default" type="submit" name="submit" value="<?=$this->transEsc('Export')?>"/>
+        <input class="export btn btn-default" type="submit" name="submit" value="<?=$this->transEsc('Export')?>"<? if($this->export()->needsRedirect($firstOption)): ?> data-lightbox-ignore<? endif; ?>/>
       </div>
     </div>
   </form>
@@ -56,6 +58,13 @@
   $script = <<<JS
   $('button.btn.hidden').removeClass('hidden');
   $('#itemhide').removeClass('in');
+  $('#format').change(function exportFormatChange(e) {
+    if (this.selectedOptions[0].getAttribute('data-redirect') === null) {
+      $('.export.btn').removeAttr('data-lightbox-ignore');
+    } else {
+      $('.export.btn').attr('data-lightbox-ignore', '1');
+    }
+  });
 JS;
 ?>
 <?=$this->inlineScript(\Zend\View\Helper\HeadScript::SCRIPT, $script, 'SET') ?>
\ No newline at end of file
diff --git a/themes/bootstrap3/templates/upgrade/getsourcedir.phtml b/themes/bootstrap3/templates/upgrade/getsourcedir.phtml
index e0bf64956b24479275cfc090124cb24f5345e76e..4ac38abb410e09868fe948ab20911aaebe822feb 100644
--- a/themes/bootstrap3/templates/upgrade/getsourcedir.phtml
+++ b/themes/bootstrap3/templates/upgrade/getsourcedir.phtml
@@ -13,7 +13,7 @@
   <input type="text" name="sourcedir" /> <input class="btn btn-default" type="submit" />
 </form>
 <hr />
-<h3>Option 2: Upgrade from VuFind 2.x</h3>
+<h3>Option 2: Upgrade from VuFind 2.x or newer</h3>
 <form class="form-inline" method="post" action="<?=$this->url('upgrade-getsourceversion')?>">
   <p>
     Please enter the version number you are upgrading from (e.g. 2.0.1):
diff --git a/themes/foundation5/scss/default.scss b/themes/foundation5/scss/default.scss
index 122f85b7010a4d04de1e3ea987b943215dd77e8a..a755b79c918872942c19f5ad6e7ec4972161dc6e 100644
--- a/themes/foundation5/scss/default.scss
+++ b/themes/foundation5/scss/default.scss
@@ -183,9 +183,10 @@ ul {
         }
       }
 
+      // make sure it doesn't bleed through - fixme
       .active {
-//        background-color: $primary-color;
-//        color: $white !important;
+        background-color: $primary-color;
+        color: lighten($side-nav-link-color-active, 40%);
         z-index: 2;
 
         &:hover {background-color: lighten($secondary-color,5%);}
@@ -915,17 +916,28 @@ img.recordcover {
 // SIDEBAR filters - "remove filters"
 .sidebar .filters {
   // first title reposition and borders
-  .title:first-of-type { border-left:1px solid $primary-color; border-right:1px solid $primary-color; border-top:1px solid $primary-color; padding-left: 1rem }
+  .title:first-of-type {
+    border-left:1px solid $primary-color;
+    border-right:1px solid $primary-color;
+    border-top:1px solid $primary-color;
+    padding-left: 1rem;
+  }
   // Sidebar filters highlight chosen filter
   ul.side-nav li .active {
     background-color: $primary-color;
     color: #fff;
     padding-left: 1rem;
-    span {padding-right:.27rem;padding-top:0;}
-    &:hover, &:focus {
+
+    span {
+      padding-right: .27rem;
+      padding-top: 0;
+    }
+
+    &:hover,
+    &:focus {
       background-color: lighten($primary-color,5%);
       color: invert($side-nav-link-color);
-  }
+    }
   }
 
   // Borders around remove-filters-button
diff --git a/themes/foundation5/templates/admin/tags/checkbox.phtml b/themes/foundation5/templates/admin/tags/checkbox.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..838852bf5fb09ee096a927ef60c8dcefdc9def66
--- /dev/null
+++ b/themes/foundation5/templates/admin/tags/checkbox.phtml
@@ -0,0 +1,8 @@
+<!-- admin - tags - checkbox.phtml -->
+<div class="checkbox">
+  <label for="<?=$this->prefix?>checkbox_<?=$this->tag['id']?>">
+    <input id="<?=$this->prefix?>checkbox_<?=$this->tag['id']?>" type="checkbox" name="ids[]" value="<?=$this->escapeHtmlAttr($this->tag['id'])?>" class="checkbox_ui"/>
+    <input type="hidden" name="idsAll[]" value="<?=$this->escapeHtmlAttr($this->tag['id'])?>" />
+  </label>
+</div>
+<!-- admin - tags - checkbox.phtml - END -->
\ No newline at end of file
diff --git a/themes/foundation5/templates/admin/tags/home.phtml b/themes/foundation5/templates/admin/tags/home.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..fa16398d71d5dc147f59174cc28aad26893335bf
--- /dev/null
+++ b/themes/foundation5/templates/admin/tags/home.phtml
@@ -0,0 +1,35 @@
+<!-- admin - tags - home.phtml -->
+<?
+  // Set page title.
+  $this->headTitle($this->translate('VuFind Administration - Tag Management'));
+?>
+<div class="row">
+  <div class="<?=$this->layoutClass('mainbody')?>">
+    <h2><?=$this->translate('Tag Management')?></h2>
+
+    <?=$this->render("admin/tags/menu.phtml")?>
+
+    <h3><?=$this->translate('Statistics')?></h3>
+    <table>
+      <tr>
+        <th><?=$this->transEsc('total_users')?></th>
+        <th><?=$this->transEsc('total_resources')?></th>
+        <th><?=$this->transEsc('total_tags')?></th>
+        <th><?=$this->transEsc('unique_tags')?></th>
+        <th><?=$this->transEsc('anonymous_tags')?></th>
+      </tr>
+      <tr>
+        <td><?=$statistics['users']?></td>
+        <td><?=$statistics['resources']?></td>
+        <td><?=$statistics['total']?></td>
+        <td><?=$statistics['unique']?></td>
+        <td><?=$statistics['anonymous']?></td>
+      </tr>
+    </table>
+  </div>
+
+  <div class="<?=$this->layoutClass('sidebar')?>">
+    <?=$this->render("admin/menu.phtml")?>
+  </div>
+</div>
+<!-- admin - tags - home.phtml - END -->
\ No newline at end of file
diff --git a/themes/foundation5/templates/admin/tags/list.phtml b/themes/foundation5/templates/admin/tags/list.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..cd9ab0753b3d516cf99ef0b1be33fe7d800042f7
--- /dev/null
+++ b/themes/foundation5/templates/admin/tags/list.phtml
@@ -0,0 +1,112 @@
+<!-- admin - tags - list.phtml -->
+<?php
+  // Set page title.
+  $this->headTitle($this->translate('VuFind Administration - Tag Management'));
+?>
+
+<div class="row">
+  <div class="<?=$this->layoutClass('mainbody')?>">
+    <h2><?=$this->translate('Tag Management')?></h2>
+    <h3><?=$this->translate('List Tags')?></h3>
+
+    <?=$this->render("admin/tags/menu.phtml")?>
+
+    <?=$this->flashmessages()?>
+
+    <div class="tagForm">
+      <form action="<?= $this->url('admin/tags', array('action' => 'List'))?>" method="get">
+
+        <fieldset>
+          <legend><?=$this->translate('filter_tags')?></legend>
+
+          <div class="row">
+            <div class="medium-3 columns">
+              <label for="user_id"><?=$this->translate('Username')?></label>
+              <select name="user_id" id="user_id">
+                <option value="ALL"><?=$this->translate('All')?></option>
+                <? foreach($this->uniqueUsers as $user):?>
+                  <option value="<?= $user['user_id'] ?>"<? if(isset($this->params['user_id']) && $user['user_id'] == $this->params['user_id']): ?> selected="selected"<? endif;?>>
+                    <?=$user['username'] ?>
+                  </option>
+                <? endforeach;?>
+              </select>
+            </div>
+            <div class="medium-3 columns">
+              <label for="tag_id"><?=$this->translate('Tag')?></label>
+              <select name="tag_id" id="tag_id">
+                <option value="ALL"><?=$this->translate('All')?></option>
+                <? foreach($this->uniqueTags as $tag):?>
+                <option value="<?= $tag['tag_id'] ?>"<? if(isset($this->params['tag_id']) && $tag['tag_id'] == $this->params['tag_id']): ?> selected="selected"<? endif;?>>
+                    <?=$tag['tag'] ?>
+                </option>
+                <? endforeach;?>
+              </select>
+            </div>
+            <div class="medium-3 columns">
+              <label for="resource_id"><?=$this->translate('Title')?></label>
+              <select name="resource_id" id="resource_id">
+                <option value="ALL"><?=$this->translate('All')?></option>
+                <? foreach($this->uniqueResources as $resource):?>
+                <option value="<?= $resource['resource_id']; ?>" title="<?=$resource['title'] ?>"<? if(isset($this->params['resource_id']) && $resource['resource_id'] == $this->params['resource_id']): ?> selected="selected"<? endif;?>>
+                    <?=$this->truncate($resource['title'], 80) ?> (<?=$resource['resource_id'] ?>)
+                </option>
+                <? endforeach;?>
+              </select>
+            </div>
+            <div class="medium-3 columns">
+              <label for="taglistsubmit">&nbsp;</label>
+              <input type="submit" id="taglistsubmit" value="<?=$this->transEsc('Filter')?>" class="button small">
+              <? if((isset($this->params['user_id']) && !is_null($this->params['user_id'])) || (isset($this->params['tag_id']) && !is_null($this->params['tag_id'])) || (isset($this->params['resource_id']) && !is_null($this->params['resource_id']))):?>
+                <a href="<?= $this->url('admin/tags', array('action' => 'List')); ?>"><?=$this->translate('clear_tag_filter')?></a>
+              <? endif;?>
+            </div>
+          </div>
+
+        </fieldset>
+
+      </form>
+    </div>
+
+    <? if(count($this->results) > 0):?>
+      <div class="tagsList">
+        <form action="<?= $this->url('admin/tags', array('action' => 'Delete'))?>" method="post">
+          <input type="hidden" name="user_id" value="<?=isset($this->params['user_id']) ? $this->params['user_id'] : '' ?>" />
+          <input type="hidden" name="tag_id" value="<?=isset($this->params['tag_id']) ? $this->params['tag_id'] : '' ?>" />
+          <input type="hidden" name="resource_id" value="<?=isset($this->params['resource_id']) ? $this->params['resource_id'] : '' ?>" />
+          <input type="hidden" name="origin" value="list" />
+
+          <table>
+            <tr>
+              <th>&nbsp;</th>
+              <th><?=$this->translate('Username')?></th>
+              <th><?=$this->translate('Tag')?></th>
+              <th><?=$this->translate('Title')?></th>
+            </tr>
+
+            <? foreach ($this->results as $tag): ?>
+              <tr>
+                <td><?=$this->render('admin/tags/checkbox', array('tag'=>$tag)) ; ?></td>
+                <td><?=$tag->username ?> (<?= $tag->user_id?>)</td>
+                <td><?=$tag->tag?> (<?= $tag->tag_id?>)</td>
+                <td><?=$tag->title?> (<?= $tag->resource_id?>)</td>
+              </tr>
+            <? endforeach;?>
+          </table>
+
+          <input type="submit" name="deleteSelected" value="<?=$this->transEsc('delete_selected')?>" class="button small">
+          <input type="submit" name="deletePage" value="<?=$this->transEsc('delete_page')?>" class="button small">
+          <input type="submit" name="deleteFilter" value="<?=$this->transEsc('delete_all')?>" class="button small">
+
+        </form>
+      </div>
+      <?=$this->paginationControl($this->results, 'Sliding', 'Helpers/pagination.phtml', array('params' => $this->params))?>
+    <? else:?>
+      <p><?=$this->translate('tag_filter_empty')?></p>
+    <? endif;?>
+  </div>
+
+  <div class="<?=$this->layoutClass('sidebar')?>">
+    <?=$this->render("admin/menu.phtml")?>
+  </div>
+</div>
+<!-- admin - tags - list.phtml - END -->
\ No newline at end of file
diff --git a/themes/foundation5/templates/admin/tags/manage.phtml b/themes/foundation5/templates/admin/tags/manage.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..23756ecc370c81f521b1ae50602a121969773765
--- /dev/null
+++ b/themes/foundation5/templates/admin/tags/manage.phtml
@@ -0,0 +1,93 @@
+<!-- admin - tags - manage.phtml -->
+<?
+  // Set page title.
+  $this->headTitle($this->translate('VuFind Administration - Tag Maintenance'));
+?>
+<div class="row">
+  <div class="<?=$this->layoutClass('mainbody')?>">
+    <h2><?=$this->translate('Tag Management')?></h2>
+    <h3><?=$this->translate('Manage Tags')?></h3>
+
+    <?=$this->render("admin/tags/menu.phtml")?>
+
+    <?=$this->flashmessages()?>
+
+    <form action="<?= $this->url('admin/tags', array('action' => 'Manage'));?>" method="post" role="form">
+      <div class="row">
+        <label for="type" class="medium-2 columns"><?=$this->translate('delete_tags_by')?>:</label>
+        <div class="medium-6 columns">
+          <select id="type" name="type">
+            <option value="user" <? if("user" == $this->type) echo " selected=selected";?>><?=$this->translate('Username')?></option>
+            <option value="tag" <? if("tag" == $this->type) echo " selected=selected";?>><?=$this->translate('Tag')?></option>
+            <option value="resource" <? if("resource" == $this->type) echo " selected=selected";?>><?=$this->translate('Title')?></option>
+          </select>
+        </div>
+        <div class="medium-4 columns">
+          <input type="submit" value="<?=$this->translate('Submit')?>" class="button small"/>
+        </div>
+      </div>
+    </form>
+
+    <? if(false !== $this->type):?>
+      <form action="<?= $this->url('admin/tags', array('action' => 'Delete'))?>" method="post">
+        <input type="hidden" name="origin" value="manage" />
+        <input type="hidden" name="type" value="<?= $this->type; ?>" />
+        <? if("user" == $type):?>
+          <div class="row">
+            <label for="user_id" class="medium-2 columns"><?=$this->translate('Username')?></label>
+            <div class="medium-6 columns">
+              <select name="user_id" id="user_id">
+                <? foreach($this->uniqueUsers as $user):?>
+                <option value="<?= $user['user_id'] ?>">
+                  <?= $user['username'] ?>
+                </option>
+                <? endforeach;?>
+              </select>
+            </div>
+            <div class="medium-4 columns">
+              <input type="submit"  name="deleteFilter" value="<?=$this->translate('delete_tags')?>" class="button small"/>
+            </div>
+          </div>
+        <? elseif("tag" == $type):?>
+          <div class="row">
+            <label for="tag_id" class="medium-2 columns"><?=$this->translate('Tag')?></label>
+            <div class="medium-6 columns">
+              <select name="tag_id" id="tag_id">
+                <? foreach($this->uniqueTags as $tag):?>
+                <option value="<?= $tag['tag_id'] ?>">
+                    <?= $tag['tag'] ?>
+                </option>
+                <? endforeach;?>
+              </select>
+            </div>
+            <div class="medium-4 columns">
+              <input type="submit" name="deleteFilter" value="<?=$this->translate('delete_tags')?>" class="button small"/>
+            </div>
+          </div>
+        <? elseif("resource" == $type):?>
+          <div class="row">
+            <label for="resource_id" class="medium-2 columns"><?=$this->translate('Title')?></label>
+            <div class="medium-6 columns">
+              <select name="resource_id" id="resource_id">
+                <? foreach($this->uniqueResources as $resource):?>
+                <option value="<?=$resource['resource_id'] ?>" title="<?=$resource['title'] ?>">
+                  <?=$this->truncate($resource['title'], 80) ?> (<?= $resource['resource_id'] ?>)
+                </option>
+                <? endforeach;?>
+              </select>
+            </div>
+            <div class="medium-4 columns">
+              <input type="submit" name="deleteFilter" value="<?=$this->translate('delete_tags')?>" class="button small"/>
+            </div>
+          </div>
+        <? endif;?>
+      </form>
+    <? endif;?>
+
+  </div>
+
+  <div class="<?=$this->layoutClass('sidebar')?>">
+    <?=$this->render("admin/menu.phtml")?>
+  </div>
+</div>
+<!-- admin - tags - manage.phtml - END -->
\ No newline at end of file
diff --git a/themes/foundation5/templates/admin/tags/menu.phtml b/themes/foundation5/templates/admin/tags/menu.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..bcc61572ef0d80f4250511e7aaf9a4885f1cc1d1
--- /dev/null
+++ b/themes/foundation5/templates/admin/tags/menu.phtml
@@ -0,0 +1,8 @@
+<!-- admin - tags - toolbar.phtml -->
+<div class="toolbar">
+  <dl class="nav sub-nav">
+    <dd<?=strtolower($this->layout()->templateName) == "tagslist" ? ' class="active"' : ''?>><a href="<?=$this->url('admin/tags', array('action' => 'List'))?>"><?=$this->transEsc('List Tags')?></a></dd>
+    <dd<?=strtolower($this->layout()->templateName) == "tagsmanage" ? ' class="active"' : ''?>><a href="<?=$this->url('admin/tags', array('action' => 'Manage'))?>"><?=$this->transEsc('Manage Tags')?></a></dd>
+  </dl>
+</div>
+<!-- admin - tags - toolbar.phtml - END -->
\ No newline at end of file
diff --git a/themes/foundation5/templates/cart/export.phtml b/themes/foundation5/templates/cart/export.phtml
index 28c2166fc8958b0dc79eca8e70070a5b3c525786..4b2e2791e8ffef781671b2c7697d238d41500f15 100644
--- a/themes/foundation5/templates/cart/export.phtml
+++ b/themes/foundation5/templates/cart/export.phtml
@@ -24,7 +24,7 @@ $this->layout()->breadcrumbs = '<li>' . $this->searchMemory()->getLastSearchLink
           <button type="button" class="button secondary small hide" data-dropdown="itemhide"  aria-controls="itemhide" aria-expanded="false">
             <?=count($this->records).' '.$this->transEsc('items') ?>
           </button>
-          <ul id="itemhide" class="f-dropdown" data-dropdown-content aria-hidden="true" tabindex="-1">
+          <ul id="itemhide" class="f-dropdown open" data-dropdown-content aria-hidden="true" tabindex="-1">
             <? foreach ($this->records as $current): ?>
               <li><?=$this->escapeHtml($current->getBreadcrumb())?></li>
             <? endforeach; ?>
@@ -39,14 +39,15 @@ $this->layout()->breadcrumbs = '<li>' . $this->searchMemory()->getLastSearchLink
       <div class="medium-9 columns">
         <select name="format" id="format" class="auto-width">
           <? foreach ($this->exportOptions as $exportOption): ?>
-            <option value="<?=$this->escapeHtmlAttr($exportOption)?>"><?=$this->transEsc($this->export()->getLabelForFormat($exportOption))?></option>
+            <? if ($firstOption == null) $firstOption = $exportOption; ?>
+            <option value="<?=$this->escapeHtmlAttr($exportOption)?>"<? if($this->export()->needsRedirect($exportOption)): ?> data-redirect<? endif; ?>><?=$this->transEsc($this->export()->getLabelForFormat($exportOption))?></option>
           <? endforeach; ?>
         </select>
       </div>
     </div>
     <div class="row">
       <div class="medium-9 columns medium-offset-3">
-        <input class="button secondary small" type="submit" name="submit" value="<?=$this->transEsc('Export')?>"/>
+        <input class="button secondary small" type="submit" name="submit" value="<?=$this->transEsc('Export')?>" <? if($this->export()->needsRedirect($firstOption)): ?> data-lightbox-ignore<? endif; ?>/>
       </div>
     </div>
   </form>
@@ -54,6 +55,14 @@ $this->layout()->breadcrumbs = '<li>' . $this->searchMemory()->getLastSearchLink
 <?
 $script = <<<JS
   $('button.button.hide').removeClass('hide');
+  $('#itemhide').removeClass('open');
+  $('#format').change(function exportFormatChange(e) {
+    if (this.selectedOptions[0].getAttribute('data-redirect') === null) {
+      $('.export.button').removeAttr('data-lightbox-ignore');
+    } else {
+      $('.export.button').attr('data-lightbox-ignore', '1');
+    }
+  });
 JS;
 ?>
 <?=$this->inlineScript(\Zend\View\Helper\HeadScript::SCRIPT, $script, 'SET') ?>
diff --git a/themes/foundation5/templates/devtools/deminify.phtml b/themes/foundation5/templates/devtools/deminify.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..daf211ce6f01a74cf93414a10be1ace95755a225
--- /dev/null
+++ b/themes/foundation5/templates/devtools/deminify.phtml
@@ -0,0 +1,39 @@
+<?
+    $this->headTitle('Deminifier');
+?>
+
+<h2>Deminifier</h2>
+
+<? if (!$min): ?>
+  <form method='POST'>
+    Minified text:
+    <textarea name="min"></textarea>
+    <input type="submit" />
+  </form>
+<? else: ?>
+  <h3>Minified Object</h3>
+  <pre><? print_r($min) ?></pre>
+<? endif; ?>
+
+<? if ($results): ?>
+  <h3>Results Object</h3>
+  <p>Class: <?=get_class($results)?></p>
+<? endif; ?>
+
+<? if ($query): ?>
+  <h3>Query Object</h3>
+  <pre><? print_r($query) ?></pre>
+<? endif; ?>
+
+<? if ($backendParams || $queryParams): ?>
+  <h3>Backend Parameters</h3>
+  <? if ($queryParams): ?>
+    <h4>Query Parameters</h4>
+    <pre><? print_r($queryParams) ?></pre>
+  <? endif ; ?>
+  <? if ($backendParams): ?>
+    <h4>Non-query Parameters</h4>
+    <pre><? print_r($backendParams) ?></pre>
+  <? endif ; ?>
+<? endif; ?>
+
diff --git a/themes/foundation5/templates/upgrade/getsourcedir.phtml b/themes/foundation5/templates/upgrade/getsourcedir.phtml
index f8800a7e25c7b172930dd99872332f36c0032235..32fb4324f8c2d14c3488c3ad382a045ead3d4c93 100644
--- a/themes/foundation5/templates/upgrade/getsourcedir.phtml
+++ b/themes/foundation5/templates/upgrade/getsourcedir.phtml
@@ -13,7 +13,7 @@ $this->layout()->breadcrumbs = '<li><a href="' . $this->url('upgrade-home') . '"
   <input type="text" name="sourcedir"/> <input class="button secondary small" type="submit" aria-label="submit form"/>
 </form>
 <hr />
-<h3>Option 2: Upgrade from VuFind 2.x</h3>
+<h3>Option 2: Upgrade from VuFind 2.x or newer</h3>
 <form class="form-inline" method="post" action="<?=$this->url('upgrade-getsourceversion')?>">
   <p>
     Please enter the version number you are upgrading from (e.g. 2.0.1):
diff --git a/themes/root/templates/HelpTranslations/ar/advsearch.phtml b/themes/root/templates/HelpTranslations/ar/advsearch.phtml
index be6eef7bab0c9534008fbc217d38a75af474bfc8..d99289abcfef191e9bde7797c1ac1251f419f39e 100644
--- a/themes/root/templates/HelpTranslations/ar/advsearch.phtml
+++ b/themes/root/templates/HelpTranslations/ar/advsearch.phtml
@@ -8,7 +8,7 @@
 <dl class="Content">
   <dt><a name="Search Fields"></a>حقول البحث</dt>
   <dd>
-    <p>حين تقوم بزيارة صفحة البحث المتقدم لأول مرة، سوف تظهر لك العديد من حقول البحث. في كل حقل يمكنك كتابة الكلمات المفتاحية التي ترغب في البحث عنها، مع إمكانية استخدام <a href="Home?topic=search">معاملات البحث</a>
+    <p>حين تقوم بزيارة صفحة البحث المتقدم لأول مرة، سوف تظهر لك العديد من حقول البحث. في كل حقل يمكنك كتابة الكلمات المفتاحية التي ترغب في البحث عنها، مع إمكانية استخدام <a href="<?=$this->url('help-home')?>?topic=search">معاملات البحث</a>
        .</p>
     <p>يكون كل حقل مصحوبا بقائمة منسدلة تتيح لك تحديد الحقل (العنوان، المؤلف، إلخ) التي تود البحث عنها. يمكنك مزج ومطابقة أنواع البحث كيفما تشاء.</p>
     <p>يتيح لك إعداد "مطابقة" تحديد كيفية التعامل مع الحقول المتعددة للبحث.</p>
diff --git a/themes/root/templates/HelpTranslations/de/advsearch.phtml b/themes/root/templates/HelpTranslations/de/advsearch.phtml
index 7315c61993e85f2ecd25ba40a02f16ea93db18db..eeae7847eb155ffe60400692152edcb877eee077 100644
--- a/themes/root/templates/HelpTranslations/de/advsearch.phtml
+++ b/themes/root/templates/HelpTranslations/de/advsearch.phtml
@@ -10,7 +10,7 @@
   <dd>
     <p>Wenn Sie das erste Mal die erweiterte Suche aufrufen, erscheinen 
        verschiedene Suchfelder. In jedem Feld können Sie einen Suchbegriff 
-       eingeben. Folgende <a href="Home?topic=search">Suchoperatoren</a>
+       eingeben. Folgende <a href="<?=$this->url('help-home')?>?topic=search">Suchoperatoren</a>
        sind erlaubt.</p>
     <p>Jedes Eingabefeld ist mit einem Auswahlmenü versehen, mit welchem Sie das
        Suchfeld auswählen können (z.B. Titel, Autor). Sie können auch
diff --git a/themes/root/templates/HelpTranslations/el/advsearch.phtml b/themes/root/templates/HelpTranslations/el/advsearch.phtml
index 0e54ad51bebd8818c295860b4b86ac7c977599a6..4e9cab7f7c8e58e998737a8d1fae80109aaaf3d6 100644
--- a/themes/root/templates/HelpTranslations/el/advsearch.phtml
+++ b/themes/root/templates/HelpTranslations/el/advsearch.phtml
@@ -1,14 +1,16 @@
-<h1>Συμβουλές Σύνθετης Αναζήτησης</h1>

+<h1>Συμβουλές Σύνθετης Αναζήτησης</h1>
+
 <ul class="HelpMenu">
   <li><a href="#Search Fields">Πεδία Αναζήτησης</a></li>
   <li><a href="#Search Groups">Ομάδες Αναζήτησης</a></li>
-</ul>

+</ul>
+
 <dl class="Content">
   <dt><a name="Search Fields"></a>Πεδία Αναζήτησης</dt>
   <dd>
     <p>Όταν επισκέπτεστε αρχικά τη σελίδα "Σύνθετη αναζήτηση", σας παρουσιάζονται 
        διάφορα πεδία έρευνας. Σε κάθε πεδίο, μπορείτε να πληκτρολογήσετε τις λέξεις-κλειδιά που
-       θέλετε να αναζητήσετε.  <a href="Home?topic=search">Τελεστές Αναζήτησης</a>
+       θέλετε να αναζητήσετε.  <a href="<?=$this->url('help-home')?>?topic=search">Τελεστές Αναζήτησης</a>
        επιτρέπονται.</p>
     <p>Κάθε πεδίο συνοδεύεται από ένα drop-down menu που σας επιτρέπει να προσδιορίζεται το είδος
        των δεδομένων (τίτλος, συγγραφέας, κλπ.) που αναζητάτε. Μπορείτε να συνδυάσετε και
@@ -21,7 +23,8 @@
     </ul>
     <p>Η επιλογή "Προσθήκη Search Field" μπορεί να χρησιμοποιηθεί για να προσθέσετε επιπλέον πεδία αναζήτησης
        στη φόρμα. Μπορείτε να χρησιμοποιήσετε όσα πεδία αναζήτησης όπως εσείς επιθυμείτε.</p>
-  </dd>
  
+  </dd>
+  
   <dt><a name="Search Groups"></a>Ομάδες Αναζήτησης</dt>
   <dd>
     <p>Για ορισμένες σύνθετες αναζητήσεις, ένα ενιαίο σύνολο πεδίων έρευνας δεν είναι
@@ -45,4 +48,5 @@
           "Όλες οι ομάδες".</li>
     </ul>
   </dd>
-</dl>

+</dl>
+
diff --git a/themes/root/templates/HelpTranslations/en/advsearch.phtml b/themes/root/templates/HelpTranslations/en/advsearch.phtml
index 6982652734ebf6c965e2cd42063c8d6d34b9cf34..64d18992d1ee1d79a94c99b367b30d671c7451eb 100644
--- a/themes/root/templates/HelpTranslations/en/advsearch.phtml
+++ b/themes/root/templates/HelpTranslations/en/advsearch.phtml
@@ -10,7 +10,7 @@
   <dd>
     <p>When you first visit the Advanced Search page, you are presented with 
        several search fields.  In each field, you can type the keywords you 
-       want to search for.  <a href="Home?topic=search">Search operators</a>
+       want to search for.  <a href="<?=$this->url('help-home')?>?topic=search">Search operators</a>
        are allowed.</p>
     <p>Each field is accompanied by a drop-down that lets you specify the type 
        of data (title, author, etc.) you are searching for.  You can mix and
diff --git a/themes/root/templates/HelpTranslations/es/advsearch.phtml b/themes/root/templates/HelpTranslations/es/advsearch.phtml
index 691d515ffb0a08888a63f83a5fccdf7b9347cd97..d90ce8e98aeec2384911c6e93aa0a212bad0f50a 100644
--- a/themes/root/templates/HelpTranslations/es/advsearch.phtml
+++ b/themes/root/templates/HelpTranslations/es/advsearch.phtml
@@ -9,7 +9,7 @@
   <dt><a name="Search Fields"></a>Campos de Búsqueda</dt>
   <dd>
     <p>Visitando la Búsqueda Avanzada por primera vez, aparecen varios campos de búsqueda.
-       En cada campo puede introducir los términos de búsuqueda. Los <a href="Home?topic=search">Operadores de búsqueda</a> están permitidos.
+       En cada campo puede introducir los términos de búsuqueda. Los <a href="<?=$this->url('help-home')?>?topic=search">Operadores de búsqueda</a> están permitidos.
     </p>
     <p>Cada campo va acompañado de un listado con el cual se puede especificar el tipo de datos (título, autor, etc.) que está buscando.
        En búsqueda avanzada puede combinar y ajustar los tipos de búsqueda según desea.
diff --git a/themes/root/templates/HelpTranslations/fr/advsearch.phtml b/themes/root/templates/HelpTranslations/fr/advsearch.phtml
index 9c1fecd8a4a9b868984255c8afa2ce56dd851726..1aa65e2bca239c776818e6baf413c3edb902f5dc 100644
--- a/themes/root/templates/HelpTranslations/fr/advsearch.phtml
+++ b/themes/root/templates/HelpTranslations/fr/advsearch.phtml
@@ -11,7 +11,7 @@
     <p>Lorsque vous visitez la première fois la recherche avancée, plusieures
        champs de saisie vous sont présentés. Vous pouvez taper dans chaque
        champ de saisie tous les mots que vous désirez rechercher. Certaines 
-       chaînes de caractères, ou <a href="Home?topic=search">« opérateurs »</a>
+       chaînes de caractères, ou <a href="<?=$this->url('help-home')?>?topic=search">« opérateurs »</a>
        , modifient le comportement VuFind.
     </p>
     <p>Chaque champ est accomapgner par un menu déroulant, avec lequel vous
diff --git a/themes/root/templates/HelpTranslations/ga/advsearch.phtml b/themes/root/templates/HelpTranslations/ga/advsearch.phtml
index ec81dfae9003457acb21d917acc895f0b4d2182f..cdc5bc7160f1227a31c211a4573c0ea7032f895b 100644
--- a/themes/root/templates/HelpTranslations/ga/advsearch.phtml
+++ b/themes/root/templates/HelpTranslations/ga/advsearch.phtml
@@ -9,7 +9,7 @@
 <dl class="Content">
   <dt><a name="Search Fields"></a>Cuardaigh Réimsí</dt>
   <dd>
-    <p>Cuirtear roinnt réimsí cuardaigh os do chomhair nuair a théann tú go leathanach an Chuardaigh Chasta. Féadfaidh tú na heochairfhocail atá uait a chlóscríobh i ngach réimse. Ceadaítear <a href="Home?topic=search" onClick="return (false);">Oibreoirí cuardaigh</a> a úsáid</p>
+    <p>Cuirtear roinnt réimsí cuardaigh os do chomhair nuair a théann tú go leathanach an Chuardaigh Chasta. Féadfaidh tú na heochairfhocail atá uait a chlóscríobh i ngach réimse. Ceadaítear <a href="<?=$this->url('help-home')?>?topic=search">Oibreoirí cuardaigh</a> a úsáid</p>
     <p>Bíonn roghchlár anuas in éineacht le gach réimse, a chuireann ar do chumas an cineál sonra (teideal, údar, srl.) atá uait a shonrú. Féadfaidh tú na cineálacha éagsúla cuardaigh a úsáid in éineacht le chéile cibé bealach is mian leat.</p>
     <p>Cuireann an socrú “Meaitseáil” ar do chumas a shonrú conas ilraonta cuardaigh a láimhseáil.</p>
     <ul>
@@ -19,7 +19,7 @@
     </ul>
     <p>Is féidir an cnaipe “Cuir Réimse Cuardaigh Leis” a úsáid chun réimsí cuardaigh breise a chur leis an bhfoirm. Féadfaidh tú an oiread réimsí cuardaigh a úsáid agus is mian leat.</p>
   </dd>
-  
+
   <dt><a name="Search Groups"></a>Grúpaí Cuardaigh</dt>
   <dd>
     <p>D’fhéadfadh sé tarlú nach leor tacar amháin réimsí cuardaigh i gcomhair cuardach casta áirithe. Cuir is gcás, mar shampla, dá mba mhian leat leabhair a fháil faoi stair na Síne nó na hIndia. Dá ndéanfá cuardach ‘GACH Téarma’ i gcomhair na Síne, na hIndia, agus na Staire ní bhfaighfeá ach leabhair faoin tSín AGUS faoin India. Dá ndéanfá cuardach AON Téarma gheofá leabhair staire nach raibh baint ar bith acu leis an tSín nó leis an India.</p>
@@ -31,4 +31,4 @@
       <li>Déan deimhin de go bhfuil “GACH Grúpa” mar shocrú meaitseála agat ag ceanntásc na nGrúpaí Cuardaigh.</li>
     </ul>
   </dd>
-</dl> 
\ No newline at end of file
+</dl>
\ No newline at end of file
diff --git a/themes/root/templates/HelpTranslations/it/advsearch.phtml b/themes/root/templates/HelpTranslations/it/advsearch.phtml
index b49c0d0421846f794cd4a7b30b0ab7d60d5ff943..8949372d67ffeebea92b4eb886da7dc428e916ec 100644
--- a/themes/root/templates/HelpTranslations/it/advsearch.phtml
+++ b/themes/root/templates/HelpTranslations/it/advsearch.phtml
@@ -10,7 +10,7 @@
   <dd>
     <p>La prima volta che vai alla pagina della ricerca avanzata ti si presentano una serie di campi di ricerca. 
 	In ciascuno di questi puoi digitare le parole chiave della ricerca che ti interessa fare. 
-	Puoi utilizzare gli <a href="Home?topic=search">operatori</a>
+	Puoi utilizzare gli <a href="<?=$this->url('help-home')?>?topic=search">operatori</a>
        di ricerca.</p>
     <p>Ciascun campo &egrave; accompagnato da un menu a tendina che ti permette di specificare il tipo di dato 
 	(titolo, autore, etc.) che stai cercando. Puoi combinare la ricerca nel modo che preferisci.</p>
diff --git a/themes/root/templates/HelpTranslations/ja/advsearch.phtml b/themes/root/templates/HelpTranslations/ja/advsearch.phtml
index 6d686286c4358d302c93ba1685adddcc0e84ea80..d126fd0e008d2d6a7de4f532f48c49c6cbfaf06c 100644
--- a/themes/root/templates/HelpTranslations/ja/advsearch.phtml
+++ b/themes/root/templates/HelpTranslations/ja/advsearch.phtml
@@ -9,7 +9,7 @@
   <dt><a name="Search Fields"></a>検索フィールド</dt>
   <dd>
     <p>最初に詳細検索を選ぶと画面には3つの検索語入力欄があります。
-    各入力欄に検索する語句を入力します。次の<a href="Home?topic=search">検索演算子</a>が
+    各入力欄に検索する語句を入力します。次の<a href="<?=$this->url('help-home')?>?topic=search">検索演算子</a>が
     使用できます。</p>
     <p>各検索語の検索対象フィールド(タイトル、著者など)はドロップダウンメニューから
     選択できます。</p>
diff --git a/themes/root/templates/HelpTranslations/pt-br/advsearch.phtml b/themes/root/templates/HelpTranslations/pt-br/advsearch.phtml
index fa99282ea070fe731dfabd5047b5519cb777ac8e..8fab823b349b9d3b72ae75e6dc783a91d4a469ce 100644
--- a/themes/root/templates/HelpTranslations/pt-br/advsearch.phtml
+++ b/themes/root/templates/HelpTranslations/pt-br/advsearch.phtml
@@ -10,7 +10,7 @@
   <dd>
     <p>A página de Busca Avançada apresenta a vários campos de busca.  
 		Em cada campo pode-se digitar termos, a qual deseja buscar itens, relacioando-os a determinado metadado, 
-		podendo fazer uso de <href="Home?topic=search">operadores de busca</a>
+		podendo fazer uso de <href="<?=$this->url('help-home')?>?topic=search">operadores de busca</a>
     </p>
     <p>Pode-se selecionar o tipo de metadado (título, autor, etc.) para cada campo de busca, 
        tornando a busca mais precisa.