diff --git a/app/CacheHelper.php b/app/CacheHelper.php
index 81b7ee56a42b2fe11de752cddb1da5ff01baa780..3a4aeaae55015b4c26f40d5ae2ebd0ed927a4d05 100644
--- a/app/CacheHelper.php
+++ b/app/CacheHelper.php
@@ -18,7 +18,7 @@ class CacheHelper
             'key' => $key,
             'value' => $value,
         ];
-        Redis::rpush(\App\Console\Commands\RequestCacher::CACHER_QUEUE, json_encode($cacherItem));
+        Redis::rpush(\App\Console\Commands\RequestCacher::CACHER_QUEUE, base64_encode(serialize($cacherItem)));
 
     }
 }
diff --git a/app/Console/Commands/RequestCacher.php b/app/Console/Commands/RequestCacher.php
index 39a88827d6d3894cffc16b660e94945ecc502f81..bf52f428edd9f6474fb1c89b79a43f1b584ce5b4 100644
--- a/app/Console/Commands/RequestCacher.php
+++ b/app/Console/Commands/RequestCacher.php
@@ -50,11 +50,11 @@ class RequestCacher extends Command
         while ($this->shouldRun) {
             $cacheItem = Redis::blpop(self::CACHER_QUEUE, 1);
             if (!empty($cacheItem)) {
-                $cacheItem = json_decode($cacheItem[1], true);
-                if (empty($cacheItem["body"])) {
-                    $cacheItem["body"] = "no-result";
+                $cacheItem = unserialize(base64_decode($cacheItem[1]));
+                if (empty($cacheItem["value"])) {
+                    $cacheItem["value"] = "no-result";
                 }
-                Cache::put($cacheItem["hash"], $cacheItem["body"], now()->addMinutes($cacheItem["cacheDuration"]));
+                Cache::put($cacheItem["key"], $cacheItem["value"], now()->addSeconds($cacheItem["timeSeconds"]));
             }
         }
     }
diff --git a/app/Console/Commands/RequestFetcher.php b/app/Console/Commands/RequestFetcher.php
index c96a6d9bbd460debfe632e809dd62eb594f2dc6b..e6e92671822c3eeef8383ad63c6b9e54d1db7a3f 100644
--- a/app/Console/Commands/RequestFetcher.php
+++ b/app/Console/Commands/RequestFetcher.php
@@ -120,7 +120,7 @@ class RequestFetcher extends Command
                             'key' => $resulthash,
                             'value' => $body,
                         ];
-                        $pipe->rpush(\App\Console\Commands\RequestCacher::CACHER_QUEUE, json_encode($cacherItem));
+                        $pipe->rpush(\App\Console\Commands\RequestCacher::CACHER_QUEUE, base64_encode(serialize($cacherItem)));
                     });
                     \curl_multi_remove_handle($this->multicurl, $info["handle"]);
                 }
diff --git a/app/Http/Controllers/MetaGerSearch.php b/app/Http/Controllers/MetaGerSearch.php
index 4eaba9979831d0f885f5aa09af29e40a1e64ab0a..377de93113dffb514fa1eda20d9d47c7bccb0189 100644
--- a/app/Http/Controllers/MetaGerSearch.php
+++ b/app/Http/Controllers/MetaGerSearch.php
@@ -6,7 +6,6 @@ use App;
 use App\MetaGer;
 use Cache;
 use Illuminate\Http\Request;
-use Illuminate\Support\Facades\Redis;
 use LaravelLocalization;
 use View;
 
@@ -64,14 +63,7 @@ class MetaGerSearch extends Controller
         # Ergebnisse der Suchmaschinen kombinieren:
         $metager->prepareResults();
 
-        # Save the results in Redis
-        $redis = Redis::connection(env('REDIS_RESULT_CONNECTION'));
-        $pipeline = $redis->pipeline();
-        foreach ($metager->getResults() as $result) {
-            $pipeline->rpush($metager->getRedisCurrentResultList(), base64_encode(serialize($result)));
-        }
-        $pipeline->expire($metager->getRedisCurrentResultList(), env('REDIS_RESULT_CACHE_DURATION'));
-        $pipeline->execute();
+        \App\CacheHelper::put($metager->getSearchUid(), $metager->getEngines(), 1 * 60);
 
         # Die Ausgabe erstellen:
         $resultpage = $metager->createView($quicktipResults);
@@ -106,83 +98,66 @@ class MetaGerSearch extends Controller
         # Create a MetaGer Instance with the supplied hash
         $hash = $request->input('loadMore', '');
 
