diff --git a/config/vufind/Pazpar2.ini b/config/vufind/Pazpar2.ini
new file mode 100644
index 0000000000000000000000000000000000000000..f4e26bb2cb04e99b7d3d7958ad8d9daf0a58877c
--- /dev/null
+++ b/config/vufind/Pazpar2.ini
@@ -0,0 +1,32 @@
+; This section contains global settings affecting search behavior.
+[General]
+; This should be the base URL of your Pazpar2 server -- REQUIRED
+base_url = "http://your-server/pazpar2/search.pz2"
+
+; This setting controls the default sort order of search results; the selected
+; option should be one of the options present in the [Sorting] section below.
+default_sort         = relevance
+
+; This section shows which search types will display in the basic search box at
+; the top of Pazpar2 pages.  The value of each setting is the text to display on
+; screen.  All on-screen text will be run through the translator, so be sure to
+; update language files if necessary.  The order of these settings will be
+; maintained in the drop-down list in the UI.
+[Basic_Searches]
+; NOT CURRENTLY SUPPORTED
+
+; This section defines which search options will be included on the advanced
+; search screen.  All the notes above [Basic_Searches] also apply here.
+[Advanced_Searches]
+; NOT CURRENTLY SUPPORTED
+
+; This section defines the sort options available on Pazpar2 search results.
+; Values on the left of the equal sign are Pazpar2 API sort values.  Values 
+; on the right of the equal sign are text that will be run through the 
+; translation module and displayed on screen.
+[Sorting]
+relevance   = sort_relevance
+
+; This section controls the behavior of the Pazpar2Record module.  See the
+; [Record] section of the main config.ini for more detailed documentation.
+[Record]
diff --git a/module/VuFind/config/module.config.php b/module/VuFind/config/module.config.php
index 20a5ff76e25b0003c214fd74c9a78aa62e37156d..cd5f26a2ba00c5bcd8049f2e6d4da2955b0902a1 100644
--- a/module/VuFind/config/module.config.php
+++ b/module/VuFind/config/module.config.php
@@ -102,6 +102,7 @@ $config = array(
             'missingrecord' => 'VuFind\Controller\MissingrecordController',
             'my-research' => 'VuFind\Controller\MyResearchController',
             'oai' => 'VuFind\Controller\OaiController',
+            'pazpar2' => 'VuFind\Controller\Pazpar2Controller',
             'records' => 'VuFind\Controller\RecordsController',
             'search' => 'VuFind\Controller\SearchController',
             'summon' => 'VuFind\Controller\SummonController',
@@ -658,6 +659,13 @@ $config = array(
                             $sm->getServiceLocator()->get('VuFind\Config')->get('searches')
                         );
                     },
