diff --git a/config/vufind/Primo.ini b/config/vufind/Primo.ini
index 5044fff0ebaaa72a858cc905b4043133b1d0ddec..48a9fefe0908ef4f64bce100305eeec962acda09 100644
--- a/config/vufind/Primo.ini
+++ b/config/vufind/Primo.ini
@@ -18,6 +18,15 @@ timeout = 30
 ; Your API id
 apiId = my-id
 
+; This section controls the result limit options for search results. default_limit
+; sets the default number of results per page. limit_options is a comma-separated
+; list of numbers to be presented to the end-user. If only one limit is required,
+; set default_limit and leave limit_options commented out.
+; WARNING: using large limits may require you to raise your PHP memory limits to
+; avoid errors.
+default_limit        = 20
+;limit_options        = 10,20,40,60,80,100
+
 ; These are the default recommendations modules to use when no specific setting
 ; are found in the [TopRecommendations] or [SideRecommendations] sections below.
 ; See the comments above those sections for details on legal settings.  You may
@@ -33,6 +42,11 @@ bulkSize = 20
 ; controls its default state: on (true) or off (false).
 retain_filters_by_default = true
 
+; The filters listed below will be applied to all new searches by default. Omit
+; this setting to have no default filters applied. These differ from hidden
+; filters because they are visible in the UI and may be removed by the user.
+;default_filters[] = "rtype:Books"
+
 ; Primo has a fixed cap on how many results you can page through.  Even though
 ; it may report more results than this number, you can't actually access results
 ; past the limit.  This setting tells VuFind where to cut off its paging mechanism.
diff --git a/config/vufind/Summon.ini b/config/vufind/Summon.ini
index cfa986fd9ffb0b8cdc72db11df7c88cf0c5fdaa7..b3cd8a2565e41883c406c0b94abfa595ae4bbd85 100644
--- a/config/vufind/Summon.ini
+++ b/config/vufind/Summon.ini
@@ -53,6 +53,12 @@ snippets = true
 ; controls its default state: on (true) or off (false).
 retain_filters_by_default = true
 
+; The filters listed below will be applied to all new searches by default. Omit
+; this setting to have no default filters applied. These differ from hidden
+; filters because they are visible in the UI and may be removed by the user.
+;default_filters[] = "IsFullText:true"
+;default_filters[] = "excludeNewspapers:true"
+
 ; Summon has a fixed cap on how many results you can page through.  Even though
 ; it may report more results than this number, you can't actually access results
 ; past the limit.  This setting tells VuFind where to cut off its paging mechanism.
diff --git a/config/vufind/searches.ini b/config/vufind/searches.ini
index ce6461f530995a19d6ce430198226f80544c95cc..ea2dbb372cff4c6f926eb93bf491c31461c8cff6 100644
--- a/config/vufind/searches.ini
+++ b/config/vufind/searches.ini
@@ -65,6 +65,12 @@ snippets = true
 ; controls its default state: on (true) or off (false).
 retain_filters_by_default = true
 
+; The filters listed below will be applied to all new searches by default. Omit
+; this setting to have no default filters applied. These differ from hidden
+; filters because they are visible in the UI and may be removed by the user.
+;default_filters[] = "format:Book"
+;default_filters[] = "institution:MyInstitution"
+
 [Cache]
 ; This controls whether the parsed searchspecs.yaml file will be stored to
 ; improve search performance; legal options are APC (use APC cache), File (store
diff --git a/config/vufind/searchspecs.yaml b/config/vufind/searchspecs.yaml
index e9733937d27d0e3a4e132deea5e9e836bd13ceb6..d139ad91665a75926770bc32a660289ceb53875b 100644
--- a/config/vufind/searchspecs.yaml
+++ b/config/vufind/searchspecs.yaml
@@ -353,6 +353,7 @@ AllFields:
     - fulltext_unstemmed^10
     - allfields
     - fulltext
+    - description
     - isbn
     - issn
   QueryFields:
@@ -407,6 +408,8 @@ AllFields:
       - [or, ~]
     fulltext:
       - [or, ~]
+    description:
+      - [or, ~]
     isbn:
       - [onephrase, ~]
     issn:
diff --git a/module/VuFind/src/VuFind/Connection/OpenLibrary.php b/module/VuFind/src/VuFind/Connection/OpenLibrary.php
index 2e27d5d4e34d28e90ce5a7b96cac5c3cfcd7a47f..439b4e043f7190aac7b6468325e10610404dd0e6 100644
--- a/module/VuFind/src/VuFind/Connection/OpenLibrary.php
+++ b/module/VuFind/src/VuFind/Connection/OpenLibrary.php
@@ -21,7 +21,7 @@
  *
  * @category VuFind2
  * @package  OpenLibrary
- * @author   Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
+ * @author   Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
  * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
  * @link     http://vufind.org/wiki/vufind2:developer_manual Wiki
  */
@@ -34,7 +34,7 @@ namespace VuFind\Connection;
  *
  * @category VuFind2
  * @package  OpenLibrary
- * @author   Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
+ * @author   Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
  * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
  * @link     http://vufind.org/wiki/vufind2:developer_manual Wiki
  */
diff --git a/module/VuFind/src/VuFind/Controller/AbstractSearch.php b/module/VuFind/src/VuFind/Controller/AbstractSearch.php
index bfc25aa1c8fa69198fec688b18bee86f43d9dfac..e8bdeb640e1dafeb15a31948f97ea9139caafd8a 100644
--- a/module/VuFind/src/VuFind/Controller/AbstractSearch.php
+++ b/module/VuFind/src/VuFind/Controller/AbstractSearch.php
@@ -112,6 +112,17 @@ class AbstractSearch extends AbstractBase
             $view->saved = $this->restoreAdvancedSearch($searchId);
         }
 
+        // If we have default filters, set them up as a fake "saved" search
+        // to properly populate special controls on the advanced screen.
+        if (!$view->saved && count($view->options->getDefaultFilters()) > 0) {
+            $view->saved = $this->getServiceLocator()
+                ->get('VuFind\SearchResultsPluginManager')
+                ->get($this->searchClassId);
+            $view->saved->getParams()->initFromRequest(
+                new \Zend\StdLib\Parameters(array())
+            );
+        }
+
         return $view;
     }
 