-        $metager = new MetaGer($hash);
-        $redis = Redis::connection(env('REDIS_RESULT_CONNECTION'));
-
-        $result = [];
-        # Check if there should be more results
-        $stats = $redis->hgetall($metager->getRedisEngineResult() . "status");
-        $stats["startTime"] = floatval($stats["startTime"]);
-        $stats["engineCount"] = intval($stats["engineCount"]);
-        $stats["engineAnswered"] = intval($stats["engineAnswered"]);
-        $stats["engineDelivered"] = intval($stats["engineDelivered"]);
-
-        $result["finished"] = true;
-        $result["engineCount"] = $stats["engineCount"];
-        $result["engineAnswered"] = $stats["engineAnswered"];
-        $result["engineDelivered"] = $stats["engineDelivered"];
-        $result["timeWaiting"] = microtime(true) - $stats["startTime"];
-
-        # Check if we can abort
-        if ($stats["engineAnswered"] > $stats["engineDelivered"]/*&& $result["timeWaiting"] <= 10 */) {
-            $metager->parseFormData($request);
-            # Nach Spezialsuchen überprüfen:
-            $metager->checkSpecialSearches($request);
-
-            # Read which search engines are new
-            $newEngines = [];
-
-            while (($engine = $redis->lpop($metager->getRedisResultWaitingKey())) != null) {
-                $result["engineDelivered"]++;
-                $newEngines[$engine] = $metager->getSumaFile()->sumas->{$engine};
-            }
-            $cache = Cache::get($hash);
-            if ($cache != null) {
-                $metager->setNext(unserialize($cache)["engines"]);
+        # Parser Skripte einhängen
+        $dir = app_path() . "/Models/parserSkripte/";
+        foreach (scandir($dir) as $filename) {
+            $path = $dir . $filename;
+            if (is_file($path)) {
+                require_once $path;
             }
+        }
 
-            # Check if this request is not for page one
-            $metager->setEngines($request, $newEngines);
+        $engines = Cache::get($hash);
+        if ($engines === null) {
+            return response()->json(['finished' => true]);
+        }
 
-            # Add the results already delivered to the user
-            $results = $redis->lrange($metager->getRedisCurrentResultList(), 0, -1);
-            foreach ($results as $index => $oldResult) {
-                $results[$index] = unserialize(base64_decode($oldResult));
-                $results[$index]->new = false;
+        // Mark all engines that are already loaded
+        $finished = true;
+        foreach ($engines as $engine) {
+            if ($engine->loaded) {
+                $engine->setNew(false);
+            } else {
+                $finished = false;
+                $engine->setNew(true);
             }
-            $metager->setResults($results);
-            $metager->retrieveResults();
-            $metager->rankAll();
-            $metager->prepareResults();
-            $result["nextSearchLink"] = $metager->nextSearchLink();
-            $results = $metager->getResults();
-            foreach ($results as $index => $resultTmp) {
-                if ($resultTmp->new) {
-                    if ($metager->getFokus() !== "bilder") {
-                        $view = View::make('layouts.result', ['index' => $index, 'result' => $resultTmp, 'metager' => $metager]);
-                        $html = $view->render();
-                        $result['newResults'][$index] = $html;
-                        $result["imagesearch"] = false;
-                    } else {
-                        $view = View::make('layouts.image_result', ['index' => $index, 'result' => $resultTmp, 'metager' => $metager]);
-                        $html = $view->render();
-                        $result['newResults'][$index] = $html;
-                        $result["imagesearch"] = true;
-                    }
+        }
+
+        $metager = new MetaGer($hash);
+
+        $metager->parseFormData($request);
+        # Nach Spezialsuchen überprüfen:
+        $metager->checkSpecialSearches($request);
+        $metager->restoreEngines($engines);
+
+        $metager->retrieveResults();
+        $metager->rankAll();
+        $metager->prepareResults();
+
+        $result = [
+            'finished' => true,
+            'newResults' => [],
+        ];
+        $result["nextSearchLink"] = $metager->nextSearchLink();
+
+        foreach ($metager->getResults() as $index => $resultTmp) {
+            if ($resultTmp->new) {
+                if ($metager->getFokus() !== "bilder") {
+                    $view = View::make('layouts.result', ['index' => $index, 'result' => $resultTmp, 'metager' => $metager]);
+                    $html = $view->render();
+                    $result['newResults'][$index] = $html;
+                    $result["imagesearch"] = false;
+                } else {
+                    $view = View::make('layouts.image_result', ['index' => $index, 'result' => $resultTmp, 'metager' => $metager]);
+                    $html = $view->render();
+                    $result['newResults'][$index] = $html;
+                    $result["imagesearch"] = true;
                 }
             }
-            # Save the results in Redis
-            $pipeline = $redis->pipeline();
-            $pipeline->hincrby($metager->getRedisEngineResult() . "status", "engineDelivered", sizeof($newEngines));
-            $pipeline->hset($metager->getRedisEngineResult() . "status", "nextSearchLink", $result["nextSearchLink"]);
-            foreach ($metager->getResults() as $resultTmp) {
-                $resultTmp->new = false;
-                $pipeline->rpush($metager->getRedisCurrentResultList(), base64_encode(serialize($resultTmp)));
-            }
-            $pipeline->expire($metager->getRedisCurrentResultList(), env('REDIS_RESULT_CACHE_DURATION'));
-            $pipeline->execute();
-
         }
+
+        // Update new Engines
+        \App\CacheHelper::put($metager->getSearchUid(), $metager->getEngines(), 1 * 60);
         return response()->json($result);
     }
 
diff --git a/app/MetaGer.php b/app/MetaGer.php
index d88098d00aa67523ef0326a6edd39effb0c79505..6ff0a640c5e55e2da67e8dca1a7073c8a5662d90 100644
--- a/app/MetaGer.php
+++ b/app/MetaGer.php
@@ -1733,4 +1733,16 @@ class MetaGer
     {
         return $this->redisCurrentResultList;
     }
+
+    public function getEngines()
+    {
+        return $this->engines;
+    }
+    /**
+     * Used by JS result loader to restore MetaGer Object of previous request
+     */
+    public function restoreEngines($engines)
+    {
+        $this->engines = $engines;
+    }
 }
diff --git a/app/Models/Searchengine.php b/app/Models/Searchengine.php
index 0604f5eac0d824904a2c8fbb1dbedd9c93e0dbe1..a37e1ab72acf4adfc3b2f54cf8d9e8fbc7b0a5da 100644
--- a/app/Models/Searchengine.php
+++ b/app/Models/Searchengine.php
@@ -37,6 +37,7 @@ abstract class Searchengine
     public $write_time = 0; # Wird eventuell für Artefakte benötigt
     public $connection_time = 0; # Wird eventuell für Artefakte benötigt
     public $cacheDuration = 60; # Wie lange soll das Ergebnis im Cache bleiben (Minuten)
+    public $new = true; # Important for loading results by JS
 
     public function __construct($name, \stdClass $engine, MetaGer $metager)
     {
@@ -183,6 +184,7 @@ abstract class Searchengine
         if ($body !== null) {
             $this->loadResults($body);
             $this->getNext($metager, $body);
+            $this->markNew();
             $this->loaded = true;
             return true;
         } else {
@@ -190,6 +192,13 @@ abstract class Searchengine
         }
     }
 
+    protected function markNew()
+    {
+        foreach ($this->results as $result) {
+            $result->new = $this->new;
+        }
+    }
+
     # Erstellt den für die Get-Anfrage genutzten String
     protected function generateGetString($query)
     {
@@ -243,4 +252,9 @@ abstract class Searchengine
     {
         return [];
     }
+
+    public function setNew($new)
+    {
+        $this->new = $new;
+    }
 }
diff --git a/resources/js/scriptResultPage.js b/resources/js/scriptResultPage.js
index dd140c82180bdc03f0a6f9d5009f3b5e614432f7..7efde427da1d6e4a141042871c5b50265500a5b8 100644
--- a/resources/js/scriptResultPage.js
+++ b/resources/js/scriptResultPage.js
@@ -59,9 +59,6 @@ function loadMoreResults() {
 
   updateUrl = updateUrl.replace("/meta.ger3", "/loadMore");
 
-  var expectedEngines = -1;
-  var deliveredEngines = -1;
-
   var currentlyLoading = false;
 
   // Regularily check for not yet delivered Results
@@ -70,7 +67,7 @@ function loadMoreResults() {
       currentlyLoading = true;
       $.getJSON(updateUrl, function (data) {
         // Check if we can clear the interval (once every searchengine has answered)
-        if (data.engineDelivered == data.engineCount || data.timeWaiting > 15) {
+        if (!data || data.finished) {
           clearInterval(resultLoader);
         }
         // If there are new results we can add them
@@ -109,13 +106,9 @@ function loadMoreResults() {
               $(".alert.alert-danger").remove();
             }
           }
-          console.log(data);
         }
         currentlyLoading = false;
       });
     }
   }, 1000);
-  //clearInterval(resultLoader);
-  console.log(updateUrl);
-
 }
\ No newline at end of file