diff --git a/Classes/Controller/RecommenderController.php b/Classes/Controller/RecommenderController.php
index 817fc02c301b5f65810958a61fcea0964e5fabf2..910d6d22e8f7ec32d63dfb43ca34fc12d48fe4da 100644
--- a/Classes/Controller/RecommenderController.php
+++ b/Classes/Controller/RecommenderController.php
@@ -13,10 +13,12 @@ namespace Slub\Bison\Controller;
  * (c) 2022 Beatrycze Volk <beatrycze.volk@slub-dresden.de>, SLUB
  */
 
-use Slub\Bison\Domain\Repository\JournalRepository;
 use Slub\Bison\Model\Journal;
 use Slub\Bison\Model\Language;
 use Slub\Bison\Model\Subject;
+use TYPO3\CMS\Core\Cache\CacheManager;
+use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
  * The recommender controller for the Bison extension
@@ -25,17 +27,46 @@ use Slub\Bison\Model\Subject;
  * @package TYPO3
  * @subpackage bison
  * @access public
- * @property JournalRepository $journalRepository
+ * @property FrontendInterface $cache This holds the cache
+ * @property string $title This hold the last searched title
+ * @property string $abstract This hold the last searched abstract
+ * @property string $references This hold the last searched references
  * @property array<Journal> $results This holds the journals for displaying to the frontend
  */
 class RecommenderController extends AbstractController
 {
 
     /**
-     * @var array<Journal>
+     * This holds the cache
+     *
+     * @var FrontendInterface
+     * @access private
+     */
+    private $cache;
+
+    /**
+     * This hold the last searched title
+     *
+     * @var string
+     * @access private
+     */
+    private $title = '';
+
+    /**
+     * This hold the last searched abstract
+     *
+     * @var string
      * @access private
      */
-    private $results;
+    private $abstract = '';
+
+    /**
+     * This hold the last searched references
+     *
+     * @var string
+     * @access private
+     */
+    private $references = '';
 
     /**
      * The recommender function returning journals based on title etc.
@@ -44,9 +75,19 @@ class RecommenderController extends AbstractController
      */
     public function mainAction()
     {
+        $this->cache = GeneralUtility::makeInstance(CacheManager::class)->getCache('tx_bison_result');
+        $resultList = $this->cache->get('result_list');
+
         $this->results = [];
 
-        if (!empty($this->requestData['title']) || !empty($this->requestData['abstract']) || !empty($this->requestData['references'])) {
+        // execute query if there is no cached result list, at least one request
+        // parameter is not empty and differs from previously stored parameters
+        if (!$resultList && $this->existRequestParameters() && $this->areCurrentRequestParametersDifferent()) {
+            //store request parameters to be able use them later in checks
+            $this->title = !empty($this->requestData['title']) ? $this->requestData['title'] : '';
+            $this->abstract = !empty($this->requestData['abstract']) ? $this->requestData['abstract'] : '';
+            $this->references = !empty($this->requestData['references']) ? $this->requestData['references'] : '';
+
             try {
                 $response = $this->client->request(
                     'POST',
@@ -67,35 +108,76 @@ class RecommenderController extends AbstractController
                         $this->results[] = new Journal($journal);
                     }
 
-                    $this->indexDatabaseList->assignIndexDatabases($this->results);
-                    $this->localPriceList->assignLocalPrices($this->results);
-                    $this->mirrorJournalList->assignMirrorJournals($this->results);
-                    $this->mirrorJournalList->markMirrorJournals($this->results);
-                    $this->localFilter->filter($this->results);
-
-                    $this->view->assign('maxApc', $this->getMaxApc());
-                    $this->view->assign('maxPublicationTime', $this->getMaxPublicationTime());
-                    $this->view->assign('keywords', $this->getKeywords());
-                    $this->view->assign('languages', $this->getLanguages());
-                    $this->view->assign('subjects', $this->getSubjects());
-                    $this->view->assign('suggestLanguage', $this->getSuggestLanguage($result->language));
-                    $this->view->assign('suggestSubject', $this->getSuggestSubject($result->subject));
-                    $this->view->assign('displayMismatchedResults', filter_var($this->extConfig['displayMismatchedResults'], FILTER_VALIDATE_BOOLEAN));
-                    $this->view->assign('displayMirrorJournals', filter_var($this->extConfig['displayMirrorJournals'], FILTER_VALIDATE_BOOLEAN));
-                    $this->view->assign('isFilterTooStrict', $this->isFilterTooStrict());
-                    $this->view->assign('countResults', $this->countResultsAfterFilter());
-                    $this->view->assign('results', $this->results);
+                    $this->processResults();
+
+                    $this->cache->set('result_list', $this->results);
+                    $this->cache->set('result_language', $result->language);
+                    $this->cache->set('result_subject', $result->subject);
+
+                    $this->assignViewVariables();
                 }
             } catch (\Exception $e) {
                 $this->logger->error('Request error: '.$e->getMessage());
                 $this->view->assign('error', $e->getMessage());
             }
+        } else if (!empty($resultList)) {
+            $this->results = $resultList;
+
+            $this->assignViewVariables();
         }
 
         $this->view->assign('contact', $this->getContactPerson());
         $this->view->assign('viewData', $this->viewData);
     }
 
+    /**
+     * Assign view variables.
+     * 
+     * @param mixed $result
+     * 
+     * @return void
+     */
+    private function assignViewVariables() {
+        $this->view->assign('maxApc', $this->getMaxApc());
+        $this->view->assign('maxPublicationTime', $this->getMaxPublicationTime());
+        $this->view->assign('keywords', $this->getKeywords());
+        $this->view->assign('languages', $this->getLanguages());
+        $this->view->assign('subjects', $this->getSubjects());
+        $this->view->assign('suggestLanguage', $this->getSuggestLanguage($this->cache->get('result_language')));
+        $this->view->assign('suggestSubject', $this->getSuggestSubject($this->cache->get('result_subject')));
+        $this->view->assign('displayMismatchedResults', filter_var($this->extConfig['displayMismatchedResults'], FILTER_VALIDATE_BOOLEAN));
+        $this->view->assign('displayMirrorJournals', filter_var($this->extConfig['displayMirrorJournals'], FILTER_VALIDATE_BOOLEAN));
+        $this->view->assign('isFilterTooStrict', $this->isFilterTooStrict());
+        $this->view->assign('countResults', $this->countResultsAfterFilter());
+        $this->view->assign('results', $this->results);
+    }
+
+    /**
+     * Checks if at least one request parameter differs.
+     *
+     * @return bool
+     */
+    private function areCurrentRequestParametersDifferent() {
+        $title = !empty($this->requestData['title']) ? $this->requestData['title'] : '';
+        $abstract = !empty($this->requestData['abstract']) ? $this->requestData['abstract'] : '';
+        $references = !empty($this->requestData['references']) ? $this->requestData['references'] : '';
+
+        return $this->title !== $title
+            || $this->abstract !== $abstract
+            || $this->references !== $references;
+    }
+
+    /**
+     * Checks if the request parameters exist.
+     *
+     * @return bool
+     */
+    private function existRequestParameters() {
+        return !empty($this->requestData['title'])
+            || !empty($this->requestData['abstract'])
+            || !empty($this->requestData['references']);
+    }
+
     /**
      * Checks if local filters are too strict. It is a case when after
      * filtering we have no results, but without filters there are results.
@@ -265,4 +347,16 @@ class RecommenderController extends AbstractController
         });
         return array_values($subjects);
     }
+
+    /** Apply local information and filters.
+     *
+     * @return void
+     */
+    private function processResults() {
+        $this->indexDatabaseList->assignIndexDatabases($this->results);
+        $this->localPriceList->assignLocalPrices($this->results);
+        $this->mirrorJournalList->assignMirrorJournals($this->results);
+        $this->mirrorJournalList->markMirrorJournals($this->results);
+        $this->localFilter->filter($this->results);
+    }
 }
