diff --git a/.dockerignore b/.dockerignore
index 2086dcb4d0a437bec9b6d85dae32037f758e0f0c..4c2d65fd36330334d8922c862f46393aac7db945 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,4 +1,4 @@
 README.md
 CHANGELOG.md
 docker-compose.yml
-Dockerfile
+Dockerfile
\ No newline at end of file
diff --git a/.env.example b/.env.example
index d0b8b81bcfa87727379ddd8c9db66e8032235303..99ebfcd82502671c9c9cd37fac01219ad5564bf4 100644
--- a/.env.example
+++ b/.env.example
@@ -1,9 +1,12 @@
 APP_ENV=local
 APP_DEBUG=true
 APP_LOG_LEVEL=debug
+LOG_CHANNEL=stderr
 APP_KEY=
 APP_URL=http://localhost
 
+BOT_PROTECTION=true
+
 DB_CONNECTION=mysql
 DB_HOST=mgdb
 DB_PORT=3306
@@ -15,11 +18,12 @@ REDIS_RESULT_CONNECTION=default
 REDIS_RESULT_CACHE_DURATION=60
 
 BROADCAST_DRIVER=log
-CACHE_DRIVER=database
+CACHE_DRIVER=redis
 SESSION_DRIVER=file
 QUEUE_CONNECTION=sync
 
-REDIS_HOST=127.0.0.1
+REDIS_CACHE_HOST=redis
+REDIS_HOST=redis
 REDIS_PASSWORD=null
 REDIS_PORT=6379
 
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ab96ed6280fd2835dca8ef836d47e8c39030a6c7..df9225a187abd80797c6ed7609ad840bbcde2972 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,6 @@
 variables:
     DOCKER_HOST: "tcp://docker-dind.gitlab:2375"
+    AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS: "--network host"
     POSTGRES_ENABLED: "false"
     CODE_QUALITY_DISABLED: "true"
     CONTAINER_SCANNING_DISABLED: "true"
@@ -156,11 +157,10 @@ development:
       - $INCREMENTAL_ROLLOUT_ENABLED
       - $INCREMENTAL_ROLLOUT_MODE
 
-
 production:
   variables:
-    ADDITIONAL_HOSTS: "www.metager.de,metager.org,www.metager.org,metager.es,www.metager.es"
+    ADDITIONAL_HOSTS: "www.metager.de,metager.org,www.metager.org,metager.es,www.metager.es,klassik.metager.org"
     HELM_UPGRADE_VALUES_FILE: .gitlab/production-values.yaml
     ROLLOUT_RESOURCE_TYPE: deployment
   environment:
-    url: https://metager.de
+    url: https://metager.de
\ No newline at end of file
diff --git a/.gitlab/development-values.yaml b/.gitlab/development-values.yaml
index b18daea3443a4b000bd3252ce01cf0e1bd095bc4..66028e145be4f518daef5729b1e732a3bf2ce1af 100644
--- a/.gitlab/development-values.yaml
+++ b/.gitlab/development-values.yaml
@@ -1,6 +1,13 @@
 service:
   externalPort: 80
   internalPort: 80
+hpa:
+  minReplicas: 1
+  maxReplicas: 5
+podDisruptionBudget:
+  enabled: true
+  minAvailable: 1
+  maxUnavailable:
 ingress:
   annotations:
     certmanager.k8s.io/cluster-issuer: letsencrypt-prod
diff --git a/.gitlab/production-values.yaml b/.gitlab/production-values.yaml
index 7c5161ff17fb608ffce6be5d6b02a09673b8c66c..6b5322b8d1601ede319e38c382217f8addc6d67e 100644
--- a/.gitlab/production-values.yaml
+++ b/.gitlab/production-values.yaml
@@ -2,11 +2,16 @@ service:
   externalPort: 80
   internalPort: 80
 hpa:
-  minReplicas: 10
-  maxReplicas: 40
+  minReplicas: 5
+  maxReplicas: 25
+podDisruptionBudget:
+  enabled: true
+  minAvailable: 5
+  maxUnavailable:
 ingress:
   annotations:
     certmanager.k8s.io/cluster-issuer: letsencrypt-prod
+    nginx.ingress.kubernetes.io/ssl-redirect: "false"
     nginx.ingress.kubernetes.io/configuration-snippet: |
       if ($host = "www.metager.de") {
           return 301 https://metager.de$request_uri;
@@ -16,4 +21,7 @@ ingress:
       }
       if ($host = "www.metager.es") {
           return 301 https://metager.es$request_uri;
+      }
+      if ($host = "klassik.metager.org") {
+          return 301 https://metager.de$request_uri;
       }
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 98d2f4094275c7aa1c3d8653c7d64709bb91686e..7bfbc1866a1f3b39b5a057fbaac0c42e7fa298c9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,48 +1,75 @@
-FROM nginx
+FROM alpine:3.11.3
 
-RUN apt -y update && apt -y install php-fpm \
+RUN apk add --update \
+    nginx \
+    tzdata \
     ca-certificates \
-    cron \
+    dcron \
     zip \
-    php7.3-common \
-    php7.3-curl \
-    php7.3-mbstring \
-    php7.3-sqlite3 \
-    php7.3-mysql \
-    php7.3-xml \
-    php7.3-zip \
-    php7.3-redis \
-    php7.3-gd \
-    redis-server
-
-RUN sed -i 's/listen.owner = www-data/listen.owner = nginx/g' /etc/php/7.3/fpm/pool.d/www.conf && \
-    sed -i 's/listen.group = www-data/listen.group = nginx/g' /etc/php/7.3/fpm/pool.d/www.conf && \
-    sed -i 's/pm.max_children = 5/pm.max_children = 100/g' /etc/php/7.3/fpm/pool.d/www.conf && \
-    sed -i 's/pm.start_servers = 2/pm.start_servers = 25/g' /etc/php/7.3/fpm/pool.d/www.conf && \
-    sed -i 's/pm.min_spare_servers = 1/pm.min_spare_servers = 5/g' /etc/php/7.3/fpm/pool.d/www.conf && \
-    sed -i 's/pm.max_spare_servers = 3/pm.max_spare_servers = 25/g' /etc/php/7.3/fpm/pool.d/www.conf && \
-    sed -i 's/user = www-data/user = nginx/g' /etc/php/7.3/fpm/pool.d/www.conf && \
-    sed -i 's/group = www-data/group = nginx/g' /etc/php/7.3/fpm/pool.d/www.conf && \
-    sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/7.3/fpm/php.ini && \
-    mkdir /html
-
-# Set correct timezone
-RUN ln -fs /usr/share/zoneinfo/Europe/Berlin /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
-
-# Add Cronjob for Laravel
-RUN (crontab -l ; echo "* * * * * php /html/artisan schedule:run >> /dev/null 2>&1") | crontab
+    redis \
+    php7 \
+    php7-fpm \
+    php7-common \
+    php7-curl \
+    php7-mbstring \
+    php7-sqlite3 \
+    php7-pdo_mysql \
+    php7-pdo_sqlite \
+    php7-dom \
+    php7-simplexml \
+    php7-tokenizer \
+    php7-zip \
+    php7-redis \
+    php7-gd \
+    php7-json \
+    php7-pcntl \
+    php7-opcache \
+    php7-fileinfo \
+    && rm -rf /var/cache/apk/*
 
 WORKDIR /html
-EXPOSE 80
+
+RUN sed -i 's/;error_log = log\/php7\/error.log/error_log = \/dev\/stderr/g' /etc/php7/php-fpm.conf && \
+    sed -i 's/;daemonize = yes/daemonize = no/g' /etc/php7/php-fpm.conf && \
+    sed -i 's/listen = 127.0.0.1:9000/listen = 9000/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/;request_terminate_timeout = 0/request_terminate_timeout = 30/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/;request_terminate_timeout_track_finished = no/request_terminate_timeout_track_finished = yes/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/;decorate_workers_output = no/decorate_workers_output = no/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/;catch_workers_output = yes/catch_workers_output = yes/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/user = nobody/user = nginx/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/group = nobody/group = nginx/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/pm.max_children = 5/pm.max_children = 100/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/pm.start_servers = 2/pm.start_servers = 5/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/pm.min_spare_servers = 1/pm.min_spare_servers = 5/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/pm.max_spare_servers = 3/pm.max_spare_servers = 25/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/user = www-data/user = nginx/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/group = www-data/group = nginx/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php7/php.ini && \
+    sed -i 's/expose_php = On/expose_php = Off/g' /etc/php7/php.ini && \
+    # Opcache configuration
+    sed -i 's/;opcache.enable=1/opcache.enable=1/g' /etc/php7/php.ini && \
+    sed -i 's/;opcache.memory_consumption=128/opcache.memory_consumption=128/g' /etc/php7/php.ini && \
+    sed -i 's/;opcache.interned_strings_buffer=8/opcache.interned_strings_buffer=8/g' /etc/php7/php.ini && \
+    sed -i 's/;opcache.max_accelerated_files=10000/opcache.max_accelerated_files=10000/g' /etc/php7/php.ini && \
+    sed -i 's/;opcache.max_wasted_percentage=5/opcache.max_wasted_percentage=5/g' /etc/php7/php.ini && \
+    sed -i 's/;opcache.validate_timestamps=1/opcache.validate_timestamps=1/g' /etc/php7/php.ini && \
+    sed -i 's/;opcache.revalidate_freq=2/opcache.revalidate_freq=300/g' /etc/php7/php.ini && \
+    echo "daemonize yes" >> /etc/redis.conf && \
+    ln -s /dev/null /var/log/nginx/access.log && \
+    ln -s /dev/stdout /var/log/nginx/error.log && \
+    cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime && \
+    echo "Europe/Berlin" > /etc/timezone && \
+    (crontab -l ; echo "* * * * * php /html/artisan schedule:run >> /dev/null 2>&1") | crontab -
 
 COPY config/nginx.conf /etc/nginx/nginx.conf
 COPY config/nginx-default.conf /etc/nginx/conf.d/default.conf
+RUN sed -i 's/fastcgi_pass phpfpm:9000;/fastcgi_pass localhost:9000;/g' /etc/nginx/conf.d/default.conf 
 COPY --chown=root:nginx . /html
 
+WORKDIR /html
+EXPOSE 80
+
 CMD chown -R root:nginx storage/logs/metager bootstrap/cache && \
     chmod -R g+w storage/logs/metager bootstrap/cache && \
-    /etc/init.d/cron start && \
-    /etc/init.d/php7.3-fpm start && \
-    /etc/init.d/nginx start && \
-    /etc/init.d/redis-server start && \
-    su -s /bin/bash -c 'php artisan requests:fetcher' nginx
+    crond -L /dev/stdout && \
+    php-fpm7
diff --git a/DockerfileDev b/DockerfileDev
new file mode 100644
index 0000000000000000000000000000000000000000..04cf4b666512d26a43bf2aabdc291055a734d6e4
--- /dev/null
+++ b/DockerfileDev
@@ -0,0 +1,61 @@
+FROM alpine:3.11.3
+
+RUN apk add --update \
+    nginx \
+    tzdata \
+    ca-certificates \
+    dcron \
+    zip \
+    redis \
+    php7 \
+    php7-fpm \
+    php7-common \
+    php7-curl \
+    php7-mbstring \
+    php7-sqlite3 \
+    php7-pdo_mysql \
+    php7-pdo_sqlite \
+    php7-dom \
+    php7-simplexml \
+    php7-tokenizer \
+    php7-zip \
+    php7-redis \
+    php7-gd \
+    php7-json \
+    php7-pcntl \
+    php7-fileinfo \
+    && rm -rf /var/cache/apk/*
+
+WORKDIR /html
+
+RUN sed -i 's/;error_log = log\/php7\/error.log/error_log = \/dev\/stderr/g' /etc/php7/php-fpm.conf && \
+    sed -i 's/;daemonize = yes/daemonize = no/g' /etc/php7/php-fpm.conf && \
+    sed -i 's/listen = 127.0.0.1:9000/listen = 9000/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/;request_terminate_timeout = 0/request_terminate_timeout = 30/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/;request_terminate_timeout_track_finished = no/request_terminate_timeout_track_finished = yes/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/;decorate_workers_output = no/decorate_workers_output = no/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/;catch_workers_output = yes/catch_workers_output = yes/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/user = nobody/user = nginx/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/group = nobody/group = nginx/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/pm.max_children = 5/pm.max_children = 100/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/pm.start_servers = 2/pm.start_servers = 5/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/pm.min_spare_servers = 1/pm.min_spare_servers = 5/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/pm.max_spare_servers = 3/pm.max_spare_servers = 25/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/user = www-data/user = nginx/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/group = www-data/group = nginx/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php7/php.ini && \
+    sed -i 's/expose_php = On/expose_php = Off/g' /etc/php7/php.ini && \
+    echo "daemonize yes" >> /etc/redis.conf && \
+    ln -s /dev/null /var/log/nginx/access.log && \
+    ln -s /dev/stdout /var/log/nginx/error.log && \
+    cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime && \
+    echo "Europe/Berlin" > /etc/timezone && \
+    (crontab -l ; echo "* * * * * php /html/artisan schedule:run >> /dev/null 2>&1") | crontab -
+
+WORKDIR /html
+EXPOSE 80
+
+CMD chown -R root:nginx storage/logs/metager bootstrap/cache && \
+    chmod -R g+w storage/logs/metager bootstrap/cache && \
+    crond -L /dev/stdout && \
+    php-fpm7
diff --git a/DockerfileDev.ignore b/DockerfileDev.ignore
new file mode 100644
index 0000000000000000000000000000000000000000..d6b954efbf510e511a85c7b357dddbcd530b9801
--- /dev/null
+++ b/DockerfileDev.ignore
@@ -0,0 +1,5 @@
+README.md
+CHANGELOG.md
+vendor/*
+node_modules/*
+storage/logs/*
\ No newline at end of file
diff --git a/app/Console/Commands/AppendLogs.php b/app/Console/Commands/AppendLogs.php
new file mode 100644
index 0000000000000000000000000000000000000000..7049e06a6777901d7272abf7090394744667a413
--- /dev/null
+++ b/app/Console/Commands/AppendLogs.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\Redis;
+use Log;
+use Monospice\LaravelRedisSentinel\RedisSentinel;
+
+class AppendLogs extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'logs:gather';
+    const LOGKEY = "metager.logs";
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Retrieves all Log Entries from Redis and writes them to file';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $redis = null;
+
+        if (env("REDIS_CACHE_DRIVER", "redis") === "redis") {
+            $redis = Redis::connection('cache');
+        } elseif (env("REDIS_CACHE_DRIVER", "redis") === "redis-sentinel") {
+            $redis = RedisSentinel::connection('cache');
+        }
+        if ($redis === null) {
+            Log::error("No valid Redis Connection specified");
+            return;
+        }
+
+        $elements = [];
+        $reply = $redis->pipeline(function ($pipe) use ($elements) {
+            $pipe->lrange(\App\Console\Commands\AppendLogs::LOGKEY, 0, -1);
+            $pipe->del(\App\Console\Commands\AppendLogs::LOGKEY);
+        });
+        $elements = $reply[0];
+        if (!is_array($elements) || sizeof($elements) <= 0) {
+            return;
+        }
+        if (file_put_contents(\App\MetaGer::getMGLogFile(), implode(PHP_EOL, $elements) . PHP_EOL, FILE_APPEND) === false) {
+            Log::error("Konnte Log Zeile(n) nicht schreiben");
+            $redis->lpush(array_reverse($elements));
+        } else {
+            Log::info("Added " . sizeof($elements) . " lines to todays log!");
+        }
+    }
+}
diff --git a/app/Console/Commands/CacheGC.php b/app/Console/Commands/CacheGC.php
deleted file mode 100644
index fbe8d1f97517264a706b70effb3349a17ba1bf82..0000000000000000000000000000000000000000
--- a/app/Console/Commands/CacheGC.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-namespace App\Console\Commands;
-
-use Illuminate\Console\Command;
-
-class CacheGC extends Command
-{
-    /**
-     * The name and signature of the console command.
-     *
-     * @var string
-     */
-    protected $signature = 'cache:gc';
-
-    /**
-     * The console command description.
-     *
-     * @var string
-     */
-    protected $description = 'Cleans up every expired cache File';
-
-    /**
-     * Create a new command instance.
-     *
-     * @return void
-     */
-    public function __construct()
-    {
-        parent::__construct();
-    }
-
-    /**
-     * Execute the console command.
-     *
-     * @return mixed
-     */
-    public function handle()
-    {
-        $cachedir = storage_path('framework/cache');
-
-        $lockfile = $cachedir . "/cache.gc";
-
-        if (file_exists($lockfile)) {
-            return;
-        } else {
-            touch($lockfile);
-        }
-
-        try {
-            foreach (new \DirectoryIterator($cachedir) as $fileInfo) {
-                if ($fileInfo->isDot()) {
-                    continue;
-                }
-                $file = $fileInfo->getPathname();
-                $basename = basename($file);
-                if (!is_dir($file) && $basename !== "cache.gc" && $basename !== ".gitignore") {
-                    $fp = fopen($file, 'r');
-                    $delete = false;
-                    try {
-                        $time = intval(fread($fp, 10));
-                        if ($time < time()) {
-                            $delete = true;
-                        }
-                    } finally {
-                        fclose($fp);
-                    }
-                    if ($delete) {
-                        unlink($file);
-                    }
-                } else if (is_dir($file)) {
-                    // Delete Directory if empty
-                    try {
-                        rmdir($file);
-                    } catch (\ErrorException $e) {
-
-                    }
-                }
-            }
-        } finally {
-            unlink($lockfile);
-        }
-
-    }
-}
diff --git a/app/Console/Commands/RequestFetcher.php b/app/Console/Commands/RequestFetcher.php
index 9b986603af972b57e341d7327218940608b28bec..5f796f15e0835b5440170c1af78bc1d33862b3c3 100644
--- a/app/Console/Commands/RequestFetcher.php
+++ b/app/Console/Commands/RequestFetcher.php
@@ -2,7 +2,6 @@
 
 namespace App\Console\Commands;
 
-use Cache;
 use Illuminate\Console\Command;
 use Illuminate\Support\Facades\Redis;
 use Log;
@@ -25,6 +24,9 @@ class RequestFetcher extends Command
 
     protected $shouldRun = true;
     protected $multicurl = null;
