diff --git a/module/VuFind/config/module.config.php b/module/VuFind/config/module.config.php
index ef74c507cfcc0c13b926b803023958d9f176fc5f..5b3d69b16797c080a2fcb53965b1001c5b51366e 100644
--- a/module/VuFind/config/module.config.php
+++ b/module/VuFind/config/module.config.php
@@ -138,6 +138,30 @@ $config = array(
             'result-scroller' => 'VuFind\Controller\Plugin\ResultScroller',
         )
     ),
+    'recommend_handler_manager' => array(
+        'abstract_factories' => array('VuFind\Recommend\PluginFactory'),
+        'invokables' => array(
+            'authorfacets' => 'VuFind\Recommend\AuthorFacets',
+            'authorinfo' => 'VuFind\Recommend\AuthorInfo',
+            'authorityrecommend' => 'VuFind\Recommend\AuthorityRecommend',
+            'catalogresults' => 'VuFind\Recommend\CatalogResults',
+            'europeanaresults' => 'VuFind\Recommend\EuropeanaResults',
+            'europeanaresultsdeferred' => 'VuFind\Recommend\EuropeanaResultsDeferred',
+            'expandfacets' => 'VuFind\Recommend\ExpandFacets',
+            'favoritefacets' => 'VuFind\Recommend\FavoriteFacets',
+            'openlibrarysubjects' => 'VuFind\Recommend\OpenLibrarySubjects',
+            'openlibrarysubjectsdeferred' => 'VuFind\Recommend\OpenLibrarySubjectsDeferred',
+            'pubdatevisajax' => 'VuFind\Recommend\PubDateVisAjax',
+            'resultgooglemapajax' => 'VuFind\Recommend\ResultGoogleMapAjax',
+            'sidefacets' => 'VuFind\Recommend\SideFacets',
+            'summondatabases' => 'VuFind\Recommend\SummonDatabases',
+            'summonresults' => 'VuFind\Recommend\SummonResults',
+            'switchtype' => 'VuFind\Recommend\SwitchType',
+            'topfacets' => 'VuFind\Recommend\TopFacets',
+            'worldcatidentities' => 'VuFind\Recommend\WorldCatIdentities',
+            'worldcatterms' => 'VuFind\Recommend\WorldCatTerms',
+        ),
+    ),
     'search_manager' => array(
         'default_namespace' => 'VuFind\Search',
         'namespaces_by_id' => array(
diff --git a/module/VuFind/src/VuFind/Bootstrap.php b/module/VuFind/src/VuFind/Bootstrap.php
index 1cfaf0c9cac52b302dded87daf37f9c7a83757d5..623805c86340582a340a071a1adf0cf6ca0c400a 100644
--- a/module/VuFind/src/VuFind/Bootstrap.php
+++ b/module/VuFind/src/VuFind/Bootstrap.php
@@ -90,7 +90,7 @@ class Bootstrap
         $config = $app->getConfig();
 
         // Use naming conventions to set up a bunch of services based on namespace:
-        $namespaces = array('Auth', 'Autocomplete', 'Session');
+        $namespaces = array('Auth', 'Autocomplete', 'Recommend', 'Session');
         foreach ($namespaces as $ns) {
             $serviceName = $ns . 'HandlerManager';
             $className = 'VuFind\\' . $ns . '\PluginManager';
diff --git a/module/VuFind/src/VuFind/Recommend/PluginFactory.php b/module/VuFind/src/VuFind/Recommend/PluginFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..a6bec132de04509773015f4131fe9bf90ac435d5
--- /dev/null
+++ b/module/VuFind/src/VuFind/Recommend/PluginFactory.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Recommendation module plugin factory
+ *
+ * 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  Recommendations
+ * @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/creating_a_session_handler Wiki
+ */
+namespace VuFind\Recommend;
+
+/**
+ * Recommendation module plugin factory
+ *
+ * @category VuFind2
+ * @package  Recommendations
+ * @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/creating_a_session_handler Wiki
+ */
+class PluginFactory extends \VuFind\ServiceManager\AbstractPluginFactory
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        $this->defaultNamespace = 'VuFind\Recommend';
+    }
+}
\ No newline at end of file
diff --git a/module/VuFind/src/VuFind/Recommend/PluginManager.php b/module/VuFind/src/VuFind/Recommend/PluginManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..86600015ce7c63fdf919035ab0216ff31755c105
--- /dev/null
+++ b/module/VuFind/src/VuFind/Recommend/PluginManager.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Recommendation module plugin manager
+ *
+ * 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  Recommendations
+ * @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/creating_a_session_handler Wiki
+ */
+namespace VuFind\Recommend;
+
+/**
+ * Recommendation module plugin manager
+ *
+ * @category VuFind2
+ * @package  Recommendations
+ * @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/creating_a_session_handler Wiki
+ */
+class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager
+{
+    /**
+     * Return the name of the base class or interface that plug-ins must conform
+     * to.
+     *
+     * @return string
+     */
+    protected function getExpectedInterface()
+    {
+        return 'VuFind\Recommend\RecommendInterface';
+    }
+}
\ No newline at end of file
diff --git a/module/VuFind/src/VuFind/Search/Base/Params.php b/module/VuFind/src/VuFind/Search/Base/Params.php
index 3040edc274be0d1bb0d606f15940f78568ac222f..0375dea9cef422b6ee13680267062cfe17179f14 100644
--- a/module/VuFind/src/VuFind/Search/Base/Params.php
+++ b/module/VuFind/src/VuFind/Search/Base/Params.php
@@ -794,6 +794,13 @@ class Params implements ServiceLocatorAwareInterface
             return;
         }
 
+        // Get the plugin manager (skip recommendations if it is unavailable):
+        $sm = $this->getServiceLocator();
+        if (!is_object($sm) || !$sm->has('RecommendHandlerManager')) {
+            return;
+        }
+        $manager = $sm->get('RecommendHandlerManager');
+
         // Process recommendations for each location:
         $this->recommend = array(
             'top' => array(), 'side' => array(), 'noresults' => array()
@@ -813,20 +820,20 @@ class Params implements ServiceLocatorAwareInterface
                 // Break apart the setting into module name and extra parameters:
                 $current = explode(':', $current);
                 $module = array_shift($current);
-                $class = 'VuFind\Recommend\\' . $module;
                 $params = implode(':', $current);
-
-                // Build a recommendation module with the provided settings.
-                if (class_exists($class)) {
-                    $obj = new $class();
-                    $obj->setConfig($params);
-                    $obj->init($this, $request);
-                    $this->recommend[$location][] = $obj;
-                } else {
+                if (!$manager->has($module)) {
                     throw new \Exception(
-                        'Could not load recommendation module: ' . $class
+                        'Could not load recommendation module: ' . $module
                     );
                 }
+
+                // Build a recommendation module with the provided settings.
+                // Create a clone in case the same module is used repeatedly with
+                // different settings.
+                $obj = clone($manager->get($module));
+                $obj->setConfig($params);
+                $obj->init($this, $request);
+                $this->recommend[$location][] = $obj;
             }
         }
     }