diff --git a/Classes/Utility/CurrencyConverter.php b/Classes/Utility/CurrencyConverter.php
index 2eb76dac2a3531a19e88610ac5f7a21b23bc41aa..e3ad49abf665f1ddbb05fb97bb02f7af6926205a 100644
--- a/Classes/Utility/CurrencyConverter.php
+++ b/Classes/Utility/CurrencyConverter.php
@@ -12,6 +12,7 @@ namespace SLUB\Bison\Utility;
  */
 
 use TYPO3\CMS\Core\Cache\CacheManager;
+use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
 use TYPO3\CMS\Core\Http\RequestFactory;
 use TYPO3\CMS\Core\Log\Logger;
 use TYPO3\CMS\Core\Log\LogManager;
@@ -24,8 +25,8 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
  * @package TYPO3
  * @subpackage bison
  * @access public
- * @property CacheManager $cache This holds the cache
- * @property LogManager $logger This holds the logger
+ * @property FrontendInterface $cache This holds the cache
+ * @property Logger $logger This holds the logger
  * @property RequestFactory $logger This holds the request factory
  */
 class CurrencyConverter implements \TYPO3\CMS\Core\SingletonInterface
@@ -35,7 +36,7 @@ class CurrencyConverter implements \TYPO3\CMS\Core\SingletonInterface
     /**
      * This holds the cache
      *
-     * @var CacheManager
+     * @var FrontendInterface
      * @access private
      */
     private $cache;
diff --git a/ext_localconf.php b/ext_localconf.php
index f1375a0c39e301cea3c5eb89fcd1324bcec1cf8b..a4faa388445713c60fa659fe95f78839383ef47b 100644
--- a/ext_localconf.php
+++ b/ext_localconf.php
@@ -12,6 +12,15 @@ defined('TYPO3') || die();
     if (!isset($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_bison_currency']['options']['defaultLifeTime'])) {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_bison_currency']['options']['defaultLifeTime'] = 87600; // 87600 seconds = 1 day
     }
+    if (!is_array($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_bison_result'])) {
+        $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_bison_result'] = [];
+    }
+    if (!isset($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_bison_result']['backend'])) {
+        $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_bison_result']['backend'] = 'TYPO3\\CMS\\Core\\Cache\\Backend\\SimpleFileBackend';
+    }
+    if (!isset($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_bison_result']['options']['defaultLifeTime'])) {
+        $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_bison_result']['options']['defaultLifeTime'] = 3600; // 3600 seconds = 1 hour
+    }
     if (!isset($GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['namespaces']['bison'])) {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['namespaces']['bison'] = [
             'Slub\Bison\ViewHelpers',