+    protected $oldMultiCurl = null;
+    protected $maxFetchedDocuments = 10000;
+    protected $fetchedDocuments = 0;
     protected $proxyhost, $proxyuser, $proxypassword;
 
     /**
@@ -50,13 +52,32 @@ class RequestFetcher extends Command
      */
     public function handle()
     {
-        $pids = [];
 
-        pcntl_async_signals(true);
+        $pidFile = "/tmp/fetcher";
         pcntl_signal(SIGINT, [$this, "sig_handler"]);
         pcntl_signal(SIGTERM, [$this, "sig_handler"]);
         pcntl_signal(SIGHUP, [$this, "sig_handler"]);
 
+        // Redis might not be available now
+        for ($count = 0; $count < 10; $count++) {
+            try {
+                Redis::connection();
+                break;
+            } catch (\Predis\Connection\ConnectionException $e) {
+                if ($count >= 9) {
+                    // If its not available after 10 seconds we will exit
+                    return;
+                }
+                sleep(1);
+            }
+        }
+
+        touch($pidFile);
+
+        if (!file_exists($pidFile)) {
+            return;
+        }
+
         try {
             $blocking = false;
             while ($this->shouldRun) {
@@ -74,49 +95,80 @@ class RequestFetcher extends Command
                 if (!empty($currentJob)) {
                     $currentJob = json_decode($currentJob, true);
                     $ch = $this->getCurlHandle($currentJob);
-                    curl_multi_add_handle($this->multicurl, $ch);
+                    if (curl_multi_add_handle($this->multicurl, $ch) !== 0) {
+                        $this->shouldRun = false;
+                        Log::error("Couldn't add Handle to multicurl");
+                        break;
+                    }
+                    $this->fetchedDocuments++;
+                    if ($this->fetchedDocuments > $this->maxFetchedDocuments) {
+                        Log::info("Reinitializing Multicurl after " . $this->fetchedDocuments . " requests.");
+                        $this->oldMultiCurl = $this->multicurl;
+                        $this->multicurl = curl_multi_init();
+                        $this->fetchedDocuments = 0;
+                    }
                     $blocking = false;
                     $active = true;
                 }
 
-                $answerRead = false;
-                while (($info = curl_multi_info_read($this->multicurl)) !== false) {
-                    $answerRead = true;
-                    $infos = curl_getinfo($info["handle"], CURLINFO_PRIVATE);
-                    $infos = explode(";", $infos);
-                    $resulthash = $infos[0];
-                    $cacheDurationMinutes = intval($infos[1]);
-                    $responseCode = curl_getinfo($info["handle"], CURLINFO_HTTP_CODE);
-                    $body = "";
-
-                    $error = curl_error($info["handle"]);
-                    if (!empty($error)) {
-                        Log::error($error);
+                $answerRead = $this->readMultiCurl($this->multicurl);
+                if ($this->oldMultiCurl != null) {
+                    $this->readMultiCurl($this->oldMultiCurl);
+                    $messagesLeft = -1;
+                    if (curl_multi_info_read($this->oldMultiCurl, $messagesLeft) === false) {
+                        if ($messagesLeft = 0) {
+                            Log::debug("Removing finished multicurl handle");
+                            curl_multi_close($this->oldMultiCurl);
+                            $this->oldMultiCurl = null;
+                        }
                     }
-
-                    if ($responseCode !== 200) {
-                        Log::debug("Got responsecode " . $responseCode . " fetching \"" . curl_getinfo($info["handle"], CURLINFO_EFFECTIVE_URL) . "\n");
-                    } else {
-                        $body = \curl_multi_getcontent($info["handle"]);
-                    }
-
-                    Redis::pipeline(function ($pipe) use ($resulthash, $body, $cacheDurationMinutes) {
-                        $pipe->set($resulthash, $body);
-                        $pipe->expire($resulthash, 60);
-                        Cache::put($resulthash, $body, $cacheDurationMinutes * 60);
-                    });
-                    \curl_multi_remove_handle($this->multicurl, $info["handle"]);
                 }
+
                 if (!$active && !$answerRead) {
                     $blocking = true;
+                } else {
+                    usleep(50 * 1000);
                 }
             }
         } finally {
+            unlink($pidFile);
             curl_multi_close($this->multicurl);
         }
-        foreach ($pids as $tmppid) {
-            \pcntl_waitpid($tmppid, $status, WNOHANG);
+    }
+
+    private function readMultiCurl($mc)
+    {
+        $answerRead = false;
+        while (($info = curl_multi_info_read($mc)) !== false) {
+            try {
+                $answerRead = true;
+                $infos = curl_getinfo($info["handle"], CURLINFO_PRIVATE);
+                $infos = explode(";", $infos);
+                $resulthash = $infos[0];
+                $cacheDurationMinutes = intval($infos[1]);
+                $responseCode = curl_getinfo($info["handle"], CURLINFO_HTTP_CODE);
+                $body = "";
+
+                $error = curl_error($info["handle"]);
+                if (!empty($error)) {
+                    Log::error($error);
+                }
+
+                if ($responseCode !== 200) {
+                    Log::debug("Got responsecode " . $responseCode . " fetching \"" . curl_getinfo($info["handle"], CURLINFO_EFFECTIVE_URL) . "\n");
+                } else {
+                    $body = \curl_multi_getcontent($info["handle"]);
+                }
+
+                Redis::pipeline(function ($pipe) use ($resulthash, $body, $cacheDurationMinutes) {
+                    $pipe->set($resulthash, $body);
+                    $pipe->expire($resulthash, 60);
+                });
+            } finally {
+                \curl_multi_remove_handle($mc, $info["handle"]);
+            }
         }
+        return $answerRead;
     }
 
     private function getCurlHandle($job)
@@ -129,11 +181,11 @@ class RequestFetcher extends Command
             CURLOPT_RETURNTRANSFER => 1,
             CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1",
             CURLOPT_FOLLOWLOCATION => true,
-            CURLOPT_CONNECTTIMEOUT => 10,
+            CURLOPT_CONNECTTIMEOUT => 2,
             CURLOPT_MAXCONNECTS => 500,
-            CURLOPT_LOW_SPEED_LIMIT => 500,
+            CURLOPT_LOW_SPEED_LIMIT => 50000,
             CURLOPT_LOW_SPEED_TIME => 5,
-            CURLOPT_TIMEOUT => 10,
+            CURLOPT_TIMEOUT => 7,
         ));
 
         if (!empty($this->proxyhost) && !empty($this->proxyport) && !empty($this->proxyuser) && !empty($this->proxypassword)) {
diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php
index 97ce1d64f4353c535360221484de3219966fcd36..51233aaaee9bbf7bc976113e4e7bdbe32ca99a1b 100644
--- a/app/Console/Kernel.php
+++ b/app/Console/Kernel.php
@@ -27,7 +27,7 @@ class Kernel extends ConsoleKernel
     {
         $schedule->command('requests:gather')->everyFifteenMinutes();
         $schedule->command('requests:useragents')->everyFiveMinutes();
-        $schedule->command('cache:gc')->hourly();
+        $schedule->command('logs:gather')->everyMinute();
 
         $schedule->call(function () {
             DB::table('monthlyrequests')->truncate();
diff --git a/app/Http/Controllers/AdminInterface.php b/app/Http/Controllers/AdminInterface.php
index d0b4664fece70baba754309f5333736434528707..4cbd7e9adbd43d5887de8d0e3ff1b86644c2ef93 100644
--- a/app/Http/Controllers/AdminInterface.php
+++ b/app/Http/Controllers/AdminInterface.php
@@ -77,7 +77,7 @@ class AdminInterface extends Controller
     private function getSearchEngineNames()
     {
         $url = config_path() . "/sumas.xml";
-        $xml = simplexml_load_file($url);
+        $xml = \simplexml_load_file($url);
         $sumas = $xml->xpath("suma");
 
         $names = array();
diff --git a/app/Http/Controllers/Assoziator.php b/app/Http/Controllers/Assoziator.php
index f7163585e765e9009b5408a2fad0b2fd040f9966..b4a7d686dbaaf71e194d27d4f17d958b7fda643c 100644
--- a/app/Http/Controllers/Assoziator.php
+++ b/app/Http/Controllers/Assoziator.php
@@ -42,7 +42,7 @@ class Assoziator extends Controller
         }
 
         $response = preg_replace("/^<\?.*\?>/s", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>", $response);
-        $content = simplexml_load_string($response);
+        $content = \simplexml_load_string($response);
 
         $words = [];
 
diff --git a/app/Http/Controllers/FokiLoader.php b/app/Http/Controllers/FokiLoader.php
index 5b1a06713d667e43f9c96dac55545ccdf73a0f26..a71e69729d7858f67c32903d44e25e109cd8c1c5 100644
--- a/app/Http/Controllers/FokiLoader.php
+++ b/app/Http/Controllers/FokiLoader.php
@@ -15,7 +15,7 @@ class FokiLoader
             $sumaFile = config_path() . "/sumas.xml";
         }
 
-        $xml = simplexml_load_file($sumaFile);
+        $xml = \simplexml_load_file($sumaFile);
         $sumas = $xml->xpath("suma");
 
         $foki = [];
diff --git a/app/Http/Controllers/HumanVerification.php b/app/Http/Controllers/HumanVerification.php
index 9e9cada8a029ed7c7330f184ea8ef4f6190cb7c4..97f148c24219d5a1236862573cf56a41c22fe541 100644
--- a/app/Http/Controllers/HumanVerification.php
+++ b/app/Http/Controllers/HumanVerification.php
@@ -92,9 +92,9 @@ class HumanVerification extends Controller
     public static function removeGet(Request $request, $mm, $password, $url)
     {
         $url = base64_decode(str_replace("<<SLASH>>", "/", $url));
-
         # If the user is correct and the password is we will delete any entry in the database
         $requiredPass = md5($mm . Carbon::NOW()->day . $url . env("PROXY_PASSWORD"));
+
         if (HumanVerification::checkId($request, $mm) && $requiredPass === $password) {
             HumanVerification::removeUser($request, $mm);
         }
@@ -126,8 +126,13 @@ class HumanVerification extends Controller
                 $changed = true;
             }
         }
+
         if ($changed) {
-            Cache::put(HumanVerification::PREFIX . "." . $user["id"], $userList, now()->addWeeks(2));
+            if (sizeof($newUserList) > 0) {
+                Cache::put(HumanVerification::PREFIX . "." . $user["id"], $newUserList, now()->addWeeks(2));
+            } else {
+                Cache::forget(HumanVerification::PREFIX . "." . $user["id"], $newUserList);
+            }
         }
     }
 
@@ -152,11 +157,10 @@ class HumanVerification extends Controller
 
         $sum = 0;
         foreach ($userlist as $uidTmp => $userTmp) {
-            if (!empty($userTmp) && !empty($userTmp["whitelist"]) && !$userTmp["whitelist"]) {
+            if (!empty($userTmp) && gettype($userTmp["whitelist"]) === "boolean" && !$userTmp["whitelist"]) {
                 $sum += intval($userTmp["unusedResultPages"]);
             }
         }
-
         # Check if we have to whitelist the user or if we can simply delete the data
         if ($user["unusedResultPages"] < $sum && !$user["whitelist"]) {
             # Whitelist
diff --git a/app/Http/Controllers/MetaGerSearch.php b/app/Http/Controllers/MetaGerSearch.php
index f6f9f434c8d1893cde7aa9fe0ba063d06db5f362..ae0b4d9c162e37f4c0e451d187f7654b54b2411f 100644
--- a/app/Http/Controllers/MetaGerSearch.php
+++ b/app/Http/Controllers/MetaGerSearch.php
@@ -11,10 +11,16 @@ use View;
 
 class MetaGerSearch extends Controller
 {
-    public function search(Request $request, MetaGer $metager)
+
+    public function search(Request $request, MetaGer $metager, $timing = false)
     {
+        $timings = null;
+        if ($timing) {
+            $timings = ['starttime' => microtime(true)];
+        }
         $time = microtime(true);
         $spamEntries = [];
+        $spamEntry = null;
         if (file_exists(config_path('spam.txt'))) {
             $spamEntries = file(config_path('spam.txt'));
         }
@@ -32,36 +38,62 @@ class MetaGerSearch extends Controller
             return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), '/'));
         }
 
+        foreach ($spamEntries as $index => $entry) {
+            $entry = trim($entry);
+            if (empty($entry)) {
+                continue;
+            }
+            if (preg_match("/" . $entry . "/si", $eingabe)) {
+                $spamEntry = $entry;
+                break;
+            }
+        }
+
         # Mit gelieferte Formulardaten parsen und abspeichern:
         $metager->parseFormData($request);
+        if (!empty($timings)) {
+            $timings["parseFormData"] = microtime(true) - $time;
+        }
 
         # Nach Spezialsuchen überprüfen:
         $metager->checkSpecialSearches($request);
-
-        if (Cache::has('spam.' . $metager->getFokus() . "." . md5($metager->getQ()))) {
-            return response(Cache::get('spam.' . $metager->getFokus() . "." . md5($metager->getEingabe())));
+        if (!empty($timings)) {
+            $timings["checkSpecialSearches"] = microtime(true) - $time;
         }
 
-        # Die Quicktips als Job erstellen
-        $quicktips = $metager->createQuicktips();
+        if ($spamEntry !== null && Cache::has('spam.' . $metager->getFokus() . "." . md5($spamEntry))) {
+            $responseContent = Cache::get('spam.' . $metager->getFokus() . "." . md5($spamEntry));
+            $responseContent = preg_replace('/(name="eingabe"\s+value=")[^"]+/', "$1$eingabe", $responseContent);
+            return response($responseContent);
+        }
 
         # Suche für alle zu verwendenden Suchmaschinen als Job erstellen,
         # auf Ergebnisse warten und die Ergebnisse laden
-        $metager->createSearchEngines($request);
+        $metager->createSearchEngines($request, $timings);
 
-        $metager->startSearch();
+        $metager->startSearch($timings);
 
         $metager->waitForMainResults();
+        if (!empty($timings)) {
+            $timings["waitForMainResults"] = microtime(true) - $time;
+        }
 
         $metager->retrieveResults();
+        if (!empty($timings)) {
+            $timings["retrieveResults"] = microtime(true) - $time;
+        }
 
-        # Versuchen die Ergebnisse der Quicktips zu laden
-        $quicktipResults = $quicktips->loadResults();
         # Alle Ergebnisse vor der Zusammenführung ranken:
         $metager->rankAll();
+        if (!empty($timings)) {
+            $timings["rankAll"] = microtime(true) - $time;
+        }
 
         # Ergebnisse der Suchmaschinen kombinieren:
         $metager->prepareResults();
+        if (!empty($timings)) {
+            $timings["prepareResults"] = microtime(true) - $time;
+        }
 
         $finished = true;
         foreach ($metager->getEngines() as $engine) {
@@ -72,21 +104,35 @@ class MetaGerSearch extends Controller
         }
 
         Cache::put("loader_" . $metager->getSearchUid(), $metager->getEngines(), 60 * 60);
+        if (!empty($timings)) {
+            $timings["Filled resultloader Cache"] = microtime(true) - $time;
+        }
 
         # Die Ausgabe erstellen:
-        $resultpage = $metager->createView($quicktipResults);
-        foreach ($spamEntries as $index => $entry) {
-            $entry = trim($entry);
-            if (empty($entry)) {
-                continue;
-            }
-            if (preg_match("/" . $entry . "/si", $metager->getEingabe())) {
-                Cache::put('spam.' . $metager->getFokus() . "." . md5($metager->getEingabe()), $resultpage->render(), 604800);
-            }
+        $resultpage = $metager->createView();
+        if ($spamEntry !== null) {
+            Cache::put('spam.' . $metager->getFokus() . "." . md5($spamEntry), $resultpage->render(), 604800);
+        }
+
+        if (!empty($timings)) {
+            $timings["createView"] = microtime(true) - $time;
         }
+
+        if ($timings) {
+            dd($timings);
+        }
+
         return $resultpage;
     }
 
+    public function searchTimings(Request $request, MetaGer $metager)
+    {
+        $request->merge([
+            'eingabe' => "Hannover",
+        ]);
+        return $this->search($request, $metager, true);
+    }
+
     public function loadMore(Request $request)
     {
         /**
@@ -204,7 +250,7 @@ class MetaGerSearch extends Controller
         $tips_text = file_get_contents($tipserver);
         $tips = [];
         try {
-            $tips_xml = simplexml_load_string($tips_text);
+            $tips_xml = \simplexml_load_string($tips_text);
 
             $tips_xml->registerXPathNamespace('mg', 'http://metager.de/tips/');
             $tips_xml = $tips_xml->xpath('mg:tip');
@@ -220,4 +266,12 @@ class MetaGerSearch extends Controller
             ->with('title', trans('tips.title'))
             ->with('tips', $tips);
     }
+
+    public function quicktips($search)
+    {
+        $quicktips = new \App\Models\Quicktips\Quicktips($search);
+        return view('quicktips')
+            ->with('quicktips', $quicktips->getResults())
+            ->with('search', $search);
+    }
 }
diff --git a/app/Http/Middleware/UserAgentMaster.php b/app/Http/Middleware/UserAgentMaster.php
index 64b1c75e91a9361398907dc6e80f240d7783bf72..f19fdcd3a1091347e41e8cadeaa9e779b9151b6f 100644
--- a/app/Http/Middleware/UserAgentMaster.php
+++ b/app/Http/Middleware/UserAgentMaster.php
@@ -34,10 +34,13 @@ class UserAgentMaster
         } else if ($agent->isPhone()) {
             $device = "mobile";
         }
-        // Push an entry to a list in Redis
-        // App\Console\Commands\SaveUseragents.php is called regulary to save the list into a sqlite database
-        Redis::rpush('useragents', json_encode(["platform" => $agent->platform(), "browser" => $agent->browser(), "device" => $device, "useragent" => $_SERVER['HTTP_USER_AGENT']]));
-        Redis::expire('useragents', 301);
+
+        if (!empty($_SERVER['HTTP_USER_AGENT'])) {
+            // Push an entry to a list in Redis
+            // App\Console\Commands\SaveUseragents.php is called regulary to save the list into a sqlite database
+            Redis::rpush('useragents', json_encode(["platform" => $agent->platform(), "browser" => $agent->browser(), "device" => $device, "useragent" => $_SERVER['HTTP_USER_AGENT']]));
+            Redis::expire('useragents', 301);
+        }
 
         // Try to retrieve a random User-Agent of the same category from the sqlite database
         $newAgent = \App\UserAgent::where("platform", $agent->platform())
diff --git a/app/MetaGer.php b/app/MetaGer.php
index 2609e1a3152c7b1ef1b7bf648975436d2edbbb55..ccfcd3520884c2dff6fb34dc14f9f2bbd77ac5a3 100644
--- a/app/MetaGer.php
+++ b/app/MetaGer.php
@@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Redis;
 use Jenssegers\Agent\Agent;
 use LaravelLocalization;
 use Log;
+use Monospice\LaravelRedisSentinel\RedisSentinel;
 use Predis\Connection\ConnectionException;
 
 class MetaGer
@@ -20,6 +21,7 @@ class MetaGer
     public $alteredQuery = "";
     public $alterationOverrideQuery = "";
     protected $fokus;
+    protected $test;
     protected $eingabe;
     protected $q;
     protected $page;
@@ -129,7 +131,7 @@ class MetaGer
     }
 
     # Erstellt aus den gesammelten Ergebnissen den View
-    public function createView($quicktipResults = [])
+    public function createView()
     {
         # Hiermit werden die evtl. ausgewählten SuMas extrahiert, damit die Input-Boxen richtig gesetzt werden können
         $focusPages = [];
@@ -169,7 +171,7 @@ class MetaGer
                         ->with('apiAuthorized', $this->apiAuthorized)
                         ->with('metager', $this)
                         ->with('browser', (new Agent())->browser())
-                        ->with('quicktips', $quicktipResults)
+                        ->with('quicktips', action('MetaGerSearch@quicktips', ["search" => $this->eingabe]))
                         ->with('focus', $this->fokus)
                         ->with('resultcount', count($this->results));
             }
@@ -242,7 +244,7 @@ class MetaGer
                         ->with('apiAuthorized', $this->apiAuthorized)
                         ->with('metager', $this)
                         ->with('browser', (new Agent())->browser())
-                        ->with('quicktips', $quicktipResults)
+                        ->with('quicktips', action('MetaGerSearch@quicktips', ["search" => $this->eingabe]))
                         ->with('resultcount', count($this->results))
                         ->with('focus', $this->fokus);
                     break;
@@ -462,19 +464,16 @@ class MetaGer
         }
     }
 
-    public function createQuicktips()
-    {
-        # Die quicktips werden als job erstellt und zur Abarbeitung freigegeben
-        $quicktips = new \App\Models\Quicktips\Quicktips($this->q, LaravelLocalization::getCurrentLocale(), $this->getTime());
-        return $quicktips;
-    }
-
     /*
      * Die Erstellung der Suchmaschinen bis die Ergebnisse da sind mit Unterfunktionen
      */
 
-    public function createSearchEngines(Request $request)
+    public function createSearchEngines(Request $request, &$timings)
     {
+        if (!empty($timings)) {
+            $timings["createSearchEngines"]["start"] = microtime(true) - $timings["starttime"];
+        }
+
         # Wenn es kein Suchwort gibt
         if (!$request->filled("eingabe") || $this->q === "") {
             return;
@@ -495,8 +494,16 @@ class MetaGer
             $sumas[$sumaName] = $this->sumaFile->sumas->{$sumaName};
         }
 
+        if (!empty($timings)) {
+            $timings["createSearchEngines"]["created engine array"] = microtime(true) - $timings["starttime"];
+        }
+
         $this->removeAdsFromListIfAdfree($sumas);
 
+        if (!empty($timings)) {
+            $timings["createSearchEngines"]["removed ads"] = microtime(true) - $timings["starttime"];
+        }
+
         foreach ($sumas as $sumaName => $suma) {
             # Check if this engine is disabled and can't be used
             $disabled = empty($suma->disabled) ? false : $suma->disabled;
@@ -550,6 +557,10 @@ class MetaGer
             }
         }
 
+        if (!empty($timings)) {
+            $timings["createSearchEngines"]["filtered invalid engines"] = microtime(true) - $timings["starttime"];
+        }
+
         # Include Yahoo Ads if Yahoo is not enabled as a searchengine
         if (!$this->apiAuthorized && $this->fokus != "bilder" && empty($this->enabledSearchengines["yahoo"]) && isset($this->sumaFile->sumas->{"yahoo-ads"})) {
             $this->enabledSearchengines["yahoo-ads"] = $this->sumaFile->sumas->{"yahoo-ads"};
@@ -574,6 +585,10 @@ class MetaGer
             $this->errors[] = $error;
         }
         $this->setEngines($request);
+        if (!empty($timings)) {
+            $timings["createSearchEngines"]["saved engines"] = microtime(true) - $timings["starttime"];
+        }
+
     }
 
     private function removeAdsFromListIfAdfree(&$sumas)
@@ -612,12 +627,38 @@ class MetaGer
         }
     }
 
-    public function startSearch()
+    public function startSearch(&$timings)
     {
+        if (!empty($timings)) {
+            $timings["startSearch"]["start"] = microtime(true) - $timings["starttime"];
+        }
+
+        # Check all engines for Cached responses
+        if ($this->canCache()) {
+            $keys = [];
+            foreach ($this->engines as $engine) {
+                $keys[] = $engine->hash;
+            }
+            $cacheValues = Cache::many($keys);
+            foreach ($this->engines as $engine) {
+                if ($cacheValues[$engine->hash] !== null) {
+                    $engine->cached = true;
+                    $engine->retrieveResults($this, $cacheValues[$engine->hash]);
+                }
+            }
+        }
+        if (!empty($timings)) {
+            $timings["startSearch"]["cache checked"] = microtime(true) - $timings["starttime"];
+        }
+
         # Wir starten alle Suchen
         foreach ($this->engines as $engine) {
-            $engine->startSearch($this);
+            $engine->startSearch($this, $timings);
+        }
+        if (!empty($timings)) {
+            $timings["startSearch"]["searches started"] = microtime(true) - $timings["starttime"];
         }
+
     }
 
     # Spezielle Suchen und Sumas
@@ -788,19 +829,20 @@ class MetaGer
         $mainEngines = $this->sumaFile->foki->{$this->fokus}->main;
         foreach ($mainEngines as $mainEngine) {
             foreach ($engines as $engine) {
-                if ($engine->name === $mainEngine) {
+                if ($engine->name === $mainEngine && !$engine->loaded) {
                     $enginesToWaitFor[] = $engine;
                 }
             }
         }
 
         $timeStart = microtime(true);
+
         $answered = [];
         $results = null;
 
         # If there is no main searchengine to wait for or if the only main engine is yahoo-ads we will define a timeout of 1s
         $forceTimeout = null;
-        if (sizeof($enginesToWaitFor) === 0 || (sizeof($enginesToWaitFor) === 1 && $enginesToWaitFor[0]->name === "yahoo-ads")) {
+        if (sizeof($enginesToWaitFor) === 1 && $enginesToWaitFor[0]->name === "yahoo-ads") {
             $forceTimeout = 1;
         }
 
@@ -812,30 +854,13 @@ class MetaGer
                     break;
                 }
             }
+
             if ((microtime(true) - $timeStart) >= 2) {
                 break;
             } else {
                 usleep(50 * 1000);
             }
         }
-
-        # Now we can add an entry to Redis which defines the starting time and how many engines should answer this request
-        /*
-    $pipeline = $redis->pipeline();
-    $pipeline->hset($this->getRedisEngineResult() . "status", "startTime", $timeStart);
-    $pipeline->hset($this->getRedisEngineResult() . "status", "engineCount", sizeof($engines));
-    $pipeline->hset($this->getRedisEngineResult() . "status", "engineDelivered", sizeof($answered));
-    # Add the cached engines as answered
-    foreach ($engines as $engine) {
-    if ($engine->cached) {
-    $pipeline->hincrby($this->getRedisEngineResult() . "status", "engineDelivered", 1);
-    $pipeline->hincrby($this->getRedisEngineResult() . "status", "engineAnswered", 1);
-    }
-    }
-    foreach ($answered as $engine) {
-    $pipeline->hset($this->getRedisEngineResult() . $engine, "delivered", "1");
-    }
-    $pipeline->execute();*/
     }
 
     public function retrieveResults()