+                    'pazpar2' => function ($sm) {
+                        return new \VuFind\RecordDriver\Pazpar2(
+                            $sm->getServiceLocator()->get('VuFind\Config')->get('config'),
+                            null,
+                            $sm->getServiceLocator()->get('VuFind\Config')->get('searches')
+                        );
+                    },
                     'solrdefault' => function ($sm) {
                         return new \VuFind\RecordDriver\SolrDefault(
                             $sm->getServiceLocator()->get('VuFind\Config')->get('config'),
@@ -835,6 +843,7 @@ $config = array(
             ),
             'search_backend' => array(
                 'factories' => array(
+                    'Pazpar2' => 'VuFind\Search\Factory\Pazpar2BackendFactory',
                     'Solr' => 'VuFind\Search\Factory\SolrDefaultBackendFactory',
                     'SolrAuth' => 'VuFind\Search\Factory\SolrAuthBackendFactory',
                     'SolrReserves' => 'VuFind\Search\Factory\SolrReservesBackendFactory',
@@ -906,6 +915,11 @@ $config = array(
         // driver is not defined here, it will inherit configuration from a configured
         // parent class.
         'recorddriver_tabs' => array(
+            'VuFind\RecordDriver\Pazpar2' => array(
+                'tabs' => array (
+                    'Details' => 'StaffViewMARC',
+                 ),
+            ),
             'VuFind\RecordDriver\SolrAuth' => array(
                 'tabs' => array (
                     'Details' => 'StaffViewMARC',
@@ -988,7 +1002,7 @@ $staticRoutes = array(
     'MyResearch/Favorites', 'MyResearch/Fines',
     'MyResearch/Holds', 'MyResearch/Home', 'MyResearch/Logout', 'MyResearch/Profile',
     'MyResearch/SaveSearch',
-    'OAI/Server', 'Records/Home',
+    'OAI/Server', 'Pazpar2/Home', 'Pazpar2/Search', 'Records/Home',
     'Search/Advanced', 'Search/Email', 'Search/History', 'Search/Home',
     'Search/NewItem', 'Search/OpenSearch', 'Search/Reserves', 'Search/Results',
     'Search/Suggest',
diff --git a/module/VuFind/src/VuFind/Controller/Pazpar2Controller.php b/module/VuFind/src/VuFind/Controller/Pazpar2Controller.php
new file mode 100644
index 0000000000000000000000000000000000000000..638120ae0492ce55b35597012a0bebaf20fea48b
--- /dev/null
+++ b/module/VuFind/src/VuFind/Controller/Pazpar2Controller.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Pazpar2 Controller
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2010.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Controller
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org   Main Site
+ */
+namespace VuFind\Controller;
+
+/**
+ * Pazpar2 Controller
+ *
+ * @category VuFind2
+ * @package  Controller
+ * @author   Chris Hallberg <challber@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org   Main Site
+ */
+class Pazpar2Controller extends AbstractSearch
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        $this->searchClassId = 'Pazpar2';
+        parent::__construct();
+    }
+
+    /**
+     * Home action
+     *
+     * @return mixed
+     */
+    public function homeAction()
+    {
+        // Set up default parameters:
+        return $this->createViewModel();
+    }
+
+    /**
+     * Search action -- call standard results action
+     *
+     * @return mixed
+     */
+    public function searchAction()
+    {
+        return $this->resultsAction();
+    }
+}
+
diff --git a/module/VuFind/src/VuFind/Controller/Pazpar2recordController.php b/module/VuFind/src/VuFind/Controller/Pazpar2recordController.php
new file mode 100644
index 0000000000000000000000000000000000000000..1a7b7bba9f30a617556f24791058be30a64e9c93
--- /dev/null
+++ b/module/VuFind/src/VuFind/Controller/Pazpar2recordController.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Pazpar2 Record Controller
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2010.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Controller
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org   Main Site
+ */
+namespace VuFind\Controller;
+
+/**
+ * Pazpar2 Record Controller
+ *
+ * @category VuFind2
+ * @package  Controller
+ * @author   Chris Hallberg <challber@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org   Main Site
+ */
+class Pazpar2recordController extends AbstractRecord
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        throw new \Exception('Pazpar2 record view not supported.');
+
+        // Override some defaults:
+        $this->searchClassId = 'Pazpar2';
+
+        // Call standard record controller initialization:
+        parent::__construct();
+    }
+}
diff --git a/module/VuFind/src/VuFind/RecordDriver/Pazpar2.php b/module/VuFind/src/VuFind/RecordDriver/Pazpar2.php
new file mode 100644
index 0000000000000000000000000000000000000000..b2c6f489c2e65c2e2744079cd88013f22b4d61a0
--- /dev/null
+++ b/module/VuFind/src/VuFind/RecordDriver/Pazpar2.php
@@ -0,0 +1,267 @@
+<?php
+/**
+ * Model for Pazpar2 records.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2010.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  RecordDrivers
+ * @author   Chris Hallberg <challber@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org/wiki/other_than_marc Wiki
+ */
+namespace VuFind\RecordDriver;
+
+/**
+ * Model for Pazpar2 records.
+ *
+ * @category VuFind2
+ * @package  RecordDrivers
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org/wiki/other_than_marc Wiki
+ */
+class Pazpar2 extends SolrDefault
+{
+    /**
+     * Pazpar2 fields
+     *
+     * @var array
+     */
+    protected $pz2fields = array();
+
+    /**
+     * Set raw data to initialize the object.
+     *
+     * @param mixed $data Raw data representing the record; Record Model
+     * objects are normally constructed by Record Driver objects using data
+     * passed in from a Search Results object.  The exact nature of the data may
+     * vary depending on the data source -- the important thing is that the
+     * Record Driver + Search Results objects work together correctly.
+     *
+     * @return void
+     */
+    public function setRawData($data)
+    {
+        $this->pz2fields = $this->xmlToArray($data);
+    }
+
+    /**
+     * Converts a SimpleXMLElement to an array
+     *
+     * @param \SimpleXMLElement $xml to be converted
+     *
+     * @return associative array of converted XML
+     */
+    protected function xmlToArray($xml)
+    {
+        $array = array();
+        foreach ($xml as $key=>$data) {
+            $children = array();
+            // Attributes
+            if (count($data->attributes()) > 0) {
+                $children['_attr_'] = array();
+                foreach ($data->attributes() as $name=>$attr) {
+                    $children['_attr_'][$name] =(string) $attr;
+                }
+            }
+            // If there's no children, we're at data
+            if ($data->count() == 0) {
+                if (!isset($children['_attr_'])) {
+                    $children =(string) $data; // Flatten
+                } else {
+                    $children[$key] =(string) $data;
+                }
+            } else {
+                // If there's children, recurse on this XML
+                $children = $this->xmlToArray($data);
+            }
+            // If first child with this name
+            if (!isset($array[$key])) {
+                $array[$key] = $children;
+            } else {
+                if (is_array($array[$key])
+                    && is_numeric(current(array_keys($array[$key])))
+                ) {
+                    $array[$key][] = $children;
+                } else {
+                    // Convert for multiple children
+                    $array[$key] = array(
+                        $array[$key],
+                        $children
+                    );
+                }
+            }
+        }
+        // Top-level Attributes
+        if (count($xml->attributes()) > 0) {
+            $array['_attr_'] = array();
+            foreach ($xml->attributes() as $key=>$attr) {
+                $array['_attr_'][$key] =(string) $attr;
+            }
+        }
+        return $array;
+    }
+
+    /**
+     * Return the unique identifier of this record within the Solr index;
+     * useful for retrieving additional information (like tags and user
+     * comments) from the external MySQL database.
+     *
+     * @return string Unique identifier.
+     */
+    public function getUniqueId()
+    {
+        return isset($this->pz2fields['location']['md-id'])
+            ? $this->pz2fields['location']['md-id']
+            : $this->pz2fields['recid'];
+    }
+
+    /**
+     * Get the main author of the record.
+     *
+     * @return string
+     */
+    public function getPrimaryAuthor()
+    {
+        $authors = isset($this->pz2fields['md-author']) ?
+            $this->pz2fields['md-author'] : '';
+
+        return is_array($authors) ? $authors[0] : $authors;
+    }
+
+    /**
+     * Get the providers of the record.
+     *
+     * @return array
+     */
+    public function getProviders()
+    {
+        if ($this->pz2fields['location']) {
+            if (isset($this->pz2fields['location']['_attr_'])) {
+                return array($this->pz2fields['location']['_attr_']['name']);
+            } else {
+                $providers = array();
+                foreach ($this->pz2fields['location'] as $i=>$location) {
+                    if ( isset($location['_attr_']['name'])
+                        && !in_array($location['_attr_']['name'], $providers)
+                    ) {
+                        $providers[] = $location['_attr_']['name'];
+                    }
+                }
+                return $providers;
+            }
+        }
+        return array();
+    }
+
+    /**
+     * Get the publication dates of the record.  See also getDateSpan().
+     *
+     * @return array
+     */
+    public function getPublicationDates()
+    {
+        return isset($this->pz2fields['md-date']) ?
+            array($this->pz2fields['md-date']) : array();
+    }
+
+    /**
+     * Get an array of all secondary authors (complementing getPrimaryAuthor()).
+     *
+     * @return array
+     */
+    public function getSecondaryAuthors()
+    {
+        $authors = isset($this->pz2fields['md-author']) ?
+            $this->pz2fields['md-author'] : '';
+
+        return is_array($authors) ? array_slice($authors, 1) : array();
+    }
+
+    /**
+     * Get the full title of the record.
+     *
+     * @return string
+     */
+    public function getTitle()
+    {
+        return $this->getShortTitle();
+    }
+
+    /**
+     * Get the short (pre-subtitle) title of the record.
+     *
+     * @return string
+     */
+    public function getShortTitle()
+    {
+        return isset($this->pz2fields['md-title']) ?
+            $this->pz2fields['md-title'] : '';
+    }
+
+    /**
+     * Return an array of associative URL arrays with one or more of the following
+     * keys:
+     *
+     * <li>
+     *   <ul>desc: URL description text to display (optional)</ul>
+     *   <ul>url: fully-formed URL (required if 'route' is absent)</ul>
+     *   <ul>route: VuFind route to build URL with (required if 'url' is absent)</ul>
+     *   <ul>routeParams: Parameters for route (optional)</ul>
+     *   <ul>queryString: Query params to append after building route (optional)</ul>
+     * </li>
+     *
+     * @return array
+     */
+    public function getURLs()
+    {
+        if (isset($this->pz2fields['location']['md-electronic-url'])) {
+            return array_map(
+                function ($url) {
+                    return array('url' => $url);
+                },
+                (array) $this->pz2fields['location']['md-electronic-url']
+            );
+        }
+        return array();
+    }
+
+    /**
+     * Does the OpenURL configuration indicate that we should display OpenURLs in
+     * the specified context?
+     *
+     * @param string $area 'results', 'record' or 'holdings'
+     *
+     * @return bool
+     */
+    public function openURLActive($area)
+    {
+        return AbstractBase::openURLActive($area);
+    }
+
+    /**
+     * Support method for getOpenURL() -- pick the OpenURL format.
+     *
+     * @return string
+     */
+    protected function getOpenURLFormat()
+    {
+        return 'Book';
+    }
+}
diff --git a/module/VuFind/src/VuFind/Search/Factory/Pazpar2BackendFactory.php b/module/VuFind/src/VuFind/Search/Factory/Pazpar2BackendFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb3c9ebdac438d4b7266583d65dfb2811569f6a2
--- /dev/null
+++ b/module/VuFind/src/VuFind/Search/Factory/Pazpar2BackendFactory.php
@@ -0,0 +1,147 @@
+<?php
+
+/**
+ * Factory for Pazpar2 backends.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2013.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Search
+ * @author   David Maus <maus@hab.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org   Main Site
+ */
+
+namespace VuFind\Search\Factory;
+
+use VuFindSearch\Backend\BackendInterface;
+use VuFindSearch\Backend\Pazpar2\Response\RecordCollectionFactory;
+use VuFindSearch\Backend\Pazpar2\QueryBuilder;
+use VuFindSearch\Backend\Pazpar2\Connector;
+use VuFindSearch\Backend\Pazpar2\Backend;
+
+use Zend\ServiceManager\ServiceLocatorInterface;
+use Zend\ServiceManager\FactoryInterface;
+
+/**
+ * Factory for Pazpar2 backends.
+ *
+ * @category VuFind2
+ * @package  Search
+ * @author   David Maus <maus@hab.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org   Main Site
+ */
+class Pazpar2BackendFactory implements FactoryInterface
+{
+    /**
+     * Logger.
+     *
+     * @var Zend\Log\LoggerInterface
+     */
+    protected $logger;
+
+    /**
+     * Superior service manager.
+     *
+     * @var ServiceLocatorInterface
+     */
+    protected $serviceLocator;
+
+    /**
+     * VuFind configuration
+     *
+     * @var \Zend\Config\Config
+     */
+    protected $config;
+
+    /**
+     * Create the backend.
+     *
+     * @param ServiceLocatorInterface $serviceLocator Superior service manager
+     *
+     * @return BackendInterface
+     */
+    public function createService(ServiceLocatorInterface $serviceLocator)
+    {
+        $this->serviceLocator = $serviceLocator;
+        $this->config = $this->serviceLocator->get('VuFind\Config')->get('Pazpar2');
+        if ($this->serviceLocator->has('VuFind\Logger')) {
+            $this->logger = $this->serviceLocator->get('VuFind\Logger');
+        }
+        $connector = $this->createConnector();
+        $backend   = $this->createBackend($connector);
+        return $backend;
+    }
+
+    /**
+     * Create the Pazpar2 backend.
+     *
+     * @param Connector $connector Connector
+     *
+     * @return Backend
+     */
+    protected function createBackend(Connector $connector)
+    {
+        $backend = new Backend($connector, $this->createRecordCollectionFactory());
+        $backend->setLogger($this->logger);
+        $backend->setQueryBuilder($this->createQueryBuilder());
+        return $backend;
+    }
+
+    /**
+     * Create the Pazpar2 connector.
+     *
+     * @return Connector
+     */
+    protected function createConnector()
+    {
+        $connector = new Connector(
+            $this->config->General->base_url,
+            $this->serviceLocator->get('VuFind\Http')->createClient()
+        );
+        $connector->setLogger($this->logger);
+        return $connector;
+    }
+
+    /**
+     * Create the Pazpar2 query builder.
+     *
+     * @return QueryBuilder
+     */
+    protected function createQueryBuilder()
+    {
+        return new QueryBuilder();
+    }
+
+    /**
+     * Create the record collection factory
+     *
+     * @return RecordCollectionFactory
+     */
+    protected function createRecordCollectionFactory()
+    {
+        $manager = $this->serviceLocator->get('VuFind\RecordDriverPluginManager');
+        $callback = function ($data) use ($manager) {
+            $driver = $manager->get('Pazpar2');
+            $driver->setRawData($data);
+            return $driver;
+        };
+        return new RecordCollectionFactory($callback);
+    }
+}
\ No newline at end of file
diff --git a/module/VuFind/src/VuFind/Search/Pazpar2/Options.php b/module/VuFind/src/VuFind/Search/Pazpar2/Options.php
new file mode 100644
index 0000000000000000000000000000000000000000..de2eb698f2d2726f1dccc0bbcf0d4bc45f1e4239
--- /dev/null
+++ b/module/VuFind/src/VuFind/Search/Pazpar2/Options.php
@@ -0,0 +1,104 @@
+<?php
+/**
+ * Pazpar2 Search Options
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2011.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Search_Pazpar2
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://www.vufind.org  Main Page
+ */
+namespace VuFind\Search\Pazpar2;
+
+/**
+ * Pazpar2 Search Options
+ *
+ * @category VuFind2
+ * @package  Search_Pazpar2
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://www.vufind.org  Main Page
+ */
+class Options extends \VuFind\Search\Base\Options
+{
+    /**
+     * Constructor
+     *
+     * @param \VuFind\Config\PluginManager $configLoader Config loader
+     */
+    public function __construct(\VuFind\Config\PluginManager $configLoader)
+    {
+        parent::__construct($configLoader);
+        $this->searchIni = $this->facetsIni = 'Pazpar2';
+
+        $this->limitOptions = array($this->defaultLimit);
+        
+        // Load source settings
+        $searchSettings = $configLoader->get($this->searchIni);
+        if (isset($searchSettings->IndexSources)
+            && !empty($searchSettings->IndexSources)
+        ) {
+            foreach ($searchSettings->IndexSources as $k => $v) {
+                $this->shards[$k] = $v;
+            }
+            // If we have a default from the configuration, use that...
+            if (isset($searchSettings->SourcePreferences->defaultChecked)
+                && !empty($searchSettings->SourcePreferences->defaultChecked)
+            ) {
+                $defaultChecked
+                    = is_object($searchSettings->SourcePreferences->defaultChecked)
+                    ? $searchSettings->SourcePreferences->defaultChecked->toArray()
+                    : array($searchSettings->SourcePreferences->defaultChecked);
+                foreach ($defaultChecked as $current) {
+                    $this->defaultSelectedShards[] = $current;
+                }
+            } else {
+                // If no default is configured, use all sources...
+                $this->defaultSelectedShards = array_keys($this->shards);
+            }
+            // Apply checkbox visibility setting if applicable:
+            if (isset($searchSettings->SourcePreferences->showCheckboxes)) {
+                $this->visibleShardCheckboxes
+                    = $searchSettings->SourcePreferences->showCheckboxes;
+            }
+        }
+    }
+
+    /**
+     * Return the route name for the search results action.
+     *
+     * @return string
+     */
+    public function getSearchAction()
+    {
+        return 'pazpar2-search';
+    }
+
+    /**
+     * Return the route name of the action used for performing advanced searches.
+     * Returns false if the feature is not supported.
+     *
+     * @return string|bool
+     */
+    public function getAdvancedSearchAction()
+    {
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/module/VuFind/src/VuFind/Search/Pazpar2/Params.php b/module/VuFind/src/VuFind/Search/Pazpar2/Params.php
new file mode 100644
index 0000000000000000000000000000000000000000..045abf57143c72c3c59cc3f5094ec8667b55c2f4
--- /dev/null
+++ b/module/VuFind/src/VuFind/Search/Pazpar2/Params.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Pazpar2 Search Parameters
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2011.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Search_Pazpar2
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://www.vufind.org  Main Page
+ */
+namespace VuFind\Search\Pazpar2;
+
+/**
+ * Pazpar2 Search Parameters
+ *
+ * @category VuFind2
+ * @package  Search_Pazpar2
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://www.vufind.org  Main Page
+ */
+class Params extends \VuFind\Search\Base\Params
+{
+}
\ No newline at end of file
diff --git a/module/VuFind/src/VuFind/Search/Pazpar2/Results.php b/module/VuFind/src/VuFind/Search/Pazpar2/Results.php
new file mode 100644
index 0000000000000000000000000000000000000000..4fbcb72ae91b5119df9738ab8970ce6007fd5cf2
--- /dev/null
+++ b/module/VuFind/src/VuFind/Search/Pazpar2/Results.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Pazpar2 Search Results
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2011.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Search_Pazpar2
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://www.vufind.org  Main Page
+ */
+namespace VuFind\Search\Pazpar2;
+use VuFindSearch\Query\AbstractQuery;
+use VuFindSearch\ParamBag;
+
+/**
+ * Pazpar2 Search Parameters
+ *
+ * @category VuFind2
+ * @package  Search_Pazpar2
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://www.vufind.org  Main Page
+ */
+class Results extends \VuFind\Search\Base\Results
+{
+    /**
+     * Support method for performAndProcessSearch -- perform a search based on the
+     * parameters passed to the object.
+     *
+     * @return void
+     */
+    protected function performSearch()
+    {
+        $query  = $this->getParams()->getQuery();
+        $limit  = $this->getParams()->getLimit();
+        $offset = $this->getStartRecord() - 1;
+        $params = $this->createBackendParameters($query, $this->getParams());
+        $collection = $this->getSearchService()
+            ->search('Pazpar2', $query, $offset, $limit, $params);
+
+        $this->resultTotal = $collection->getTotal();
+        $this->results = $collection->getRecords();
+    }
+
+    /**
+     * Returns the stored list of facets for the last search
+     *
+     * @param array $filter Array of field => on-screen description listing
+     * all of the desired facet fields; set to null to get all configured values.
+     *
+     * @return array        Facets data arrays
+     */
+    public function getFacetList($filter = null)
+    {
+        // No facets in Pazpar2:
+        return array();
+    }
+
+    /**
+     * Create search backend parameters for advanced features.
+     *
+     * @param AbstractQuery $query  Query being processed
+     * @param Params        $params Search parameters
+     *
+     * @return ParamBag
+     */
+    protected function createBackendParameters(AbstractQuery $query, Params $params)
+    {
+        $backendParams = new ParamBag();
+
+        // Sources
+        $sources = $params->getSelectedShards();
+        if (!empty($sources)) {
+            $allShards = $params->getOptions()->getShards();
+            foreach ($sources as $i=>$current) {
+                $sources[$i] = $allShards[$current];
+            }
+            $backendParams->set('filter', 'pz:id='.implode('|', $sources));
+        }
+
+        return $backendParams;
+    }
+}
\ No newline at end of file
diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Backend.php b/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Backend.php
new file mode 100644
index 0000000000000000000000000000000000000000..1bc67ff581b5083db3004ae4554aafa273defcbc
--- /dev/null
+++ b/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Backend.php
@@ -0,0 +1,297 @@
+<?php
+/**
+ * Pazpar2 backend.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2010.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Search
+ * @author   David Maus <maus@hab.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org
+ */
+namespace VuFindSearch\Backend\Pazpar2;
+
+use VuFindSearch\Query\AbstractQuery;
+
+use VuFindSearch\ParamBag;
+
+use VuFindSearch\Response\RecordCollectionInterface;
+use VuFindSearch\Response\RecordCollectionFactoryInterface;
+
+use VuFindSearch\Backend\BackendInterface;
+use VuFindSearch\Backend\Exception\BackendException;
+
+use Zend\Log\LoggerInterface;
+
+/**
+ * Pazpar2 backend.
+ *
+ * @category VuFind2
+ * @package  Search
+ * @author   David Maus <maus@hab.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org
+ */
+class Backend implements BackendInterface
+{
+    /**
+     * Record collection factory.
+     *
+     * @var RecordCollectionFactoryInterface
+     */
+    protected $collectionFactory;
+
+    /**
+     * Logger, if any.
+     *
+     * @var LoggerInterface
+     */
+    protected $logger;
+
+    /**
+     * Connector.
+     *
+     * @var Connector
+     */
+    protected $connector;
+
+    /**
+     * Backend identifier.
+     *
+     * @var string
+     */
+    protected $identifier = null;
+
+    /**
+     * Query builder.
+     *
+     * @var QueryBuilder
+     */
+    protected $queryBuilder;
+
+    /**
+     * Constructor.
+     *
+     * @param Connector                        $connector Pazpar2 connector
+     * @param RecordCollectionFactoryInterface $factory   Record collection factory
+     *
+     * @return void
+     */
+    public function __construct(Connector $connector,
+        RecordCollectionFactoryInterface $factory
+    ) {
+        $this->setRecordCollectionFactory($factory);
+        $this->connector    = $connector;
+    }
+
+    /**
+     * Set the backend identifier.
+     *
+     * @param string $identifier Backend identifier
+     *
+     * @return void
+     */
+    public function setIdentifier($identifier)
+    {
+        $this->identifier = $identifier;
+    }
+
+    /**
+     * Perform a search and return record collection.
+     *
+     * @param AbstractQuery $query  Search query
+     * @param integer       $offset Search offset
+     * @param integer       $limit  Search limit
+     * @param ParamBag      $params Search backend parameters
+     *
+     * @return RecordCollectionInterface
+     */
+    public function search(AbstractQuery $query, $offset, $limit,
+        ParamBag $params = null
+    ) {
+        $baseParams = $this->getQueryBuilder()->build($query);
+        if (null !== $params) {
+            $baseParams->mergeWith($params);
+        }
+        $this->connector->search($baseParams);
+
+        $showParams = new ParamBag(
+            array('block' => 1, 'num' => $limit, 'start' => $offset)
+        );
+        $response = $this->connector->show($showParams);
+
+        $hits = isset($response->hit) ? $response->hit : array();
+        $collection = $this->createRecordCollection(
+            $hits, intval($response->merged), $offset
+        );
+        $this->injectSourceIdentifier($collection);
+        return $collection;
+    }
+
+    /**
+     * Retrieve a single document.
+     *
+     * @param string   $id     Document identifier
+     * @param ParamBag $params Search backend parameters
+     *
+     * @return RecordCollectionInterface
+     */
+    public function retrieve($id, ParamBag $params = null)
+    {
+        $response   = $this->connector->record($id);
+        $collection = $this->createRecordCollection(array($response), 1);
+        $this->injectSourceIdentifier($collection);
+        return $collection;
+    }
+
+    /**
+     * Set the Logger.
+     *
+     * @param LoggerInterface $logger Logger
+     *
+     * @return void
+     */
+    public function setLogger(LoggerInterface $logger)
+    {
+        $this->logger = $logger;
+    }
+
+    /**
+     * Return query builder.
+     *
+     * Lazy loads an empty QueryBuilder if none was set.
+     *
+     * @return QueryBuilder
+     */
+    public function getQueryBuilder()
+    {
+        if (!$this->queryBuilder) {
+            $this->queryBuilder = new QueryBuilder();
+        }
+        return $this->queryBuilder;
+    }
+
+    /**
+     * Set the query builder.
+     *
+     * @param QueryBuilder $queryBuilder Query builder
+     *
+     * @return void
+     *
+     * @todo Typehint QueryBuilderInterface
+     */
+    public function setQueryBuilder(QueryBuilder $queryBuilder)
+    {
+        $this->queryBuilder = $queryBuilder;
+    }
+
+    /**
+     * Return backend identifier.
+     *
+     * @return string
+     */
+    public function getIdentifier()
+    {
+        return $this->identifier;
+    }
+
+    /**
+     * Set the record collection factory.
+     *
+     * @param RecordCollectionFactoryInterface $factory Factory
+     *
+     * @return void
+     */
+    public function setRecordCollectionFactory(
+        RecordCollectionFactoryInterface $factory
+    ) {
+        $this->collectionFactory = $factory;
+    }
+
+    /**
+     * Return the record collection factory.
+     *
+     * Lazy loads a generic collection factory.
+     *
+     * @return RecordCollectionFactoryInterface
+     */
+    public function getRecordCollectionFactory()
+    {
+        return $this->collectionFactory;
+    }
+
+    /**
+     * Return the Summon connector.
+     *
+     * @return Connector
+     */
+    public function getConnector()
+    {
+        return $this->connector;
+    }
+
+    /// Internal API
+
+    /**
+     * Inject source identifier in record collection and all contained records.
+     *
+     * @param ResponseInterface $response Response
+     *
+     * @return void
+     */
+    protected function injectSourceIdentifier(RecordCollectionInterface $response)
+    {
+        $response->setSourceIdentifier($this->identifier);
+        foreach ($response as $record) {
+            $record->setSourceIdentifier($this->identifier);
+        }
+        return $response;
+    }
+
+    /**
+     * Send a message to the logger.
+     *
+     * @param string $level   Log level
+     * @param string $message Log message
+     * @param array  $context Log context
+     *
+     * @return void
+     */
+    protected function log($level, $message, array $context = array())
+    {
+        if ($this->logger) {
+            $this->logger->$level($message, $context);
+        }
+    }
+
+    /**
+     * Create record collection.
+     *
+     * @param array $records Records to process
+     * @param int   $total   Total result count
+     * @param int   $offset  Search offset
+     *
+     * @return RecordCollectionInterface
+     */
+    protected function createRecordCollection($records, $total = 0, $offset = 0)
+    {
+        return $this->getRecordCollectionFactory()
+            ->factory(compact('records', 'total', 'offset'));
+    }
+}
\ No newline at end of file
diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Connector.php b/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Connector.php
new file mode 100644
index 0000000000000000000000000000000000000000..053cfa69efe90316f8e339661bdbe6dff5eb0136
--- /dev/null
+++ b/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Connector.php
@@ -0,0 +1,336 @@
+<?php
+/**
+ * Central class for connecting to Pazpar2 resources used by VuFind.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2011.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Connection
+ * @author   Chris Hallberg <challber@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org/wiki/system_classes Wiki
+ */
+namespace VuFindSearch\Backend\Pazpar2;
+
+use VuFindSearch\ParamBag;
+use VuFindSearch\Backend\Exception\HttpErrorException;
+
+use Zend\Http\Request;
+
+use Zend\Log\LoggerInterface;
+
+/**
+ * Central class for connecting to resources used by VuFind.
+ *
+ * @category VuFind2
+ * @package  Connection
+ * @author   Chris Hallberg <challber@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org/wiki/system_classes Wiki
+ */
+class Connector
+{
+    /**
+     * Base url for searches
+     *
+     * @var string
+     */
+    protected $base;
+
+    /**
+     * The HTTP_Request object used for REST transactions
+     *
+     * @var \Zend\Http\Client
+     */
+    protected $client;
+
+    /**
+     * Session ID
+     *
+     * @var string
+     */
+    protected $session = false;
+
+    /**
+     * Logger instance.
+     *
+     * @var LoggerInterface
+     */
+    protected $logger = false;
+
+    /**
+     * Constructor
+     *
+     * @param string            $base     Base URL for Pazpar2
+     * @param \Zend\Http\Client $client   An HTTP client object
+     * @param bool              $autoInit Should we auto-initialize the Pazpar2
+     * connection?
+     */
+    public function __construct($base, \Zend\Http\Client $client, $autoInit = false)
+    {
+        $this->base = $base;
+        if (empty($this->base)) {
+            throw new \Exception('Missing Pazpar2 base URL.');
+        }
+
+        $this->client = $client;
+        $this->client->setMethod(Request::METHOD_GET);  // always use GET
+
+        if ($autoInit) {
+            $this->init();
+        }
+    }
+
+    /**
+     * Set logger instance.
+     *
+     * @param LoggerInterface $logger Logger
+     *
+     * @return void
+     */
+    public function setLogger(LoggerInterface $logger)
+    {
+        $this->logger = $logger;
+    }
+
+    /**
+     * Initializes a session. Returns session ID to be used in subsequent requests.
+     * Adds session to the base
+     *
+     * @return session id
+     */
+    public function init()
+    {
+        $this->session = false; // clear any existing session
+        $session = $this->query('init');
+        if (!isset($session->session)) {
+            throw new \Exception('Session initialization failed.');
+        }
+        $this->session = $session->session;
+        return $session;
+    }
+
+    /**
+     * Requests and receives information from pazpar
+     *
+     * @param string   $command the command to be executed
+     * @param ParamBag $data    optional extra data
+     *
+     * @return SimpleXMLElement Response
+     */
+    protected function query($command, ParamBag $data = null)
+    {
+        // If we don't have a session as long as we're not being explict
+        if (!$this->session && $command !== 'init') {
+            $this->init();
+        }
+
+        // Don't change input when manipulating parameters:
+        $params = (null === $data) ? new ParamBag() : clone($data);
+
+        // Add session and command:
+        if ($this->session) {
+            $params->set('session', $this->session);
+        }
+        $params->set('command', $command);
+
+        $this->client->setUri($this->base . '?' . implode('&', $params->request()));
+        $xmlStr = $this->send($this->client);
+        $xml = simplexml_load_string($xmlStr);
+
+        // If our session has expired, start a new session
+        if ($command !== 'init'
+            && $xml->session == $this->session && isset($this->session)
+        ) {
+            $this->init();
+            return $this->query($command, $data);
+        }
+        return $xml;
+    }
+
+    /**
+     * Send a request and return the response.
+     *
+     * @param \Zend\Http\Client $client Prepare HTTP client
+     *
+     * @return string Response body
+     *
+     * @throws RemoteErrorException  SOLR signaled a server error (HTTP 5xx)
+     * @throws RequestErrorException SOLR signaled a client error (HTTP 4xx)
+     */
+    protected function send(\Zend\Http\Client $client)
+    {
+        if ($this->logger) {
+            $this->logger->debug(
+                sprintf('=> %s %s', $client->getMethod(), $client->getUri())
+            );
+        }
+
+        $time     = microtime(true);
+        $response = $client->send();
+        $time     = microtime(true) - $time;
+
+        if ($this->logger) {
+            $this->logger->debug(
+                sprintf(
+                    '<= %s %s', $response->getStatusCode(),
+                    $response->getReasonPhrase()
+                ), array('time' => $time)
+            );
+        }
+
+        if (!$response->isSuccess()) {
+            throw HttpErrorException::createFromResponse($response);
+        }
+        return $response->getBody();
+    }
+
+    /**
+     * Keeps a session alive. An idle session will time out after one minute.
+     * The ping command can be used to keep the session alive absent other activity.
+     * It is suggested that any browser client have a simple alarm handler
+     * which sends a ping every 50 seconds or so once a session has been initialized
+     *
+     * @return void
+     */
+    public function ping()
+    {
+        $ping = $this->query('ping');
+    }
+
+    /**
+     * Retrieves a detailed record.
+     * Unlike the show command, this command returns
+     * metadata records before merging takes place.
+     *
+     * @param string $id array of options as described above
+     *
+     * @return associative array of XML data
+     */
+    public function record($id)
+    {
+        return $this->query('record', new ParamBag(array('id'=>$id)));
+    }
+
+    /**
+     * Launches a search.
+     *
+     * Option (default):
+     *  - query     : search string ('')
+     *  - filter    : setting+operator+args pairs, such as 'pz:id=4|17, pz:id~3'
+     *  - limit     : Narrows the search by one or more fields (typically facets)
+     *                as name=arg1|arg2| pairs separated by comma (none)
+     *  - startrecs : int (0)
+     *  - maxrecs   : int (100)
+     *
+     * TODO: Make the array more useful to get the correct format?
+     *
+     * @param ParamBag $options array of options as described above
+     *
+     * @return associative array of XML data
+     */
+    public function search(ParamBag $options = null)
+    {
+        return $this->query('search', $options);
+    }
+
+    /**
+     * Return session id
+     *
+     * @return session id
+     */
+    public function session()
+    {
+        return $this->session;
+    }
+
+    /**
+     * Applies settings to this session
+     * Each setting parameter has the form name[target]=value
+     *
+     * TODO: Make the array more useful to get the correct format?
+     *
+     * @param string $settings settings to be sets
+     *
+     * @return bool Success/failure status
+     */
+    public function settings($settings = false)
+    {
+        if ($settings === false) {
+            return false;
+        }
+        $set = $this->query('settings', $settings);
+        return $set->status == 'OK';
+    }
+
+    /**
+     * Proper alias of results
+     *
+     * Options (default):
+     *  - start : int (0)
+     *  - num   : int (20)
+     *  - block : 1 = wait until enough records are found (0)
+     *  - sort  : column:1 [increasing] or 0 [decreasing] (none)
+     *
+     * @param ParamBag $options array of options as described above
+     *
+     * @return array Associative array of XML data
+     */
+    public function show(ParamBag $options = null)
+    {
+        return $this->query('show', $options);
+    }
+
+    /**
+     * Provides status information about an ongoing search.
+     *
+     * @return associative array of XML data
+     */
+    public function stat()
+    {
+        return $this->query('stat');
+    }
+
+    /**
+     * Retrieves term list(s).
+     *
+     * Options (default):
+     *  - name : comma-separated list of termlist names (all termlists)
+     *  - num  : maximum number of entries to return (15)
+     *
+     * @param ParamBag $options array of options as described above
+     *
+     * @return array Associative array of XML data
+     */
+    public function termlist(ParamBag $options = null)
+    {
+        return $this->query('termlist', $options);
+    }
+
+    /**
+     * Returns information about the status of each active client.
+     *
+     * @param string $id client id
+     *
+     * @return array Associative array of XML data
+     */
+    public function bytarget($id)
+    {
+        return $this->query('bytarget', new ParamBag(array('id'=>$id)));
+    }
+}
\ No newline at end of file
diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/QueryBuilder.php b/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/QueryBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..fcf952471a75475a3f7803243c6cca40e9dc5859
--- /dev/null
+++ b/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/QueryBuilder.php
@@ -0,0 +1,121 @@
+<?php
+
+/**
+ * Pazpar2 QueryBuilder.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2010.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Search
+ * @author   Andrew S. Nagy <vufind-tech@lists.sourceforge.net>
+ * @author   David Maus <maus@hab.de>
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org
+ */
+
+namespace VuFindSearch\Backend\Pazpar2;
+
+use VuFindSearch\Query\AbstractQuery;
+use VuFindSearch\Query\QueryGroup;
+use VuFindSearch\Query\Query;
+
+use VuFindSearch\ParamBag;
+
+/**
+ * Pazpar2 QueryBuilder.
+ *
+ * @category VuFind2
+ * @package  Search
+ * @author   Andrew S. Nagy <vufind-tech@lists.sourceforge.net>
+ * @author   David Maus <maus@hab.de>
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org
+ */
+class QueryBuilder
+{
+    /// Public API
+
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+    }
+
+    /**
+     * Return Pazpar2 search parameters based on a user query and params.
+     *
+     * @param AbstractQuery $query User query
+     *
+     * @return ParamBag
+     */
+    public function build(AbstractQuery $query)
+    {
+        // Build base query
+        $queryStr = $this->abstractQueryToString($query);
+
+        // Send back results
+        $params = new ParamBag();
+        $params->set('query', $queryStr);
+        return $params;
+    }
+
+    /// Internal API
+
+    /**
+     * Convert an AbstractQuery object to a query string.
+     *
+     * @param AbstractQuery $query Query to convert
+     *
+     * @return string
+     */
+    protected function abstractQueryToString(AbstractQuery $query)
+    {
+        if ($query instanceof Query) {
+            return $this->queryToString($query);
+        } else {
+            return $this->queryGroupToString($query);
+        }
+    }
+
+    /**
+     * Convert a QueryGroup object to a query string.
+     *
+     * @param QueryGroup $query QueryGroup to convert
+     *
+     * @return string
+     */
+    protected function queryGroupToString(QueryGroup $query)
+    {
+        throw new \Exception('Advanced queries not supported.');
+    }
+
+    /**
+     * Convert a single Query object to a query string.
+     *
+     * @param Query $query Query to convert
+     *
+     * @return string
+     */
+    protected function queryToString(Query $query)
+    {
+        return strtolower($query->getString());
+    }
+}
\ No newline at end of file
diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Response/RecordCollection.php b/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Response/RecordCollection.php
new file mode 100644
index 0000000000000000000000000000000000000000..909a3e6d00fe141b620c179cb439ff3a407bc79e
--- /dev/null
+++ b/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Response/RecordCollection.php
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * Pazpar2 record collection.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2010.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Search
+ * @author   David Maus <maus@hab.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org
+ */
+
+namespace VuFindSearch\Backend\Pazpar2\Response;
+
+use VuFindSearch\Response\AbstractRecordCollection;
+
+/**
+ * Pazpar2 record collection.
+ *
+ * @category VuFind2
+ * @package  Search
+ * @author   David Maus <maus@hab.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org
+ */
+class RecordCollection extends AbstractRecordCollection
+{
+    /**
+     * Raw response.
+     *
+     * @var array
+     */
+    protected $response;
+
+    /**
+     * Constructor.
+     *
+     * @param int $total  Total result count
+     * @param int $offset Search offset
+     *
+     * @return void
+     */
+    public function __construct($total = 0, $offset = 0)
+    {
+        $this->total = $total;
+        $this->offset = $offset;
+        $this->rewind();
+    }
+
+    /**
+     * Return total number of records found.
+     *
+     * @return int
+     */
+    public function getTotal()
+    {
+        return $this->total;
+    }
+
+    /**
+     * Return facet information.
+     *
+     * @return array
+     */
+    public function getFacets()
+    {
+        return array();
+    }
+
+    /**
+     * Return offset in the total search result set.
+     *
+     * @return int
+     */
+    public function getOffset()
+    {
+        return $this->offset;
+    }
+}
\ No newline at end of file
diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Response/RecordCollectionFactory.php b/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Response/RecordCollectionFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..63757ca96b64aa2f7ee93c91ad9511b2d1aae0f2
--- /dev/null
+++ b/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Response/RecordCollectionFactory.php
@@ -0,0 +1,97 @@
+<?php
+
+/**
+ * Simple factory for record collection.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2010.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Search
+ * @author   David Maus <maus@hab.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org
+ */
+
+namespace VuFindSearch\Backend\Pazpar2\Response;
+
+use VuFindSearch\Response\RecordCollectionFactoryInterface;
+use VuFindSearch\Exception\InvalidArgumentException;
+
+/**
+ * Simple factory for record collection.
+ *
+ * @category VuFind2
+ * @package  Search
+ * @author   David Maus <maus@hab.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org
+ */
+class RecordCollectionFactory implements RecordCollectionFactoryInterface
+{
+    /**
+     * Factory to turn data into a record object.
+     *
+     * @var Callable
+     */
+    protected $recordFactory;
+
+    /**
+     * Class of collection.
+     *
+     * @var string
+     */
+    protected $collectionClass;
+
+    /**
+     * Constructor.
+     *
+     * @param Callable $recordFactory   Record factory callback
+     * @param string   $collectionClass Class of collection
+     *
+     * @return void
+     */
+    public function __construct($recordFactory = null, $collectionClass = null)
+    {
+        if (!is_callable($recordFactory)) {
+            throw new InvalidArgumentException('Record factory must be callable.');
+        }
+        $this->recordFactory = $recordFactory;
+        $this->collectionClass = (null === $collectionClass)
+            ? 'VuFindSearch\Backend\Pazpar2\Response\RecordCollection'
+            : $collectionClass;
+    }
+
+    /**
+     * Return record collection.
+     *
+     * @param array $response Array with 'records', 'total' and 'offset' keys
+     *
+     * @return RecordCollection
+     */
+    public function factory($response)
+    {
+        $collection = new $this->collectionClass(
+            $response['total'], $response['offset']
+        );
+        foreach ($response['records'] as $doc) {
+            $collection->add(call_user_func($this->recordFactory, $doc));
+        }
+        return $collection;
+    }
+
+}
\ No newline at end of file
diff --git a/themes/blueprint/templates/RecordDriver/Pazpar2/link-author.phtml b/themes/blueprint/templates/RecordDriver/Pazpar2/link-author.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..34ec85e9849867608a0a901e72ab8ff8f452cfe1
--- /dev/null
+++ b/themes/blueprint/templates/RecordDriver/Pazpar2/link-author.phtml
@@ -0,0 +1 @@
+<?=$this->url('pazpar2-search')?>?lookfor=<?=urlencode($this->lookfor)?>&amp;type=author
\ No newline at end of file
diff --git a/themes/blueprint/templates/RecordDriver/Pazpar2/link-series.phtml b/themes/blueprint/templates/RecordDriver/Pazpar2/link-series.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..203012a0d1e20fd416074e7aeabf72b45f06f3c5
--- /dev/null
+++ b/themes/blueprint/templates/RecordDriver/Pazpar2/link-series.phtml
@@ -0,0 +1 @@
+<?=$this->url('pazpar2-search')?>?lookfor=%22<?=urlencode($this->lookfor)?>%22&amp;type=series
\ No newline at end of file
diff --git a/themes/blueprint/templates/RecordDriver/Pazpar2/link-subject.phtml b/themes/blueprint/templates/RecordDriver/Pazpar2/link-subject.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..12428b058b52d3d15abe04107fd9a063b3d719b6
--- /dev/null
+++ b/themes/blueprint/templates/RecordDriver/Pazpar2/link-subject.phtml
@@ -0,0 +1 @@
+<?=$this->url('pazpar2-search')?>?lookfor=%22<?=urlencode($this->lookfor)?>%22&amp;type=subject
\ No newline at end of file
diff --git a/themes/blueprint/templates/RecordDriver/Pazpar2/link-title.phtml b/themes/blueprint/templates/RecordDriver/Pazpar2/link-title.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..f0f81ef686c85302fd1beb62b9e565bd305602f7
--- /dev/null
+++ b/themes/blueprint/templates/RecordDriver/Pazpar2/link-title.phtml
@@ -0,0 +1 @@
+<?=$this->url('pazpar2-search')?>?lookfor=%22<?=urlencode($this->lookfor)?>%22&amp;type=title
\ No newline at end of file
diff --git a/themes/blueprint/templates/RecordDriver/Pazpar2/result-list.phtml b/themes/blueprint/templates/RecordDriver/Pazpar2/result-list.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..e89ae99d31cffe683329d9ed97eed3588b13cd6d
--- /dev/null
+++ b/themes/blueprint/templates/RecordDriver/Pazpar2/result-list.phtml
@@ -0,0 +1,98 @@
+<div class="result source<?=$this->escapeHtml($this->driver->getResourceSource())?> recordId<?=$this->driver->supportsAjaxStatus()?' ajaxItemId':''?>">
+  <input type="hidden" value="<?=$this->escapeHtml($this->driver->getUniqueID())?>" class="hiddenId" />
+  <div class="span-2">
+  <? if ($summThumb = $this->record($this->driver)->getThumbnail()): ?>
+    <img src="<?=$this->escapeHtml($summThumb)?>" class="summcover" alt="<?=$this->transEsc('Cover Image')?>"/>
+  <? else: ?>
+    <img src="<?=$this->url('cover-unavailable')?>" class="summcover" alt="<?=$this->transEsc('No Cover Image')?>"/>
+  <? endif; ?>
+  </div>
+  <div class="span-9">
+    <div class="resultItemLine1">
+      <b class="title"><?
+        $summHighlightedTitle = $this->driver->getHighlightedTitle();
+        $summTitle = $this->driver->getTitle();
+        if (!empty($summHighlightedTitle)) {
+            echo $this->highlight($this->addEllipsis($summHighlightedTitle, $summTitle));
+        } else if (!empty($summTitle)) {
+            echo $this->escapeHtml($this->truncate($summTitle, 180));
+        } else {
+            echo $this->transEsc('Title not available');
+        }
+      ?></b>
+    </div>
+
+    <div class="resultItemLine2">
+      <? $summAuthor = $this->driver->getPrimaryAuthor(); if (!empty($summAuthor)): ?>
+      <?=$this->transEsc('by')?>
+      <a href="<?=$this->record($this->driver)->getLink('author', $summAuthor)?>"><?
+        $summHighlightedAuthor = $this->driver->getHighlightedAuthor();
+        echo !empty($summHighlightedAuthor)
+            ? $this->highlight($summHighlightedAuthor)
+            : $this->escapeHtml($summAuthor);
+      ?></a>
+      <? endif; ?>
+
+      <? $journalTitle = $this->driver->getContainerTitle(); $summDate = $this->driver->getPublicationDates(); ?>
+      <? if (!empty($journalTitle)): ?>
+        <?=!empty($summAuthor) ? '<br />' : ''?>
+        <?=/* TODO: handle highlighting more elegantly here */ $this->transEsc('Published in') . ' <a href="' . $this->record($this->driver)->getLink('journaltitle', str_replace(array('{{{{START_HILITE}}}}', '{{{{END_HILITE}}}}'), '', $journalTitle)) . '">' . $this->highlight($journalTitle) . '</a>';?>
+        <?=!empty($summDate) ? ' (' . $this->escapeHtml($summDate[0]) . ')' : ''?>
+      <? elseif (!empty($summDate)): ?>
+        <?=!empty($summAuthor) ? '<br />' : ''?>
+        <?=$this->transEsc('Published') . ' ' . $this->escapeHtml($summDate[0])?>
+      <? endif; ?>
+    </div>
+
+    <div class="last">
+      <? if ($snippet = $this->driver->getHighlightedSnippet()) {
+           if (!empty($snippet['caption'])) {
+             echo '<strong>' . $this->transEsc($snippet['caption']) . ':</strong> ';
+           }
+           if (!empty($snippet['snippet'])) {
+             echo '<span class="quotestart">&#8220;</span>...' . $this->highlight($snippet['snippet']) . '...<span class="quoteend">&#8221;</span><br/>';
+           }
+         }
+      ?>
+      <div class="callnumAndLocation">
+          <? $locations = $this->driver->getProviders(); if (!empty($locations)): ?>
+            <?=$this->transEsc('Provider')?>: <?=$this->escapeHtml(implode(', ', $locations))?>
+          <? endif; ?>
+          <? $summCallNo = $this->driver->getCallNumber(); if (!empty($summCallNo)): ?>
+            <?=$this->transEsc('Call Number')?>: <?=$this->escapeHtml($summCallNo)?>
+          <? endif; ?>
+      </div>
+
+      <? /* We need to find out if we're supposed to display an OpenURL link ($openUrlActive),
+            but even if we don't plan to display the link, we still want to get the $openUrl
+            value for use in generating a COinS (Z3988) tag -- see bottom of file.
+          */
+         $openUrl = $this->driver->getOpenURL();
+         $openUrlActive = $this->driver->openURLActive('results');
+         $urls = $this->record($this->driver)->getLinkDetails();
+         if ($openUrlActive || !empty($urls)): ?>
+        <? if ($openUrlActive): ?>
+          <br/>
+          <?=$this->openUrl($openUrl)?>
+          <? if ($this->driver->replaceURLsWithOpenURL()) $urls = array(); // clear URL list if replace setting is active ?>
+        <? endif; ?>
+        <? if (!is_array($urls)) $urls = array(); foreach ($urls as $current): ?>
+          <br/>
+          <a href="<?=$this->escapeHtml($this->proxyUrl($current['url']))?>" class="fulltext" target="new"><?=($current['url'] == $current['desc']) ? $this->transEsc('Get full text') : $this->escapeHtml($current['desc'])?></a>
+        <? endforeach; ?>
+      <? endif; ?>
+
+      <br class="hideIfDetailed"/>
+      <?=$this->record($this->driver)->getFormatList()?>
+
+      <? if (!$openUrlActive && empty($urls) && $this->driver->supportsAjaxStatus()): ?>
+      <div class="status ajax_availability hide"><?=$this->transEsc('Loading')?>...</div>
+      <? endif; ?>
+      <?=$this->record($this->driver)->getPreviews()?>
+    </div>
+  </div>
+
+  <div class="clear"></div>
+</div>
+
+<?=$openUrl?'<span class="Z3988" title="'.$this->escapeHtml($openUrl).'"></span>':''?>
diff --git a/themes/blueprint/templates/pazpar2/home.phtml b/themes/blueprint/templates/pazpar2/home.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..d13d4348c1e39e2222b5f16ce7d65ecd7816ef92
--- /dev/null
+++ b/themes/blueprint/templates/pazpar2/home.phtml
@@ -0,0 +1 @@
+<?=$this->render('search/home.phtml');?>
\ No newline at end of file
diff --git a/themes/blueprint/templates/pazpar2/search.phtml b/themes/blueprint/templates/pazpar2/search.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..c1797c1cd4a1ebb2ccad84718b1e225e51cac6a8
--- /dev/null
+++ b/themes/blueprint/templates/pazpar2/search.phtml
@@ -0,0 +1,4 @@
+<?
+    // Load standard settings from the default search results screen:
+    echo $this->render('search/results.phtml');
+?>
\ No newline at end of file
diff --git a/themes/jquerymobile/templates/RecordDriver/Pazpar2/link-author.phtml b/themes/jquerymobile/templates/RecordDriver/Pazpar2/link-author.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..34ec85e9849867608a0a901e72ab8ff8f452cfe1
--- /dev/null
+++ b/themes/jquerymobile/templates/RecordDriver/Pazpar2/link-author.phtml
@@ -0,0 +1 @@
+<?=$this->url('pazpar2-search')?>?lookfor=<?=urlencode($this->lookfor)?>&amp;type=author
\ No newline at end of file
diff --git a/themes/jquerymobile/templates/RecordDriver/Pazpar2/link-series.phtml b/themes/jquerymobile/templates/RecordDriver/Pazpar2/link-series.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..203012a0d1e20fd416074e7aeabf72b45f06f3c5
--- /dev/null
+++ b/themes/jquerymobile/templates/RecordDriver/Pazpar2/link-series.phtml
@@ -0,0 +1 @@
+<?=$this->url('pazpar2-search')?>?lookfor=%22<?=urlencode($this->lookfor)?>%22&amp;type=series
\ No newline at end of file
diff --git a/themes/jquerymobile/templates/RecordDriver/Pazpar2/link-subject.phtml b/themes/jquerymobile/templates/RecordDriver/Pazpar2/link-subject.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..12428b058b52d3d15abe04107fd9a063b3d719b6
--- /dev/null
+++ b/themes/jquerymobile/templates/RecordDriver/Pazpar2/link-subject.phtml
@@ -0,0 +1 @@
+<?=$this->url('pazpar2-search')?>?lookfor=%22<?=urlencode($this->lookfor)?>%22&amp;type=subject
\ No newline at end of file
diff --git a/themes/jquerymobile/templates/RecordDriver/Pazpar2/link-title.phtml b/themes/jquerymobile/templates/RecordDriver/Pazpar2/link-title.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..f0f81ef686c85302fd1beb62b9e565bd305602f7
--- /dev/null
+++ b/themes/jquerymobile/templates/RecordDriver/Pazpar2/link-title.phtml
@@ -0,0 +1 @@
+<?=$this->url('pazpar2-search')?>?lookfor=%22<?=urlencode($this->lookfor)?>%22&amp;type=title
\ No newline at end of file
diff --git a/themes/jquerymobile/templates/RecordDriver/Pazpar2/result-list.phtml b/themes/jquerymobile/templates/RecordDriver/Pazpar2/result-list.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..a4bd4560797dc7aebc3127906a503b348c7e3f83
--- /dev/null
+++ b/themes/jquerymobile/templates/RecordDriver/Pazpar2/result-list.phtml
@@ -0,0 +1,31 @@
+<b>
+  <div class="result source<?=$this->escapeHtml($this->driver->getResourceSource())?> recordId<?=$this->driver->supportsAjaxStatus()?' ajaxItemId':''?>">
+    <input type="hidden" value="<?=$this->escapeHtml($this->driver->getUniqueID())?>" class="hiddenId" />
+    <h3><?
+      $summHighlightedTitle = $this->driver->getHighlightedTitle();
+      $summTitle = $this->driver->getTitle();
+      if (!empty($summHighlightedTitle)) {
+          echo $this->highlight($this->addEllipsis($summHighlightedTitle, $summTitle));
+      } else if (!empty($summTitle)) {
+          echo $this->escapeHtml($this->truncate($summTitle, 180));
+      } else {
+          echo $this->transEsc('Title not available');
+      }
+    ?></h3>
+    <? $summAuthor = $this->driver->getPrimaryAuthor(); if (!empty($summAuthor)): ?>
+      <p><?=$this->transEsc('by')?> <?
+      $summHighlightedAuthor = $this->driver->getHighlightedAuthor();
+      echo !empty($summHighlightedAuthor)
+          ? $this->highlight($summHighlightedAuthor)
+          : $this->escapeHtml($summAuthor);
+      ?>
+    <? endif; ?>
+    <? $locations = $this->driver->getProviders(); if (!empty($locations)): ?>
+      <p><strong><?=$this->transEsc('Provider')?>:</strong> <?=$this->escapeHtml(implode(', ', $locations))?></p>
+    <? endif; ?>
+    <? $summCallNo = $this->driver->getCallNumber(); if (!empty($summCallNo)): ?>
+      <p><strong><?=$this->transEsc('Call Number')?>:</strong> <?=$this->escapeHtml($summCallNo)?></p>
+    <? endif; ?>
+    <?=$this->record($this->driver)->getFormatList()?>
+  </div>
+</b>
diff --git a/themes/jquerymobile/templates/pazpar2/home.phtml b/themes/jquerymobile/templates/pazpar2/home.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..d13d4348c1e39e2222b5f16ce7d65ecd7816ef92
--- /dev/null
+++ b/themes/jquerymobile/templates/pazpar2/home.phtml
@@ -0,0 +1 @@
+<?=$this->render('search/home.phtml');?>
\ No newline at end of file
diff --git a/themes/jquerymobile/templates/pazpar2/search.phtml b/themes/jquerymobile/templates/pazpar2/search.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..c1797c1cd4a1ebb2ccad84718b1e225e51cac6a8
--- /dev/null
+++ b/themes/jquerymobile/templates/pazpar2/search.phtml
@@ -0,0 +1,4 @@
+<?
+    // Load standard settings from the default search results screen:
+    echo $this->render('search/results.phtml');
+?>
\ No newline at end of file