diff --git a/module/VuFind/config/module.config.php b/module/VuFind/config/module.config.php
index 807e8f236b0675dbc34a5b912ac70ddbf64ca5fc..d975fafd08d4961e21f8cdf06b3a2fd5791b3163 100644
--- a/module/VuFind/config/module.config.php
+++ b/module/VuFind/config/module.config.php
@@ -482,7 +482,7 @@ $config = array(
             },
             'VuFindTheme\Tools' => function ($sm) {
                 return new \VuFind\Theme\Tools(
-                    realpath(__DIR__ . '/../../../themes')
+                    realpath(__DIR__ . '/../../../themes'), 'blueprint'
                 );
             }
         ),
diff --git a/module/VuFind/src/VuFind/Theme/Initializer.php b/module/VuFind/src/VuFind/Theme/Initializer.php
index d076af647a3d0f55f6ec6b0ac30285512a13e53f..8613a4ec7a103fa67b177d57f8d816ea20e58882 100644
--- a/module/VuFind/src/VuFind/Theme/Initializer.php
+++ b/module/VuFind/src/VuFind/Theme/Initializer.php
@@ -29,7 +29,6 @@ namespace VuFind\Theme;
 use VuFind\Mobile,
     VuFind\Mvc\View\Http\InjectTemplateListener,
     Zend\Config\Config,
-    Zend\Config\Reader\Ini as IniReader,
     Zend\Mvc\MvcEvent,
     Zend\Stdlib\RequestInterface as Request;
 