@@ -1351,7 +1376,7 @@ class MetaGer
         if ($this->shouldLog) {
             try {
                 $logEntry = "";
-                $logEntry .= date("H:s:i");
+                $logEntry .= date("H:i:s");
                 $logEntry .= " ref=" . $this->request->header('Referer');
                 $logEntry .= " time=" . round((microtime(true) - $this->starttime), 2) . " serv=" . $this->fokus;
                 $logEntry .= " interface=" . LaravelLocalization::getCurrentLocale();
@@ -1359,9 +1384,15 @@ class MetaGer
                 $logEntry .= " key=" . $this->apiKey;
                 $logEntry .= " eingabe=" . $this->eingabe;
 
-                $logpath = \App\MetaGer::getMGLogFile();
-                file_put_contents($logpath, $logEntry . PHP_EOL, FILE_APPEND | LOCK_EX);
+                $logEntry = preg_replace("/\n+/", " ", $logEntry);
+
+                if (env("REDIS_CACHE_DRIVER", "redis") === "redis") {
+                    Redis::connection('cache')->rpush(\App\Console\Commands\AppendLogs::LOGKEY, $logEntry);
+                } elseif (env("REDIS_CACHE_DRIVER", "redis") === "redis-sentinel") {
+                    RedisSentinel::connection('cache')->rpush(\App\Console\Commands\AppendLogs::LOGKEY, $logEntry);
+                }
             } catch (\Exception $e) {
+                Log::error($e->getMessage());
                 return;
             }
         }
diff --git a/app/Models/Quicktips/Quicktips.php b/app/Models/Quicktips/Quicktips.php
index 2022b26b2d6976f6046979d28b04af4d4a3c3914..1088e82cd777f49dd400e08e44f0dab80996ce8d 100644
--- a/app/Models/Quicktips/Quicktips.php
+++ b/app/Models/Quicktips/Quicktips.php
@@ -3,51 +3,42 @@
 namespace App\Models\Quicktips;
 
 use Cache;