diff --git a/module/VuFind/src/VuFind/Db/Table/PluginManager.php b/module/VuFind/src/VuFind/Db/Table/PluginManager.php
index 057ce03e37123ff81582384c058c1479c38f56bb..1def44ac819c35ddac1de6dacc7b9e79f84f6bac 100644
--- a/module/VuFind/src/VuFind/Db/Table/PluginManager.php
+++ b/module/VuFind/src/VuFind/Db/Table/PluginManager.php
@@ -26,6 +26,7 @@
  * @link     http://vufind.org/wiki/vufind2:database_gateways Wiki
  */
 namespace VuFind\Db\Table;
+use Zend\ServiceManager\ConfigInterface;
 
 /**
  * Database table plugin manager
@@ -43,11 +44,10 @@ class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager
      *
      * Make sure table gateways are properly initialized.
      *
-     * @param null|ConfigInterface $configuration Configuration settings (optional)
+     * @param ConfigInterface $configuration Configuration settings (optional)
      */
-    public function __construct(
-        \Zend\ServiceManager\ConfigInterface $configuration = null
-    ) {
+    public function __construct(ConfigInterface $configuration = null)
+    {
         parent::__construct($configuration);
         $initializer = function ($instance, $manager) {
             $instance
diff --git a/module/VuFind/src/VuFind/Recommend/OpenLibrarySubjects.php b/module/VuFind/src/VuFind/Recommend/OpenLibrarySubjects.php
index f04650c7f080aba8c2454d99afbe5a658d3bd01c..c325ae7b62e729b6feb021a567e207f69c9b4c2b 100644
--- a/module/VuFind/src/VuFind/Recommend/OpenLibrarySubjects.php
+++ b/module/VuFind/src/VuFind/Recommend/OpenLibrarySubjects.php
@@ -22,7 +22,7 @@
  * @category VuFind2
  * @package  Recommendations
  * @author   Demian Katz <demian.katz@villanova.edu>
- * @author   Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
+ * @author   Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
  * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
  * @link     http://vufind.org/wiki/vufind2:recommendation_modules Wiki
  */
@@ -38,7 +38,7 @@ use VuFind\Connection\OpenLibrary, VuFind\Solr\Utils as SolrUtils;
  * @category VuFind2
  * @package  Recommendations
  * @author   Demian Katz <demian.katz@villanova.edu>
- * @author   Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
+ * @author   Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
  * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
  * @link     http://vufind.org/wiki/vufind2:recommendation_modules Wiki
  */
diff --git a/module/VuFind/src/VuFind/Recommend/OpenLibrarySubjectsDeferred.php b/module/VuFind/src/VuFind/Recommend/OpenLibrarySubjectsDeferred.php
index f36217bbc631a6b99d542b159adbe72aaffaf6cf..7ed94cd39d3ef223d04cff516d24127a42cadf20 100644
--- a/module/VuFind/src/VuFind/Recommend/OpenLibrarySubjectsDeferred.php
+++ b/module/VuFind/src/VuFind/Recommend/OpenLibrarySubjectsDeferred.php
@@ -22,7 +22,7 @@
  * @category VuFind2
  * @package  Recommendations
  * @author   Demian Katz <demian.katz@villanova.edu>
- * @author   Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
+ * @author   Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
  * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
  * @link     http://vufind.org/wiki/vufind2:recommendation_modules Wiki
  */
@@ -37,7 +37,7 @@ namespace VuFind\Recommend;
  * @category VuFind2
  * @package  Recommendations
  * @author   Demian Katz <demian.katz@villanova.edu>
- * @author   Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
+ * @author   Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
  * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
  * @link     http://vufind.org/wiki/vufind2:recommendation_modules Wiki
  */
diff --git a/module/VuFind/src/VuFind/Recommend/PluginManager.php b/module/VuFind/src/VuFind/Recommend/PluginManager.php
index d537edb793d09d87d67ff6f280a8adaea4127eac..cd14b1fbf0e5d0a599243eb31865b62b2879d768 100644
--- a/module/VuFind/src/VuFind/Recommend/PluginManager.php
+++ b/module/VuFind/src/VuFind/Recommend/PluginManager.php
@@ -26,6 +26,7 @@
  * @link     http://vufind.org/wiki/vufind2:recommendation_modules Wiki
  */
 namespace VuFind\Recommend;
+use Zend\ServiceManager\ConfigInterface;
 
 /**
  * Recommendation module plugin manager
@@ -41,11 +42,10 @@ class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager
     /**
      * Constructor
      *
-     * @param null|ConfigInterface $configuration Configuration settings (optional)
+     * @param ConfigInterface $configuration Configuration settings (optional)
      */
-    public function __construct(
-        \Zend\ServiceManager\ConfigInterface $configuration = null
-    ) {
+    public function __construct(ConfigInterface $configuration = null)
+    {
         // These plugins are not meant to be shared -- the same module may be used
         // multiple times with different configurations, so we need to build a new
         // copy each time the plugin is retrieved.
diff --git a/module/VuFind/src/VuFind/Recommend/SideFacets.php b/module/VuFind/src/VuFind/Recommend/SideFacets.php
index 158d1256cb1939ab5b5ef0879c84afce9ba2a24d..96fca96f5eba57fa22eb49bf72403101e56d4eea 100644
--- a/module/VuFind/src/VuFind/Recommend/SideFacets.php
+++ b/module/VuFind/src/VuFind/Recommend/SideFacets.php
@@ -253,6 +253,39 @@ class SideFacets extends AbstractFacets
         return array_map('trim', explode(',', $this->collapsedFacets));
     }
 
+    /**
+     * Get the list of filters to display
+     *
+     * @param array $extraFilters Extra filters to add to the list.
+     *
+     * @return array
+     */
+    public function getVisibleFilters($extraFilters = array())
+    {
+        // Merge extras into main list:
+        $filterList = array_merge(
+            $this->results->getParams()->getFilterList(true), $extraFilters
+        );
+
+        // Filter out suppressed values:
+        $final = array();
+        foreach ($filterList as $field => $filters) {
+            $current = array();
+            foreach ($filters as $i => $filter) {
+                if (!isset($filter['suppressDisplay'])
+                    || !$filter['suppressDisplay']
+                ) {
+                    $current[] = $filter;
+                }
+            }
+            if (!empty($current)) {
+                $final[$field] = $current;
+            }
+        }
+
+        return $final;
+    }
+
     /**
      * getRangeFacets
      *
diff --git a/module/VuFind/src/VuFind/RecordDriver/PluginManager.php b/module/VuFind/src/VuFind/RecordDriver/PluginManager.php
index 17bc972f37db8a44336a31583b45267b21710544..407e0284bf2bf60971fe2d4a4e2cd5cd4d3de5e9 100644
--- a/module/VuFind/src/VuFind/RecordDriver/PluginManager.php
+++ b/module/VuFind/src/VuFind/RecordDriver/PluginManager.php
@@ -26,6 +26,7 @@
  * @link     http://vufind.org/wiki/vufind2:record_drivers Wiki
  */
 namespace VuFind\RecordDriver;
+use Zend\ServiceManager\ConfigInterface;
 
 /**
  * Record driver plugin manager
@@ -41,11 +42,10 @@ class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager
     /**
      * Constructor
      *
-     * @param null|ConfigInterface $configuration Configuration settings (optional)
+     * @param ConfigInterface $configuration Configuration settings (optional)
      */
-    public function __construct(
-        \Zend\ServiceManager\ConfigInterface $configuration = null
-    ) {
+    public function __construct(ConfigInterface $configuration = null)
+    {
         // Record drivers are not meant to be shared -- every time we retrieve one,
         // we are building a brand new object.
         $this->setShareByDefault(false);
diff --git a/module/VuFind/src/VuFind/Related/PluginManager.php b/module/VuFind/src/VuFind/Related/PluginManager.php
index af1d827f7ad005151f75005b1188b1a2035c2837..168adc757830865f964b5e869e0f19c9ee33bc7f 100644
--- a/module/VuFind/src/VuFind/Related/PluginManager.php
+++ b/module/VuFind/src/VuFind/Related/PluginManager.php
@@ -26,6 +26,7 @@
  * @link     http://vufind.org/wiki/vufind2:building_a_related_record_module Wiki
  */
 namespace VuFind\Related;
+use Zend\ServiceManager\ConfigInterface;
 
 /**
  * Related record plugin manager
@@ -41,11 +42,10 @@ class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager
     /**
      * Constructor
      *
-     * @param null|ConfigInterface $configuration Configuration settings (optional)
+     * @param ConfigInterface $configuration Configuration settings (optional)
      */
-    public function __construct(
-        \Zend\ServiceManager\ConfigInterface $configuration = null
-    ) {
+    public function __construct(ConfigInterface $configuration = null)
+    {
         // These plugins are not meant to be shared -- the same module may be used
         // multiple times with different configurations, so we need to build a new
         // copy each time the plugin is retrieved.
diff --git a/module/VuFind/src/VuFind/Search/BackendManager.php b/module/VuFind/src/VuFind/Search/BackendManager.php
index 45eb5690f930f19aec20417d28df8cb25dc1cd7f..16364ff107136c5f257e1aadab45eb5a7064d751 100644
--- a/module/VuFind/src/VuFind/Search/BackendManager.php
+++ b/module/VuFind/src/VuFind/Search/BackendManager.php
@@ -68,7 +68,7 @@ class BackendManager implements SharedListenerAggregateInterface
     /**
      * Constructor.
      *
-     * @param ServiceManager $registry Backend registry
+     * @param ServiceLocatorInterface $registry Backend registry
      *
      * @return void
      */
diff --git a/module/VuFind/src/VuFind/Search/Base/Options.php b/module/VuFind/src/VuFind/Search/Base/Options.php
index cbfd27dc7daeb7fafe6fdad49b1c6e638e3b5fac..e8ba9e61a05fc0388d25dc8f6c89af1b4c18e503 100644
--- a/module/VuFind/src/VuFind/Search/Base/Options.php
+++ b/module/VuFind/src/VuFind/Search/Base/Options.php
@@ -54,6 +54,7 @@ abstract class Options implements TranslatorAwareInterface
     protected $basicHandlers = array();
     protected $specialAdvancedFacets = '';
     protected $retainFiltersByDefault = true;
+    protected $defaultFilters = array();
 
     // Available limit options
     protected $defaultLimit = 20;
@@ -552,6 +553,16 @@ abstract class Options implements TranslatorAwareInterface
         return isset($session->lastView) ? $session->lastView : null;
     }
 
+    /**
+     * Get default filters to apply to an empty search.
+     *
+     * @return array
+     */
+    public function getDefaultFilters()
+    {
+        return $this->defaultFilters;
+    }
+
     /**
      * Should filter settings be retained across searches by default?
      *
diff --git a/module/VuFind/src/VuFind/Search/Base/Params.php b/module/VuFind/src/VuFind/Search/Base/Params.php
index 2202e38344e97a68799f8dc7f826ba43364a97a9..ecf4460732cb599b846ce5e3a3cf3715ce0d3180 100644
--- a/module/VuFind/src/VuFind/Search/Base/Params.php
+++ b/module/VuFind/src/VuFind/Search/Base/Params.php
@@ -87,6 +87,13 @@ class Params implements ServiceLocatorAwareInterface
      */
     protected $serviceLocator;
 
+    /**
+     * Are default filters applied?
+     *
+     * @var bool
+     */
+    protected $defaultsApplied = false;
+
     /**
      * Constructor
      *
@@ -1291,6 +1298,20 @@ class Params implements ServiceLocatorAwareInterface
             }
         }
 
+        // If we don't have the special flag indicating that defaults have
+        // been applied, and if we do have defaults, apply them:
+        if ($request->get('dfApplied')) {
+            $this->defaultsApplied = true;
+        } else {
+            $defaults = $this->getOptions()->getDefaultFilters();
+            if (!empty($defaults)) {
+                foreach ($defaults as $current) {
+                    $this->addFilter($current);
+                }
+                $this->defaultsApplied = true;
+            }
+        }
+
         // Handle range filters:
         $this->initRangeFilters($request);
     }
@@ -1387,6 +1408,13 @@ class Params implements ServiceLocatorAwareInterface
         $this->filterList   = $minified->f;
         $this->searchType   = $minified->ty;
 
+        // Deminified searches will always have defaults already applied;
+        // we don't want to accidentally manipulate them further.
+        $defaults = $this->getOptions()->getDefaultFilters();
+        if (!empty($defaults)) {
+            $this->defaultsApplied = true;
+        }
+
         // Search terms, we need to expand keys
         $this->query = QueryAdapter::deminify($minified->t);
     }
@@ -1580,4 +1608,14 @@ class Params implements ServiceLocatorAwareInterface
         }
         return true;
     }
+
+    /**
+     * Are default filters applied?
+     *
+     * @return bool
+     */
+    public function hasDefaultsApplied()
+    {
+        return $this->defaultsApplied;
+    }
 }
\ No newline at end of file
diff --git a/module/VuFind/src/VuFind/Search/Params/PluginManager.php b/module/VuFind/src/VuFind/Search/Params/PluginManager.php
index baaa27cca4b8740853338ed0effcffdf17089f51..2bb6cdb56bac30a0d9ee61a74f51ce8feeb4d993 100644
--- a/module/VuFind/src/VuFind/Search/Params/PluginManager.php
+++ b/module/VuFind/src/VuFind/Search/Params/PluginManager.php
@@ -26,6 +26,7 @@
  * @link     http://vufind.org/wiki/vufind2:record_drivers Wiki
  */
 namespace VuFind\Search\Params;
+use Zend\ServiceManager\ConfigInterface;
 
 /**
  * Search params plugin manager
@@ -41,11 +42,10 @@ class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager
     /**
      * Constructor
      *
-     * @param null|ConfigInterface $configuration Configuration settings (optional)
+     * @param ConfigInterface $configuration Configuration settings (optional)
      */
-    public function __construct(
-        \Zend\ServiceManager\ConfigInterface $configuration = null
-    ) {
+    public function __construct(ConfigInterface $configuration = null)
+    {
         // These objects are not meant to be shared -- every time we retrieve one,
         // we are building a brand new object.
         $this->setShareByDefault(false);
diff --git a/module/VuFind/src/VuFind/Search/Primo/Options.php b/module/VuFind/src/VuFind/Search/Primo/Options.php
index ed7f4dfcfeeddf995c1781a1f49f8c1cb44f11b4..31fb5c6a82f1306aeaabe0942c33d1adf9511211 100644
--- a/module/VuFind/src/VuFind/Search/Primo/Options.php
+++ b/module/VuFind/src/VuFind/Search/Primo/Options.php
@@ -79,11 +79,24 @@ class Options extends \VuFind\Search\Base\Options
         // Load the search configuration file:
         $searchSettings = $configLoader->get($this->searchIni);
 
+        // Set up limit preferences
+        if (isset($searchSettings->General->default_limit)) {
+            $this->defaultLimit = $searchSettings->General->default_limit;
+        }
+        if (isset($searchSettings->General->limit_options)) {
+            $this->limitOptions
+                = explode(",", $searchSettings->General->limit_options);
+        }
+
         // Load search preferences:
         if (isset($searchSettings->General->retain_filters_by_default)) {
             $this->retainFiltersByDefault
                 = $searchSettings->General->retain_filters_by_default;
         }
+        if (isset($searchSettings->General->default_filters)) {
+            $this->defaultFilters = $searchSettings->General->default_filters
+                ->toArray();
+        }
 
         // Result limit:
         if (isset($searchSettings->General->result_limit)) {
diff --git a/module/VuFind/src/VuFind/Search/Results/PluginManager.php b/module/VuFind/src/VuFind/Search/Results/PluginManager.php
index 720e6bdae8f47c7b4c8b6b17b50816f2b2171cfe..15cfd57680f4faac36b4c81a9a6597389b6e1cd1 100644
--- a/module/VuFind/src/VuFind/Search/Results/PluginManager.php
+++ b/module/VuFind/src/VuFind/Search/Results/PluginManager.php
@@ -26,6 +26,7 @@
  * @link     http://vufind.org/wiki/vufind2:record_drivers Wiki
  */
 namespace VuFind\Search\Results;
+use Zend\ServiceManager\ConfigInterface;
 
 /**
  * Search results plugin manager
@@ -41,11 +42,10 @@ class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager
     /**
      * Constructor
      *
-     * @param null|ConfigInterface $configuration Configuration settings (optional)
+     * @param ConfigInterface $configuration Configuration settings (optional)
      */
-    public function __construct(
-        \Zend\ServiceManager\ConfigInterface $configuration = null
-    ) {
+    public function __construct(ConfigInterface $configuration = null)
+    {
         // These objects are not meant to be shared -- every time we retrieve one,
         // we are building a brand new object.
         $this->setShareByDefault(false);
diff --git a/module/VuFind/src/VuFind/Search/Solr/Options.php b/module/VuFind/src/VuFind/Search/Solr/Options.php
index d1696ea38ad6b33b188836f212f9dea8dc89a229..7c8cfa57116f7f92615c9dc54ffa6ff4838bcf14 100644
--- a/module/VuFind/src/VuFind/Search/Solr/Options.php
+++ b/module/VuFind/src/VuFind/Search/Solr/Options.php
@@ -84,6 +84,10 @@ class Options extends \VuFind\Search\Base\Options
             $this->retainFiltersByDefault
                 = $searchSettings->General->retain_filters_by_default;
         }
+        if (isset($searchSettings->General->default_filters)) {
+            $this->defaultFilters = $searchSettings->General->default_filters
+                ->toArray();
+        }
         if (isset($searchSettings->Basic_Searches)) {
             foreach ($searchSettings->Basic_Searches as $key => $value) {
                 $this->basicHandlers[$key] = $value;
diff --git a/module/VuFind/src/VuFind/Search/Summon/Options.php b/module/VuFind/src/VuFind/Search/Summon/Options.php
index af2f7a2eaf2e28c514ad40fdb0e7804386755064..05b6e122c68c30ec938026b5eaa6081b2e1f0916 100644
--- a/module/VuFind/src/VuFind/Search/Summon/Options.php
+++ b/module/VuFind/src/VuFind/Search/Summon/Options.php
@@ -106,6 +106,10 @@ class Options extends \VuFind\Search\Base\Options
             $this->retainFiltersByDefault
                 = $searchSettings->General->retain_filters_by_default;
         }
+        if (isset($searchSettings->General->default_filters)) {
+            $this->defaultFilters = $searchSettings->General->default_filters
+                ->toArray();
+        }
         if (isset($searchSettings->General->result_limit)) {
             $this->resultLimit = $searchSettings->General->result_limit;
         }
diff --git a/module/VuFind/src/VuFind/Search/UrlQueryHelper.php b/module/VuFind/src/VuFind/Search/UrlQueryHelper.php
index b7a58e46559b4b5cad90d89aae69a213af7fd007..a8c4dd1ae569e70a8db08df391eb3f6536d445ca 100644
--- a/module/VuFind/src/VuFind/Search/UrlQueryHelper.php
+++ b/module/VuFind/src/VuFind/Search/UrlQueryHelper.php
@@ -222,6 +222,9 @@ class UrlQueryHelper
                 $params['shard'] = $shards;
             }
         }
+        if ($this->params->hasDefaultsApplied()) {
+            $params['dfApplied'] = 1;
+        }
 
         return $params;
     }
diff --git a/module/VuFind/src/VuFind/ServiceManager/AbstractPluginManager.php b/module/VuFind/src/VuFind/ServiceManager/AbstractPluginManager.php
index f9721dac18a05e9570f0dddc1b8119a3089272af..3fdda41e3d799e4436ebae1064c685e9e9412d56 100644
--- a/module/VuFind/src/VuFind/ServiceManager/AbstractPluginManager.php
+++ b/module/VuFind/src/VuFind/ServiceManager/AbstractPluginManager.php
@@ -27,6 +27,7 @@
  */
 namespace VuFind\ServiceManager;
 use Zend\ServiceManager\AbstractPluginManager as Base,
+    Zend\ServiceManager\ConfigInterface,
     Zend\ServiceManager\Exception\RuntimeException as ServiceManagerRuntimeException;
 
 /**
@@ -46,11 +47,10 @@ abstract class AbstractPluginManager extends Base
      *
      * Make sure table gateways are properly initialized.
      *
-     * @param null|ConfigInterface $configuration Configuration settings (optional)
+     * @param ConfigInterface $configuration Configuration settings (optional)
      */
-    public function __construct(
-        \Zend\ServiceManager\ConfigInterface $configuration = null
-    ) {
+    public function __construct(ConfigInterface $configuration = null)
+    {
         parent::__construct($configuration);
         $this->addInitializer(
             array('VuFind\ServiceManager\Initializer', 'initPlugin'), false
diff --git a/module/VuFind/src/VuFind/Statistics/Driver/PluginManager.php b/module/VuFind/src/VuFind/Statistics/Driver/PluginManager.php
index 9f3590029efe7debdf4885ad8b4b9933f1d9de9f..6f78dc325563de01048136a0b7c9289657c37cea 100644
--- a/module/VuFind/src/VuFind/Statistics/Driver/PluginManager.php
+++ b/module/VuFind/src/VuFind/Statistics/Driver/PluginManager.php
@@ -26,6 +26,7 @@
  * @link     http://vufind.org/wiki/vufind2:statistics_drivers Wiki
  */
 namespace VuFind\Statistics\Driver;
+use Zend\ServiceManager\ConfigInterface;
 
 /**
  * Statistics driver plugin manager
@@ -41,11 +42,10 @@ class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager
     /**
      * Constructor
      *
-     * @param null|ConfigInterface $configuration Configuration settings (optional)
+     * @param ConfigInterface $configuration Configuration settings (optional)
      */
-    public function __construct(
-        \Zend\ServiceManager\ConfigInterface $configuration = null
-    ) {
+    public function __construct(ConfigInterface $configuration = null)
+    {
         // Stats drivers are not meant to be shared -- every time we retrieve one,
         // we are building a brand new object.
         $this->setShareByDefault(false);
diff --git a/module/VuFind/src/VuFind/View/Helper/Root/Reviews.php b/module/VuFind/src/VuFind/View/Helper/Root/Reviews.php
index b1d106b784349fb74130e84d9444ec3c1ac159b9..12b616989f00e550d94802c9468f4e2681337a92 100644
--- a/module/VuFind/src/VuFind/View/Helper/Root/Reviews.php
+++ b/module/VuFind/src/VuFind/View/Helper/Root/Reviews.php
@@ -424,7 +424,7 @@ class Reviews extends AbstractSyndetics implements \Zend\Log\LoggerAwareInterfac
      *
      * @throws \Exception
      * @return array     Returns array with review data
-     * @author Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
+     * @author Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
      */
     protected function loadGuardian($id)
     {
diff --git a/module/VuFindHttp/src/VuFindHttp/HttpService.php b/module/VuFindHttp/src/VuFindHttp/HttpService.php
index b3f029fd7977fe83c9af34b03c961cfa3f1fc296..553c023125fa3b1083fa32ae78b527e12ed39cac 100644
--- a/module/VuFindHttp/src/VuFindHttp/HttpService.php
+++ b/module/VuFindHttp/src/VuFindHttp/HttpService.php
@@ -90,10 +90,10 @@ class HttpService implements HttpServiceInterface
      *
      * Returns the client given as argument with appropriate proxy setup.
      *
-     * @param Zend\Http\Client $client  HTTP client
-     * @param array            $options ZF2 ProxyAdapter options
+     * @param \Zend\Http\Client $client  HTTP client
+     * @param array             $options ZF2 ProxyAdapter options
      *
-     * @return Zend\Http\Client
+     * @return \Zend\Http\Client
      */
     public function proxify(\Zend\Http\Client $client, array $options = array())
     {
diff --git a/module/VuFindHttp/src/VuFindHttp/HttpServiceInterface.php b/module/VuFindHttp/src/VuFindHttp/HttpServiceInterface.php
index 3a16da3fe1cfe0c5b05c0297b7e4df14dce1ba49..d23f84044d113c3aa6a886908973ba9ee109b1ac 100644
--- a/module/VuFindHttp/src/VuFindHttp/HttpServiceInterface.php
+++ b/module/VuFindHttp/src/VuFindHttp/HttpServiceInterface.php
@@ -46,10 +46,10 @@ interface HttpServiceInterface
      *
      * Returns the client given as argument with appropriate proxy setup.
      *
-     * @param Zend\Http\Client $client  HTTP client
-     * @param array            $options ZF2 ProxyAdapter options
+     * @param \Zend\Http\Client $client  HTTP client
+     * @param array             $options ZF2 ProxyAdapter options
      *
-     * @return Zend\Http\Client
+     * @return \Zend\Http\Client
      */
     public function proxify(\Zend\Http\Client $client, array $options = array());
 
diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Backend.php b/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Backend.php
index fdd1cb5d19022102326fd17fc1be893e31ab5831..b563ef39182fe3c732a15283619939703b85cc7b 100644
--- a/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Backend.php
+++ b/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Backend.php
@@ -100,7 +100,7 @@ class Backend extends AbstractBackend
         if (null !== $params) {
             $baseParams->mergeWith($params);
         }
-        $baseParams->set('pageSize', $limit);
+        $baseParams->set('limit', $limit);
         $page = $limit > 0 ? floor($offset / $limit) + 1 : 1;
         $baseParams->set('pageNumber', $page);
 
diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Connector.php b/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Connector.php
index b1976658a7a6771866a4070d28aae4b1d4569872..c9b69cdf9ac78faf0ce14634b5398a40f6bbb029 100644
--- a/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Connector.php
+++ b/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Connector.php
@@ -423,7 +423,7 @@ class Connector
             //   that means it has the prim namespace prefix.
             // So first set the right prefix
             $prefix = $doc;
-            if ($doc->PrimoNMBib != 'true') {
+            if ($doc->PrimoNMBib != 'true' && isset($namespaces['prim'])) {
                 // Use the namespace prefix to get those missing child
                 //   elements out of $doc.
                 $prefix = $doc->children($namespaces['prim']);
diff --git a/module/VuFindTheme/src/VuFindTheme/View/Helper/HeadThemeResources.php b/module/VuFindTheme/src/VuFindTheme/View/Helper/HeadThemeResources.php
index f20876903af24cd25ea4def1538063c0e7d5a4ec..50fa6a71c4b7897f6834688c4dbc2e87d6ed9555 100644
--- a/module/VuFindTheme/src/VuFindTheme/View/Helper/HeadThemeResources.php
+++ b/module/VuFindTheme/src/VuFindTheme/View/Helper/HeadThemeResources.php
@@ -64,7 +64,7 @@ class HeadThemeResources extends \Zend\View\Helper\AbstractHelper
     {
         // Set up encoding:
         $headMeta = $this->getView()->plugin('headmeta');
-        $headMeta()->appendHttpEquiv(
+        $headMeta()->prependHttpEquiv(
             'Content-Type', 'text/html; charset=' . $this->container->getEncoding()
         );
 
diff --git a/themes/blueprint/js/common.js b/themes/blueprint/js/common.js
index bf090280615fc7aff82838600f48849cad524faa..b2e4a582084987eb6ee0b51bfe48c79babae3d99 100644
--- a/themes/blueprint/js/common.js
+++ b/themes/blueprint/js/common.js
@@ -45,6 +45,8 @@ function filterAll(element, formId) {
     }
     $("#" + formId + " :input[type='checkbox'][name='filter[]']")
         .attr('checked', element.checked);
+    $("#" + formId + " :input[type='checkbox'][name='dfApplied']")
+        .attr('checked', element.checked);
 }
 
 function extractParams(str) {
diff --git a/themes/blueprint/templates/Recommend/SideFacets.phtml b/themes/blueprint/templates/Recommend/SideFacets.phtml
index 91a056b0039a8296281277e5cf78ac171ccf42db..b73a7bcd11f4044767ccefcb0cddc0844c322013 100644
--- a/themes/blueprint/templates/Recommend/SideFacets.phtml
+++ b/themes/blueprint/templates/Recommend/SideFacets.phtml
@@ -11,9 +11,9 @@
         </div>
     <? endforeach; ?>
   <? endif; ?>
-  <? $extraFilters = isset($this->extraSideFacetFilters) ? $this->extraSideFacetFilters : array(); ?>
   <? $collapsedFacets = $this->recommend->getCollapsedFacets() ?>
-  <? $filterList = array_merge($results->getParams()->getFilterList(true), $extraFilters); if (!empty($filterList)): ?>
+  <? $extraFilters = isset($this->extraSideFacetFilters) ? $this->extraSideFacetFilters : array(); ?>
+  <? $filterList = $this->recommend->getVisibleFilters($extraFilters); if (!empty($filterList)): ?>
     <strong><?=$this->transEsc('Remove Filters')?></strong>
     <ul class="filters">
     <? foreach ($filterList as $field => $filters): ?>
diff --git a/themes/blueprint/templates/combined/results.phtml b/themes/blueprint/templates/combined/results.phtml
index d6da81d63443e6269dcfb716242156b0fa5739e6..a677bdf7138b39b2cc9a3c315de9e79b5aad9239 100644
--- a/themes/blueprint/templates/combined/results.phtml
+++ b/themes/blueprint/templates/combined/results.phtml
@@ -18,6 +18,7 @@
             'searchClassId' => $this->params->getsearchClassId(),
             'checkboxFilters' => $this->params->getCheckboxFacets(),
             'filterList' => $this->params->getFilters(),
+            'hasDefaultsApplied' => $this->params->hasDefaultsApplied(),
             'selectedShards' => $this->params->getSelectedShards()
         )
     );
diff --git a/themes/blueprint/templates/search/advanced/layout.phtml b/themes/blueprint/templates/search/advanced/layout.phtml
index 5d398551995ab109de430cb4097c5132a9a8e34d..d7ad979a7579fd5e06599a5fff26a279c4a91078 100644
--- a/themes/blueprint/templates/search/advanced/layout.phtml
+++ b/themes/blueprint/templates/search/advanced/layout.phtml
@@ -11,19 +11,32 @@
     // Set up saved search details:
     if (isset($this->saved) && is_object($this->saved)) {
         $searchDetails = $this->saved->getParams()->getQuery();
-        $groups = $searchDetails->getQueries();
+        if ($searchDetails instanceof \VuFindSearch\Query\Query) {
+            // Not an advanced query -- ignore it.
+            $searchDetails = $groups = false;
+        } else {
+            $groups = $searchDetails->getQueries();
+        }
+        $hasDefaultsApplied = $this->saved->getParams()->hasDefaultsApplied();
         $searchFilters = $this->saved->getParams()->getFilterList();
     } else {
-        $searchDetails = $searchFilters = $groups = false;
+        $hasDefaultsApplied = $searchDetails = $searchFilters = $groups = false;
     }
 
     // Set up Javascript:
     // Step 1: Define our search arrays so they are usuable in the javascript
     $this->headScript()->appendScript($this->render('search/advanced/globals.phtml'));
     // Step 2: Call the javascript to make use of the above
-    $this->headScript()->appendFile('advanced_search.js');
+    $this->headScript()->appendFile(
+        isset($this->advancedSearchJsOverride) ? $this->advancedSearchJsOverride : 'advanced_search.js'
+    );
     // Step 3: Build the page
-    $this->headScript()->appendScript($this->partial('search/advanced/build_page.phtml', array('searchDetails' => $searchDetails)));
+    $this->headScript()->appendScript(
+        $this->partial(
+            isset($this->buildPageOverride) ? $this->buildPageOverride : 'search/advanced/build_page.phtml',
+            array('searchDetails' => $searchDetails)
+        )
+    );
 ?>
 <form method="get" action="<?=$this->url($this->options->getSearchAction())?>" id="advSearchForm" name="searchForm" class="search">
   <div class="<?=$this->layoutClass('mainbody')?>">
@@ -128,6 +141,9 @@
   </div>
 
   <div class="<?=$this->layoutClass('sidebar')?>">
+    <? if ($hasDefaultsApplied): ?>
+      <input type="hidden" name="dfApplied" value="1" />
+    <? endif ?>
     <? if (!empty($searchFilters)): ?>
       <div class="filterList">
         <h3><?=$this->transEsc("adv_search_filters")?><br/><span>(<?=$this->transEsc("adv_search_select_all")?> <input type="checkbox" checked="checked" onclick="filterAll(this, 'advSearchForm');" />)</span></h3>
diff --git a/themes/blueprint/templates/search/results.phtml b/themes/blueprint/templates/search/results.phtml
index 443e5dfb348bae04dbe44b9c852fe5d396b1d858..5155c3bac84b968a21c64121b021392d3a8f1424 100644
--- a/themes/blueprint/templates/search/results.phtml
+++ b/themes/blueprint/templates/search/results.phtml
@@ -18,6 +18,7 @@
             'searchClassId' => $this->params->getsearchClassId(),
             'checkboxFilters' => $this->params->getCheckboxFacets(),
             'filterList' => $this->params->getFilters(),
+            'hasDefaultsApplied' => $this->params->hasDefaultsApplied(),
             'selectedShards' => $this->params->getSelectedShards()
         )
     );
diff --git a/themes/blueprint/templates/search/searchbox.phtml b/themes/blueprint/templates/search/searchbox.phtml
index 01bbbebfc7490033b91ac1ae71703f27f7e86a4e..212ef848fdb9504a2cc22e169b07fcb1e7b95a58 100644
--- a/themes/blueprint/templates/search/searchbox.phtml
+++ b/themes/blueprint/templates/search/searchbox.phtml
@@ -77,7 +77,7 @@
             isset($this->checkboxFilters) && is_array($this->checkboxFilters) ? $this->checkboxFilters : array()
         );
       ?>
-      <? if (!empty($filterDetails)): ?>
+      <? if ((isset($hasDefaultsApplied) && $hasDefaultsApplied) || !empty($filterDetails)): ?>
         <? $defaultFilterState = $options->getRetainFilterSetting() ? ' checked="checked"' : ''; ?>
         <div class="keepFilters">
           <input type="checkbox"<?=$defaultFilterState?> id="searchFormKeepFilters"/> <label for="searchFormKeepFilters"><?=$this->transEsc("basic_search_keep_filters")?></label>
@@ -86,6 +86,11 @@
               <input id="<?=$this->escapeHtml($current['id'])?>" type="checkbox"<?=$defaultFilterState?> name="filter[]" value="<?=$this->escapeHtml($current['value'])?>" />
               <label for="<?=$this->escapeHtml($current['id'])?>"><?=$this->escapeHtml($current['value'])?></label>
             <? endforeach; ?>
+            <? if (isset($hasDefaultsApplied) && $hasDefaultsApplied): ?>
+              <!-- this is a hidden element that flags whether or not default filters have been applied;
+                   it is intentionally unlabeled, as users are not meant to manipulate it directly. -->
+              <input id="dfApplied" type="checkbox" name="dfApplied" value="1" />
+            <? endif; ?>
           </div>
         </div>
       <? endif; ?>
diff --git a/themes/bootstrap/templates/Recommend/SideFacets.phtml b/themes/bootstrap/templates/Recommend/SideFacets.phtml
index f8047a758934cbb90ab707fe777b9d5c1fb89429..09915b710c1b3071123a14852b4700394fd9a921 100644
--- a/themes/bootstrap/templates/Recommend/SideFacets.phtml
+++ b/themes/bootstrap/templates/Recommend/SideFacets.phtml
@@ -14,9 +14,9 @@
     </div>
   <? endforeach; ?>
 <? endif; ?>
-<? $extraFilters = isset($this->extraSideFacetFilters) ? $this->extraSideFacetFilters : array(); ?>
 <? $collapsedFacets = $this->recommend->getCollapsedFacets() ?>
-<? $filterList = array_merge($results->getParams()->getFilterList(true), $extraFilters); if (!empty($filterList)): ?>
+<? $extraFilters = isset($this->extraSideFacetFilters) ? $this->extraSideFacetFilters : array(); ?>
+<? $filterList = $this->recommend->getVisibleFilters($extraFilters); if (!empty($filterList)): ?>
   <ul class="nav nav-list">
     <li class="nav-header"><?=$this->transEsc('Remove Filters')?></li>
     <? foreach ($filterList as $field => $filters): ?>
diff --git a/themes/bootstrap/templates/combined/results.phtml b/themes/bootstrap/templates/combined/results.phtml
index e380f189ade9150000ae8510b715d7f6968c02fa..90b09d91e16393d6aa09b66254228324b10e6d7b 100644
--- a/themes/bootstrap/templates/combined/results.phtml
+++ b/themes/bootstrap/templates/combined/results.phtml
@@ -18,6 +18,7 @@
       'searchClassId' => $this->params->getsearchClassId(),
       'checkboxFilters' => $this->params->getCheckboxFacets(),
       'filterList' => $this->params->getFilters(),
+      'hasDefaultsApplied' => $this->params->hasDefaultsApplied(),
       'selectedShards' => $this->params->getSelectedShards()
     )
   );
diff --git a/themes/bootstrap/templates/search/advanced/layout.phtml b/themes/bootstrap/templates/search/advanced/layout.phtml
index a46b130461a131b39897f745e86d24f172dd2ce7..9b224c58ee53629d4b7022e116751bd7a2a067a6 100644
--- a/themes/bootstrap/templates/search/advanced/layout.phtml
+++ b/themes/bootstrap/templates/search/advanced/layout.phtml
@@ -12,19 +12,32 @@
   // Set up saved search details:
   if (isset($this->saved) && is_object($this->saved)) {
     $searchDetails = $this->saved->getParams()->getQuery();
-    $groups = $searchDetails->getQueries();
+    if ($searchDetails instanceof \VuFindSearch\Query\Query) {
+        // Not an advanced query -- ignore it.
+        $searchDetails = $groups = false;
+    } else {
+        $groups = $searchDetails->getQueries();
+    }
+    $hasDefaultsApplied = $this->saved->getParams()->hasDefaultsApplied();
     $searchFilters = $this->saved->getParams()->getFilterList();
   } else {
-    $searchDetails = $searchFilters = $groups = false;
+    $hasDefaultsApplied = $searchDetails = $searchFilters = $groups = false;
   }
 
   // Set up Javascript:
   // Step 1: Define our search arrays so they are usuable in the javascript
   $this->headScript()->appendScript($this->render('search/advanced/globals.phtml'));
   // Step 2: Call the javascript to make use of the above
-  $this->headScript()->appendFile('advanced_search.js');
+  $this->headScript()->appendFile(
+    isset($this->advancedSearchJsOverride) ? $this->advancedSearchJsOverride : 'advanced_search.js'
+  );
   // Step 3: Build the page
-  $this->headScript()->appendScript($this->partial('search/advanced/build_page.phtml', array('searchDetails' => $searchDetails)));
+  $this->headScript()->appendScript(
+    $this->partial(
+      isset($this->buildPageOverride) ? $this->buildPageOverride : 'search/advanced/build_page.phtml',
+      array('searchDetails' => $searchDetails)
+    )
+  );
 ?>
 
 <?=$this->flashmessages()?>
@@ -51,6 +64,9 @@
   </div>
 
   <div class="<?=$this->layoutClass('sidebar')?>">
+    <? if ($hasDefaultsApplied): ?>
+      <input type="hidden" name="dfApplied" value="1" />
+    <? endif ?>
     <? if (!empty($searchFilters)): ?>
       <div class="filterList">
         <h4><?=$this->transEsc("adv_search_filters")?></h4>
diff --git a/themes/bootstrap/templates/search/results.phtml b/themes/bootstrap/templates/search/results.phtml
index dcf99e6b9d0a8c4a54c81fe3de10fb83aec314ac..71794c83bc3c8473325da8f65b83143dec6bfecf 100644
--- a/themes/bootstrap/templates/search/results.phtml
+++ b/themes/bootstrap/templates/search/results.phtml
@@ -18,6 +18,7 @@
         'searchClassId' => $this->params->getsearchClassId(),
         'checkboxFilters' => $this->params->getCheckboxFacets(),
         'filterList' => $this->params->getFilters(),
+        'hasDefaultsApplied' => $this->params->hasDefaultsApplied(),
         'selectedShards' => $this->params->getSelectedShards()
       )
   );
diff --git a/themes/bootstrap/templates/search/searchbox.phtml b/themes/bootstrap/templates/search/searchbox.phtml
index 7ced9c84e3718cf676e957a01e79927409608410..917727d6396cc6997039e9519f139b85d103d0d9 100644
--- a/themes/bootstrap/templates/search/searchbox.phtml
+++ b/themes/bootstrap/templates/search/searchbox.phtml
@@ -69,7 +69,7 @@
             isset($this->checkboxFilters) && is_array($this->checkboxFilters) ? $this->checkboxFilters : array()
         );
       ?>
-      <? if (!empty($filterDetails)): ?>
+      <? if ((isset($hasDefaultsApplied) && $hasDefaultsApplied) || !empty($filterDetails)): ?>
         <? $defaultFilterState = $options->getRetainFilterSetting() ? ' checked="checked"' : ''; ?>
         <label class="checkbox">
           <input onChange="$('.applied-filter').click()" type="checkbox"<?=$defaultFilterState?> id="searchFormKeepFilters"/>
@@ -77,9 +77,14 @@
         </label>
         <div class="hidden">
           <? foreach ($filterDetails as $current): ?>
-            <input id="<?=$this->escapeHtml($current['id'])?>" type="checkbox"<?=$defaultFilterState?> name="filter[]" value="<?=$this->escapeHtml($current['value'])?>" />
+            <input class="applied-filter" id="<?=$this->escapeHtml($current['id'])?>" type="checkbox"<?=$defaultFilterState?> name="filter[]" value="<?=$this->escapeHtml($current['value'])?>" />
             <label for="<?=$this->escapeHtml($current['id'])?>"><?=$this->escapeHtml($current['value'])?></label>
           <? endforeach; ?>
+          <? if (isset($hasDefaultsApplied) && $hasDefaultsApplied): ?>
+            <!-- this is a hidden element that flags whether or not default filters have been applied;
+                 it is intentionally unlabeled, as users are not meant to manipulate it directly. -->
+            <input class="applied-filter" id="dfApplied" type="checkbox" name="dfApplied" value="1" />
+          <? endif; ?>
         </div>
       <? endif; ?>
       <?
diff --git a/themes/jquerymobile/templates/Recommend/SideFacets.phtml b/themes/jquerymobile/templates/Recommend/SideFacets.phtml
index bb69c5fefddcf713148cda17727420f8d5784bed..e93c5c27218b0a37512a0fb5c41a0d9d4fad3fc6 100644
--- a/themes/jquerymobile/templates/Recommend/SideFacets.phtml
+++ b/themes/jquerymobile/templates/Recommend/SideFacets.phtml
@@ -1,5 +1,5 @@
 <? $results = $this->recommend->getResults(); ?>
-<? $filterList = $results->getParams()->getFilterList(true); if (!empty($filterList)): ?>
+<? $filterList = $this->recommend->getVisibleFilters(); if (!empty($filterList)): ?>
   <ul class="filters" data-role="listview" data-inset="true" data-dividertheme="e">
     <li data-role="list-divider"><?=$this->transEsc('adv_search_filters')?></li>
     <? $i = 0; foreach ($filterList as $field => $filters): ?>