@@ -44,11 +43,40 @@ use VuFind\Mobile,
  */
 class Initializer
 {
+    /**
+     * Theme configuration object
+     *
+     * @var Config
+     */
     protected $config;
+
+    /**
+     * Zend MVC Event
+     *
+     * @var MvcEvent
+     */
     protected $event;
+
+    /**
+     * Theme resource container
+     *
+     * @var ResourceContainer
+     */
     protected $resourceContainer;
+
+    /**
+     * Top-level service manager
+     *
+     * @var \Zend\ServiceManager\ServiceManager
+     */
     protected $serviceManager;
-    protected $session;
+
+    /**
+     * Theme tools object
+     *
+     * @var \VuFind\Theme\Tools
+     */
+    protected $tools;
 
     /**
      * Constructor
@@ -66,14 +94,11 @@ class Initializer
         $this->serviceManager = $this->event->getApplication()->getServiceManager();
 
         // Get base directory from tools object:
-        $tools = $this->serviceManager->get('VuFindTheme\Tools');
-        $this->baseDir = $tools->getBaseDir();
+        $this->tools = $this->serviceManager->get('VuFindTheme\Tools');
+        $this->baseDir = $this->tools->getBaseDir();
 
         // Grab the resource manager for tracking CSS, JS, etc.:
-        $this->resourceContainer = $tools->getResourceContainer();
-
-        // Set up a session namespace for storing theme settings:
-        $this->session = $tools->getPersistenceContainer();
+        $this->resourceContainer = $this->tools->getResourceContainer();
     }
 
     /**
@@ -136,65 +161,24 @@ class Initializer
         // Determine theme options:
         $this->sendThemeOptionsToView();
 
-        // Make sure theme details are available in the session:
-        $error = $this->loadThemeDetails($currentTheme);
+        // Make sure the current theme is set correctly in the tools object:
+        try {
+            $this->tools->setTheme($currentTheme);
+        } catch (\Exception $error) {
+            // If an illegal value is passed in, the setter may throw an exception.
+            // We should ignore it for now and throw it after we have set up the
+            // theme (the setter will use a safe value instead of the illegal one).
+        }
 
         // Using the settings we initialized above, actually configure the themes; we
         // need to do this even if there is an error, since we need a theme in order
         // to display an error message!
-        $this->setUpThemes(array_reverse($this->session->allThemeInfo));
+        $this->setUpThemes(array_reverse($this->tools->getThemeInfo()));
 
         // If we encountered an error loading theme settings, fail now.
-        if (!empty($error)) {
-            throw new \Exception($error);
-        }
-    }
-
-    /**
-     * Support method for init() -- load all of the theme details from either the
-     * session or disk (as needed).
-     *
-     * @param string $currentTheme The name of the user-selected theme.
-     *
-     * @return string Error message on problem, empty string on success.
-     */
-    protected function loadThemeDetails($currentTheme)
-    {
-        // Fill in the session if it is not already populated:
-        if (!isset($this->session->currentTheme)
-            || $this->session->currentTheme !== $currentTheme
-        ) {
-            // If the configured theme setting is illegal, switch it to "blueprint"
-            // and set a flag so we can throw an Exception once everything is set
-            // up:
-            if (!file_exists($this->baseDir . "/$currentTheme/theme.ini")) {
-                $themeLoadError = 'Cannot load theme: ' . $currentTheme;
-                $currentTheme = 'blueprint';
-            }
-
-            // Remember the top-level theme setting:
-            $this->session->currentTheme = $currentTheme;
-
-            // Build an array of theme information by inheriting up the theme tree:
-            $allThemeInfo = array();
-            do {
-                $iniReader = new IniReader();
-                $currentThemeInfo = new Config(
-                    $iniReader->fromFile(
-                        $this->baseDir . "/$currentTheme/theme.ini"
-                    )
-                );
-
-                $allThemeInfo[$currentTheme] = $currentThemeInfo;
-
-                $currentTheme = $currentThemeInfo->extends;
-            } while ($currentTheme);
-
-            $this->session->allThemeInfo = $allThemeInfo;
+        if (isset($error)) {
+            throw new \Exception($error->getMessage());
         }
-
-        // Report success or failure:
-        return isset($themeLoadError) ? $themeLoadError : '';
     }
 
     /**
diff --git a/module/VuFind/src/VuFind/Theme/Tools.php b/module/VuFind/src/VuFind/Theme/Tools.php
index 782f506bf2cccb0319c87f19f6982c092f9a1ff1..5a3e002ec5f3cb63708cfd2ab734dac855cab844 100644
--- a/module/VuFind/src/VuFind/Theme/Tools.php
+++ b/module/VuFind/src/VuFind/Theme/Tools.php
@@ -26,7 +26,6 @@
  * @link     http://vufind.org   Main Site
  */
 namespace VuFind\Theme;
-use Zend\Session\Container as SessionContainer;
 
 /**
  * VuFind Theme Support Methods
@@ -46,6 +45,21 @@ class Tools
      */
     protected $baseDir;
 
+    /**
+     * Current selected theme
+     *
+     * @var string
+     */
+    protected $currentTheme;
+
+    /**
+     * A safe theme (guaranteed to exist) that can be loaded if an invalid
+     * configuration is passed in
+     *
+     * @var string
+     */
+    protected $safeTheme;
+
     /**
      * Resource container
      *
@@ -54,22 +68,22 @@ class Tools
     protected $resourceContainer;
 
     /**
-     * Session (persistence) container
+     * Theme configuration
      *
-     * @var SessionContainer
+     * @var array
      */
-    protected $sessionContainer;
+    protected $allThemeInfo = null;
 
     /**
      * Constructor
      *
      * @param string $baseDir Base directory for theme files.
      */
-    public function __construct($baseDir)
+    public function __construct($baseDir, $safeTheme)
     {
         $this->baseDir = $baseDir;
+        $this->currentTheme = $this->safeTheme = $safeTheme;
         $this->resourceContainer = new ResourceContainer();
-        $this->sessionContainer = new SessionContainer('Theme');
     }
 
     /**
@@ -94,14 +108,71 @@ class Tools
     }
 
     /**
-     * Get the container used for persisting theme-related settings from
-     * page to page.
+     * Get the configuration file for the specified theme.
+     *
+     * @param string $theme Theme name
+     *
+     * @return string
+     */
+    protected function getThemeConfig($theme)
+    {
+        return $this->baseDir . "/$theme/theme.ini";
+    }
+
+    /**
+     * Set the current theme.
      *
-     * @return SessionContainer
+     * @param string $theme Theme to set.
+     *
+     * @return void
+     * @throws \Exception
+     */
+    public function setTheme($theme)
+    {
+        // If the configured theme setting is illegal, throw an exception without
+        // making any changes.
+        if (!file_exists($this->getThemeConfig($theme))) {
+            throw new \Exception('Cannot load theme: ' . $theme);
+        }
+        if ($theme != $this->currentTheme) {
+            // Clear any cached theme information when we change themes:
+            $this->allThemeInfo = null;
+            $this->currentTheme = $theme;
+        }
+    }
+
+    /**
+     * Get the current theme.
+     *
+     * @return string
      */
-    public function getPersistenceContainer()
+    public function getTheme()
     {
-        return $this->sessionContainer;
+        return $this->currentTheme;
+    }
+
+    /**
+     * Get all the configuration details related to the current theme.
+     *
+     * @return array
+     */
+    public function getThemeInfo()
+    {
+        // Fill in the theme info cache if it is not already populated:
+        if (null === $this->allThemeInfo) {
+            // Build an array of theme information by inheriting up the theme tree:
+            $this->allThemeInfo = array();
+            $currentTheme = $this->getTheme();
+            do {
+                $iniReader = new \Zend\Config\Reader\Ini();
+                $this->allThemeInfo[$currentTheme] = new \Zend\Config\Config(
+                    $iniReader->fromFile($this->getThemeConfig($currentTheme))
+                );
+                $currentTheme = $this->allThemeInfo[$currentTheme]->extends;
+            } while ($currentTheme);
+        }
+
+        return $this->allThemeInfo;
     }
 
     /**
@@ -117,12 +188,12 @@ class Tools
      */
     public function findContainingTheme($relativePath, $returnFile = false)
     {
-        $session = $this->getPersistenceContainer();
         $basePath = $this->getBaseDir();
         $allPaths = is_array($relativePath)
             ? $relativePath : array($relativePath);
 
-        $currentTheme = $session->currentTheme;
+        $currentTheme = $this->getTheme();
+        $allThemeInfo = $this->getThemeInfo();
 
         while (!empty($currentTheme)) {
             foreach ($allPaths as $currentPath) {
@@ -131,7 +202,7 @@ class Tools
                     return $returnFile ? $file : $currentTheme;
                 }
             }
-            $currentTheme = $session->allThemeInfo[$currentTheme]->extends;
+            $currentTheme = $allThemeInfo[$currentTheme]->extends;
         }
 
         return null;