-use Illuminate\Foundation\Bus\DispatchesJobs;
-use Illuminate\Support\Facades\Redis;
+use LaravelLocalization;
 use Log;
 
 class Quicktips
 {
-    use DispatchesJobs;
 
     private $quicktipUrl = "/1.1/quicktips.xml";
+    private $results = [];
     const QUICKTIP_NAME = "quicktips";
     const CACHE_DURATION = 60;
 
     private $hash;
 
-    public function __construct($search, $locale, $max_time)
+    public function __construct($search/*, $locale, $max_time*/)
     {
+        $locale = LaravelLocalization::getCurrentLocale();
         if (env("APP_ENV") === "production") {
             $this->quicktipUrl = "https://quicktips.metager.de" . $this->quicktipUrl;
         } else {
             $this->quicktipUrl = "https://dev.quicktips.metager.de" . $this->quicktipUrl;
         }
-        $this->startSearch($search, $locale, $max_time);
+        $this->startSearch($search, $locale);
     }
 
-    public function startSearch($search, $locale, $max_time)
+    public function startSearch($search, $locale)
     {
         $url = $this->quicktipUrl . "?search=" . $this->normalize_search($search) . "&locale=" . $locale;
         $this->hash = md5($url);
 
         if (!Cache::has($this->hash)) {
-
-            // Queue this search
-            $mission = [
-                "resulthash" => $this->hash,
-                "url" => $url,
-                "username" => null,
-                "password" => null,
-                "headers" => [],
-                "cacheDuration" => self::CACHE_DURATION,
-            ];
-
-            $mission = json_encode($mission);
-
-            Redis::rpush(\App\MetaGer::FETCHQUEUE_KEY, $mission);
+            $results = file_get_contents($url);
+            Cache::put($this->hash, $results, Quicktips::CACHE_DURATION);
+        } else {
+            $results = Cache::get($this->hash);
         }
+        $this->results = $this->loadResults($results);
     }
 
     /**
@@ -56,9 +47,8 @@ class Quicktips
      * 2. Parse the results
      * Returns an empty array if no results are found
      */
-    public function loadResults()
+    public function loadResults($resultsRaw)
     {
-        $resultsRaw = $this->retrieveResults($this->hash);
         if ($resultsRaw) {
             $results = $this->parseResults($resultsRaw);
             return $results;
@@ -86,7 +76,7 @@ class Quicktips
     {
         $quicktips_raw = preg_replace("/\r\n/si", "", $quicktips_raw);
         try {
-            $content = simplexml_load_string($quicktips_raw);
+            $content = \simplexml_load_string($quicktips_raw);
             if (!$content) {
                 return;
             }
@@ -175,4 +165,9 @@ class Quicktips
     {
         return urlencode($search);
     }
+
+    public function getResults()
+    {
+        return $this->results;
+    }
 }
diff --git a/app/Models/Searchengine.php b/app/Models/Searchengine.php
index 6584aa30f75043645f5015d3f0ddf36c457b54cd..59e758fca5d025fdf20d80ae3bbc93c0353e5285 100644
--- a/app/Models/Searchengine.php
+++ b/app/Models/Searchengine.php
@@ -105,12 +105,17 @@ abstract class Searchengine
     {}
 
     # Prüft, ob die Suche bereits gecached ist, ansonsted wird sie als Job dispatched
-    public function startSearch(\App\MetaGer $metager)
+    public function startSearch(\App\MetaGer $metager, &$timings)
     {
-        if ($this->canCache && Cache::has($this->hash)) {
-            $this->cached = true;
-            $this->retrieveResults($metager, true);
-        } else {
+        if (!empty($timings)) {
+            $timings["startSearch"][$this->name]["start"] = microtime(true) - $timings["starttime"];
+        }
+
+        if (!$this->cached) {
+            if (!empty($timings)) {
+                $timings["startSearch"][$this->name]["checked cache"] = microtime(true) - $timings["starttime"];
+            }
+
             // We need to submit a action that one of our workers can understand
             // The missions are submitted to a redis queue in the following string format
             // <ResultHash>;<URL to fetch>
@@ -144,10 +149,17 @@ abstract class Searchengine
             // Since each Searcher is dedicated to one specific search engine
             // each Searcher has it's own queue lying under the redis key <name>.queue
             Redis::rpush(\App\MetaGer::FETCHQUEUE_KEY, $mission);
+            if (!empty($timings)) {
+                $timings["startSearch"][$this->name]["pushed job"] = microtime(true) - $timings["starttime"];
+            }
+
             // The request is not cached and will be submitted to the searchengine
             // We need to check if the number of requests to this engine are limited
             if (!empty($this->engine->{"monthly-requests"})) {
                 Redis::incr("monthlyRequests:" . $this->name);
+                if (!empty($timings)) {
+                    $timings["startSearch"][$this->name]["increased monthly requests"] = microtime(true) - $timings["starttime"];
+                }
             }
         }
     }
@@ -171,15 +183,13 @@ abstract class Searchengine
     }
 
     # Fragt die Ergebnisse von Redis ab und lädt Sie
-    public function retrieveResults(MetaGer $metager)
+    public function retrieveResults(MetaGer $metager, $body = null)
     {
         if ($this->loaded) {
             return true;
         }
 
-        $body = null;
         if ($this->cached) {
-            $body = Cache::get($this->hash);
             if ($body === "no-result") {
                 $body = "";
             }
@@ -188,6 +198,7 @@ abstract class Searchengine
         }
 
         if ($body !== null) {
+            Cache::put($this->hash, $body, $this->cacheDuration * 60);
             $this->loadResults($body);
             $this->getNext($metager, $body);
             $this->markNew();
diff --git a/app/Models/XmlSearchengine.php b/app/Models/XmlSearchengine.php
index 00472b4a7bc64d1771243bc94ff6e017b0836e1a..9cf973399a92dd4a5fcde54e3a637f88d843862e 100644
--- a/app/Models/XmlSearchengine.php
+++ b/app/Models/XmlSearchengine.php
@@ -2,17 +2,19 @@
 
 namespace App\Models;
 
+use Log;
+
 abstract class XmlSearchengine extends Searchengine
 {
     public function loadresults($results)
     {
         try {
-            $resultsXml = simplexml_load_string($results);
+            $resultsXml = \simplexml_load_string($results);
             $this->loadXmlResults($resultsXml);
         } catch (\Exception $e) {
-            abort(500, "\n~~~~~~~~\n$results\n~~~~~~~~\nis not a valid xml string");
+            Log::error($e->getMessage());
         }
     }
 
-    protected abstract function loadXmlResults($resultsXml);
+    abstract protected function loadXmlResults($resultsXml);
 }
diff --git a/app/Models/parserSkripte/BASE.php b/app/Models/parserSkripte/BASE.php
index 64f7a0321a7f90b7b45b5fea9985fdb5f22fc4c1..c47dee3d8b3ce6bb5b744a6ad49e27b1f6373e26 100644
--- a/app/Models/parserSkripte/BASE.php
+++ b/app/Models/parserSkripte/BASE.php
@@ -18,7 +18,7 @@ class BASE extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
@@ -33,7 +33,7 @@ class BASE extends Searchengine
                             $title = $attribute;
                             break;
                         case 'dclink':
-                            $link        = $attribute;
+                            $link = $attribute;
                             $anzeigeLink = $link;
                             break;
                         case 'dcdescription':
@@ -49,7 +49,7 @@ class BASE extends Searchengine
                         $link,
                         $anzeigeLink,
                         $descr,
-                        $this->engine->{"display-name"},$this->engine->homepage,
+                        $this->engine->{"display-name"}, $this->engine->homepage,
                         $this->counter
                     );
                 }
diff --git a/app/Models/parserSkripte/Blogsearch.php b/app/Models/parserSkripte/Blogsearch.php
index a97f217c8960df4b790943626aec6e2465f2a301..83689ffcd439ffac4c9482b9b1c8ad4b48e7cedf 100644
--- a/app/Models/parserSkripte/Blogsearch.php
+++ b/app/Models/parserSkripte/Blogsearch.php
@@ -18,17 +18,17 @@ class Blogsearch extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
 
             $results = $content->xpath('//xml/docs/doc');
             foreach ($results as $result) {
-                $title       = $result->{"title"}->__toString();
-                $link        = $result->{"url"}->__toString();
+                $title = $result->{"title"}->__toString();
+                $link = $result->{"url"}->__toString();
                 $anzeigeLink = $link;
-                $descr       = $result->{"content"}->__toString();
+                $descr = $result->{"content"}->__toString();
                 $this->counter++;
                 $this->results[] = new \App\Models\Result(
                     $this->engine,
@@ -36,7 +36,7 @@ class Blogsearch extends Searchengine
                     $link,
                     $anzeigeLink,
                     $descr,
-                    $this->engine->{"display-name"},$this->engine->homepage,
+                    $this->engine->{"display-name"}, $this->engine->homepage,
                     $this->counter
                 );
             }
diff --git a/app/Models/parserSkripte/Ebay.php b/app/Models/parserSkripte/Ebay.php
index b9ea1351fab8e885f4a3268d86662a7ef6e37c6a..848e01a75d484cb5c102f836dcb630f4946a51f4 100644
--- a/app/Models/parserSkripte/Ebay.php
+++ b/app/Models/parserSkripte/Ebay.php
@@ -18,7 +18,7 @@ class Ebay extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
diff --git a/app/Models/parserSkripte/Ecoshopper.php b/app/Models/parserSkripte/Ecoshopper.php
index 6555361f3bda488933981c8c2bd2b754aff0b015..818d55cf7fa39a1f57411fdf65cf27fcafe4316d 100644
--- a/app/Models/parserSkripte/Ecoshopper.php
+++ b/app/Models/parserSkripte/Ecoshopper.php
@@ -18,16 +18,16 @@ class Ecoshopper extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
 
             $results = $content->xpath('//response/result[@name="response"]/doc');
             foreach ($results as $result) {
-                $result      = simplexml_load_string($result->saveXML());
-                $title       = $result->xpath('//doc/str[@name="artikelName"]')[0]->__toString();
-                $link        = $result->xpath('//doc/str[@name="artikelDeeplink"]')[0]->__toString();
+                $result = \simplexml_load_string($result->saveXML());
+                $title = $result->xpath('//doc/str[@name="artikelName"]')[0]->__toString();
+                $link = $result->xpath('//doc/str[@name="artikelDeeplink"]')[0]->__toString();
                 $anzeigeLink = parse_url($link);
                 if (isset($anzeigeLink['query'])) {
                     parse_str($anzeigeLink['query'], $query);
@@ -49,10 +49,10 @@ class Ecoshopper extends Searchengine
                     $link,
                     $anzeigeLink,
                     $descr,
-                    $this->engine->{"display-name"},$this->engine->homepage,
+                    $this->engine->{"display-name"}, $this->engine->homepage,
                     $this->counter,
                     ['partnershop' => false,
-                        'image'        => $image]
+                        'image' => $image]
                 );
             }
         } catch (\Exception $e) {
diff --git a/app/Models/parserSkripte/Exalead.php b/app/Models/parserSkripte/Exalead.php
index 399b888e5351fddd82d40a490bcbf387771a620a..a500dc750e7aecb7db0915d06d89a549a1018321 100644
--- a/app/Models/parserSkripte/Exalead.php
+++ b/app/Models/parserSkripte/Exalead.php
@@ -18,7 +18,7 @@ class Exalead extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
diff --git a/app/Models/parserSkripte/Flickr.php b/app/Models/parserSkripte/Flickr.php
index 1292867d01e57c993b6729e0b0151e2418bc5d9d..c04724e09dc50dcfdb9060673140b5e7ace7df02 100644
--- a/app/Models/parserSkripte/Flickr.php
+++ b/app/Models/parserSkripte/Flickr.php
@@ -18,7 +18,7 @@ class Flickr extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
@@ -53,7 +53,7 @@ class Flickr extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
diff --git a/app/Models/parserSkripte/Kelkoo.php b/app/Models/parserSkripte/Kelkoo.php
index 03796a476fe7d54b914863a7d5f0049c5c28f8a4..75380f558bf80dc0fe2214b57f5dd339ed437c8b 100644
--- a/app/Models/parserSkripte/Kelkoo.php
+++ b/app/Models/parserSkripte/Kelkoo.php
@@ -18,14 +18,13 @@ class Kelkoo extends Searchengine
         $this->hash = md5($this->engine->host . $this->getString . $this->engine->port . $this->name);
     }
 
-       
     public function loadResults($result)
     {
         $result = preg_replace("/\r\n/si", "", $result);
         # delete namespace, allowing easier xpath access
         $result = str_replace('xmlns="urn:yahoo:prods"', '', $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
@@ -40,23 +39,22 @@ class Kelkoo extends Searchengine
             $results = $content->xpath('/ProductSearch/Products/Product/Offer');
 
             foreach ($results as $result) {
-                $result      = simplexml_load_string($result->saveXML());
+                $result = \simplexml_load_string($result->saveXML());
+
+                $title = $result->Title[0]->__toString();
 
-                $title       = $result->Title[0]->__toString();
-                
                 $price = floatval($result->Price[0]->Price[0]);
                 $deliveryPrice = floatval($result->Price[0]->DeliveryCost[0]);
                 $totalPrice = $price + $deliveryPrice;
 
                 $descr = "";
-            
-                if(isset($result->Description[0]))
-                {
+
+                if (isset($result->Description[0])) {
                     $descr = $result->Description[0]->__toString();
                 }
-                $descr      .= "<p>Preis: " . $price . " €</p>";
-                $image       = $result->Images[0]->Image[0]->Url[0]->__toString();
-                $link        = $result->Url[0]->__toString();
+                $descr .= "<p>Preis: " . $price . " €</p>";
+                $image = $result->Images[0]->Image[0]->Url[0]->__toString();
+                $link = $result->Url[0]->__toString();
                 $anzeigeLink = $result->Merchant[0]->Name[0]->__toString();
                 $this->counter++;
                 $this->results[] = new \App\Models\Result(
@@ -65,10 +63,10 @@ class Kelkoo extends Searchengine
                     $link,
                     $anzeigeLink,
                     $descr,
-                    $this->engine->{"display-name"},$this->engine->homepage,
+                    $this->engine->{"display-name"}, $this->engine->homepage,
                     $this->counter,
                     ['image' => $image,
-                     'price' => $totalPrice * 100]
+                        'price' => $totalPrice * 100]
                 );
             }
         } catch (\Exception $e) {
@@ -84,7 +82,7 @@ class Kelkoo extends Searchengine
         # delete namespace, allowing easier xpath access
         $result = str_replace('xmlns="urn:yahoo:prods"', '', $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
@@ -120,22 +118,22 @@ class Kelkoo extends Searchengine
         $next = new Kelkoo($this->name, $this->engine, $metager);
         $next->unsignedGetString .= "&start=" . ($current + 20);
         $next->getString = $next->UrlSigner($next->unsignedGetString);
-        
+
         $next->hash = md5($next->engine->host . $next->getString . $next->engine->port . $next->name);
         $this->next = $next;
     }
 
-
     # kelkoogroup.com/kelkoo-customer-service/kelkoo-developer-network/shopping-services/samples/signing-url-php/
-    public function UrlSigner($path){
-        
+    public function UrlSigner($path)
+    {
+
         $urlPath = $path;
         $partner = $this->engine->{"http-auth-credentials"}->ID;
         $key = $this->engine->{"http-auth-credentials"}->Key;
 
         $URL_sig = "hash";
         $URL_ts = "timestamp";
-        $URL_partner = "aid"; 
+        $URL_partner = "aid";
         $URLreturn = "";
         $URLtmp = "";
         $s = "";
@@ -145,7 +143,7 @@ class Kelkoo extends Searchengine
         $urlPath = str_replace(" ", "+", $urlPath);
         // format URL
         $URLtmp = $urlPath . "&" . $URL_partner . "=" . $partner . "&" . $URL_ts . "=" . $time;
-       
+
         // URL needed to create the token
         $s = $urlPath . "&" . $URL_partner . "=" . $partner . "&" . $URL_ts . "=" . $time . $key;
         $token = "";
diff --git a/app/Models/parserSkripte/Mg_produkt2.php b/app/Models/parserSkripte/Mg_produkt2.php
index 8136279bc2d0376683315aa6a0a77d885beffeda..455965c9494b60e8b6221447ecdcd10f5e724ce1 100644
--- a/app/Models/parserSkripte/Mg_produkt2.php
+++ b/app/Models/parserSkripte/Mg_produkt2.php
@@ -18,7 +18,7 @@ class Mg_produkt2 extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
@@ -27,14 +27,14 @@ class Mg_produkt2 extends Searchengine
 
             foreach ($results as $result) {
 
-                $result      = simplexml_load_string($result->saveXML());
-                $title       = $result->xpath('/doc/arr[@name="artikelName"]')[0]->{"str"}->__toString();
-                $link        = $result->xpath('/doc/arr[@name="artikelDeeplink"]')[0]->{"str"}->__toString();
+                $result = \simplexml_load_string($result->saveXML());
+                $title = $result->xpath('/doc/arr[@name="artikelName"]')[0]->{"str"}->__toString();
+                $link = $result->xpath('/doc/arr[@name="artikelDeeplink"]')[0]->{"str"}->__toString();
                 $anzeigeLink = parse_url($link);
                 parse_str($anzeigeLink['query'], $query);
                 $anzeigeLink = $query['diurl'];
-                $descr       = $result->xpath('/doc/arr[@name="artikelBeschreibung"]')[0]->{"str"}->__toString();
-                $image       = $result->xpath('/doc/arr[@name="artikelImageurl"]')[0]->{"str"}->__toString();
+                $descr = $result->xpath('/doc/arr[@name="artikelBeschreibung"]')[0]->{"str"}->__toString();
+                $image = $result->xpath('/doc/arr[@name="artikelImageurl"]')[0]->{"str"}->__toString();
                 $this->counter++;
                 $this->results[] = new \App\Models\Result(
                     $this->engine,
@@ -42,7 +42,7 @@ class Mg_produkt2 extends Searchengine
                     $link,
                     $anzeigeLink,
                     $descr,
-                    $this->engine->{"display-name"},$this->engine->homepage,
+                    $this->engine->{"display-name"}, $this->engine->homepage,
                     $this->counter,
                     ['image' => $image]
                 );
diff --git a/app/Models/parserSkripte/Minisucher.php b/app/Models/parserSkripte/Minisucher.php
index f318b2442269759802c9ee29f494d7554bb08609..69a55f9dcd5e0bd5bdcc253d441c71e9a330988e 100644
--- a/app/Models/parserSkripte/Minisucher.php
+++ b/app/Models/parserSkripte/Minisucher.php
@@ -18,7 +18,7 @@ class Minisucher extends Searchengine
     public function loadResults($content)
     {
         try {
-            $content = simplexml_load_string($content);
+            $content = \simplexml_load_string($content);
         } catch (\Exception $e) {
             return;
         }
@@ -35,7 +35,7 @@ class Minisucher extends Searchengine
         foreach ($results as $result) {
             try {
                 $counter++;
-                $result = simplexml_load_string($result->saveXML());
+                $result = \simplexml_load_string($result->saveXML());
 
                 $title = $result->xpath('//doc/arr[@name="title"]/str')[0]->__toString();
                 $link = $result->xpath('//doc/str[@name="url"]')[0]->__toString();
diff --git a/app/Models/parserSkripte/Opencrawlastronomie.php b/app/Models/parserSkripte/Opencrawlastronomie.php
index c8909f941b6660ba811b583b4869e0cfd5adc971..beeaa07c7fe19c49aa3cc85efe10021fe27bf1bb 100644
--- a/app/Models/parserSkripte/Opencrawlastronomie.php
+++ b/app/Models/parserSkripte/Opencrawlastronomie.php
@@ -18,22 +18,22 @@ class Opencrawlastronomie extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
 
             $results = $content->xpath('//rss/channel/item');
-            $count   = 0;
+            $count = 0;
             foreach ($results as $result) {
                 if ($count > 10) {
                     break;
                 }
 
-                $title       = $result->{"title"}->__toString();
-                $link        = $result->{"link"}->__toString();
+                $title = $result->{"title"}->__toString();
+                $link = $result->{"link"}->__toString();
                 $anzeigeLink = $link;
-                $descr       = strip_tags($result->{"description"}->__toString());
+                $descr = strip_tags($result->{"description"}->__toString());
                 $this->counter++;
                 $this->results[] = new \App\Models\Result(
                     $this->engine,
@@ -41,7 +41,7 @@ class Opencrawlastronomie extends Searchengine
                     $link,
                     $anzeigeLink,
                     $descr,
-                    $this->engine->{"display-name"},$this->engine->homepage,
+                    $this->engine->{"display-name"}, $this->engine->homepage,
                     $this->counter
                 );
                 $count++;
diff --git a/app/Models/parserSkripte/Opencrawlpolitik.php b/app/Models/parserSkripte/Opencrawlpolitik.php
index 75c36f68fd720305d1a290b7ac390400b0ac5dc9..9f2490f00ddf80bad93c93d94362e2eb1e69d0a2 100644
--- a/app/Models/parserSkripte/Opencrawlpolitik.php
+++ b/app/Models/parserSkripte/Opencrawlpolitik.php
@@ -18,13 +18,13 @@ class Opencrawlpolitik extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
 
             $results = $content->xpath('//rss/channel/item');
-            $count   = 0;
+            $count = 0;
             foreach ($results as $result) {
                 if ($count > 10) {
                     break;
@@ -38,10 +38,10 @@ class Opencrawlpolitik extends Searchengine
 
                 $additionalInformation = ['date' => $dateVal];
 
-                $title       = $result->{"title"}->__toString();
-                $link        = $result->{"link"}->__toString();
+                $title = $result->{"title"}->__toString();
+                $link = $result->{"link"}->__toString();
                 $anzeigeLink = $link;
-                $descr       = strip_tags(htmlspecialchars_decode($result->{"description"}->__toString()));
+                $descr = strip_tags(htmlspecialchars_decode($result->{"description"}->__toString()));
                 $this->counter++;
                 $this->results[] = new \App\Models\Result(
                     $this->engine,
@@ -49,7 +49,7 @@ class Opencrawlpolitik extends Searchengine
                     $link,
                     $anzeigeLink,
                     $descr,
-                    $this->engine->{"display-name"},$this->engine->homepage,
+                    $this->engine->{"display-name"}, $this->engine->homepage,
                     $this->counter,
                     $additionalInformation
                 );
diff --git a/app/Models/parserSkripte/Opencrawlregengergie.php b/app/Models/parserSkripte/Opencrawlregengergie.php
index 1db47c49c934e7b3ef9638835c0f46e8cbda102f..53d232bf2bfed26b3a9b7331fa9ec2c59133397a 100644
--- a/app/Models/parserSkripte/Opencrawlregengergie.php
+++ b/app/Models/parserSkripte/Opencrawlregengergie.php
@@ -18,22 +18,22 @@ class Opencrawlregengergie extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
 
             $results = $content->xpath('//rss/channel/item');
-            $count   = 0;
+            $count = 0;
             foreach ($results as $result) {
                 if ($count > 10) {
                     break;
                 }
 
-                $title       = $result->{"title"}->__toString();
-                $link        = $result->{"link"}->__toString();
+                $title = $result->{"title"}->__toString();
+                $link = $result->{"link"}->__toString();
                 $anzeigeLink = $link;
-                $descr       = strip_tags($result->{"description"}->__toString());
+                $descr = strip_tags($result->{"description"}->__toString());
                 $this->counter++;
                 $this->results[] = new \App\Models\Result(
                     $this->engine,
@@ -41,7 +41,7 @@ class Opencrawlregengergie extends Searchengine
                     $link,
                     $anzeigeLink,
                     $descr,
-                    $this->engine->{"display-name"},$this->engine->homepage,
+                    $this->engine->{"display-name"}, $this->engine->homepage,
                     $this->counter
                 );
                 $count++;
diff --git a/app/Models/parserSkripte/Overture.php b/app/Models/parserSkripte/Overture.php
index 9a2825e8f95fd07828210e9889e20a41891dc8da..ece8bafa3e1781acd42179c243fa07007fb0b9cf 100644
--- a/app/Models/parserSkripte/Overture.php
+++ b/app/Models/parserSkripte/Overture.php
@@ -21,7 +21,7 @@ class Overture extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
@@ -84,7 +84,7 @@ class Overture extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
diff --git a/app/Models/parserSkripte/OvertureAds.php b/app/Models/parserSkripte/OvertureAds.php
index 36bff4285c591e6bfa14624ea5f05161f8f2fd67..7270c90d64c16e52eaab7bd7069a055c8f812f6b 100644
--- a/app/Models/parserSkripte/OvertureAds.php
+++ b/app/Models/parserSkripte/OvertureAds.php
@@ -20,7 +20,7 @@ class OvertureAds extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
@@ -55,7 +55,7 @@ class OvertureAds extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
diff --git a/app/Models/parserSkripte/Qip.php b/app/Models/parserSkripte/Qip.php
index 0a43dd0c3a27bb79598d45f4ffd68ee850fb5014..7c3b1f0238421076b4d1649124654f93f58758bd 100644
--- a/app/Models/parserSkripte/Qip.php
+++ b/app/Models/parserSkripte/Qip.php
@@ -18,17 +18,17 @@ class Qip extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
 
             $results = $content->xpath('//channel/item');
             foreach ($results as $result) {
-                $title       = $result->{"title"}->__toString();
-                $link        = $result->{"link"}->__toString();
+                $title = $result->{"title"}->__toString();
+                $link = $result->{"link"}->__toString();
                 $anzeigeLink = $link;
-                $descr       = $result->{"description"}->__toString();
+                $descr = $result->{"description"}->__toString();
                 $this->counter++;
                 $this->results[] = new \App\Models\Result(
                     $this->engine,
@@ -36,7 +36,7 @@ class Qip extends Searchengine
                     $link,
                     $anzeigeLink,
                     $descr,
-                    $this->engine->{"display-name"},$this->engine->homepage,
+                    $this->engine->{"display-name"}, $this->engine->homepage,
                     $this->counter
                 );
             }
diff --git a/app/Models/parserSkripte/Qualigo.php b/app/Models/parserSkripte/Qualigo.php
index f760139256b05ac8905fdc664f7da8e68525a90e..229ed9fb28ad3e7b4d935cfedeb3b5823d826220 100644
--- a/app/Models/parserSkripte/Qualigo.php
+++ b/app/Models/parserSkripte/Qualigo.php
@@ -3,6 +3,7 @@
 namespace App\Models\parserSkripte;
 
 use App\Models\XmlSearchengine;
+use Log;
 
 class Qualigo extends XmlSearchengine
 {
@@ -14,6 +15,10 @@ class Qualigo extends XmlSearchengine
 
     protected function loadXmlResults($resultsXml)
     {
+        if(empty($resultsXml) || !$resultsXml){
+            Log::error("A problem occurred parsing results from $this->name:");
+            return;
+        }
         try {
             $results = $resultsXml->xpath('//RL/RANK');
             foreach ($results as $result) {
diff --git a/app/Models/parserSkripte/Scopia.php b/app/Models/parserSkripte/Scopia.php
index 29a1b5b7cd56f7b9ebab66fec0e36fb30dffc006..8403d07a49efa45c0f8bdf173f03d744c64b731d 100644
--- a/app/Models/parserSkripte/Scopia.php
+++ b/app/Models/parserSkripte/Scopia.php
@@ -23,7 +23,7 @@ class Scopia extends Searchengine
 
         try {
 
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
@@ -59,7 +59,7 @@ class Scopia extends Searchengine
         $result = html_entity_decode($result);
         $result = str_replace("&", "&amp;", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
 
         } catch (\Exception $e) {
             Log::error("A problem occurred parsing results from $this->name:");
diff --git a/app/Models/parserSkripte/Shopzilla.php b/app/Models/parserSkripte/Shopzilla.php
index 40e187b0b0ba5f72178986264612761720d0e3a2..f0cf7cf82d423ac93603bb2d56183c838ec647a5 100644
--- a/app/Models/parserSkripte/Shopzilla.php
+++ b/app/Models/parserSkripte/Shopzilla.php
@@ -18,7 +18,7 @@ class Shopzilla extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
@@ -66,7 +66,7 @@ class Shopzilla extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
diff --git a/app/Models/parserSkripte/Tuhh.php b/app/Models/parserSkripte/Tuhh.php
index e6380ad2fd9c3bf8de88997eebca98780f7d63b1..7dfe58cc2608c72e48731da827e75b3563dc2e1e 100644
--- a/app/Models/parserSkripte/Tuhh.php
+++ b/app/Models/parserSkripte/Tuhh.php
@@ -18,7 +18,7 @@ class Tuhh extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
@@ -29,10 +29,10 @@ class Tuhh extends Searchengine
                     break;
                 }
 
-                $title       = $result->{"title"}->__toString();
-                $link        = $result->{"link"}["href"]->__toString();
+                $title = $result->{"title"}->__toString();
+                $link = $result->{"link"}["href"]->__toString();
                 $anzeigeLink = $link;
-                $descr       = strip_tags($result->{"summary"}->__toString());
+                $descr = strip_tags($result->{"summary"}->__toString());
                 $this->counter++;
                 $this->results[] = new \App\Models\Result(
                     $this->engine,
@@ -40,7 +40,7 @@ class Tuhh extends Searchengine
                     $link,
                     $anzeigeLink,
                     $descr,
-                    $this->engine->{"display-name"},$this->engine->homepage,
+                    $this->engine->{"display-name"}, $this->engine->homepage,
                     $this->counter
                 );
                 $count++;
diff --git a/app/Models/parserSkripte/Yacyunih.php b/app/Models/parserSkripte/Yacyunih.php
index 9a65805669448f39dada46f3cd6a7799d21a5580..8b357b024da23aa6f48ece5b2928f4d14a5a4342 100644
--- a/app/Models/parserSkripte/Yacyunih.php
+++ b/app/Models/parserSkripte/Yacyunih.php
@@ -18,7 +18,7 @@ class Yacyunih extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
@@ -32,10 +32,10 @@ class Yacyunih extends Searchengine
                 if ($count > 10) {
                     break;
                 }
-                $title       = $result->{"title"}->__toString();
-                $link        = $result->{"link"}->__toString();
+                $title = $result->{"title"}->__toString();
+                $link = $result->{"link"}->__toString();
                 $anzeigeLink = $link;
-                $descr       = strip_tags($result->{"description"}->__toString());
+                $descr = strip_tags($result->{"description"}->__toString());
                 $this->counter++;
                 $this->results[] = new \App\Models\Result(
                     $this->engine,
@@ -43,7 +43,7 @@ class Yacyunih extends Searchengine
                     $link,
                     $anzeigeLink,
                     $descr,
-                    $this->engine->{"display-name"},$this->engine->homepage,
+                    $this->engine->{"display-name"}, $this->engine->homepage,
                     $this->counter
                 );
                 $count++;
diff --git a/app/Models/parserSkripte/Yandex.php b/app/Models/parserSkripte/Yandex.php
index 242171244296159b49c2d79d2ba1b98535ac2b58..9f6e68d3b40cf1426ed69bffb4f81e33e4ccc869 100644
--- a/app/Models/parserSkripte/Yandex.php
+++ b/app/Models/parserSkripte/Yandex.php
@@ -18,7 +18,7 @@ class Yandex extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
@@ -61,7 +61,7 @@ class Yandex extends Searchengine
     {
         $result = preg_replace("/\r\n/si", "", $result);
         try {
-            $content = simplexml_load_string($result);
+            $content = \simplexml_load_string($result);
             if (!$content) {
                 return;
             }
diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml
index 0940498c1fbb03087901827449603c36c39b83fd..98090f8dd40a0a84716afea640d72b7cffca4718 100644
--- a/chart/templates/deployment.yaml
+++ b/chart/templates/deployment.yaml
@@ -38,11 +38,9 @@ spec:
       - name: mglogs-persistent-storage
         persistentVolumeClaim:
           claimName: mglogs
-      - name: mgcache-persistent-storage
-        persistentVolumeClaim:
-          claimName: mgcache
       containers:
-      - name: {{ .Chart.Name }}
+      # Main PHP-FPM Container
+      - name: {{ .Chart.Name }}-phpfpm
         image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
         imagePullPolicy: {{ .Values.image.pullPolicy }}
         {{- if .Values.application.secretName }}
@@ -51,23 +49,44 @@ spec:
             name: {{ .Values.application.secretName }}
         {{- end }}
         env:
-{{- if .Values.postgresql.managed }}
-        - name: POSTGRES_USER
-          valueFrom:
-            secretKeyRef:
-              name: app-postgres
-              key: username
-        - name: POSTGRES_PASSWORD
-          valueFrom:
-            secretKeyRef:
-              name: app-postgres
-              key: password
-        - name: POSTGRES_HOST
-          valueFrom:
-            secretKeyRef:
-              name: app-postgres
-              key: privateIP
-{{- end }}
+        - name: DATABASE_URL
+          value: {{ .Values.application.database_url | quote }}
+        - name: GITLAB_ENVIRONMENT_NAME
+          value: {{ .Values.gitlab.envName }}
+        - name: GITLAB_ENVIRONMENT_URL
+          value: {{ .Values.gitlab.envURL }}
+        ports:
+        - name: "{{ .Values.service.name }}-phpfpm"
+          containerPort: 9000
+        livenessProbe:
+          tcpSocket:
+            port: "{{ .Values.service.name }}-phpfpm"
+          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+        readinessProbe:
+          tcpSocket:
+            port: "{{ .Values.service.name }}-phpfpm"
+          initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
+        volumeMounts:
+        - name: mglogs-persistent-storage
+          mountPath: /html/storage/logs/metager
+          readOnly: false
+        resources:
+          requests:
+            cpu: 500m
+            memory: 500m
+      # Nginx Container
+      - name: {{ .Chart.Name }}-nginx
+        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+        command: ["nginx"]
+        imagePullPolicy: {{ .Values.image.pullPolicy }}
+        {{- if .Values.application.secretName }}
+        envFrom:
+        - secretRef:
+            name: {{ .Values.application.secretName }}
+        {{- end }}
+        env:
         - name: DATABASE_URL
           value: {{ .Values.application.database_url | quote }}
         - name: GITLAB_ENVIRONMENT_NAME
@@ -101,13 +120,53 @@ spec:
 {{- end }}
           initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
           timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
-        volumeMounts:
-        - name: mglogs-persistent-storage
-          mountPath: /html/storage/logs/metager
-          readOnly: false
-        - name: mgcache-persistent-storage
-          mountPath: /html/storage/framework/cache
-          readOnly: false
         resources:
-{{ toYaml .Values.resources | indent 12 }}
+          requests:
+            cpu: 100m
+            memory: 100m
+      # Redis Container
+      - name: {{ .Chart.Name }}-redis
+        image: "redis:5.0.3-alpine"
+        imagePullPolicy: {{ .Values.image.pullPolicy }}
+        ports:
+        - name: "{{ .Values.service.name }}-redis"
+          containerPort: 6379
+        livenessProbe:
+          tcpSocket:
+            port: "{{ .Values.service.name }}-redis"
+          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+        readinessProbe:
+          tcpSocket:
+            port: "{{ .Values.service.name }}-redis"
+          initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
+        resources:
+          requests:
+            cpu: 100m
+            memory: 1Gi
+      # Fetcher Container
+      - name: {{ .Chart.Name }}-fetcher
+        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+        command: ["su"]
+        args: ["-s", "/bin/sh", "-c", "php artisan requests:fetcher", "nginx"]
+        imagePullPolicy: {{ .Values.image.pullPolicy }}
+        livenessProbe:
+          exec:
+            command:
+            - cat
+            - /tmp/fetcher
+          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+        readinessProbe:
+          exec:
+            command:
+            - cat
+            - /tmp/fetcher
+          initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
+        resources:
+          requests:
+            cpu: 500m
+            memory: 100m
 {{- end -}}
diff --git a/chart/templates/ingress.yaml b/chart/templates/ingress.yaml
index 7d053d159d866e519762de6f7bc294af0064d53c..ec7cba476deee3d8e013c663c8da077cffda1d9e 100644
--- a/chart/templates/ingress.yaml
+++ b/chart/templates/ingress.yaml
@@ -48,6 +48,10 @@ spec:
         backend:
           serviceName: {{ template "fullname" . }}
           servicePort: {{ .Values.service.externalPort }}
+      - path: /wsb
+        backend:
+          serviceName: wsb
+          servicePort: 80
 {{- if .Values.service.commonName }}
   - host: {{ template "hostname" .Values.service.commonName }}
     http:
diff --git a/composer.json b/composer.json
index 16e10a04a2fa8053e329560b08ff11bf0f631843..2f226d4725f83c9a6b08fd8488c71ef51ece476e 100644
--- a/composer.json
+++ b/composer.json
@@ -17,6 +17,7 @@
         "laravel/tinker": "^1.0",
         "mcamara/laravel-localization": "^1.3",
         "mews/captcha": "^2.2",
+        "monospice/laravel-redis-sentinel-drivers": "^2.6",
         "predis/predis": "^1.1",
         "symfony/dom-crawler": "^4.1"
     },
diff --git a/config/cache.php b/config/cache.php
index 009ab29bae5e21ea3b2e7c17daa4e772fc8abc96..6138e970a063774c061b339b99c7dd925f098ada 100644
--- a/config/cache.php
+++ b/config/cache.php
@@ -69,8 +69,8 @@ return [
         ],
 
         'redis' => [
-            'driver' => 'redis',
-            'connection' => 'default',
+            'driver' => env('REDIS_CACHE_DRIVER', 'redis'),
+            'connection' => 'cache',
         ],
 
     ],
diff --git a/config/database.php b/config/database.php
index e5cd2aee9d14596cb17db04ab31894cccda43965..d01f9ab8ecf0e2cd33c1b12e4202e0837c1d32d6 100644
--- a/config/database.php
+++ b/config/database.php
@@ -113,11 +113,20 @@ return [
         'cluster' => false,
 
         'default' => [
+            'read_write_timeout' => -1,
             'host' => env('REDIS_HOST', 'localhost'),
             'password' => env('REDIS_PASSWORD', null),
             'port' => env('REDIS_PORT', 6379),
             'database' => 0,
         ],
+
+        'cache' => [
+            'driver' => env('REDIS_CACHE_DRIVER', 'redis'),
+            'host' => env('REDIS_CACHE_HOST', 'localhost'),
+            'password' => env('REDIS_CACHE_PASSWORD', null),
+            'port' => env('REDIS_CACHE_PORT', 6379),
+            'database' => 0,
+        ],
     ],
 
 ];
diff --git a/config/nginx-default.conf b/config/nginx-default.conf
index 946abda6eab5ca7a8e36793d2a3b54e6ce8400d6..e418b8d6d53316d2b680e762ed1024f03b58ff14 100644
--- a/config/nginx-default.conf
+++ b/config/nginx-default.conf
@@ -14,7 +14,7 @@ server {
     location ~ \.php$ {
         try_files $uri /index.php =404;
         fastcgi_split_path_info ^(.+\.php)(/.+)$;
-        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
+        fastcgi_pass phpfpm:9000;
         fastcgi_index index.php;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         include fastcgi_params;
diff --git a/config/nginx.conf b/config/nginx.conf
index 37937533858b6ce991610d9ce3c0a1bfe6b24e15..96b512b5d167229b8eeb3fd3fc35865e455ef503 100644
--- a/config/nginx.conf
+++ b/config/nginx.conf
@@ -5,6 +5,7 @@ worker_processes  100;
 error_log  /var/log/nginx/error.log warn;
 pid        /var/run/nginx.pid;
 
+daemon off;
 
 events {
     worker_connections  1024;
diff --git a/config/session.php b/config/session.php
index e2779ad8d00db247c45aa773888494bad79c46bc..e769fac0e564350ada90982fc87dff1e1470869f 100644
--- a/config/session.php
+++ b/config/session.php
@@ -14,7 +14,7 @@ return [
     | Supported: "file", "cookie", "database", "apc",
     |            "memcached", "redis", "array"
     |
-    */
+     */
 
     'driver' => env('SESSION_DRIVER', 'file'),
 
@@ -27,7 +27,7 @@ return [
     | to be allowed to remain idle before it expires. If you want them
     | to immediately expire on the browser closing, set that option.
     |
-    */
+     */
 
     'lifetime' => 120,
 
@@ -42,9 +42,9 @@ return [
     | should be encrypted before it is stored. All encryption will be run
     | automatically by Laravel and you can use the Session like normal.
     |
-    */
+     */
 
-    'encrypt' => false,
+    'encrypt' => true,
 
     /*
     |--------------------------------------------------------------------------
@@ -55,7 +55,7 @@ return [
     | files may be stored. A default has been set for you but a different
     | location may be specified. This is only needed for file sessions.
     |
-    */
+     */
 
     'files' => storage_path('framework/sessions'),
 
@@ -68,7 +68,7 @@ return [
     | connection that should be used to manage these sessions. This should
     | correspond to a connection in your database configuration options.
     |
-    */
+     */
 
     'connection' => null,
 
@@ -81,7 +81,7 @@ return [
     | should use to manage the sessions. Of course, a sensible default is
     | provided for you; however, you are free to change this as needed.
     |
-    */
+     */
 
     'table' => 'sessions',
 
@@ -94,7 +94,7 @@ return [
     | cache store that should be used for these sessions. This value must
     | correspond with one of the application's configured cache stores.
     |
-    */
+     */
 
     'store' => null,
 
@@ -107,7 +107,7 @@ return [
     | rid of old sessions from storage. Here are the chances that it will
     | happen on a given request. By default, the odds are 2 out of 100.
     |
-    */
+     */
 
     'lottery' => [2, 100],
 
@@ -120,9 +120,9 @@ return [
     | instance by ID. The name specified here will get used every time a
     | new session cookie is created by the framework for every driver.
     |
-    */
+     */
 
-    'cookie' => 'laravel_session',
+    'cookie' => 'mg_session',
 
     /*
     |--------------------------------------------------------------------------
@@ -133,7 +133,7 @@ return [
     | be regarded as available. Typically, this will be the root path of
     | your application but you are free to change this when necessary.
     |
-    */
+     */
 
     'path' => '/',
 
@@ -146,7 +146,7 @@ return [
     | in your application. This will determine which domains the cookie is
     | available to in your application. A sensible default has been set.
     |
-    */
+     */
 
     'domain' => env('SESSION_DOMAIN', null),
 
@@ -159,7 +159,7 @@ return [
     | to the server if the browser has a HTTPS connection. This will keep
     | the cookie from being sent to you if it can not be done securely.
     |
-    */
+     */
 
     'secure' => env('SESSION_SECURE_COOKIE', false),
 
@@ -172,7 +172,7 @@ return [
     | value of the cookie and the cookie will only be accessible through
     | the HTTP protocol. You are free to modify this option if needed.
     |
-    */
+     */
 
     'http_only' => true,
 
diff --git a/config/trustedproxy.php b/config/trustedproxy.php
index b2359b8ad135359dca94eaf318d8373c5dd9ff5b..cd3476603a6ca10bf85eb5e2550ed9e8874cbfe2 100644
--- a/config/trustedproxy.php
+++ b/config/trustedproxy.php
@@ -15,6 +15,8 @@ return [
      */
     'proxies' => [
         '10.244.0.0/16',
+        '144.76.113.134',
+        '144.76.88.77',
     ],
 
     /*
diff --git a/docker-compose.yml b/docker-compose.yml
index 12a424fca3b5ece1a22765225c94f933e73fd5b9..7b15a2087bf2a5a609deeb97fbfa4c75f10cded3 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -20,7 +20,7 @@ services:
     working_dir: /data
     command: /data/init.sh
   mgdb:
-    restart: unless-stopped
+    restart: on-failure
     image: mariadb:latest
     command: --default-authentication-plugin=mysql_native_password
     environment:
@@ -28,16 +28,43 @@ services:
       - MYSQL_USER=metager
       - MYSQL_PASSWORD=metager
       - MYSQL_DATABASE=metager
-  web:
+  redis:
+    restart: on-failure
+    image: redis:6.0-rc1-alpine
+  phpfpm:
     depends_on:
       - "mgdb"
       - "dependencies"
       - "phpdeps"
       - "assets"
-    restart: unless-stopped
-    build: .
+      - "redis"
+    restart: on-failure
+    build:
+      context: .
+      dockerfile: DockerfileDev
+    image: metager:latest
     working_dir: /html
     volumes:
       - .:/html
+  nginx:
+    depends_on:
+      - "phpfpm"
+    restart: on-failure
+    image: metager:latest
+    working_dir: /html
+    command: nginx
+    volumes:
+      - .:/html
+      - ./config/nginx.conf:/etc/nginx/nginx.conf
+      - ./config/nginx-default.conf:/etc/nginx/conf.d/default.conf
     ports: 
     - "8080:80"
+  worker:
+    depends_on:
+      - "phpfpm"
+    restart: on-failure
+    image: metager:latest
+    working_dir: /html
+    volumes:
+      - .:/html
+    command: "su -s /bin/sh -c 'php artisan requests:fetcher' nginx"
diff --git a/index.html b/index.html
index 1e6f8ab225a0d59f3119bbf885582148729b710a..160d090d2b9b14922366afeb1b69609d83ac1e2a 100644
--- a/index.html
+++ b/index.html
@@ -209,7 +209,7 @@
             <a href="https://metager.de/tips">Tips</a>
           </li>
           <li>
-            <a class="outlink" href="https://gitlab.metager3.de/open-source/MetaGer">MetaGer Quellcode</a>
+            <a class="outlink" href="https://gitlab.metager.de/open-source/MetaGer">MetaGer Quellcode</a>
           </li>
           <li>
             <a class="outlink" href="https://metager.de/tor">TOR-Hidden-Service</a>
diff --git a/public/index.php b/public/index.php
index 0db12691b303ca33de4a3ebaed50f05390282d4f..872ae19f6058aab6d046162d0c37f2328a6b2c96 100644
--- a/public/index.php
+++ b/public/index.php
@@ -13,7 +13,10 @@ if (isset($_SERVER["HTTP_FORWARDED"]) && isset($_SERVER["HTTP_X_FORWARDED_FOR"])
     unset($_SERVER["HTTP_FORWARDED"]);
 }
 
-$_SERVER["AGENT"] = $_SERVER["HTTP_USER_AGENT"];
+$_SERVER["AGENT"] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1";
+if (!empty($_SERVER["HTTP_USER_AGENT"])) {
+    $_SERVER["AGENT"] = $_SERVER["HTTP_USER_AGENT"];
+}
 
 /*
 |--------------------------------------------------------------------------
diff --git a/readme.md b/readme.md
index 26920c06bbc130723e345b62d23b8f86db019eda..af089fe896b736f635ce71a7a2f2123bef439f02 100644
--- a/readme.md
+++ b/readme.md
@@ -25,7 +25,7 @@ We use the awesome project [Browserstack](https://www.browserstack.com) for cros
 
 ## Offizielle Dokumentation
 
-Die Dokumentation ist im [Wiki des Gitlab-Projektes](https://gitlab.metager3.de/open-source/MetaGer/wikis/home) zu finden.
+Die Dokumentation ist im [Wiki des Gitlab-Projektes](https://gitlab.metager.de/open-source/MetaGer/wikis/home) zu finden.
 
 ## Beiträge
 
@@ -36,12 +36,12 @@ Es steht dir jedoch frei, ein Ticket zu eröffnen.
 ## Sicherheitslücken
 
 Falls du eine Sicherheitslücke findest oder dir etwas unsicher vorkommt,
-zögere bitte nicht ein [Ticket zu schreiben](https://gitlab.metager3.de/open-source/MetaGer/issues) oder eine Mail an [office@suma-ev.de](mailto:office@suma-ev.de) zu senden.
+zögere bitte nicht ein [Ticket zu schreiben](https://gitlab.metager.de/open-source/MetaGer/issues) oder eine Mail an [office@suma-ev.de](mailto:office@suma-ev.de) zu senden.
 
 ## Lizenzen
 
 Der MetaGer-eigene Code, sofern nicht anders anders angegeben, steht unter der [AGPL-Lizenz Version 3](https://www.gnu.org/licenses/agpl-3.0).
 
-Eine Liste der Projekte, auf denen MetaGer basiert, und deren Lizenzen sind in der Datei [LICENSE](https://gitlab.metager3.de/open-source/MetaGer/blob/development/LICENSE) zu finden.   
+Eine Liste der Projekte, auf denen MetaGer basiert, und deren Lizenzen sind in der Datei [LICENSE](https://gitlab.metager.de/open-source/MetaGer/blob/development/LICENSE) zu finden.   
 
 
diff --git a/resources/js/result-saver.js b/resources/js/result-saver.js
index 50706213d8f0945ac32dbf99b7721163360a4cdc..c4c6e113ecfe36e63953f26b1774aeedff24d47e 100644
--- a/resources/js/result-saver.js
+++ b/resources/js/result-saver.js
@@ -16,7 +16,7 @@ $(document).ready(function () {
  * Load all saved results and sort them
  * @param {String} sort The type of sorting function to call for these results
  */
-function Results () {
+function Results() {
   if (!localStorage) return;
   this.prefix = 'result_';
   this.sort = 'chronological';
@@ -29,8 +29,8 @@ function Results () {
  */
 Results.prototype.addResult = function (result) {
   if (this.results.every(function (val) {
-      return val.hash !== result.hash;
-    })) {
+    return val.hash !== result.hash;
+  })) {
     this.results.push(result);
   }
 };
@@ -120,7 +120,7 @@ Results.prototype.updateResultPageInterface = function () {
           <h1>' + t('result-saver.title') + '</h1>\
         </div>\
         ');
-    $('#additions-container').append(tabPanel);
+    $('#additions-container').prepend(tabPanel);
   } else {
     // If there already is a savedFoki element, get it
     $('#savedFoki').html('');
@@ -178,7 +178,7 @@ Results.prototype.addToContainer = function (container) {
       if (html.toLowerCase().indexOf(search.toLowerCase()) === -1) {
         // hide entire result block
         $(value).parent().addClass('hidden');
-      }else {
+      } else {
         // show entire result block
         $(value).parent().removeClass('hidden');
       }
@@ -218,7 +218,7 @@ Results.prototype.addToContainer = function (container) {
  * @param {int} rank The rank of this result
  * @param {int} hash The hash value for this result
  */
-function Result (title, link, hosterName, hosterLink, anzeigeLink, description, anonym, index, hash) {
+function Result(title, link, hosterName, hosterLink, anzeigeLink, description, anonym, index, hash) {
   // Set prefix for localstorage
   this.prefix = 'result_';
 
@@ -313,7 +313,7 @@ Result.prototype.save = function () {
  * Convert a string into base64 format
  * @param {String} str The string to convert
  */
-function b64EncodeUnicode (str) {
+function b64EncodeUnicode(str) {
   return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
     return String.fromCharCode('0x' + p1);
   }));
@@ -323,7 +323,7 @@ function b64EncodeUnicode (str) {
  * Convert a base64 string into normal format
  * @param {String} str The string to convert
  */
-function b64DecodeUnicode (str) {
+function b64DecodeUnicode(str) {
   return decodeURIComponent(Array.prototype.map.call(atob(str), function (c) {
     return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
   }).join(''));
@@ -389,7 +389,7 @@ Result.prototype.toHtml = function () {
     </div>');
 
   // Add a click listener to the remover, that removes the result on click
-  $(result).find('.remover').click({caller: this}, function (event) {
+  $(result).find('.remover').click({ caller: this }, function (event) {
     event.data.caller.remove();
   });
 
@@ -400,7 +400,7 @@ Result.prototype.toHtml = function () {
  * Saves the result at the given index
  * @param {int} index The index of the result to save
  */
-function resultSaver (index) {
+function resultSaver(index) {
   // Remember the original result element
   var original = $('.result[data-count=' + index + ']');
 
@@ -428,6 +428,6 @@ function resultSaver (index) {
   // Animate the result transfer to the saved results
   var transferTarget = $('.saved-result[data-count=' + index + ']');
   if (original.length > 0 && transferTarget.length > 0) {
-    $(original).transfer({to: transferTarget, duration: 1000});
+    $(original).transfer({ to: transferTarget, duration: 1000 });
   }
 }
diff --git a/resources/lang/de/datenschutz.php b/resources/lang/de/datenschutz.php
index 85248bfc15d0df27708b72cdf8fdce23e1ee006f..466bf48a4a93d65d155d52b62eb0cb89184b1e93 100644
--- a/resources/lang/de/datenschutz.php
+++ b/resources/lang/de/datenschutz.php
@@ -5,7 +5,7 @@ return [
 
     'general.1' => 'Datenschutz und Privatsphäre gehören für uns zu den wichtigsten Gütern im Internet. Sie sind absolut schützenswert und dürfen keinesfalls kommerziell genutzt werden. Im Folgenden eine kurze Auflistung unserer Vorgehensweise. Eine ausführliche Darstellung mit Hintergrund-Informationen, warum wir die einzige wirklich sichere Suchmaschine betreiben, finden Sie <a href="https://suma-ev.de/presse/Sicher-suchen-UND-finden-mit-MetaGer.html">in unserem Blog</a>.',
 
-    'general.3' => 'Nur Software, dessen Quellcode öffentlich zugänglich ist, kann von jedem überprüft werden.  In allen anderen Fällen müssen User <em>glauben</em>, was Betreiber oder "Gütesiegel"-Verkäufer behaupten.  MetaGer ist Freie Software unter der GNU-AGPLv3-Lizenz (siehe dazu die <a href="http://heise.de/-3295586" target="_blank" rel="noopener"> Nachricht im Heise-Ticker</a>). Der MetaGer-Quellcode steht Ihnen unter folgendem Link zur Verfügung: <a href="https://gitlab.metager3.de/open-source/MetaGer" target="_blank" rel="noopener">https://gitlab.metager3.de/open-source/MetaGer</a><br />Sie müssen uns nichts glauben: Sie können es selber kontrollieren!',
+    'general.3' => 'Nur Software, dessen Quellcode öffentlich zugänglich ist, kann von jedem überprüft werden.  In allen anderen Fällen müssen User <em>glauben</em>, was Betreiber oder "Gütesiegel"-Verkäufer behaupten.  MetaGer ist Freie Software unter der GNU-AGPLv3-Lizenz (siehe dazu die <a href="http://heise.de/-3295586" target="_blank" rel="noopener"> Nachricht im Heise-Ticker</a>). Der MetaGer-Quellcode steht Ihnen unter folgendem Link zur Verfügung: <a href="https://gitlab.metager.de/open-source/MetaGer" target="_blank" rel="noopener">https://gitlab.metager.de/open-source/MetaGer</a><br />Sie müssen uns nichts glauben: Sie können es selber kontrollieren!',
 
     'policy.1' => 'Unsere Vorgehensweise/Policy:',
     'policy.2' => 'Wir speichern weder Ihre IP-Adresse, noch den
diff --git a/resources/lang/de/hilfe.php b/resources/lang/de/hilfe.php
index ae99a3b509c60d9257793be52fa486044f65d0de..387158d7562747791be1f472764645820e97b4fd 100644
--- a/resources/lang/de/hilfe.php
+++ b/resources/lang/de/hilfe.php
@@ -104,7 +104,7 @@ return [
     'metager.explanation.2' => 'Dazu kommt der höhere Abdeckungsgrad, denn nicht jede Suchmaschine kennt das ganze Internet. Näheres zu Metasuchmaschinen finden Sie bei <a href="https://de.wikipedia.org/wiki/Metasuchmaschine" target="_blank" rel="noopener">Wikipedia</a>. Vielleicht genügen Ihnen die Ergebnisse, die Ihnen MetaGer präsentiert, vielleicht möchten Sie mit einer einzelnen Suchmaschine nochmals suchen. In der Ergebnisliste sehen Sie an jedem Ergebnis, woher es kam und können auch direkt klicken. Wir haben die uns zur Verfügung stehenden Suchdienste sinnvoll gruppiert und daraus die verschiedenen Suchfoki erstellt.',
 
     'searchengine.title' => 'Warum können wir Suchmaschinen abfragen und trotzdem die Anonymität der Nutzer wahren?',
-    'searchengine.explanation' => 'Wir als Meta-Suchmaschine stehen zwischen Ihnen und der Abfrage, die bspw. an Yahoo weiter geleitet wird. Das bedeutet, wenn Sie eine Suchabfrage abschicken, schicken sie diese Abfrage an uns. Wir entziehen dieser dann alle Informationen, welche sie identifizieren könnten und leiten eine anonyme Abfrage an Yahoo weiter. Yahoo schickt die Antwort dann wiederum an uns und wir leiten diese an Sie weiter. So handhaben wir dies mit allen Suchmaschinen, die wir abfragen. So können wir garantieren, dass Ihre Privatsphäre gegenüber allen bei uns abgefragten Suchmaschinen gewahrt bleibt. Darüber hinaus können wir auch garantieren, dass Ihre Daten auch bei uns nicht abgespeichert werden (Ausnahme: Kurzfristige Speicherung gegen Hacking- und Bot-Attacken) Genauer ersichtlich wird das in unserer <a href="/datenschutz/" target="_blank" rel="noopener">Datenschutzerklärung</a>. Dies ist sogar für die Öffentlichkeit nachvollziehbar, da der gesamte Quelltext von MetaGer unter einer freien Lizenz veröffentlicht wurde <a href="https://gitlab.metager3.de/open-source/MetaGer">(https://gitlab.metager3.de/open-source/MetaGer)</a>. Wenn Sie eine eigene Website haben, dann können Sie auf ihr auch einmal auf einfache Weise mit dem  <a href=":widget-link" target="_blank">MetaGer-Widget</a> experimentieren. Sie dürfen das Widget mit Logo frei auf Ihren Webseiten verwenden und auch Links auf MetaGer.de setzen, wenn Sie wollen.',
+    'searchengine.explanation' => 'Wir als Meta-Suchmaschine stehen zwischen Ihnen und der Abfrage, die bspw. an Yahoo weiter geleitet wird. Das bedeutet, wenn Sie eine Suchabfrage abschicken, schicken sie diese Abfrage an uns. Wir entziehen dieser dann alle Informationen, welche sie identifizieren könnten und leiten eine anonyme Abfrage an Yahoo weiter. Yahoo schickt die Antwort dann wiederum an uns und wir leiten diese an Sie weiter. So handhaben wir dies mit allen Suchmaschinen, die wir abfragen. So können wir garantieren, dass Ihre Privatsphäre gegenüber allen bei uns abgefragten Suchmaschinen gewahrt bleibt. Darüber hinaus können wir auch garantieren, dass Ihre Daten auch bei uns nicht abgespeichert werden (Ausnahme: Kurzfristige Speicherung gegen Hacking- und Bot-Attacken) Genauer ersichtlich wird das in unserer <a href="/datenschutz/" target="_blank" rel="noopener">Datenschutzerklärung</a>. Dies ist sogar für die Öffentlichkeit nachvollziehbar, da der gesamte Quelltext von MetaGer unter einer freien Lizenz veröffentlicht wurde <a href="https://gitlab.metager.de/open-source/MetaGer">(https://gitlab.metager.de/open-source/MetaGer)</a>. Wenn Sie eine eigene Website haben, dann können Sie auf ihr auch einmal auf einfache Weise mit dem  <a href=":widget-link" target="_blank">MetaGer-Widget</a> experimentieren. Sie dürfen das Widget mit Logo frei auf Ihren Webseiten verwenden und auch Links auf MetaGer.de setzen, wenn Sie wollen.',
 
     'content.title' => 'Fragwürdige Inhalte / Jugendschutz',
     'content.explanation.1' => 'Ich habe "Treffer" erhalten, die finde ich nicht nur ärgerlich, sondern die enthalten meiner Meinung nach illegale Inhalte!',
diff --git a/resources/lang/de/impressum.php b/resources/lang/de/impressum.php
index c6646208c88900c4b7974de1f1e73f4fb1355fb4..c5a9b7ae1857b1070a10aa5d2bf5fe2d47743c63 100644
--- a/resources/lang/de/impressum.php
+++ b/resources/lang/de/impressum.php
@@ -16,8 +16,7 @@ Tel.: ++49-(0)511-34000070
 EMail: <a href="mailto:office@suma-ev.de">office@suma-ev.de</a><a href="/kontakt/"> - Public-PGP-Key</a>
 <a href="/kontakt/">Verschlüsselndes Kontaktformular</a>',
     'info.4' => 'Vorstand: Dominik Hebeler, Carsten Riel, <a href="https://www.ostfalia.de/cms/de/pws/jensen/index.html">Prof.Dr. Nils Jensen</a>',
-    'info.6' => 'Jugendschutzbeauftragter: Georg Becker
-<a href="mailto:jugendschutz@metager.de">jugendschutz@metager.de</a>',
+    'info.6' => 'Jugendschutzbeauftragte: Manuela Branz <a href="mailto:jugendschutz@metager.de">jugendschutz@metager.de</a>',
     'info.8' => '"SUMA-EV - Verein für freien Wissenszugang" ist ein gemeinnütziger
 Verein, eingetragen in das Vereinsregister beim Amtsgericht Hannover
 unter VR200033.
diff --git a/resources/lang/de/languages.php b/resources/lang/de/languages.php
index 05325d1588cf1c5cd4c60396675bc06a8af6d1e8..49878ec997b8a19a5c973fc8716cc4194d68cbe1 100644
--- a/resources/lang/de/languages.php
+++ b/resources/lang/de/languages.php
@@ -1,13 +1,13 @@
 <?php
 
 return [
-    'header'         => 'MetaGer - Ãœbersetzungen',
+    'header' => 'MetaGer - Ãœbersetzungen',
     'beschreibung.1' => 'Vielen Dank, dass du erwägst MetaGer bei der Übersetzung seiner Texte zu unterstützen. Dir wird im unteren Bereich eine Datei und tabellarisch die dazugehörigen Texte angezeigt. Das Feld "#ID" dient dabei nur der Orientierung und ist für die Übersetzung unwichtig. In der nächsten Spalte findest du entweder Texte der Sprache für die uns einige Übersetzungen fehlen, oder aber ein Textfeld. Wird hier für eine Reihe ein Textfeld angezeigt, so fehlen uns die Texte in der angegebenen Sprache.',
     'beschreibung.2' => 'Du kannst uns unterstützen, indem du dir die Referenztexte in den folgenden Spalten (rechts daneben) ansiehst und nach Möglichkeit eine Übersetzung in der gesuchten Sprache in das Textfeld einträgst.',
-    'progress'       => ':uebersetzteTexte/:textCount Texten übersetzt (:percentage%)',
-    'hinweis.1'      => 'Sobald du mit deinen Texten zufrieden bist, kannst du uns diese mit einem Klick auf folgenden Knopf automatisch zusenden. Wenn es mehr fehlende Texte in der angegebenen Sprache gibt, wird dein Browser dich danach direkt zu diesen leiten.',
-    'hinweis.2'      => '<b>Hinweis</b>: Die übermittelten Texte werden von diesem Tool erst erkannt, sobald diese von uns gesichtet und eingefügt wurden. Wenn du deine Arbeit sichern möchtest um diese zu einem späteren Zeitpunkt fortzusetzen (auch wenn wir deine bisherige Arbeit noch nicht übernehmen konnten), so reicht es vollkommen, den aktuellen Link aus deiner Browserleiste zu kopieren und zu einem späteren Zeitpunkt wieder aufzurufen.',
-    'hinweis.3'      => '<b>Achtung</b>: Mit der Einsendung stimmst du einer <a href="https://gitlab.metager3.de/open-source/MetaGer" target="_blank" rel="noopener">Veröffentlichung</a> deiner Texte unter AGPL-v3-Lizenz durch uns zu. Falls du namentlich genannt werden möchtest, teile uns dies bitte in einer email an <a href="mailto:office@suma-ev.de">office@suma-ev.de</a> mit.',
-    'email'			 => '<b>E-Mail-Adresse für Rückfragen</b> (optional):',
-    'synoptic'		 => ['hinweis' => 'Datei wurde zuletzt bearbeitet.'], 
+    'progress' => ':uebersetzteTexte/:textCount Texten übersetzt (:percentage%)',
+    'hinweis.1' => 'Sobald du mit deinen Texten zufrieden bist, kannst du uns diese mit einem Klick auf folgenden Knopf automatisch zusenden. Wenn es mehr fehlende Texte in der angegebenen Sprache gibt, wird dein Browser dich danach direkt zu diesen leiten.',
+    'hinweis.2' => '<b>Hinweis</b>: Die übermittelten Texte werden von diesem Tool erst erkannt, sobald diese von uns gesichtet und eingefügt wurden. Wenn du deine Arbeit sichern möchtest um diese zu einem späteren Zeitpunkt fortzusetzen (auch wenn wir deine bisherige Arbeit noch nicht übernehmen konnten), so reicht es vollkommen, den aktuellen Link aus deiner Browserleiste zu kopieren und zu einem späteren Zeitpunkt wieder aufzurufen.',
+    'hinweis.3' => '<b>Achtung</b>: Mit der Einsendung stimmst du einer <a href="https://gitlab.metager.de/open-source/MetaGer" target="_blank" rel="noopener">Veröffentlichung</a> deiner Texte unter AGPL-v3-Lizenz durch uns zu. Falls du namentlich genannt werden möchtest, teile uns dies bitte in einer email an <a href="mailto:office@suma-ev.de">office@suma-ev.de</a> mit.',
+    'email' => '<b>E-Mail-Adresse für Rückfragen</b> (optional):',
+    'synoptic' => ['hinweis' => 'Datei wurde zuletzt bearbeitet.'],
 ];
diff --git a/resources/lang/de/team.php b/resources/lang/de/team.php
index 85a50b815e60c221e7863e6be87d478acea6a117..c12fa9a2198f44b930752668d84b099b80dd8bb7 100644
--- a/resources/lang/de/team.php
+++ b/resources/lang/de/team.php
@@ -3,13 +3,13 @@
 return [
     'role.0' => 'geschäftsführender Vorstand',
     'role.1' => 'Vorstand',
-    'role.2' => 'Büroleiter und Jugendschutzbeauftragter',
+    'role.2' => 'Jugendschutzbeauftragte',
     'role.3' => 'Pressereferentin',
     'role.4' => 'Programmierer',
     'role.5' => 'Programmierer',
     'role.6' => 'Programmierer',
     'role.7' => 'Sekretariat',
-    'role.8' => 'Gründer',
+    'role.8' => 'Founder',
 
     'contact.1' => 'Fragen/Probleme zu MetaGer etc. bitte immer an <a href="mailto:office@suma-ev.de">office@suma-ev.de</a> mailen, oder das <a href="/kontakt/">Kontaktformular mit Verschlüsselung</a> benutzten.',
     'contact.2' => 'Sollten Sie jemals eine E-Mail mit seltsamem Inhalt bekommen, auf der unsere Namen und/oder unsere E-Mail Adressen als Absender genannt sind, lesen Sie bitte hier weiter: <a href="https://metager.de/wsb/fakemail/">https://metager.de/wsb/fakemail/</a>',
diff --git a/resources/lang/en/datenschutz.php b/resources/lang/en/datenschutz.php
index bed413336f227bb282cc2c29e62fa9f8c27709d3..27df9cb3a86fbfa77425aa0a27bf3584ee8cf540 100644
--- a/resources/lang/en/datenschutz.php
+++ b/resources/lang/en/datenschutz.php
@@ -3,7 +3,7 @@
 return [
     "head" => "Privacy",
     "general.1" => "For us, privacy is one of the most important goods on the internet. It needs to be preserved and is not to be used for profit. The following is a small summary of our approach.",
-    "general.3" => "Only free software with open source code is under control of any user.  In\r\nall other cases the users have to <em>believe</em> what the maintainers tell about\r\nwhat is going on inside.  If maintainers claim that they have strictly\r\nimplemented privacy and data protecion, users have to believe them.\r\nMetaGer is free software under GNU-AGPLv3 Licence. It is available to\r\nanyone at <a href=\"https://gitlab.metager3.de/open-source/MetaGer\">https://gitlab.metager3.de/open-source/MetaGer</a>.",
+    "general.3" => "Only free software with open source code is under control of any user.  In\r\nall other cases the users have to <em>believe</em> what the maintainers tell about\r\nwhat is going on inside.  If maintainers claim that they have strictly\r\nimplemented privacy and data protecion, users have to believe them.\r\nMetaGer is free software under GNU-AGPLv3 Licence. It is available to\r\nanyone at <a href=\"https://gitlab.metager.de/open-source/MetaGer\">https://gitlab.metager.de/open-source/MetaGer</a>.",
     "policy.1" => "Our Approach/Policy:",
     "policy.2" => "Neither do we save your IP, nor the\r\n<a href=\"https://en.wikipedia.org/wiki/Canvas_fingerprinting\" target=\"_blank\" rel=\"noopener\">\"fingerprint\" of your Browser</a> (For the purpose of securing our servers against Hacking- and Bot-Attacks, we need to store these information for a short period of time. It will be then automatically deleted afterwards).",
     "policy.5" => "We do not set tracking-cookies or use tracking-pixels or similar technology, to \"track\" our users (tracking = following a users digital movement on the internet).",
diff --git a/resources/lang/en/hilfe.php b/resources/lang/en/hilfe.php
index b9132e535daf3c65615cf0445918335bf52f1991..0c88f48715a032eb533fbd4e3f2f68f44455228c 100644
--- a/resources/lang/en/hilfe.php
+++ b/resources/lang/en/hilfe.php
@@ -1,34 +1,34 @@
 <?php
 return [
-    "achtung"               => "Warning! Structure and functionality of our website are subject to constant development and changes. We try to update our help pages as quickly as possible, but can not prevent temporary mistakes.",
-    "title"                 => "MetaGer Help",
+    "achtung" => "Warning! Structure and functionality of our website are subject to constant development and changes. We try to update our help pages as quickly as possible, but can not prevent temporary mistakes.",
+    "title" => "MetaGer Help",
 
-    "title.2"               => 'Use of the search engine',
-    
-    "searchfield.title"     => 'The search field',
-    "searchfield.info"      => 'The search field contains:',
+    "title.2" => 'Use of the search engine',
+
+    "searchfield.title" => 'The search field',
+    "searchfield.info" => 'The search field contains:',
     "searchfield.memberkey" => 'The key symbol (only SUMA-EV members): Members can enter a private key to use the "free-of-advertising" metager search. If you want this too, just become a member: <a href = "https://metager.org/beitritt">Membership form</a>',
-    "searchfield.slot"      => 'The search field: Enter your words here.',
-    "searchfield.search"    => 'The magnifier: Start your search.',
-
-    "resultpage.title"      => 'The result page',
-    "resultpage.foci"       => 'There are six different search focuses below the search field (Web, Pictures...). We assigned specific search engines to these focuses.',
-    "resultpage.choice"     => 'Below these you have two links:',
-    "resultpage.filter"     => 'Filter: Toggle filters on / off and apply settings here. Each focus has its own assortment.',
-    "resultpage.settings"   => 'Settings: Apply here your permanent settings for the current focus. You can select / unselect search engines here, too. Your settings are stored as non-personally identifiable cookies. Click "Overview" to see your settings. If settings have been stored you find a deletion button at the end of the page.',
-
-    "stopworte.title"       => "Exclude single words",
-    "stopworte.1"           => "If you want to exclude words within the search result, you have to put a \"-\" in front of that word",
-    "stopworte.2"           => "Example: You are looking for a new car, but no BMW. Then your search should be <div class=\"well well-sm\">new car -bmw</div>",
-    "stopworte.3"           => "car new -bmw",
-
-    "mehrwortsuche.title"       => "Searching for more than one word",
-    "mehrwortsuche.1"           => "Without quotation you will get results containing one or some of the words of your search entry. Use quotes for the search for exact phrases, citations....",
-    "mehrwortsuche.2"           => "Example: search for Shakespears <div class=\"well well-sm\">to be or not to be</div> will deliver many results, but the exact phrase will only be found using <div class=\"well well-sm\">\"to be or nor to be\"</div>",
-    "mehrwortsuche.3"           => "Please use quotes to make sure to get your search words in the results list.",
-    "mehrwortsuche.3.example"   => '"round-table" "decision"',
-    "mehrwortsuche.4"           => "Put words or phrases in quotation marks to search for exact combinations.",
-    "mehrwortsuche.4.example"   => '"round-table decision"',
+    "searchfield.slot" => 'The search field: Enter your words here.',
+    "searchfield.search" => 'The magnifier: Start your search.',
+
+    "resultpage.title" => 'The result page',
+    "resultpage.foci" => 'There are six different search focuses below the search field (Web, Pictures...). We assigned specific search engines to these focuses.',
+    "resultpage.choice" => 'Below these you have two links:',
+    "resultpage.filter" => 'Filter: Toggle filters on / off and apply settings here. Each focus has its own assortment.',
+    "resultpage.settings" => 'Settings: Apply here your permanent settings for the current focus. You can select / unselect search engines here, too. Your settings are stored as non-personally identifiable cookies. Click "Overview" to see your settings. If settings have been stored you find a deletion button at the end of the page.',
+
+    "stopworte.title" => "Exclude single words",
+    "stopworte.1" => "If you want to exclude words within the search result, you have to put a \"-\" in front of that word",
+    "stopworte.2" => "Example: You are looking for a new car, but no BMW. Then your search should be <div class=\"well well-sm\">new car -bmw</div>",
+    "stopworte.3" => "car new -bmw",
+
+    "mehrwortsuche.title" => "Searching for more than one word",
+    "mehrwortsuche.1" => "Without quotation you will get results containing one or some of the words of your search entry. Use quotes for the search for exact phrases, citations....",
+    "mehrwortsuche.2" => "Example: search for Shakespears <div class=\"well well-sm\">to be or not to be</div> will deliver many results, but the exact phrase will only be found using <div class=\"well well-sm\">\"to be or nor to be\"</div>",
+    "mehrwortsuche.3" => "Please use quotes to make sure to get your search words in the results list.",
+    "mehrwortsuche.3.example" => '"round-table" "decision"',
+    "mehrwortsuche.4" => "Put words or phrases in quotation marks to search for exact combinations.",
+    "mehrwortsuche.4.example" => '"round-table decision"',
 
     "grossklein.title" => "Upper case vs. lower case",
     "grossklein.1" => "Upper case will not be distinguished from lower case",
@@ -106,7 +106,7 @@ return [
     'metager.explanation.2' => 'Additionally: meta search engines provide a wider coverage and a better overview, because none of the search engines knows the whole internet (Read more: <a href="https://en.wikipedia.org/wiki/Metasearch_engine" target="_blank" rel="noopener">Wikipedia</a>. Every result shows its origin in the right top corner. You may try this specific search engine to look for further results. We have grouped all available search services to several search focuses.',
 
     'searchengine.title' => 'How does MetaGer query other search engines while preserving user anonymity?',
-    'searchengine.explanation' => 'Since MetaGer is a meta-search engine, every search request you send to us will be stripped of information which could lead to your identification before being sent to e.g. Yahoo. Yahoo will send their response to us which we will then forward to you. This is how we handle every search request sent to us, no matter which one of the offered search engines you use. By doing this we commit ourselves to guarantee your privacy and do not save any personal data. It is possible to verify this, since the source code of MetaGer has been released under a free license <a href=\"https://gitlab.metager3.de/open-source/MetaGer\">(https://gitlab.metager3.de/open-source/MetaGer)</a>. If you have your own website you could try and find out how our <a href=":widget-link" target="_blank">MetaGer-Widget</a> works. You are also free to create links to our search engine.',
+    'searchengine.explanation' => 'Since MetaGer is a meta-search engine, every search request you send to us will be stripped of information which could lead to your identification before being sent to e.g. Yahoo. Yahoo will send their response to us which we will then forward to you. This is how we handle every search request sent to us, no matter which one of the offered search engines you use. By doing this we commit ourselves to guarantee your privacy and do not save any personal data. It is possible to verify this, since the source code of MetaGer has been released under a free license <a href=\"https://gitlab.metager.de/open-source/MetaGer\">(https://gitlab.metager.de/open-source/MetaGer)</a>. If you have your own website you could try and find out how our <a href=":widget-link" target="_blank">MetaGer-Widget</a> works. You are also free to create links to our search engine.',
 
     'content.title' => 'Inappropriate Content / youth protection',
     'content.explanation.1' => 'I found results with illegal content.',
diff --git a/resources/lang/en/impressum.php b/resources/lang/en/impressum.php
index 4ed813e0c76219df1c2af5d36bb7ea5a35bf9d30..ba88f17dd67bb27fdb40f07c25d8a140e6e53126 100644
--- a/resources/lang/en/impressum.php
+++ b/resources/lang/en/impressum.php
@@ -15,8 +15,7 @@ Tel.: ++49-(0)511-34000070
 EMail: <a href="mailto:office@suma-ev.de">office@suma-ev.de</a><a href="/kontakt/"> - Public-PGP-Key</a>
 <a href="/kontakt/">encrypted contact form</a>',
     'info.4' => 'Board: Dominik Hebeler, Carsten Riel, <a href="https://www.ostfalia.de/cms/de/pws/jensen/index.html">Prof.Dr. Nils Jensen</a>',
-    'info.6' => 'Youth Protection Commissioner: Georg Becker
-<a href="mailto:jugendschutz@metager.de">jugendschutz@metager.de</a>',
+    'info.6' => 'Youth Protection Commissioner: Manuela Branz <a href="mailto:jugendschutz@metager.de">jugendschutz@metager.de</a>',
     'info.8' => '"SUMA-EV - Verein für freien Wissenszugang" is a charitable association, registered in the register of associations at the Amtsgericht Hannover
 under VR200033.
 
diff --git a/resources/lang/en/languages.php b/resources/lang/en/languages.php
index 583d8564aae88c1ce8f414c0be18ee27cb99b329..c58a7536d5a678f081b42362c9e576fcebff55f9 100644
--- a/resources/lang/en/languages.php
+++ b/resources/lang/en/languages.php
@@ -1,15 +1,15 @@
 <?php
 
 return [
-    "header"	=>	"MetaGer - translations",
-    "beschreibung.1"	=>	"Thank you for your aim to playing an active part in providing MetaGer in different languages. You can see the content of a specific file as a table with -possibly- empty textfields on the left side. These are the items of which we don't have a translation yet.",
-    "beschreibung.2"	=>	"Just type the translation of the right column in the empty field on the left side of it. You don't have to translate the name of the item, the #ID.",
-    "progress"	=>	":uebersetzteTexte/:textCount snippets translated (:percentage%)",
-    "hinweis.1"	=>	"Please click \"Submit data\" when finished. You don't have to translate all items.",
-    "hinweis.2"	=>	"<b>Hint</b>: You won't see your translations until we checked and inserted it. Save your work by setting a bookmark.",
-    "hinweis.3"	=>	"<b>Note</b>: We publish the hole content of your work on  a<a href=\"https://gitlab.metager3.de/open-source/MetaGer\" target=\"_blank\" rel=\"noopener\">Publication</a>. This is subject to a AGPL-v3-License. You agree with clicking the \"Submit data\" button.",
-    "email"	=>	"<b>Email address for possible inquiries</b> (optional):",
-    "synoptic"	=>	[
-        "hinweis"	=>	"Last modified:"
-    ]
-];
\ No newline at end of file
+    "header" => "MetaGer - translations",
+    "beschreibung.1" => "Thank you for your aim to playing an active part in providing MetaGer in different languages. You can see the content of a specific file as a table with -possibly- empty textfields on the left side. These are the items of which we don't have a translation yet.",
+    "beschreibung.2" => "Just type the translation of the right column in the empty field on the left side of it. You don't have to translate the name of the item, the #ID.",
+    "progress" => ":uebersetzteTexte/:textCount snippets translated (:percentage%)",
+    "hinweis.1" => "Please click \"Submit data\" when finished. You don't have to translate all items.",
+    "hinweis.2" => "<b>Hint</b>: You won't see your translations until we checked and inserted it. Save your work by setting a bookmark.",
+    "hinweis.3" => "<b>Note</b>: We publish the hole content of your work on  a<a href=\"https://gitlab.metager.de/open-source/MetaGer\" target=\"_blank\" rel=\"noopener\">Publication</a>. This is subject to a AGPL-v3-License. You agree with clicking the \"Submit data\" button.",
+    "email" => "<b>Email address for possible inquiries</b> (optional):",
+    "synoptic" => [
+        "hinweis" => "Last modified:",
+    ],
+];
diff --git a/resources/lang/en/team.php b/resources/lang/en/team.php
index d5b9af6a8c5b94fc6a6076fbfbc404e0eee6815e..6100c349d073c33cc5a7f6b53157ef194d32379b 100644
--- a/resources/lang/en/team.php
+++ b/resources/lang/en/team.php
@@ -3,7 +3,7 @@
 return [
     "role.0" => "CEO",
     "role.1" => "executive",
-    "role.2" => "office supervisor und youth protection commissioner",
+    "role.2" => "youth protection commissioner",
     "role.3" => "press secretary",
     "role.4" => "programmer",
     "role.5" => "programmer",
diff --git a/resources/lang/es/datenschutz.php b/resources/lang/es/datenschutz.php
index 37df009a7862a2eb2a5edfee519782bcc512e8f4..5c4ef40535289b5579ec4273812e0be1d19d8e82 100644
--- a/resources/lang/es/datenschutz.php
+++ b/resources/lang/es/datenschutz.php
@@ -3,7 +3,7 @@
 return [
     "head" => "Protección de datos y privacidad",
     "general.1" => "Protección de datos y privacidad son para nosotros los bienes más importantes del internet. Son dignos de ser protegidos y no se debería usarlos comercialmente. Aquí una corta lista de nuestro modo de proceder. Una extensa presentación con información trasfondo, porque nosotros mantenemos el único buscador realmente seguro, encuentra en <a href=\"https://suma-ev.de/presse/Sicher-suchen-UND-finden-mit-MetaGer.html\">aquí.</a> ",
-    "general.3" => "Solo software que esta libre y el código fuente disponible, puede ser revisado por cualquier persona. En los demás casos el usuario tiene que CREER, lo que dice la compañía operadora o el vendedor del sello de calidad. MetaGer es software libre bajo licencia GNU-AGPLv3 (vea la noticia relacionada en alemán en el Heise Ticker <a href=\"http://heise.de/-3295586\" target=\"_blank\" rel=\"noopener\">http://heise.de/-3295586</a>). Usted puede descargar el código fuente de MetaGer aquí: <a href=\"https://gitlab.metager3.de/open-source/MetaGer\" target=\"_blank\" rel=\"noopener\">https://gitlab.metager3.de/open-source/MetaGer</a><br /> No necesita creernos nada: USTED mismo lo puede controlar!",
+    "general.3" => "Solo software que esta libre y el código fuente disponible, puede ser revisado por cualquier persona. En los demás casos el usuario tiene que CREER, lo que dice la compañía operadora o el vendedor del sello de calidad. MetaGer es software libre bajo licencia GNU-AGPLv3 (vea la noticia relacionada en alemán en el Heise Ticker <a href=\"http://heise.de/-3295586\" target=\"_blank\" rel=\"noopener\">http://heise.de/-3295586</a>). Usted puede descargar el código fuente de MetaGer aquí: <a href=\"https://gitlab.metager.de/open-source/MetaGer\" target=\"_blank\" rel=\"noopener\">https://gitlab.metager.de/open-source/MetaGer</a><br /> No necesita creernos nada: USTED mismo lo puede controlar!",
     "policy.1" => "Nuestro procedimiento / política:",
     "policy.2" => "No guardamos suya dirección IP, ni suyo \"Browser-Fingerprint\" (<a href=\"http://www.heise.de/security/meldung/Fingerprinting-Viele-Browser-sind-ohne-Cookies-identifizierbar-1982976.html\" target=\"_blank\" rel=\"noopener\">)Excepción : a corto plazo con ocasión de bot/hacking.",
     "policy.5" => "No usamos Tracking-Cookies o un Tracking-Pixel o tecnologías similares, para perseguir a nuestros usuarios (Tracking = Seguir los movimientos en el internet).",
diff --git a/resources/lang/es/impressum.php b/resources/lang/es/impressum.php
index a72ffe3a27eaaf76a4c8b6429fc9cc13d2d5ca84..2d7e5a036c5d425beef9d6b7fe2b508d9af09723 100644
--- a/resources/lang/es/impressum.php
+++ b/resources/lang/es/impressum.php
@@ -7,7 +7,7 @@ return [
     "info.2" => " SUMA-EV Röselerstr. 3 D-30159 Hannover Deutschland/Germany",
     "info.3" => "Contacto: Tel.: ++49-(0)511-34000070 EMail: <a href=\"mailto:office@suma-ev.de\">office@suma-ev.de</a><a href=\"/kontakt/\"> - Public-PGP-Key</a> <a href=\"/kontakt/\">Formulario encriptado</a>",
     "info.4" => "Junta directiva: Dominik Hebeler, Carsten Riel, <a href=\"https://www2.ostfalia.de/cms/de/pws/jensenn/index.html\">Prof.Dr. Nils Jensen</a>",
-    "info.6" => "Encargado de protección de menores: Georg Becker <a href=\"mailto:jugendschutz@metager.de\">jugendschutz@metager.de</a>",
+    "info.6" => "Encargado de protección de menores: Manuela Branz <a href=\"mailto:jugendschutz@metager.de\">jugendschutz@metager.de</a>",
     "info.8" => "\"SUMA-EV - Verein für freien Wissenszugang\" es una asociación sin fines de lucro, registrado en el registro de asociaciones del Amtsgericht Hannover bajo numero VR200033. Número de identificación a efectos del IVA:  DE 300 464 091 La \"Gottfried Wilhelm Leibniz Universität Hannover\" es una entidad del derecho publico.",
     "info.9" => "Exención de responsabilidad",
     "info.10" => "Pese al control minucioso de contenidos no podemos hacernos responsable de contenidos encontrados en hipervinculos externos. Para los contenidos de páginas linkeadas son unicamente responsables las respectivas compañías operadoras.",
diff --git a/resources/lang/es/team.php b/resources/lang/es/team.php
index 08258c41a82ff546aced219425755cfe40b52592..1ddeb07834c0f7878195f10733261c65982c82d8 100644
--- a/resources/lang/es/team.php
+++ b/resources/lang/es/team.php
@@ -3,7 +3,7 @@
 return [
     "role.0" => "Director ejecutivo [CEO]",
     "role.1" => "la junta directiva",
-    "role.2" => "La oficina (moderar y protección de menores)",
+    "role.2" => "Moderar y protección de menores",
     "role.3" => "Revistar la prensa",
     "role.4" => " Programador | programadora",
     "role.5" => " Programador | programadora",
diff --git a/resources/less/metager/pages/resultpage.less b/resources/less/metager/pages/resultpage.less
index 90d190d8194ef13de6a44adfa4e7298318eb3968..a2a703ea1965582827ae6a5a7ecdf2f0dc31a7ca 100644
--- a/resources/less/metager/pages/resultpage.less
+++ b/resources/less/metager/pages/resultpage.less
@@ -1,6 +1,5 @@
 @import "./resultpage/result-page.less";
 @import "./resultpage/result.less";
 @import "./resultpage/product.less";
-@import "./resultpage/quicktips.less";
 @import "./resultpage/result-saver.less";
 @import "./resultpage/keyboard-nav.less";
\ No newline at end of file
diff --git a/resources/less/metager/pages/resultpage/quicktips.less b/resources/less/metager/pages/resultpage/quicktips.less
index 11b7dedbea0e0606148c155d78a580266ced658a..f7f3eb879083fa2a4d5f19dcd3a29e7936e60c2d 100644
--- a/resources/less/metager/pages/resultpage/quicktips.less
+++ b/resources/less/metager/pages/resultpage/quicktips.less
@@ -1,11 +1,21 @@
 /* Quicktips */
-
+@import "../../variables.less";
+@import "../../general/cards.less";
+@import "../../general/general.less";
 @quicktip-font-large: @result-font-large;
 @quicktip-font-medium: @result-font-medium;
 @quicktip-font-small: @result-font-small;
 #quicktips {
     display: flex;
     flex-direction: column;
+    margin: 0 8px;
+    background-color: inherit;
+    a {
+        text-decoration: none;
+        &:hover {
+            text-decoration: underline;
+        }
+    }
     .quicktip {
         .card-light;
         position: relative;
@@ -15,7 +25,6 @@
         }
         margin: 10px 0px;
         padding: 10px 10px 10px 10px;
-        width: 100%;
         border: 1px solid #ccc;
         background-color: @quicktip-background-color;
         details:not([open=""]) {
@@ -24,6 +33,32 @@
             }
         }
         .quicktip-summary {
+            display: block;
+            .btn {
+                display: inline-block;
+                margin-bottom: 0;
+                font-weight: 400;
+                text-align: center;
+                vertical-align: middle;
+                -ms-touch-action: manipulation;
+                touch-action: manipulation;
+                cursor: pointer;
+                background-image: none;
+                border: 1px solid transparent;
+                white-space: nowrap;
+                padding: 6px 12px;
+                font-size: 14px;
+                line-height: 1.42857143;
+                border-radius: 4px;
+                -webkit-user-select: none;
+                -moz-user-select: none;
+                -ms-user-select: none;
+                user-select: none;
+                text-decoration: none;
+                &:hover {
+                    text-decoration: underline;
+                }
+            }
             .quicktip-headline {
                 width: 100%;
                 display: flex;
diff --git a/resources/less/metager/pages/resultpage/result-page.less b/resources/less/metager/pages/resultpage/result-page.less
index 3225857ff146dd6fc6388cad0b6bad59645f2670..7e70f86be684ab115cc272a7bd7e1b16ac515ffd 100644
--- a/resources/less/metager/pages/resultpage/result-page.less
+++ b/resources/less/metager/pages/resultpage/result-page.less
@@ -397,9 +397,19 @@ a {
         /**/
         //min-width: @additions-width-min;
         max-width: @additions-width-max;
+        width: 100%;
+        height: 100%;
         #search-settings {
             display: none;
         }
+        #quicktips {
+            height: 100%;
+            width: 100%;
+            iframe{
+                height: 100%;
+                width: 100%;
+            }
+        }
     }
     footer {
         grid-area: footer;
diff --git a/resources/less/metager/pages/start-page.less b/resources/less/metager/pages/start-page.less
index 5c82fad10423862cf2e01da13359ae016e974c64..9370b38b4bcc40f31b160816bc29ee69c791c942 100644
--- a/resources/less/metager/pages/start-page.less
+++ b/resources/less/metager/pages/start-page.less
@@ -86,9 +86,10 @@
                     margin: 0;
                 }
                 > img {
-                    width: 2.3em;
+                    max-width: 2.3em;
                 }
                 > div.teaser {
+                    width: 100%;
                     font-size: .7em;
                     text-align: justify;
                     hyphens: auto;
@@ -108,4 +109,4 @@
             color: green;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/resources/less/metager/variables.less b/resources/less/metager/variables.less
index 7830bd9e4023e145ffed2c5015c14fb6dca25270..1541bf4acc6669dc8a4b0e598a86abcb4862ea36 100644
--- a/resources/less/metager/variables.less
+++ b/resources/less/metager/variables.less
@@ -1,5 +1,5 @@
 // MetaGer Brand Color
-@metager-orange: #FF8000;
+@metager-orange: #FF8000; 
 // Shades of Gray
 @color-white: white;
 @color-almost-white: mix(@color-white, @color-black, 90%);
@@ -32,4 +32,33 @@ sans-serif;
 // Card styles
 @card-background-color: @background-color;
 // Default Border Color
-@border-color: #ccc;
\ No newline at end of file
+@border-color: #ccc;
+
+@result-font-large: 18px;
+@result-font-medium: 16px;
+@result-font-url: 14px;
+@result-font-small: 12px;
+@result-description-color: @color-black;
+@result-image-border-color: @color-almost-white;
+
+// Background color
+@resultpage-background-color: @background-color;
+// Margin to the left of the results
+@results-margin-left: 16px;
+// Min and max widths of the 2 resultpage columns
+@results-width-min: 500px;
+@results-width-max: 800px;
+@additions-width-min: 500px;
+@additions-width-max: 500px;
+// Breakpoints for the 2 resultpage columns
+@resultpage-breakpoint-max: (@results-width-max + @additions-width-max + @padding-small-default * 2 + @padding-small-default * 4 + 6);
+@resultpage-breakpoint-min: (@results-width-min + @additions-width-min + @padding-small-default * 4);
+@product-shop-color: green;
+// The point upon which a .screen-large logo is displayed
+@logo-size-breakpoint: (@results-width-min + @padding-small-default * 2);
+// The point upon which the sidebar opener switches place
+@sidebar-opener-breakpoint: (@results-width-max + @padding-small-default * 2 + 60px);
+// Quicktip background color
+@quicktip-background-color: @color-white;
+// Color of the Spruch author
+@spruch-author-color: @color-strong-grey;
diff --git a/resources/views/layouts/researchandtabs.blade.php b/resources/views/layouts/researchandtabs.blade.php
index 8ec665cc5eea2909a517208e0ef11b78c3e7694e..9e9596e0cc281bb673cf0a82750fbd6df5e41859 100644
--- a/resources/views/layouts/researchandtabs.blade.php
+++ b/resources/views/layouts/researchandtabs.blade.php
@@ -36,7 +36,7 @@
 		@include('layouts.keyboardNavBox')
 		@if( $metager->showQuicktips() )
 			<div id="quicktips">
-				@include('quicktips', ['quicktips', $quicktips])
+				<iframe src="{{ $quicktips }}" frameborder="0"></iframe>
 			</div>
 		@endif
 	</div>
diff --git a/resources/views/parts/quicktip.blade.php b/resources/views/parts/quicktip.blade.php
index 08dd26f334af78a72848d779049b398b4f0390cb..04601ff0425603ce8907c1ad482bcff9a012abf0 100644
--- a/resources/views/parts/quicktip.blade.php
+++ b/resources/views/parts/quicktip.blade.php
@@ -5,7 +5,7 @@
         @if ($quicktip->title != "")
           <h1 class="quicktip-title">
             @if ($quicktip->link != "")
-              <a href="{{ $quicktip->link }}">{{ $quicktip->title }}</a>
+              <a href="{{ $quicktip->link }}" target="_parent">{{ $quicktip->title }}</a>
             @else
               {{ $quicktip->title }}
             @endif
@@ -32,7 +32,7 @@
       <div class="quicktip-detail">
         <h2>
           @if (isset($detail->link))
-            <a href="{{ $detail->link }}">{{ $detail->title }}</a>
+            <a href="{{ $detail->link }}" target="_parent">{{ $detail->title }}</a>
           @else
             {{ $detail->title }}
           @endif
@@ -47,7 +47,7 @@
       @if ($quicktip->title != "")
         <h1 class="quicktip-title">
           @if ($quicktip->link != "")
-            <a href="{{ $quicktip->link }}">{{ $quicktip->title }}</a>
+            <a href="{{ $quicktip->link }}" target="_parent">{{ $quicktip->title }}</a>
           @else
             {{ $quicktip->title }}
           @endif
diff --git a/resources/views/parts/sidebar.blade.php b/resources/views/parts/sidebar.blade.php
index 30ae10e06030958c4c4a0215ad288016ce65ff8c..5793fb91e7a6387c59e3d8040c74718f58859d28 100644
--- a/resources/views/parts/sidebar.blade.php
+++ b/resources/views/parts/sidebar.blade.php
@@ -98,7 +98,7 @@
           <a href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/tips/") }}" >{{ trans('sidebar.titles.tips') }}</a>
         </li>
         <li>
-          <a class="outlink" href="https://gitlab.metager3.de/open-source/MetaGer" >{{ trans('sidebar.nav24') }}</a>
+          <a class="outlink" href="https://gitlab.metager.de/open-source/MetaGer" >{{ trans('sidebar.nav24') }}</a>
         </li>
         <li>
           <a class="outlink" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/tor/") }}" >{{ trans('sidebar.nav14') }}</a>
diff --git a/resources/views/quicktips.blade.php b/resources/views/quicktips.blade.php
index f354bda8b7ff7dadefffc7704e3bf4325b39b28b..6fa679cf65fd25ab3e02af788260f55783900250 100644
--- a/resources/views/quicktips.blade.php
+++ b/resources/views/quicktips.blade.php
@@ -1,5 +1,19 @@
+<!DOCTYPE html>
+<html lang="{{ LaravelLocalization::getCurrentLocale() }}">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>{{ $search }} - MetaGer Quicktips</title>
+  <link type="text/css" rel="stylesheet" href="{{ mix('css/quicktips.css') }}" />
+  <link href="/fonts/liberationsans/stylesheet.css" rel="stylesheet">
+	<link type="text/css" rel="stylesheet" href="{{ mix('css/fontawesome.css') }}" />
+	<link type="text/css" rel="stylesheet" href="{{ mix('css/fontawesome-solid.css') }}" />
+</head>
+<body id="quicktips">
 @foreach($quicktips as $quicktip)
   <div class="quicktip" type="{{ $quicktip->type }}">
     @include('parts.quicktip', ['quicktip' => $quicktip])
   </div>
-@endforeach
\ No newline at end of file
+@endforeach
+</body>
+</html>
diff --git a/resources/views/team/team.blade.php b/resources/views/team/team.blade.php
index 8ff5079b8c5a7780f560968b99ac66fbaeb81db3..ea92ec37e43bdcebf3adf4984897532d6a94b568 100644
--- a/resources/views/team/team.blade.php
+++ b/resources/views/team/team.blade.php
@@ -16,21 +16,13 @@
 					<a href="carsten@suma-ev.de">carsten@suma-ev.de</a></p>
 				</li>
 				<li>
-					<p>Becker, Georg - {!! trans('team.role.2') !!} -
-					<a href="mailto:georg.becker@suma-ev.de">georg.becker@suma-ev.de</a></p>
-				</li>
-				<li>
-					<p>Branz, Manuela - {!! trans('team.role.3') !!} -
+					<p>Branz, Manuela - {!! trans('team.role.3') !!} & {!! trans('team.role.2') !!} -
 					<a href="mailto:manuela.branz@suma-ev.de">manuela.branz@suma-ev.de</a></p>
 				</li>
 				<li>
 					<p>Höfer, Phil - {!! trans('team.role.5') !!} -
 					<a href="mailto:phil@suma-ev.de">phil@suma-ev.de</a></p>
 				</li>
-				<li>
-					<p>Hasselbring, Karl - {!! trans('team.role.6') !!} -
-					<a href="mailto:karl@suma-ev.de">karl@suma-ev.de</a></p>
-				</li>
 				<li>
 					<p>Givi, Aria - {!! trans('team.role.6') !!} -
 					<a href="mailto:aria@suma-ev.de">aria@suma-ev.de</a></p>
diff --git a/resources/views/widget/sitesearch.blade.php b/resources/views/widget/sitesearch.blade.php
index c01d9b756adf349bfb869d4e05e17cd195ffa4cb..811a474f436171811260c363dd5cbccc3ce29795 100644
--- a/resources/views/widget/sitesearch.blade.php
+++ b/resources/views/widget/sitesearch.blade.php
@@ -28,7 +28,7 @@
 	</div>
 		<h2>{{ trans('sitesearch.generated.5') }} <button id="copyButton" class="btn btn-default" type="button"><i class="fa fa-paperclip" aria-hidden="true"></i> {{ trans('websearch.head.copy') }}</button></h2>
 		<textarea id="codesnippet" readonly style="width:100%;height:500px">
-			<form class="metager-searchform" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/") }}/meta/meta.ger3" method="get" accept-charset="UTF-8">
+			<form class="metager-searchform" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/") }}meta/meta.ger3" method="get" accept-charset="UTF-8">
 				<style type="text/css" scoped>
 					.metager-searchinput {
 						height: 30px;
diff --git a/resources/views/widget/websearch.blade.php b/resources/views/widget/websearch.blade.php
index 13ced28619221568ed7e60be694bc43e69f82e6d..09e73017ea5a746e351c81272423d1ffd4b037dc 100644
--- a/resources/views/widget/websearch.blade.php
+++ b/resources/views/widget/websearch.blade.php
@@ -7,7 +7,7 @@
 		<h1>{{ trans('websearch.head.1') }}</h1>
 		<p>{{ trans('websearch.head.2') }}</p>
 		<h2>{{ trans('websearch.head.3') }}</h2>
-		<form class="metager-searchform" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/") }}/meta/meta.ger3" method="GET" accept-charset="UTF-8" >
+		<form class="metager-searchform" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/") }}meta/meta.ger3" method="GET" accept-charset="UTF-8" >
 			<a href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/") }}"><img class="metager-logo" title="{{ trans('websearch.head.4') }}" alt="MetaGer" src="data:image/png;base64, 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"></a>
 			<input class="metager-searchinput" name="eingabe" placeholder="{{ trans('websearch.head.5') }}" required="">
 			<input type="hidden" name="lang" value="{{ trans('websearch.head.6') }}">
diff --git a/routes/web.php b/routes/web.php
index 90f0257318fc166ade1596c64106cceb64ed0bce..7f6093e491b6413cc4604a2ddaa2f24f81126fb5 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -87,9 +87,9 @@ Route::group(
 
         Route::get('beitritt', function () {
             if (LaravelLocalization::getCurrentLocale() === "de") {
-                return response()->file(storage_path('app/public/aufnahmeantrag-de.pdf'));
+                return response()->download(storage_path('app/public/aufnahmeantrag-de.pdf'), "SUMA-EV_Beitrittsformular_" . (new \DateTime())->format("Y_m_d") . ".pdf", ["Content-Type" => "application/pdf"]);
             } else {
-                return response()->file(storage_path('app/public/aufnahmeantrag-en.pdf'));
+                return response()->download(storage_path('app/public/aufnahmeantrag-en.pdf'), "SUMA-EV_Membershipform_" . (new \DateTime())->format("Y_m_d") . ".pdf", ["Content-Type" => "application/pdf"]);
             }
         });
 
@@ -170,10 +170,14 @@ Route::group(
         Route::group(['middleware' => ['auth.basic'], 'prefix' => 'admin'], function () {
             Route::get('/', 'AdminInterface@index');
             Route::match(['get', 'post'], 'count', 'AdminInterface@count');
+            Route::get('timings', 'MetaGerSearch@searchTimings');
             Route::get('count/graphtoday.svg', 'AdminInterface@countGraphToday');
             Route::get('engine/stats.json', 'AdminInterface@engineStats');
             Route::get('check', 'AdminInterface@check');
             Route::get('engines', 'AdminInterface@engines');
+            Route::get('ip', function () {
+                dd(Request::ip(), $_SERVER["AGENT"]);
+            });
         });
 
         Route::get('settings', function () {
@@ -181,6 +185,7 @@ Route::group(
         });
 
         Route::match(['get', 'post'], 'meta/meta.ger3', 'MetaGerSearch@search')->middleware('humanverification', 'useragentmaster');
+
         Route::get('meta/loadMore', 'MetaGerSearch@loadMore');
         Route::post('img/cat.jpg', 'HumanVerification@remove');
         Route::get('r/metager/{mm}/{pw}/{url}', ['as' => 'humanverification', 'uses' => 'HumanVerification@removeGet']);
@@ -191,7 +196,7 @@ Route::group(
         Route::get('pluginClose', 'LogController@pluginClose');
         Route::get('pluginInstall', 'LogController@pluginInstall');
 
-        Route::get('qt', 'MetaGerSearch@quicktips');
+        Route::get('qt/{eingabe}', 'MetaGerSearch@quicktips');
         Route::get('tips', 'MetaGerSearch@tips');
         Route::get('/plugins/opensearch.xml', 'StartpageController@loadPlugin');
         Route::get('owi', function () {
diff --git a/webpack.mix.js b/webpack.mix.js
index 0c51044cede6aa75705430c4afe586f9ea822ea0..91565c2e243bffdfc366fe10fe028ee96cc9c072 100644
--- a/webpack.mix.js
+++ b/webpack.mix.js
@@ -25,6 +25,9 @@ mix
   .less("resources/less/metager/metager-dark.less", "public/css/themes/metager-dark.css", {
     strictMath: true
   })
+  .less("resources/less/metager/pages/resultpage/quicktips.less", "public/css/quicktips.css", {
+    strictMath: true
+  })
   .less("resources/less/font-awesome/fontawesome.less", "public/css/fontawesome.css", {
     strictMath: true
   })
@@ -37,8 +40,8 @@ mix
   .less(
     "resources/less/metager/pages/key.less",
     "public/css/key.css", {
-      strictMath: true
-    }
+    strictMath: true
+  }
   )
   .less("resources/less/utility.less", "public/css/utility.css", {
     strictMath: true