diff --git a/.gitignore b/.gitignore
index ce2c62fe06a253c2c0b6c95525cd7a1dbd8ba4e7..46d87d2d30d6167368a3384d68ac433c9645f833 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,7 +6,6 @@ Homestead.json
 Homestead.yaml
 .env
 .orig
-.vscode
 langfiles.zip
 npm-debug.log
 # The Files created by Webpack in the build process
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 126e341893ea8a72fb737c274a8926541c77e18e..fe648a53adc3a43d236423613c989af32ed1d9cb 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -42,8 +42,11 @@ build:
 prepare_node:
   stage: prepare
   image: node:10
+  variables:
+    npm_config_cache: "$CI_PROJECT_DIR/.npm"
   before_script:
-    - npm install
+    - npm install -g npm-cache
+    - npm-cache install --cacheDirectory "$CI_PROJECT_DIR/.npm-package-cache" npm
   script:
     - npm run prod
   artifacts:
@@ -53,25 +56,28 @@ prepare_node:
       - public/mix-manifest.json
   cache:
     # Cache per Branch
-    key: "node-$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG"
+    key: "metager-${CI_JOB_NAME}"
     paths:
-      - node_modules
+      - .npm
+      - .npm-package-cache
   only:
     - branches
     - tags
 
 prepare_composer:
   stage: prepare
-  image: prooph/composer:7.3
+  image: registry.metager.de/open-source/composer/master
+  variables:
+    COMPOSER_HOME: "$CI_PROJECT_DIR/.composer"
   script:
     - composer install --no-dev
   artifacts:
     paths:
       - vendor
   cache:
-    key: "composer-$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG"
+    key: "metager-${CI_JOB_NAME}"
     paths:
-      - vendor
+      - .composer
 
 review:
   variables:
diff --git a/.gitlab/development-values.yaml b/.gitlab/development-values.yaml
index fd4bf6adef22ea3a93cb950483c495e392bfd2e3..4082c9baf9c2227ba61bfe27b76c8ad042a6afad 100644
--- a/.gitlab/development-values.yaml
+++ b/.gitlab/development-values.yaml
@@ -27,10 +27,14 @@ resourcesFetcher:
     cpu: 500m
     memory: 100M
   limits:
+resources:
+  requests:
+    cpu: 500m
+    memory: 500M
 podDisruptionBudget:
   enabled: true
-  minAvailable:
-  maxUnavailable: 0
+  minAvailable: 1
+  maxUnavailable:
 podAnnotations:
   prometheus.io/scrape: "true"
   prometheus.io/path: /metrics
diff --git a/.gitlab/production-values.yaml b/.gitlab/production-values.yaml
index bdc9fb84de196d139abdf71cea97f79be2db2804..c2ab6cb44de47ad1d503faef53eb0b18367a8f4e 100644
--- a/.gitlab/production-values.yaml
+++ b/.gitlab/production-values.yaml
@@ -9,8 +9,8 @@ hpa:
   maxReplicas: 100
 podDisruptionBudget:
   enabled: true
-  minAvailable:
-  maxUnavailable: 0
+  minAvailable: 3
+  maxUnavailable:
 podAnnotations:
   prometheus.io/scrape: "true"
   prometheus.io/path: /metrics
@@ -39,6 +39,10 @@ resourcesFetcher:
     cpu: 500m
     memory: 100M
   limits:
+resources:
+  requests:
+    cpu: 500m
+    memory: 500M
 ingress:
   annotations:
     cert-manager.io/cluster-issuer: letsencrypt-prod
diff --git a/.gitlab/review-apps-values.yaml b/.gitlab/review-apps-values.yaml
index a8a7331ba3b28d881b56dc6845c2124779a058b2..39675d18a11ea100f328d62b50fe08e84869cff3 100644
--- a/.gitlab/review-apps-values.yaml
+++ b/.gitlab/review-apps-values.yaml
@@ -36,4 +36,4 @@ resourcesRedis:
   limits:
 resourcesFetcher: 
   requests:
-  limits:
\ No newline at end of file
+  limits:
diff --git a/.gitlab/service_desk_templates/new_note.md b/.gitlab/service_desk_templates/new_note.md
new file mode 100644
index 0000000000000000000000000000000000000000..357a3bcd3d0fa4ce9750e523362062f1a0d36ee6
--- /dev/null
+++ b/.gitlab/service_desk_templates/new_note.md
@@ -0,0 +1,4 @@
+%{NOTE_TEXT}  
+Team SUMA-EV & MetaGer, Röselerstraße 3, 30159 Hannover  
+Tel.: +4951134000070, E-Mail: support@suma-ev.de, Fax: +4951134001023  
+[suma-ev.de](https://suma-ev.de) & [metager.de](https://metager.de)
diff --git a/.gitlab/service_desk_templates/thank_you.md b/.gitlab/service_desk_templates/thank_you.md
new file mode 100644
index 0000000000000000000000000000000000000000..b61b3b72a4a1683cf94655e9e68ec75daccd6486
--- /dev/null
+++ b/.gitlab/service_desk_templates/thank_you.md
@@ -0,0 +1,10 @@
+vielen Dank für Ihre Kontaktaufnahme. Wie Sie vielleicht schon vermuten ist dies zunächst lediglich eine automatisch generierte Antwort, in der wir über unseren Datenschutz aufklären. In unserer [Datenschutzerklärung](https://metager.de/datenschutz#contact) können Sie mehr darüber erfahren, wie lange wir Daten über unsere Konversation aufbewahren und welche Daten überhaupt anfallen.  
+Ein Mitarbeiter wird sich aber möglichst schnell mit Ihrem Anliegen befassen.
+
+##### English Version
+Thank you for contacting us. As you might already suspect, this is initially just an automatically generated answer in which we explain our data protection. In our [data protection declaration](https://metager.org/datenschutz#contact) you can find out more about how long we keep data about our conversation and what data is actually generated.  
+However, an employee will deal with your request as quickly as possible.
+  
+Team SUMA-EV & MetaGer, Röselerstraße 3, 30159 Hannover  
+Tel.: +4951134000070, E-Mail: support@suma-ev.de, Fax: +4951134001023  
+[suma-ev.de](https://suma-ev.de) & [metager.de](https://metager.de)
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000000000000000000000000000000000000..7987693b275ab4e9e2834defffbf52c763a061ef
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,28 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "PHP - Listen for XDebug",
+            "type": "php",
+            "request": "launch",
+            "port": 9000,
+            "pathMappings": {
+                "/html": "${workspaceRoot}"
+            }
+        },
+        {
+            "name": "PHP - Launch currently open script",
+            "type": "php",
+            "request": "launch",
+            "port": 9000,
+            "program": "${file}",
+            "cwd": "${fileDirname}",
+            "pathMappings": {
+                "/html": "${workspaceRoot}"
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/DockerfileDev b/DockerfileDev
index 04cf4b666512d26a43bf2aabdc291055a734d6e4..af73db666ebcf92c8ccebe2f9028f3ff9b86b1c3 100644
--- a/DockerfileDev
+++ b/DockerfileDev
@@ -24,6 +24,7 @@ RUN apk add --update \
     php7-json \
     php7-pcntl \
     php7-fileinfo \
+    php7-xdebug \
     && rm -rf /var/cache/apk/*
 
 WORKDIR /html
@@ -31,7 +32,7 @@ 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 = 0/request_terminate_timeout = 900/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 && \
@@ -45,6 +46,11 @@ RUN sed -i 's/;error_log = log\/php7\/error.log/error_log = \/dev\/stderr/g' /et
     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 && \
+    sed -i 's/;zend_extension=xdebug.so/zend_extension=xdebug.so/g' /etc/php7/conf.d/xdebug.ini && \
+    echo "xdebug.remote_enable = 1" >> /etc/php7/conf.d/xdebug.ini && \
+    echo "xdebug.remote_autostart = 1" >> /etc/php7/conf.d/xdebug.ini && \
+    echo "xdebug.remote_connect_back = 1" >> /etc/php7/conf.d/xdebug.ini && \
+    echo "xdebug.idekey=VSCODE" >> /etc/php7/conf.d/xdebug.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 && \
diff --git a/app/Console/Commands/RequestFetcher.php b/app/Console/Commands/RequestFetcher.php
index 270d8bd47d4734ae455f1cf69f535a3bee19bb1d..d36f91163cee7baa142b1cf882c655fcdfef863f 100644
--- a/app/Console/Commands/RequestFetcher.php
+++ b/app/Console/Commands/RequestFetcher.php
@@ -198,6 +198,10 @@ class RequestFetcher extends Command
             CURLOPT_TIMEOUT => 7,
         ));
 
+        if (!empty($job["curlopts"])) {
+            curl_setopt_array($ch, $job["curlopts"]);
+        }
+
         if (!empty($this->proxyhost) && !empty($this->proxyport) && !empty($this->proxyuser) && !empty($this->proxypassword)) {
             curl_setopt($ch, CURLOPT_PROXY, $this->proxyhost);
             curl_setopt($ch, CURLOPT_PROXYUSERPWD, $this->proxyuser . ":" . $this->proxypassword);
diff --git a/app/Http/Controllers/AdminInterface.php b/app/Http/Controllers/AdminInterface.php
index 19efccc428cd5eba19e096f1b4e1ee06ec9f6afd..dd14d95d868424f9e6e04fdcff6f14011cec79bc 100644
--- a/app/Http/Controllers/AdminInterface.php
+++ b/app/Http/Controllers/AdminInterface.php
@@ -142,11 +142,19 @@ class AdminInterface extends Controller
         $rekordTagDate = "";
         $size = 0;
         $count = 0;
+        $logToday = 0;
 
         foreach ($logs as $key => $stats) {
             if ($key === 0) {
                 // Log for today
-                $logToday = empty($stats->insgesamt->{$interface}) ? 0 : $stats->insgesamt->{$interface};
+                $now = Carbon::now();
+                $now->hour = 0;
+                $now->minute = 0;
+                $now->second = 0;
+                while ($now->lessThanOrEqualTo(Carbon::now()->subMinutes(5))) {
+                    $logToday += empty($stats->time->{$now->format('H:i')}->{$interface}) ? 0 : $stats->time->{$now->format('H:i')}->{$interface};
+                    $now->addMinutes(5);
+                }
                 continue;
             }
             $insgesamt = empty($stats->insgesamt->{$interface}) ? 0 : $stats->insgesamt->{$interface};
@@ -156,7 +164,7 @@ class AdminInterface extends Controller
             $now->minute = 0;
             $now->second = 0;
 
-            while ($now->lessThanOrEqualTo(Carbon::now())) {
+            while ($now->lessThanOrEqualTo(Carbon::now()->subMinutes(5))) {
                 $sameTime += empty($stats->time->{$now->format('H:i')}->{$interface}) ? 0 : $stats->time->{$now->format('H:i')}->{$interface};
                 $now->addMinutes(5);
             }
@@ -190,7 +198,7 @@ class AdminInterface extends Controller
                 $sum += ($logToday - $sameTime);
             }
         }
-        
+
         $averageIncrease = 0;
         if (sizeof($sameTimes) > 0) {
             $averageIncrease = $sum / sizeof($sameTimes);
diff --git a/app/Http/Controllers/KeyController.php b/app/Http/Controllers/KeyController.php
index f9f36a49c27a1ab5d2f7cbba69d31c54076bbd8b..4cdd3542688a7a85a25c13d0581070974e7b8abc 100644
--- a/app/Http/Controllers/KeyController.php
+++ b/app/Http/Controllers/KeyController.php
@@ -5,72 +5,66 @@ namespace App\Http\Controllers;
 use Cookie;
 use Illuminate\Http\Request;
 use LaravelLocalization;
+use \App\Models\Key;
 
 class KeyController extends Controller
 {
     public function index(Request $request)
     {
         $redirUrl = $request->input('redirUrl', "");
+        $cookie = Cookie::get('key');
+        $key = $request->input('keyToSet', '');
 
-        return view('key')
-            ->with('title', trans('titles.key'));
+        if (empty($key) && empty($cookie)) {
+            $key = 'enter_key_here';
+        } elseif (empty($key) && !empty($cookie)) {
+            $key = $cookie;
+        } elseif (!empty($key)) {
+            $key = $request->input('key');
+        }
 
+        $cookieLink = LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('loadSettings', Cookie::get()));
+        return view('key')
+            ->with('title', trans('titles.key'))
+            ->with('cookie', $key)
+            ->with('cookieLink', $cookieLink);
     }
 
     public function setKey(Request $request)
     {
         $redirUrl = $request->input('redirUrl', "");
-        $key = $request->input('key', '');
+        $keyToSet = $request->input('keyToSet');
+        $key = new Key($request->input('keyToSet', ''));
 
-        if ($this->authorizeKey($key)) {
+        if ($key->getStatus()) {
             # Valid Key
             $host = $request->header("X_Forwarded_Host", "");
             if (empty($host)) {
                 $host = $request->header("Host", "");
             }
-
-            Cookie::queue('key', $key, 525600, '/', null, false, false);
-            return redirect($redirUrl);
+            Cookie::queue('key', $keyToSet, 525600, '/', null, false, false);
+            $settings = Cookie::get();
+            $settings['key'] = $keyToSet;
+            $cookieLink = LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('loadSettings', $settings));
+            return view('key')
+                ->with('title', trans('titles.key'))
+                ->with('cookie', $keyToSet)
+                ->with('cookieLink', $cookieLink);
         } else {
+            $cookieLink = LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('loadSettings', Cookie::get()));
             return view('key')
                 ->with('title', trans('titles.key'))
-                ->with('keyValid', false);
+                ->with('keyValid', false)
+                ->with('cookie', 'enter_key_here')
+                ->with('cookieLink', $cookieLink);
         }
     }
 
     public function removeKey(Request $request)
     {
         $redirUrl = $request->input('redirUrl', "");
-        Cookie::queue('key', '', 0, '/', null, false, false);
+        Cookie::queue(Cookie::forget('key'));
         $url = LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), action('KeyController@index', ['redirUrl' => $redirUrl]));
         return redirect($url);
     }
-
-    private function authorizeKey($key)
-    {
-        $postdata = http_build_query(array(
-            'dummy' => rand(),
-        ));
-        $opts = array('http' => array(
-            'method' => 'POST',
-            'header' => 'Content-type: application/x-www-form-urlencoded',
-            'content' => $postdata,
-        ),
-        );
-
-        $context = stream_context_create($opts);
-
-        try {
-            $link = "https://key.metager3.de/" . urlencode($key) . "/request-permission/api-access";
-            $result = json_decode(file_get_contents($link, false, $context));
-            if ($result->{'api-access'} == true) {
-                return true;
-            } else {
-                return false;
-            }
-        } catch (\ErrorException $e) {
-            return false;
-        }
-
-    }
 }
diff --git a/app/Http/Controllers/MetaGerSearch.php b/app/Http/Controllers/MetaGerSearch.php
index dbc9c50dd124adf5603732e73754c7ddf1daac07..032d739bdd2a8d0c2fcdd33a8fa08e10008eb1bd 100644
--- a/app/Http/Controllers/MetaGerSearch.php
+++ b/app/Http/Controllers/MetaGerSearch.php
@@ -88,9 +88,13 @@ class MetaGerSearch extends Controller
         $metager->startSearch($timings);
 
         # Versuchen die Ergebnisse der Quicktips zu laden
-        $quicktipResults = $quicktips->loadResults();
-        if (!empty($timings)) {
-            $timings["Loaded Quicktip Results"] = microtime(true) - $time;
+        if($quicktips !== null) {
+            $quicktipResults = $quicktips->loadResults();
+            if (!empty($timings)) {
+                $timings["Loaded Quicktip Results"] = microtime(true) - $time;
+            }
+        } else {
+            $quicktipResults = [];
         }
 
         $metager->waitForMainResults();
@@ -119,7 +123,6 @@ class MetaGerSearch extends Controller
                 $engine->markNew();
             }
         }
-
         try {
             Cache::put("loader_" . $metager->getSearchUid(), [
                 "metager" => [
@@ -223,7 +226,7 @@ class MetaGerSearch extends Controller
         $metager->setAdgoalLoaded($adgoal["loaded"]);
         $metager->setAdgoalHash($adgoal["adgoalHash"]);
 
-        $metager->parseFormData($request);
+        $metager->parseFormData($request, false);
         # Nach Spezialsuchen überprüfen:
         $metager->checkSpecialSearches($request);
         $metager->restoreEngines($engines);
diff --git a/app/Http/Controllers/ServiceDesk.php b/app/Http/Controllers/ServiceDesk.php
new file mode 100644
index 0000000000000000000000000000000000000000..48a83799ded21744f6e9bdbbe2f826d51669cf5a
--- /dev/null
+++ b/app/Http/Controllers/ServiceDesk.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use Log;
+use Carbon;
+
+class ServiceDesk extends Controller
+{
+    private $accessToken = null;
+    private $apiUrl = "https://gitlab.metager.de/api/v4/projects";
+
+    public function webhook(Request $request)
+    {
+        // Validate Token match
+        $token = $request->header("X-Gitlab-Token");
+        if ($token !== env("gitlab_webhook_token", "")) {
+            Log::info("Webhook Action not taken. Token mismatch: " . $token);
+            return;
+        }
+        $this->accessToken = env("gitlab_access_token", "");
+
+        $event = json_decode($request->getContent(), true);
+
+        if ($event["user"]["username"] === "support-bot" && $event["issue"]["author_id"] === 301 && $event["issue"]["state"] === "closed") {
+            $closedAt = new Carbon($event["issue"]["closed_at"]);
+            $createdAt = new Carbon($event["object_attributes"]["created_at"]);
+            if ($createdAt->isAfter($closedAt)) {
+                // Reopen the issues
+                $getParameter = [
+                    "state_event" => "reopen"
+                ];
+                $url = $this->apiUrl . "/2/issues/" . $event["issue"]["iid"] . "?" . http_build_query($getParameter);
+
+                $response = file_get_contents($url, false, stream_context_create([
+                    "http" => [
+                        "method" => "PUT",
+                        "header" => "Authorization: Bearer " . $this->accessToken . "\r\n"
+                        ]
+                ]));
+                Log::info("reopened issue " . $event["issue"]["iid"]);
+            }
+        }
+
+        return response("");
+    }
+}
diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php
index 03b6629eb018cc996e9a76f2feee5cfde7fdb0fb..8a637a2a1e42d465a825e4a190828c8064f77c52 100644
--- a/app/Http/Controllers/SettingsController.php
+++ b/app/Http/Controllers/SettingsController.php
@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use Cookie;
 use LaravelLocalization;
 use \App\MetaGer;
+use \App\Models\Key;
 use \Illuminate\Http\Request;
 
 class SettingsController extends Controller
@@ -46,7 +47,6 @@ class SettingsController extends Controller
                         $filters[$name]->values->$key = $values->$key;
                     }
                 }
-
             }
         }
 
@@ -56,15 +56,15 @@ class SettingsController extends Controller
         $cookies = Cookie::get();
         $settingActive = false;
         foreach ($cookies as $key => $value) {
-            if (\starts_with($key, [$fokus . "_engine_", $fokus . "_setting_"]) || strpos($key, $fokus . '_blpage') === 0 || $key === 'dark_mode') {
+            if (\starts_with($key, [$fokus . "_engine_", $fokus . "_setting_"]) || strpos($key, $fokus . '_blpage') === 0 || $key === 'dark_mode' || $key === 'new_tab' || $key === 'key' || $key === 'zitate') {
                 $settingActive = true;
             }
         }
 
         # Reading cookies for black list entries
         $blacklist = [];
-        foreach($cookies as $key => $value){
-            if(stripos($key, 'blpage') !== false && stripos($key, $fokus) !== false){
+        foreach ($cookies as $key => $value) {
+            if (stripos($key, 'blpage') !== false && stripos($key, $fokus) !== false) {
                 $blacklist[$key] = $value;
             }
         }
@@ -147,7 +147,6 @@ class SettingsController extends Controller
         }
 
         return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url])));
-
     }
 
     public function enableSearchEngine(Request $request)
@@ -163,11 +162,10 @@ class SettingsController extends Controller
         if (Cookie::get($fokus . "_engine_" . $suma) !== null) {
             $path = \Request::path();
             $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
-            Cookie::queue($fokus . "_engine_" . $suma, "", 0, $cookiePath, null, false, false);
+            Cookie::queue($fokus . "_engine_" . $suma, "", 525600, $cookiePath, null, false, false);
         }
 
         return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url])));
-
     }
 
     public function enableFilter(Request $request)
@@ -202,38 +200,42 @@ class SettingsController extends Controller
         }
 
         return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url])));
-
     }
 
-    public function enableSetting(Request $request) {
+    public function enableSetting(Request $request)
+    {
         $fokus = $request->input('fokus', '');
         $url = $request->input('url', '');
         // Currently only the setting for quotes is supported
 
         $quotes = $request->input('zitate', '');
-        if(!empty($quotes)){
-            if($quotes === "off"){
-                $path = \Request::path();
-                $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
-                Cookie::queue($fokus . "_setting_zitate", "off", 0, $cookiePath, null, false, false);
-            }elseif($quotes === "on") {
-                $path = \Request::path();
-                $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
-                Cookie::queue($fokus . "_setting_zitate", "", 0, $cookiePath, null, false, false);
+        if (!empty($quotes)) {
+            if ($quotes === "off") {
+                Cookie::queue('zitate', 'off', 525600, '/', null, false, false);
+            } elseif ($quotes === "on") {
+                Cookie::queue('zitate', '', 0, '/', null, false, false);
             }
         }
 
         $darkmode = $request->input('dm');
-        if(!empty($darkmode)){
-            if($darkmode === "off"){
-                Cookie::queue('dark_mode', '1', 0, '/', null, false, false);
-            }elseif($darkmode === "on") {
-                Cookie::queue('dark_mode', '2', 0, '/', null, false, false);
-            }elseif($darkmode === "system"){
+        if (!empty($darkmode)) {
+            if ($darkmode === "off") {
+                Cookie::queue('dark_mode', '1', 525600, '/', null, false, false);
+            } elseif ($darkmode === "on") {
+                Cookie::queue('dark_mode', '2', 525600, '/', null, false, false);
+            } elseif ($darkmode === "system") {
                 Cookie::queue('dark_mode', '', 0, '/', null, false, false);
             }
         }
 
+        $newTab = $request->input('nt');
+        if (!empty($newTab)) {
+            if ($newTab === "off") {
+                Cookie::queue('new_tab', '', 0, '/', null, false, false);
+            } elseif ($newTab === "on") {
+                Cookie::queue('new_tab', 'on', 525600, '/', null, false, false);
+            }
+        }
 
         return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url])));
     }
@@ -253,10 +255,18 @@ class SettingsController extends Controller
                 $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
                 Cookie::queue($key, "", 0, $cookiePath, null, false, false);
             }
-            if($key === 'dark_mode'){
+            if ($key === 'dark_mode') {
+                Cookie::queue($key, "", 0, '/', null, false, false);
+            }
+            if ($key === 'new_tab') {
+                Cookie::queue($key, "", 0, '/', null, false, false);
+            }
+            if ($key === 'key') {
+                Cookie::queue($key, "", 0, '/', null, false, false);
+            }
+            if ($key === 'zitate') {
                 Cookie::queue($key, "", 0, '/', null, false, false);
             }
-
         }
         $this->clearBlacklist($request);
 
@@ -279,13 +289,18 @@ class SettingsController extends Controller
         $key = $request->input('key', '');
         $path = \Request::path();
         $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
-        if($key === 'dark_mode'){
+        if ($key === 'dark_mode') {
+            Cookie::queue($key, "", 0, '/', null, false, false);
+        } elseif ($key === 'new_tab') {
+            Cookie::queue($key, "", 0, '/', null, false, false);
+        } elseif ($key === 'key') {
             Cookie::queue($key, "", 0, '/', null, false, false);
-        }else{
+        } elseif ($key === 'zitate') {
+            Cookie::queue($key, "", 0, '/', null, false, false);
+        } else {
             Cookie::queue($key, "", 0, $cookiePath, null, false, false);
         }
         return redirect($request->input('url', 'https://metager.de'));
-
     }
 
     public function removeAllSettings(Request $request)
@@ -294,9 +309,15 @@ class SettingsController extends Controller
         $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
 
         foreach (Cookie::get() as $key => $value) {
-            if($key === 'dark_mode'){
-                Cookie::queue($key, "", 0, '/', null, false, false);    
-            }else{
+            if ($key === 'dark_mode') {
+                Cookie::queue($key, "", 0, '/', null, false, false);
+            } elseif ($key === 'new_tab') {
+                Cookie::queue($key, "", 0, '/', null, false, false);
+            } elseif ($key === 'key') {
+                Cookie::queue($key, "", 0, '/', null, false, false);
+            } elseif ($key === 'zitate') {
+                Cookie::queue($key, "", 0, '/', null, false, false);
+            } else {
                 Cookie::queue($key, "", 0, $cookiePath, null, false, false);
             }
         }
@@ -311,13 +332,12 @@ class SettingsController extends Controller
         $regexProtocol = '#^([a-z]{0,5}://)?(www.)?#';
         $blacklist = preg_filter($regexProtocol, '', $request->input('blacklist'));
 
-        if(stripos($blacklist, '/') !== false){
+        if (stripos($blacklist, '/') !== false) {
             $blacklist = substr($blacklist, 0, stripos($blacklist, '/'));
         }
 
         $regexUrl = '#^(\*\.)?[a-z0-9]+(\.[a-z0-9]+)?(\.[a-z0-9]{2,})$#';
-        if(preg_match($regexUrl, $blacklist) === 1){
-
+        if (preg_match($regexUrl, $blacklist) === 1) {
             $path = \Request::path();
             $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
             $cookies = Cookie::get();
@@ -326,22 +346,22 @@ class SettingsController extends Controller
 
             ksort($cookies);
 
-            if(!empty($cookies)){
+            if (!empty($cookies)) {
                 foreach ($cookies as $key => $value) {
-                    if(stripos($key, $fokus . '_blpage') === 0){
-                        if($value === $blacklist){
+                    if (stripos($key, $fokus . '_blpage') === 0) {
+                        if ($value === $blacklist) {
                             $noduplicate = false;
                             break;
                         }
-                        if((int)(substr($key,strlen($fokus . '_blpage'))) === $cookieCounter){
+                        if ((int)(substr($key, strlen($fokus . '_blpage'))) === $cookieCounter) {
                             $cookieCounter++;
                         }
                     }
                 }
             }
-            if($noduplicate && !empty($blacklist) > 0 && strlen($blacklist) <= 255){
+            if ($noduplicate && !empty($blacklist) > 0 && strlen($blacklist) <= 255) {
                 $cookieName= $fokus.'_blpage'.$cookieCounter;
-                Cookie::queue($cookieName, $blacklist, 0, $cookiePath, null, false, false);
+                Cookie::queue($cookieName, $blacklist, 525600, $cookiePath, null, false, false);
             }
         }
         return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url])));
@@ -370,8 +390,8 @@ class SettingsController extends Controller
         $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
         $cookies = Cookie::get();
         
-        foreach($cookies as $key => $value){
-            if(stripos($key, $fokus . '_blpage') === 0) {
+        foreach ($cookies as $key => $value) {
+            if (stripos($key, $fokus . '_blpage') === 0) {
                 Cookie::queue($key, "", 0, $cookiePath, null, false, false);
             }
         }
@@ -381,40 +401,50 @@ class SettingsController extends Controller
 
     public function loadSettings(Request $request)
     {
-        
         $path = \Request::path();
         $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
 
-        $sumaFile = MetaGer::getLanguageFile();
-        $sumaFile = json_decode(file_get_contents($sumaFile), true);
-        
-        $foki = array_keys($sumaFile['foki']);
-        $regexUrl = '#^(\*\.)?[a-z0-9]+(\.[a-z0-9]+)?(\.[a-z0-9]{2,})$#';
+        $langFile = MetaGer::getLanguageFile();
+        $langFile = json_decode(file_get_contents($langFile));
 
+        $regexUrl = '#^(\*\.)?[a-z0-9]+(\.[a-z0-9]+)?(\.[a-z0-9]{2,})$#';
 
-        $cookies = $request->all();
-        foreach($cookies as $key => $value){
-            $blpage = false;
-            foreach($foki as $fokus){
-                if(strpos($key, $fokus . '_blpage') === 0 && preg_match($regexUrl, $value) === 1){
-                    Cookie::queue($key, $value, 0, $cookiePath, null, false, false);
-                    $blpage = true;
+        $settings = $request->all();
+        foreach ($settings as $key => $value) {
+            if ($key === 'key') {
+                $memberKey = new Key($value);
+                if ($memberKey->getStatus()) {
+                    Cookie::queue($key, $value, 525600, '/', null, false, false);
                 }
-            }
-            if($blpage){
-                continue;
-            }
-            if($key === 'dark_mode'){
-                Cookie::queue($key, $value, 0, '/', null, false, false);
-            }
-            foreach($sumaFile['filter']['parameter-filter'] as $suma => $filter){
-                if($key === $suma && $value === $filter){
-                    Cookie::queue($key, $value, 0, $cookiePath, null, false, false);
+            } elseif ($key === 'dark_mode' && ($value === '1' || $value === '2')) {
+                Cookie::queue($key, $value, 525600, '/', null, false, false);
+            } elseif ($key === 'new_tab' && $value === 'on') {
+                Cookie::queue($key, 'on', 525600, '/', null, false, false);
+            } elseif ($key === 'zitate' && $value === 'off') {
+                Cookie::queue($key, 'off', 525600, '/', null, false, false);
+            } else {
+                foreach ($langFile->foki as $fokus => $fokusInfo) {
+                    if (strpos($key, $fokus . '_blpage') === 0 && preg_match($regexUrl, $value) === 1) {
+                        Cookie::queue($key, $value, 525600, $cookiePath, null, false, false);
+                    } elseif (strpos($key, $fokus.'_setting_') === 0) {
+                        foreach ($langFile->filter->{'parameter-filter'} as $parameter) {
+                            foreach ($parameter->values as $p => $v) {
+                                if ($key === $fokus.'_setting_' . $parameter->{'get-parameter'} && $value === $p) {
+                                    Cookie::queue($key, $value, 525600, $cookiePath, null, false, false);
+                                }
+                            }
+                        }
+                    } else {
+                        $sumalist = array_keys($this->getSumas($fokus));
+                        foreach ($sumalist as $suma) {
+                            if (strpos($key, $fokus . '_engine_' . $suma) === 0) {
+                                Cookie::queue($key, 'off', 525600, $cookiePath, null, false, false);
+                            }
+                        }
+                    }
                 }
-
             }
         }
-
         return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), url('/')));
     }
 }
diff --git a/app/Http/Controllers/Stresstest.php b/app/Http/Controllers/Stresstest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4114a8c6c4c9f7766c78c55a406ead2d65aa7f0
--- /dev/null
+++ b/app/Http/Controllers/Stresstest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App;
+use App\MetaGer;
+use Cache;
+use Illuminate\Http\Request;
+use LaravelLocalization;
+use Log;
+use View;
+
+/* The controller uses the MetaGers dummy engine ( documentation: https:\/\/gitlab.metager.de\/open-source\/dummy-engine )
+*  to generate a list of test results for stress testing purposes at "/admin/stress".
+*  For local testing go to config/stress.json and change sumas->dummy->host to "dummy-nginx".
+*  To activate browser and human verfication use the following route: "/admin/stress/verify".
+*/ 
+class Stresstest extends MetaGerSearch
+{
+    public function index(Request $request, MetaGer $metager, $timing = false)
+    {
+        # adds / replaces query input with a random string to avoid cached results
+        $request->merge(["eingabe" => "test" . rand()]);
+
+        # deactivates adgoal
+        $metager->setDummy(true);
+        $metager->setAdgoalHash(true);
+
+        parent::search($request, $metager, $timing);
+    }
+}
\ No newline at end of file
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index cb14ae7025a3077233dfb5cd09cd401242a20a52..e5eb7fc686bc6c83efc1d401d68080e329df9f41 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -63,5 +63,6 @@ class Kernel extends HttpKernel
         'humanverification' => \App\Http\Middleware\HumanVerification::class,
         'useragentmaster' => \App\Http\Middleware\UserAgentMaster::class,
         'browserverification' => \App\Http\Middleware\BrowserVerification::class,
+        'keyvalidation' => \App\Http\Middleware\KeyValidation::class,
     ];
 }
diff --git a/app/Http/Middleware/BrowserVerification.php b/app/Http/Middleware/BrowserVerification.php
index f8ec4a32f4fd904c6d869a4605ce335ebcfe413e..0c1537db1edc33b30ae9e8a0af7c73e1ee8f5b21 100644
--- a/app/Http/Middleware/BrowserVerification.php
+++ b/app/Http/Middleware/BrowserVerification.php
@@ -18,7 +18,17 @@ class BrowserVerification
      */
     public function handle($request, Closure $next)
     {
-        if ($request->filled("loadMore") && Cache::has($request->input("loadMore"))) {
+
+        if(($request->input("out", "") === "api" || $request->input("out", "") === "atom10") && app('App\Models\Key')->getStatus()) {
+            header('Content-type: application/xml; charset=utf-8');
+        } elseif(($request->input("out", "") === "api" || $request->input("out", "") === "atom10") && !app('App\Models\Key')->getStatus()) {
+            abort(403);
+        } else {
+            header('Content-type: text/html; charset=utf-8');
+        }
+        header('X-Accel-Buffering: no');
+
+        if (($request->filled("loadMore") && Cache::has($request->input("loadMore"))) || app('App\Models\Key')->getStatus()) {
             return $next($request);
         }
 
@@ -55,9 +65,6 @@ class BrowserVerification
             }
         }
 
-        header('Content-type: text/html; charset=utf-8');
-        header('X-Accel-Buffering: no');
-
         $key = md5($request->ip() . microtime(true));
 
         echo(view('layouts.resultpage.verificationHeader')->with('key', $key)->render());
diff --git a/app/Http/Middleware/HumanVerification.php b/app/Http/Middleware/HumanVerification.php
index 805c86488a1e11b324ea55485f164d9eeb441e67..43997ee9ee90585bcce2a480bd8cfbefb35a077f 100644
--- a/app/Http/Middleware/HumanVerification.php
+++ b/app/Http/Middleware/HumanVerification.php
@@ -41,12 +41,12 @@ class HumanVerification
             unset($_SERVER["AGENT"]);
 
             /**
-             * If the user sends a Password or a key
+             * If the user sends a valid key or an appversion
              * We will not verificate the user.
              * If someone that uses a bot finds this out we
              * might have to change it at some point.
              */
-            if ($request->filled('password') || $request->filled('key') || Cookie::get('key') !== null || $request->filled('appversion') || !env('BOT_PROTECTION', false)) {
+            if ($request->filled('appversion') || !env('BOT_PROTECTION', false) || app('App\Models\Key')->getStatus()) {
                 $update = false;
                 return $next($request);
             }
diff --git a/app/MetaGer.php b/app/MetaGer.php
index 11b2126bf549183e0e9f4ca87280248c8eb1fa36..2da7805ba743fb79059cbfaceb0a0a829746bb3e 100644
--- a/app/MetaGer.php
+++ b/app/MetaGer.php
@@ -78,6 +78,7 @@ class MetaGer
     protected $redisEngineResult;
     protected $redisCurrentResultList;
     public $starttime;
+    protected $dummy = false;
 
     public function __construct($hash = "")
     {
@@ -206,33 +207,12 @@ class MetaGer
                         ->with('browser', (new Agent())->browser())
                         ->with('fokus', $this->fokus);
                     break;
-                case 'rich':
-                    return view('resultpages.metager3rich')
-                        ->with('results', $viewResults)
-                        ->with('eingabe', $this->eingabe)
-                        ->with('mobile', $this->mobile)
-                        ->with('warnings', $this->warnings)
-                        ->with('errors', $this->errors)
-                        ->with('apiAuthorized', $this->apiAuthorized)
-                        ->with('metager', $this)
-                        ->with('browser', (new Agent())->browser())
-                        ->with('fokus', $this->fokus);
-                    break;
-                case 'rss20':
-                    return view('resultpages.metager3resultsrss20')
-                        ->with('results', $viewResults)
-                        ->with('eingabe', $this->eingabe)
-                        ->with('apiAuthorized', $this->apiAuthorized)
-                        ->with('metager', $this)
-                        ->with('resultcount', sizeof($viewResults))
-                        ->with('fokus', $this->fokus);
-                    break;
+                
                 case 'api':
-                    return response()->view('resultpages.metager3resultsatom10', ['results' => $viewResults, 'eingabe' => $this->eingabe, 'metager' => $this, 'resultcount' => sizeof($viewResults), 'key' => $this->apiKey, 'apiAuthorized' => $this->apiAuthorized])->header('Content-Type', 'application/xml');
+                    return view('resultpages.metager3resultsatom10', ['eingabe' => $this->eingabe, 'resultcount' => sizeof($viewResults), 'key' => $this->apiKey, 'metager' => $this]);
                     break;
                 case 'atom10':
-                    return response()->view('resultpages.metager3resultsatom10', ['results' => $viewResults, 'eingabe' => $this->eingabe, 'metager' => $this, 'resultcount' => sizeof($viewResults), 'key' => $this->apiKey, 'apiAuthorized' => true])
-                        ->header('Content-Type', 'application/xml');
+                    return view('resultpages.metager3resultsatom10', ['eingabe' => $this->eingabe, 'resultcount' => sizeof($viewResults), 'key' => $this->apiKey, 'metager' => $this]);
                     break;
                 case 'result-count':
                     # Wir geben die Ergebniszahl und die benötigte Zeit zurück:
@@ -321,7 +301,7 @@ class MetaGer
         if (empty($this->adgoalLoaded)) {
             $this->adgoalLoaded = false;
         }
-        if (!$this->apiAuthorized && !$this->adgoalLoaded) {
+        if (!$this->apiAuthorized && !$this->adgoalLoaded && !$this->dummy) {
             if (empty($this->adgoalHash)) {
                 if (!empty($this->jskey)) {
                     $js = Redis::connection('cache')->lpop("js" . $this->jskey);
@@ -446,7 +426,7 @@ class MetaGer
         if ($publicKey === false) {
             return true;
         }
-        $tldList = "";
+        $linkList = "";
         foreach ($results as $result) {
             if (!$result->new) {
                 continue;
@@ -455,18 +435,34 @@ class MetaGer
             if (strpos($link, "http") !== 0) {
                 $link = "http://" . $link;
             }
-            $tldList .= parse_url($link, PHP_URL_HOST) . ",";
-            $result->tld = parse_url($link, PHP_URL_HOST);
+            $linkList .= $link . ",";
         }
-        $tldList = rtrim($tldList, ",");
+
+        $linkList = rtrim($linkList, ",");
 
         # Hashwert
-        $hash = md5("meta" . $publicKey . $tldList . "GER");
+        $hash = md5($linkList . $privateKey);
 
         # Query
         $query = $this->q;
 
-        $link = "https://api.smartredirect.de/api_v2/CheckForAffiliateUniversalsearchMetager.php?p=" . urlencode($publicKey) . "&k=" . urlencode($hash) . "&tld=" . urlencode($tldList) . "&q=" . urlencode($query);
+        $link = "https://xf.gdprvalidate.de/v4/check";
+
+        # Which country to use
+        # Will be de for metager.de and en for metager.org
+        $country = "de";
+        if (LaravelLocalization::getCurrentLocale() === "en") {
+            $country = "en";
+        }
+
+        $postfields = [
+            "key" => $publicKey,
+            "panel" => "ZMkW9eSKJS",
+            "member" => "338b9Bnm",
+            "signature" => $hash,
+            "links" => $linkList,
+            "country" => $country,
+        ];
 
         // Submit fetch job to worker
         $mission = [
@@ -475,9 +471,15 @@ class MetaGer
             "useragent" => "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0",
             "username" => null,
             "password" => null,
-            "headers" => null,
+            "headers" => [
+                "Content-Type" => "application/x-www-form-urlencoded"
+            ],
             "cacheDuration" => 60,
             "name" => "Adgoal",
+            "curlopts" => [
+                CURLOPT_POST => true,
+                CURLOPT_POSTFIELDS => \http_build_query($postfields)
+            ]
         ];
         $mission = json_encode($mission);
         Redis::rpush(\App\MetaGer::FETCHQUEUE_KEY, $mission);
@@ -495,7 +497,7 @@ class MetaGer
         if ($hash === true) {
             return true;
         }
-
+        
         if ($waitForResult) {
             while (microtime(true) - $startTime < 5) {
                 $answer = Cache::get($hash);
@@ -511,39 +513,24 @@ class MetaGer
         if ($answer === null) {
             return false;
         }
+        
         try {
-            $answer = json_decode($answer);
-            $publicKey = getenv('adgoal_public');
-            $privateKey = getenv('adgoal_private');
-
-            # Nun müssen wir nur noch die Links für die Advertiser ändern:
-            foreach ($results as $result) {
-                $link = $result->link;
-                $result->tld = parse_url($link, PHP_URL_HOST);
-            }
+            $answer = json_decode($answer, true);
 
-            foreach ($answer as $el) {
-                $hoster = $el[0];
-                $hash = $el[1];
+            foreach ($answer as $partnershop) {
+                $targetUrl = $partnershop["url"];
 
                 foreach ($results as $result) {
-                    if ($hoster === $result->tld && !$result->partnershop) {
-                        # Hier ist ein Advertiser:
-                        # Das Logo hinzufügen:
+                    if ($result->link === $targetUrl && !$result->partnershop) {
+                        # Ein Advertiser gefunden
                         if ($result->image !== "") {
-                            $result->logo = "https://img.smartredirect.de/logos_v2/60x30/" . urlencode($hash) . ".gif";
+                            $result->logo = $partnershop["logo"];
                         } else {
-                            $result->image = "https://img.smartredirect.de/logos_v2/120x60/" . urlencode($hash) . ".gif";
+                            $result->image = $partnershop["logo"];
                         }
 
                         # Den Link hinzufügen:
-                        $targetUrl = $result->link;
-                        # Query
-                        $query = $this->q;
-
-                        $gateHash = md5($targetUrl . $privateKey);
-                        $newLink = "https://api.smartredirect.de/api_v2/ClickGate.php?p=" . urlencode($publicKey) . "&k=" . urlencode($gateHash) . "&url=" . urlencode($targetUrl) . "&q=" . urlencode($query);
-                        $result->link = $newLink;
+                        $result->link = $partnershop["click_url"];
                         $result->partnershop = true;
                         $result->changed = true;
                     }
@@ -577,30 +564,7 @@ class MetaGer
 
     public function authorize($key)
     {
-        $postdata = http_build_query(array(
-            'dummy' => rand(),
-        ));
-        $opts = array(
-            'http' => array(
-                'method' => 'POST',
-                'header' => 'Content-type: application/x-www-form-urlencoded',
-                'content' => $postdata,
-            ),
-        );
-
-        $context = stream_context_create($opts);
-
-        try {
-            $link = "https://key.metager3.de/" . urlencode($key) . "/request-permission/api-access";
-            $result = json_decode(file_get_contents($link, false, $context));
-            if ($result->{'api-access'} == true) {
-                return true;
-            } else {
-                return false;
-            }
-        } catch (\ErrorException $e) {
-            return false;
-        }
+        return app('App\Models\Key')->requestPermission();
     }
 
     /*
@@ -707,7 +671,7 @@ class MetaGer
 
         # Special case if search engines are disabled
         # Since bing is normally only active if a filter is set but it should be active, too if yahoo is disabled
-        if ($this->getFokus() === "web" && empty($this->enabledSearchengines["yahoo"]) && \Cookie::get("web_engine_bing") !== "off") {
+        if ($this->getFokus() === "web" && empty($this->enabledSearchengines["yahoo"]) && \Cookie::get("web_engine_bing") !== "off"  && isset($this->sumaFile->sumas->{"bing"})) {
             $this->enabledSearchengines["bing"] = $this->sumaFile->sumas->{"bing"};
         }
 
@@ -794,6 +758,10 @@ class MetaGer
             foreach ($this->engines as $engine) {
                 $keys[] = $engine->hash;
             }
+            # Noch searchengines enabled
+            if (empty($keys)) {
+                return;
+            }
             $cacheValues = Cache::many($keys);
             foreach ($this->engines as $engine) {
                 if ($cacheValues[$engine->hash] !== null) {
@@ -1055,7 +1023,7 @@ class MetaGer
      * Ende Suchmaschinenerstellung und Ergebniserhalt
      */
 
-    public function parseFormData(Request $request)
+    public function parseFormData(Request $request, $auth = true)
     {
         # Sichert, dass der request in UTF-8 formatiert ist
         if ($request->input('encoding', 'utf8') !== "utf8") {
@@ -1086,9 +1054,9 @@ class MetaGer
         $this->fokus = $request->input('focus', 'web');
         # Suma-File
         if (App::isLocale("en")) {
-            $this->sumaFile = config_path() . "/sumasEn.json";
+            $this->sumaFile = config_path() . ($this->dummy ? "/stress.json" : "/sumasEn.json");
         } else {
-            $this->sumaFile = config_path() . "/sumas.json";
+            $this->sumaFile = config_path() . ($this->dummy ? "/stress.json" : "/sumas.json");
         }
         if (!file_exists($this->sumaFile)) {
             die(trans('metaGer.formdata.cantLoad'));
@@ -1128,16 +1096,16 @@ class MetaGer
         $this->agent = new Agent();
         $this->mobile = $this->agent->isMobile();
         # Sprüche
-        if (!App::isLocale("de") || (\Cookie::has($this->getFokus() . '_setting_zitate') && \Cookie::get($this->getFokus() . '_setting_zitate') === "off")) {
-            $this->sprueche = "off";
+        if (!App::isLocale('de') || (\Cookie::has('zitate') && \Cookie::get('zitate') === 'off')) {
+            $this->sprueche = 'off';
         } else {
-            $this->sprueche = "on";
+            $this->sprueche = 'on';
         }
-        if ($request->filled("zitate") && $request->input('zitate') === "on" || $request->input('zitate') === "off") {
+        if ($request->filled('zitate') && $request->input('zitate') === 'on' || $request->input('zitate') === 'off') {
             $this->sprueche = $request->input('quotes');
         }
 
-        $this->newtab = $request->input('newtab', 'on');
+        $this->newtab = $request->input('new_tab', \Cookie::get('new_tab'));
         if ($this->newtab === "on") {
             $this->newtab = "_blank";
         } elseif ($this->framed) {
@@ -1191,7 +1159,7 @@ class MetaGer
                 $this->apiKey = "";
             }
         }
-        if ($this->apiKey) {
+        if ($this->apiKey && $auth) {
             $this->apiAuthorized = $this->authorize($this->apiKey);
         }
 
@@ -1247,7 +1215,7 @@ class MetaGer
 
         $this->out = $request->input('out', "html");
         # Standard output format html
-        if ($this->out !== "html" && $this->out !== "json" && $this->out !== "results" && $this->out !== "results-with-style" && $this->out !== "result-count" && $this->out !== "rss20" && $this->out !== "atom10" && $this->out !== "rich" && $this->out !== "api") {
+        if ($this->out !== "html" && $this->out !== "json" && $this->out !== "results" && $this->out !== "results-with-style" && $this->out !== "result-count" && $this->out !== "atom10" && $this->out !== "api") {
             $this->out = "html";
         }
         # Wir schalten den Cache aus, wenn die Ergebniszahl überprüft werden soll
@@ -1267,8 +1235,12 @@ 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(), $this->sprueche);
-        return $quicktips;
+        if (!$this->dummy) {
+            $quicktips = new \App\Models\Quicktips\Quicktips($this->q, LaravelLocalization::getCurrentLocale(), $this->getTime(), $this->sprueche);
+            return $quicktips;
+        } else {
+            return null;
+        }
     }
 
 
@@ -2068,4 +2040,9 @@ class MetaGer
     {
         $this->engines = $engines;
     }
+
+    public function setDummy($dummy)
+    {
+        $this->dummy = $dummy;
+    }
 }
diff --git a/app/Models/Key.php b/app/Models/Key.php
new file mode 100644
index 0000000000000000000000000000000000000000..7748e1046cfc1de1fa3842435556a12c5bb2cf94
--- /dev/null
+++ b/app/Models/Key.php
@@ -0,0 +1,79 @@
+<?php
+
+namespace App\Models;
+
+class Key
+{
+    public $key;
+    public $status; # valid key = true, invalid key = false, unidentified key = null
+    private $keyserver = "https://key.metager.de/";
+
+    public function __construct($key, $status = null)
+    {
+        $this->key = $key;
+        $this->status = $status;
+        if (getenv("APP_ENV") !== "production") {
+            $this->keyserver = "https://dev.key.metager.de/";
+        }
+    }
+
+    # always returns true or false
+    public function getStatus()
+    {
+        if ($this->key !== '' && $this->status === null) {
+            $this->updateStatus();
+        }
+        if ($this->status === null || $this->status === false) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    
+    public function updateStatus()
+    {
+        try {
+            $link = $this->keyserver . urlencode($this->key) . "/request-permission/api-access";
+            $result = json_decode(file_get_contents($link));
+            if ($result->{'api-access'} == true) {
+                $this->status = true;
+                return true;
+            } else {
+                $this->status = false;
+                return false;
+            }
+        } catch (\ErrorException $e) {
+            return false;
+        }
+    }
+
+    public function requestPermission()
+    {
+        $postdata = http_build_query(array(
+            'dummy' => 0,
+        ));
+        $opts = array(
+            'http' => array(
+                'method' => 'POST',
+                'header' => 'Content-type: application/x-www-form-urlencoded',
+                'content' => $postdata,
+            ),
+        );
+
+        $context = stream_context_create($opts);
+
+        try {
+            $link = $this->keyserver . urlencode($this->key) . "/request-permission/api-access";
+            $result = json_decode(file_get_contents($link, false, $context));
+            if ($result->{'api-access'} == true) {
+                return true;
+            } else {
+                $this->status = false;
+                return false;
+            }
+        } catch (\ErrorException $e) {
+            return false;
+        }
+    }
+}
diff --git a/app/Models/parserSkripte/Bing.php b/app/Models/parserSkripte/Bing.php
index d8f096cc71ab8215459e3224b764fde2a3101380..ba894665af1f07b6fcb38ea2c4552e19b2dc3db6 100644
--- a/app/Models/parserSkripte/Bing.php
+++ b/app/Models/parserSkripte/Bing.php
@@ -4,6 +4,7 @@ namespace app\Models\parserSkripte;
 
 use App\Models\Searchengine;
 use Log;
+use LaravelLocalization;
 
 class Bing extends Searchengine
 {
@@ -12,6 +13,16 @@ class Bing extends Searchengine
     public function __construct($name, \stdClass $engine, \App\MetaGer $metager)
     {
         parent::__construct($name, $engine, $metager);
+
+        if(LaravelLocalization::getCurrentLocale() === 'en'){
+            $langFile = $metager->getLanguageFile();
+            $langFile = json_decode(file_get_contents($langFile));
+            $acceptLanguage = $metager->request->headers->all()['accept-language'][0];
+            foreach($langFile->filter->{'parameter-filter'}->language->sumas->bing->values as $key => $value){
+                if(stripos($acceptLanguage, "en") === 0 && stripos($acceptLanguage, $value) === 0)
+                $this->engine->{"get-parameter"}->mkt =  $value;
+            }
+        }
     }
 
     public function loadResults($result)
diff --git a/app/Models/parserSkripte/Dummy.php b/app/Models/parserSkripte/Dummy.php
new file mode 100644
index 0000000000000000000000000000000000000000..8dc7af0b74865eb2457f936918d38e90ce98337a
--- /dev/null
+++ b/app/Models/parserSkripte/Dummy.php
@@ -0,0 +1,85 @@
+<?php
+
+namespace app\Models\parserSkripte;
+
+use App\Models\Searchengine;
+use Log;
+use LaravelLocalization;
+
+class Dummy extends Searchengine
+{
+    public $results = [];
+
+    public function __construct($name, \stdClass $engine, \App\MetaGer $metager)
+    {
+        parent::__construct($name, $engine, $metager);
+    }
+
+    public function loadResults($result)
+    {
+        try {
+            $content = json_decode($result);
+            if (!$content) {
+                return;
+            }
+
+            foreach ($content as $result) {
+                    $title = $result->title;
+                    $link = $result->link;
+                    $anzeigeLink = $link;
+                    $descr = $result->descr;
+                    $this->counter++;
+                    $this->results[] = new \App\Models\Result(
+                        $this->engine,
+                        $title,
+                        $link,
+                        $anzeigeLink,
+                        $descr,
+                        $this->engine->{"display-name"},$this->engine->homepage,
+                        $this->counter
+                    );
+            }
+        } catch (\Exception $e) {
+            Log::error("A problem occurred parsing results from $this->name:");
+            Log::error($e->getMessage());
+            return;
+        }
+    }
+    public function getNext(\App\MetaGer $metager, $result)
+    {
+        try {
+            $results = json_decode($result);
+
+            $newEngine = unserialize(serialize($this->engine));
+
+            $perPage = 0;
+            if(isset($newEngine->{"get-parameter"}->count)){
+                $perPage = $newEngine->{"get-parameter"}->count;
+            } else {
+                $perPage = 10;
+            }
+
+            $offset = 0;
+            if(empty($newEngine->{"get-parameter"}->skip)){
+                $offset = $perPage;
+            } else {
+                $offset = $newEngine->{"get-parameter"}->skip + $perPage;
+            }
+
+            if (PHP_INT_MAX - $perPage < ($offset + $perPage)) {
+                return;
+            } else {
+                $newEngine->{"get-parameter"}->skip = strval($offset);
+            }
+
+            $next = new Dummy($this->name, $newEngine, $metager);
+            $this->next = $next;
+
+        } catch (\Exception $e) {
+            Log::error("A problem occurred parsing results from $this->name:");
+            Log::error($e->getMessage());
+            return;
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/app/Providers/KeyServiceProvider.php b/app/Providers/KeyServiceProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..d4922504a9abbed244d17b0f0571d2de6b701ee5
--- /dev/null
+++ b/app/Providers/KeyServiceProvider.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\ServiceProvider;
+use Request;
+use Cookie;
+use App\Models\Key;
+
+class KeyServiceProvider extends ServiceProvider
+{
+    /**
+     * Register services.
+     *
+     * @return void
+     */
+    public function register()
+    {
+        $key = "";
+        if(Cookie::has('key')) {
+            $key = Cookie::get('key');
+        }
+        if(Request::filled('key')) {
+            $key = Request::input('key');
+        }
+        $this->app->singleton(Key::class, function ($app) use ($key) {
+            return new Key($key);
+        });
+    }
+
+    /**
+     * Bootstrap services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        //
+    }
+}
diff --git a/config/app.php b/config/app.php
index 47828b33d594d301f7af0c023709b3032f90cd4f..67d46683195056c5ead15a83f219c69c5b5f740f 100644
--- a/config/app.php
+++ b/config/app.php
@@ -179,6 +179,7 @@ return [
         App\Providers\RouteServiceProvider::class,
         Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider::class,
         App\Providers\MetaGerProvider::class,
+        App\Providers\KeyServiceProvider::class,
         Jenssegers\Agent\AgentServiceProvider::class,
         Fideloper\Proxy\TrustedProxyServiceProvider::class,
         Mews\Captcha\CaptchaServiceProvider::class,
diff --git a/config/nginx-default-dev.conf b/config/nginx-default-dev.conf
new file mode 100644
index 0000000000000000000000000000000000000000..0424e725ec0a6ef5844cad5dd64bd58e149d3bee
--- /dev/null
+++ b/config/nginx-default-dev.conf
@@ -0,0 +1,55 @@
+server {
+    listen       80;
+    server_name  localhost;
+    root   /html/public;
+    index  index.php index.html index.htm;
+
+    #charset koi8-r;
+    #access_log  /var/log/nginx/host.access.log  main;
+
+    location / {
+        try_files $uri $uri/ /index.php?$query_string;
+    }
+
+    location ~ \.php$ {
+        try_files $uri /index.php =404;
+        fastcgi_split_path_info ^(.+\.php)(/.+)$;
+        fastcgi_pass phpfpm:9000;
+        fastcgi_index index.php;
+        fastcgi_read_timeout 900;
+        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+        include fastcgi_params;
+    }
+
+    #error_page  404              /404.html;
+
+    # redirect server error pages to the static page /50x.html
+    #
+    error_page   500 502 503 504  /50x.html;
+    location = /50x.html {
+        root   /usr/share/nginx/html;
+    }
+
+    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
+    #
+    #location ~ \.php$ {
+    #    proxy_pass   http://127.0.0.1;
+    #}
+
+    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
+    #
+    #location ~ \.php$ {
+    #    root           html;
+    #    fastcgi_pass   127.0.0.1:9000;
+    #    fastcgi_index  index.php;
+    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
+    #    include        fastcgi_params;
+    #}
+
+    # deny access to .htaccess files, if Apache's document root
+    # concurs with nginx's one
+    #
+    #location ~ /\.ht {
+    #    deny  all;
+    #}
+}
\ No newline at end of file
diff --git a/config/stress.json b/config/stress.json
new file mode 100644
index 0000000000000000000000000000000000000000..181de977f56660ea1cd120b9eccc317df7d7c0f7
--- /dev/null
+++ b/config/stress.json
@@ -0,0 +1,115 @@
+{
+    "sumas": {
+        "dummy": {
+            "host": "production-auto-deploy.dummy-engine-87.svc.cluster.local",
+            "path": "\/",
+            "port": 80,
+            "query-parameter": "q",
+            "input-encoding": "utf8",
+            "output-encoding": "utf8",
+            "parser-class": "Dummy",
+            "get-parameter": {},
+            "request-header": {},
+            "display-name": "dummy",
+            "engine-boost": 1,
+            "cache-duration": 0,
+            "disabled": false,
+            "filter-opt-in": false,
+            "homepage": "https:\/\/gitlab.metager.de\/open-source\/dummy-engine"
+        }
+    },
+    "foki": {
+        "web": {
+            "display-name": "index.foki.web",
+            "sumas": [
+                "dummy"
+            ],
+            "main": [
+                "dummy"
+            ]
+        }
+    },
+    "filter": {
+        "query-filter": {},
+        "parameter-filter": {
+            "count": {
+                "name": "metaGer.filter.count",
+                "desc": "",
+                "get-parameter": "count",
+                "values": {
+                    "10": "10",
+                    "20": "20",
+                    "30": "30",
+                    "40": "40",
+                    "50": "50",
+                    "100": "100"
+                },
+                "sumas": {
+                    "dummy": {
+                        "get-parameter": "count",
+                        "values": {
+                            "10": "10",
+                            "20": "20",
+                            "30": "30",
+                            "40": "40",
+                            "50": "50",
+                            "100": "100"
+                        }
+                    }
+                }
+            },
+            "min": {
+                "name": "metaGer.filter.min",
+                "desc": "",
+                "get-parameter": "min",
+                "values": {
+                    "nofilter" : "0",
+                    "2": "2",
+                    "4": "4",
+                    "6": "6",
+                    "8": "8",
+                    "10": "10"
+                },
+                "sumas": {
+                    "dummy": {
+                        "get-parameter": "min",
+                        "values": {
+                            "nofilter" : "0",
+                            "2": "2000",
+                            "4": "4000",
+                            "6": "6000",
+                            "8": "8000",
+                            "10": "10000"
+                        }
+                    }
+                }
+            },
+            "max": {
+                "name": "metaGer.filter.max",
+                "desc": "",
+                "get-parameter": "max",
+                "values": {
+                    "nofilter" : "0",
+                    "2": "2",
+                    "4": "4",
+                    "6": "6",
+                    "8": "8",
+                    "10": "10"
+                },
+                "sumas": {
+                    "dummy": {
+                        "get-parameter": "max",
+                        "values": {
+                            "nofilter" : "0",
+                            "2": "2000",
+                            "4": "4000",
+                            "6": "6000",
+                            "8": "8000",
+                            "10": "10000"
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/config/sumas.json.example b/config/sumas.json.example
new file mode 100644
index 0000000000000000000000000000000000000000..d9962295300d34cd9e18f60f20a883b3c251d36c
--- /dev/null
+++ b/config/sumas.json.example
@@ -0,0 +1,115 @@
+{
+    "sumas": {
+        "dummy": {
+            "host": "dummy-nginx",
+            "path": "\/",
+            "port": 80,
+            "query-parameter": "q",
+            "input-encoding": "utf8",
+            "output-encoding": "utf8",
+            "parser-class": "Dummy",
+            "get-parameter": {},
+            "request-header": {},
+            "display-name": "dummy",
+            "engine-boost": 1,
+            "cache-duration": -1,
+            "disabled": false,
+            "filter-opt-in": false,
+            "homepage": "https:\/\/gitlab.metager.de\/open-source\/dummy-engine"
+        }
+    },
+    "foki": {
+        "web": {
+            "display-name": "index.foki.web",
+            "sumas": [
+                "dummy"
+            ],
+            "main": [
+                "dummy"
+            ]
+        }
+    },
+    "filter": {
+        "query-filter": {},
+        "parameter-filter": {
+            "count": {
+                "name": "metaGer.filter.count",
+                "desc": "",
+                "get-parameter": "count",
+                "values": {
+                    "10": "10",
+                    "20": "20",
+                    "30": "30",
+                    "40": "40",
+                    "50": "50",
+                    "100": "100"
+                },
+                "sumas": {
+                    "dummy": {
+                        "get-parameter": "count",
+                        "values": {
+                            "10": "10",
+                            "20": "20",
+                            "30": "30",
+                            "40": "40",
+                            "50": "50",
+                            "100": "100"
+                        }
+                    }
+                }
+            },
+            "min": {
+                "name": "metaGer.filter.min",
+                "desc": "",
+                "get-parameter": "min",
+                "values": {
+                    "nofilter" : "0",
+                    "2": "2",
+                    "4": "4",
+                    "6": "6",
+                    "8": "8",
+                    "10": "10"
+                },
+                "sumas": {
+                    "dummy": {
+                        "get-parameter": "min",
+                        "values": {
+                            "nofilter" : "0",
+                            "2": "2000",
+                            "4": "4000",
+                            "6": "6000",
+                            "8": "8000",
+                            "10": "10000"
+                        }
+                    }
+                }
+            },
+            "max": {
+                "name": "metaGer.filter.max",
+                "desc": "",
+                "get-parameter": "max",
+                "values": {
+                    "nofilter" : "0",
+                    "2": "2",
+                    "4": "4",
+                    "6": "6",
+                    "8": "8",
+                    "10": "10"
+                },
+                "sumas": {
+                    "dummy": {
+                        "get-parameter": "max",
+                        "values": {
+                            "nofilter" : "0",
+                            "2": "2000",
+                            "4": "4000",
+                            "6": "6000",
+                            "8": "8000",
+                            "10": "10000"
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/config/sumas.xml.example b/config/sumas.xml.example
deleted file mode 100644
index c9de862dea063a45488e74ab7e220afcc89c7600..0000000000000000000000000000000000000000
--- a/config/sumas.xml.example
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<sumas>
-	<suma name="mnogosearch" host="mg3.suma-ev.de" skript="/cgi-bin/search.cgi" formData="q=&lt;&lt;QUERY&gt;&gt;&amp;cs=utf-8&amp;ps=20" package="mnogosearch" type="web" port="80" userSelectable="1" displayName="Wikis" outputEncoding="Latin1"/>
-	<suma name="BASE" host="baseapi.ub.uni-bielefeld.de" skript="/cgi-bin/BaseHttpSearchInterface.fcgi" formData="func=PerformSearch&amp;query=&lt;&lt;QUERY&gt;&gt;" package="BASE" port="80" formDataEn="func=PerformSearch&amp;query=&lt;&lt;QUERY&gt;&gt;" displayName="BASE" userSelectable="1" type="wissenschaft" homepage="http://www.base-search.net/"/>
-	<suma name="blogsearch" host="blogsuche.suma-ev.de" skript="/blogsearch/xmlout.php" formData="search=&lt;&lt;QUERY&gt;&gt;&amp;length=400&amp;rows=50&amp;category=&lt;&lt;CATEGORY&gt;&gt;" package="blogsearch" port="80" inputEncoding="utf8" displayName="Blogsuche" userSelectable="1" type="andere" engineBoost="0.2" homepage="http://blogsuche.suma-ev.de/blogsearch/index.php"/>
-</sumas>
diff --git a/docker-compose.yml b/docker-compose.yml
index 86f67380c09364af43322a4efa01b536faf09119..1b05b4f8884f4735a4cd1110436c4b5504b4dac3 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -56,7 +56,7 @@ services:
     volumes:
       - .:/html
       - ./config/nginx.conf:/etc/nginx/nginx.conf
-      - ./config/nginx-default.conf:/etc/nginx/conf.d/default.conf
+      - ./config/nginx-default-dev.conf:/etc/nginx/conf.d/default.conf
     ports: 
     - "8080:80"
   worker:
@@ -76,3 +76,14 @@ services:
     volumes:
       - .:/html
     command: "php artisan dusk"
+  dummy-phpfpm:
+    restart: on-failure
+    image: registry.metager.de/open-source/dummy-engine/master
+    working_dir: /html
+  dummy-nginx:
+    depends_on:
+      - "dummy-phpfpm"
+    restart: on-failure
+    image: registry.metager.de/open-source/dummy-engine/master
+    working_dir: /html
+    command: sh -c "sed -i 's/fastcgi_pass localhost:9000;/fastcgi_pass dummy-phpfpm:9000;/g' /etc/nginx/conf.d/default.conf && nginx"
\ No newline at end of file
diff --git a/init.sh b/init.sh
index 42af2efa729c488cf1e2ab9d83222a6d67111426..63305b0bdc1795424cbf2d708620b31977d1e2a0 100755
--- a/init.sh
+++ b/init.sh
@@ -7,6 +7,14 @@ if [ ! -f "/data/.env" ]; then
     cp /data/.env.example /data/.env
 fi
 
+if [ ! -f "/data/config/sumas.json" ]; then
+    cp /data/config/sumas.json.example /data/config/sumas.json
+fi
+
+if [ ! -f "/data/config/sumasEn.json" ]; then
+    cp /data/config/sumas.json.example /data/config/sumasEn.json
+fi
+
 if [ -f "/data/database/useragents.sqlite" ]; then
     rm /data/database/useragents.sqlite
 fi
diff --git a/resources/js/scriptResultPage.js b/resources/js/scriptResultPage.js
index 9caa935fae20f47e858cb0f8ea3272503a5cb7f2..18ce51a129fc0f6d50f281608680f144d8f93de7 100644
--- a/resources/js/scriptResultPage.js
+++ b/resources/js/scriptResultPage.js
@@ -5,11 +5,11 @@ $(document).ready(function () {
 });
 
 function botProtection() {
-  $('.result').find('a').click(function () {
+  $('.result').find('a').click(function (e) {
     var link = $(this).attr('href');
     var newtab = false;
     var top = false;
-    if ($(this).attr('target') == '_blank') {
+    if ($(this).attr('target') == '_blank' || e.ctrlKey) {
       newtab = true;
     } else if ($(this).attr('target') == "_top") {
       top = true;
@@ -32,10 +32,7 @@ function botProtection() {
           }
         }
       });
-    if (!newtab)
-      return false;
-    else
-      return true;
+    return newtab;
   });
 }
 
@@ -135,4 +132,4 @@ function loadMoreResults() {
       });
     }
   }, 1000);
-}
\ No newline at end of file
+}
diff --git a/resources/lang/de/key.php b/resources/lang/de/key.php
index c39f62f45b1f0f99f0586fc3277f26ee4334da06..f29f434b0c955872eb77b9fe56ae78593892bc20 100644
--- a/resources/lang/de/key.php
+++ b/resources/lang/de/key.php
@@ -7,8 +7,8 @@ return [
     'p3' => 'Wenn Sie sich den Cookie anschauen steht dort drin "key=xxxx". Wir verwenden diesen dementsprechend nicht für Tracking-Zwecke. Er wird auch zu keinem Zeitpunkt in irgendeiner Form von uns gespeichert oder geloggt.',
     'p4' => 'Wichtig: Um diese Funktion nutzen zu können, müssen Sie Cookies in Ihrem Browser zugelassen haben. Die Einstellung bleibt dann solange gespeichert, wie Ihr Browser Cookies speichert.',
     'p5' => 'Um den Schlüssel darüber hinausgehend speichern zu können haben Sie folgende Möglichkeiten:',
-    'li1' => 'Richten Sie sich <code>:url</code>',
-    'li2' => 'Falls Sie MetaGer als Standardsuchmaschine verwenden, können Sie nach der Schlüsseleingabe den Eintrag löschen und erneut hinzufügen. Wenn Sie in Ihrem Browser einen "Suchstring" eingeben müssen, können Sie <code>:url</code> verwenden.',
+    'li1' => 'Richten Sie sich folgenden Link als Startseite/Lesezeichen ein:',
+    'li2' => 'Falls Sie MetaGer als Standardsuchmaschine verwenden, können Sie nach der Schlüsseleingabe den Eintrag löschen und erneut hinzufügen. Wenn Sie in Ihrem Browser einen "Suchstring" eingeben müssen, können Sie folgenden verwenden:',
     'placeholder1' => 'Schlüssel eingeben...',
     'removeKey' => 'aktuellen Schlüssel entfernen',
     'invalidKey' => 'Der eingegebene Schlüssel ist ungültig',
diff --git a/resources/lang/de/metaGer.php b/resources/lang/de/metaGer.php
index 549fb420085adf703ddbed7a66adc4c1f25f43a6..220c08c0755427224e29241decb8321098258818 100644
--- a/resources/lang/de/metaGer.php
+++ b/resources/lang/de/metaGer.php
@@ -133,5 +133,10 @@ return [
 
     "filter.rabate" => "Min. Rabatt",
 
+    "filter.count" => "Anzahl",
+    "filter.skip" => "Ãœberspringen",
+    "filter.min" => "Minimum Sleep (in s)",
+    "filter.max" => "Maximum Sleep (in s)",
+
     "settings" => "Einstellungen",
 ];
diff --git a/resources/lang/de/plugin-desktop/desktop-edge.php b/resources/lang/de/plugin-desktop/desktop-edge.php
index 6eea328db40271b756722bf4df6a34c33217dda2..19334ba642ae0a6db23ddf6b97da39a0653c7ae4 100644
--- a/resources/lang/de/plugin-desktop/desktop-edge.php
+++ b/resources/lang/de/plugin-desktop/desktop-edge.php
@@ -14,7 +14,7 @@
         'default-search-v18.4' => 'Wählen Sie "MetaGer: Sicher suchen & finden..." und klicken Sie auf "Als Standard".',
 
         //Instructions for Edge version >= 80
-        'default-search-v80.1' => 'Geben Sie "edge://settings/searchEngines" in der Adressleiste ein, um in die Suchmaschineneinstellungen zu gelangen.',
+        'default-search-v80.1' => 'Öffnen Sie einen neuen Tab und geben Sie "edge://settings/searchEngines" in der Adressleiste ein, um in die Suchmaschineneinstellungen zu gelangen.',
         'default-search-v80.2' => 'Klicken Sie neben dem Eintrag von MetaGer auf "<i class="fa fa-ellipsis-h"></i>" und wählen Sie "Als Standard".',
 
         'default-page-v15.1' => 'Klicken Sie oben rechts im Browser auf "<i class="fa fa-ellipsis-h"></i>" und öffnen Sie die "Einstellungen".',
diff --git a/resources/lang/de/plugin-mobile/mobile-firefox.php b/resources/lang/de/plugin-mobile/mobile-firefox.php
index 0c215b31060a11f33fec129c547afbe668ed278c..eda9f8e1bcf70aca936ea90af5cac328e66ec53c 100644
--- a/resources/lang/de/plugin-mobile/mobile-firefox.php
+++ b/resources/lang/de/plugin-mobile/mobile-firefox.php
@@ -13,5 +13,7 @@
         'default-search-v80.2' => 'Wählen Sie den Menüpunkt "Einstellungen".',
         'default-search-v80.3' => 'In dem dann erscheinenden Menü wählen Sie in der Kategorie "Allgemein" den Menüpunkt "Suchen".',
         'default-search-v80.4' => 'Tippen Sie auf "+ Suchmaschine hinzufügen".',
-        'default-search-v80.5' => 'Wählen Sie "Andere" aus und tragen darunter den Namen (MetaGer) und den Such-String ein. Bestätigen Sie mit "<i class="fas fa-check"></i>" in der rechten oberen Ecke.',
+        'default-search-v80.5' => 'Wählen Sie "Andere" aus und tragen darunter den Namen (MetaGer) und den Such-String ein.',
+        'default-search-v80.6' => 'Bestätigen Sie mit "<i class="fas fa-check"></i>" in der rechten oberen Ecke.',
+        'default-search-v80.7' => 'Tippen Sie in der dann erscheinenden Liste auf MetaGer.',
     ];
diff --git a/resources/lang/de/plugin-page.php b/resources/lang/de/plugin-page.php
index 235f4dfc51354d7fcac95ba831838e5cf897a285..797c4e29214daa3f46d877ce2372d3875fd2f2d1 100644
--- a/resources/lang/de/plugin-page.php
+++ b/resources/lang/de/plugin-page.php
@@ -15,6 +15,9 @@ return [
     'head.9' => 'MetaGer zu UCBrowser hinzufügen',
     'head.10' => 'Metager zu Samsung Internet hinzufügen',
 
+    'search-engine.1' => 'Was macht eine Standardsuchmaschine?',
+    'search-engine.2' => 'Mit MetaGer als Standardsuchmaschine können Sie Ihren Browser anweisen Suchen, welche z.B. über die Adressleiste durchgeführt werden, automatisch von MetaGer beantworten zu lassen.',
+
     'browser-download' => 'Firefox herunterladen',
     'firefox-plugin' => 'MetaGer als Standardsuchmaschine mit Add-on einrichten',
     'firefox-default-search' => 'MetaGer als Standardsuchmaschine ohne Add-on einrichten',
diff --git a/resources/lang/de/settings.php b/resources/lang/de/settings.php
index a1b23f6e1102e655883d72213b155ccad658f4b9..3925e423a48bbcd475e9dbed2b284c7481e2d183 100644
--- a/resources/lang/de/settings.php
+++ b/resources/lang/de/settings.php
@@ -25,13 +25,17 @@ return [
     'add' => 'Hinzufügen',
     'clear' => 'Blacklist leeren',
     'copy' => 'Kopieren',
+    'hint' => 'Diese Einstellungen betreffen alle Fokusse und Unterseiten übergreifend!',
 
     'darkmode' => 'Dunklen Modus umschalten',
-    'darkmode-hint' => 'Die Einstellung für den dunklen Modus betrifft alle Fokusse und Unterseiten übergreifend!',
     'system' => 'Systemstandard',
     'dark' => 'Dunkel',
     'light' => 'Hell',
 
+    'newTab' => 'Ergebnisse in neuem Tab öffnen',
+    'off' => 'Aus',
+    'on' => 'An',
+
     // Translations from the settings overview
     'noSettings' => 'Aktuell sind keine Einstellungen gesetzt!',
     'allSettings.header' => 'Auf :root gesetzte Einstellungen',
@@ -45,5 +49,4 @@ return [
     'key' => 'Ihr Schlüssel für die werbefreie Suche',
     'blentry' => 'Blacklisteintrag',
     'removeCookie' => 'Diesen Cookie entfernen',
-    'dm' => 'Dunkler Modus',
 ];
diff --git a/resources/lang/de/team.php b/resources/lang/de/team.php
index 21bb3b5ec4f2e3661199bc7c64b1b5b6058cda29..163286560aadac0c8c1c9f79606c17b8da46ad3a 100644
--- a/resources/lang/de/team.php
+++ b/resources/lang/de/team.php
@@ -1,16 +1,16 @@
 <?php
 
 return [
-    'role.0' => 'geschäftsführender Vorstand',
-    'role.1' => 'Vorstand',
-    'role.2' => 'Jugendschutzbeauftragte',
-    'role.3' => 'Pressereferentin',
-    'role.4' => 'Programmierer',
-    'role.5' => 'Programmierer',
-    'role.6' => 'Programmiererin',
-    'role.7' => 'Sekretariat',
-    'role.8' => 'Founder',
-    'role.9' => 'Praktikant',
+    'role.0'    => 'geschäftsführender Vorstand',
+    'role.1'    => 'Vorstand',
+    'role.1.1'  => 'Vorständin',
+    'role.2'    => 'Jugendschutzbeauftragte',
+    'role.3'    => 'Pressereferentin',
+    'role.5'    => 'Programmierer',
+    'role.6'    => 'Programmiererin',
+    'role.7'    => 'Sekretariat',
+    'role.8'    => 'Founder',
+    'role.9'    => 'Praktikant',
 
     '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/key.php b/resources/lang/en/key.php
index 8026105ee2fefc9038bf01268a3d499dde2030d0..a78cb1fe3b7d01ec60431d39d5972a814409158d 100644
--- a/resources/lang/en/key.php
+++ b/resources/lang/en/key.php
@@ -7,7 +7,7 @@ return [
     'p3' => 'If you look at the cookie there is "key = xxxx" in there. We do not use it for tracking purposes. It is also never stored or logged by us in any way.',
     'p4' => 'Important: In order to use this function, you must have allowed cookies in your browser. The setting will remain saved as long as your browser saves cookies.',
     'p5' => 'In order to be able to save the key beyond that, you have the following options:',
-    'li1' => 'Set up <code>:url</code> as the start page in your browser.',
+    'li1' => 'Set the following URL as start page/bookmark in your browser:',
     'li2' => 'If you are using MetaGer as the default search engine, you can delete the entry after entering the key and add it again. If you have to enter a "search string" in your browser, you can use <code>:url</code>.',
     'placeholder1' => 'Enter key ...',
     'removeKey' => 'Remove current key',
diff --git a/resources/lang/en/metaGer.php b/resources/lang/en/metaGer.php
index 2af697cc3d9539792a3bef180ec1224a309084c8..66f0557cbba5b8f561f2c9a68a7f51206f04e2da 100644
--- a/resources/lang/en/metaGer.php
+++ b/resources/lang/en/metaGer.php
@@ -133,5 +133,10 @@ return [
 
     "filter.rabate" => "Min. Rabate",
 
+    "filter.count" => "Count",
+    "filter.skip" => "Skip",
+    "filter.min" => "Minimum sleep (in s)",
+    "filter.max" => "Maximum sleep (in s)",
+
     "settings" => "Settings",
 ];
diff --git a/resources/lang/en/plugin-mobile/mobile-firefox.php b/resources/lang/en/plugin-mobile/mobile-firefox.php
index eaa46c66284850ddeff273667f8c24f0e87956a8..19eba99427524ee8dde064477140df5dffbfdda4 100644
--- a/resources/lang/en/plugin-mobile/mobile-firefox.php
+++ b/resources/lang/en/plugin-mobile/mobile-firefox.php
@@ -13,5 +13,7 @@
         'default-search-v80.2' => 'Choose Settings.',
         'default-search-v80.3' => 'Under "General" pick "Search".',
         'default-search-v80.4' => 'Tap "+ Add search engine".',
-        'default-search-v80.5' => 'Choose "Other", enter "MetaGer" as name and the search string to use. Finally tap "<i class="fas fa-check"></i>" in the top right corner to save.',
+        'default-search-v80.5' => 'Choose "Other", enter "MetaGer" as name and the search string to use.',
+        'default-search-v80.6' => 'Tap "<i class="fas fa-check"></i>" in the top right corner to save.',
+        'default-search-v80.7' => 'Finally choose the MetaGer entry from the list.',
     ];
diff --git a/resources/lang/en/plugin-page.php b/resources/lang/en/plugin-page.php
index c70c0a794829a62b277018922508a6cb7be062c1..557aaefc6bdb6e08e9be68d0944cb01e9a84b361 100644
--- a/resources/lang/en/plugin-page.php
+++ b/resources/lang/en/plugin-page.php
@@ -15,6 +15,9 @@ return [
     'head.9' => 'Add MetaGer to your UCBrowser',
     'head.10' => 'Add MetaGer to your Samsung Internet',
 
+    'search-engine.1' => 'What is a default search engine?',
+    'search-engine.2' => 'With MetaGer as default searchengine you can instruct your browser to automatically use MetaGer when search queries are entered i.e. into the adress bar.',
+
     'browser-download' => 'Download Firefox',
     'firefox-plugin' => 'Set MetaGer as default search engine with add-on',
     'firefox-default-search' => 'Set MetaGer as default search engine without add-on',
diff --git a/resources/lang/en/settings.php b/resources/lang/en/settings.php
index 5bc3590ead6028d23dc7b25dc10958b545244fd5..d45aec158ba791736576d44560aca2baf292453c 100644
--- a/resources/lang/en/settings.php
+++ b/resources/lang/en/settings.php
@@ -25,13 +25,17 @@ return [
     'add' => 'Add',
     'clear' => 'Clear black list',
     'copy' => 'Copy',
+    'hint' => 'These settings affect all foci and sub-pages!',
 
     'darkmode' => 'Toggle dark mode',
-    'darkmode-hint' => 'The setting for dark mode affects all foci and sub-pages!',
     'system' => 'System Default',
     'dark' => 'Dark',
     'light' => 'Light',
 
+    'newTab' => 'Open results in new tabs',
+    'off' => 'off',
+    'on' => 'on',
+
     // Translations from the settings overview
     'noSettings' => "Currently no settings are set!",
     'allSettings.header' => "Settings on :root",
@@ -45,5 +49,4 @@ return [
     'key' => "Your key to the ad-free search",
     'blentry' => 'Black list entry',
     'removeCookie' => "Remove this cookie",
-    'dm' => 'Dark mode',
 ];
diff --git a/resources/lang/en/team.php b/resources/lang/en/team.php
index 6ca00fb4aa4382313360b59697abbc6ff0d00dfd..af2d52a7b75c5cb0588b3dac5e8139817a6d5f94 100644
--- a/resources/lang/en/team.php
+++ b/resources/lang/en/team.php
@@ -1,16 +1,16 @@
 <?php
 
 return [
-    "role.0" => "CEO",
-    "role.1" => "executive",
-    "role.2" => "youth protection commissioner",
-    "role.3" => "press secretary",
-    "role.4" => "programmer",
-    "role.5" => "programmer",
-    "role.6" => "programmer",
-    "role.7" => "secretary",
-    "role.8" => "founder",
-    "role.9" => "trainee",
+    "role.0"    => "CEO",
+    "role.1"    => "executive",
+    "role.1.1"  => "executive",
+    "role.2"    => "Youth protection commissioner",
+    "role.3"    => "press secretary",
+    "role.5"    => "programmer",
+    "role.6"    => "programmer",
+    "role.7"    => "secretary",
+    "role.8"    => "founder",
+    "role.9"    => "trainee",
     
     "contact.1" => "Please mail your questions/problems about MetaGer etc. to <a href=\"mailto:office@suma-ev.de\">office@suma-ev.de</a> or use the <a href=\"/en/kontakt/\">contact form with encryption</a>.",
     "contact.2" => "If you get any emails with strange contents from us please read more about this: <a href=\"https://metager.de/wsb/fakemail/\">https://metager.de/wsb/fakemail/</a>",
diff --git a/resources/lang/es/plugin-desktop/desktop-ie.php b/resources/lang/es/plugin-desktop/desktop-ie.php
new file mode 100644
index 0000000000000000000000000000000000000000..2491de5b0d7fd854e1e1418447b3b7571ae29f46
--- /dev/null
+++ b/resources/lang/es/plugin-desktop/desktop-ie.php
@@ -0,0 +1,14 @@
+<?php
+
+return [
+    "default-search-v9.1"	=>	"Haga clic en <a href=\"javascript:window.external.addSearchProvider($('link[rel=search]').attr('href'));\">aquí</a>, para agregar MetaGer como motor de búsqueda.",
+    "default-search-v9.2"	=>	"Seleccione \"Establecer este buscador como predeterminado\" y haga clic en \"Agregar\".",
+    "default-search-v11.1"	=>	"Haga clic en <a href=\"javascript:window.external.addSearchProvider($('link[rel=search]').attr('href'));\">aquí</a>, para agregar MetaGer como motor de búsqueda.",
+    "default-search-v11.2"	=>	"En la parte superior derecha de su navegador haga clic en \"<i class=\"fa fa-cog\" aria-hidden=\"true\"></i>\".",
+    "default-search-v11.3"	=>	"Seleccione el elemento del menú \"Administrar complementos\".",
+    "default-search-v11.4"	=>	"En la sección \"Tipos de complementos\", haga clic en \"Proveedores de búsqueda\", luego en el panel derecho pulse  MetaGer.",
+    "default-search-v11.5"	=>	"Confirmar pulsando en el botón \"Como predeterminado\" que tiene abajo.",
+    "default-page-v9.1"	=>	"Haga clic en <a href=\"/\" target=\"_blank\" rel=\"noopener\">aquí </a> para abrir MetaGer en una nueva pestaña.",
+    "default-page-v9.2"	=>	"En la nueva pestaña arriba a la izquierda, haga clic en la flecha junto a la <i class=\"fas fa-home\" aria-hidden=\"true\"> </i> y luego en \"Cambiar o agregar página de inicio\".",
+    "default-page-v9.3"	=>	"En la ventana emergente que aparece, seleccione \"Usar esta página como única página principal\" y luego haga clic en \"Sí\"."
+];
diff --git a/resources/lang/es/plugin-desktop/desktop-opera.php b/resources/lang/es/plugin-desktop/desktop-opera.php
new file mode 100644
index 0000000000000000000000000000000000000000..677fe71500ddfafdfc3fd7a989482f27a9c42103
--- /dev/null
+++ b/resources/lang/es/plugin-desktop/desktop-opera.php
@@ -0,0 +1,11 @@
+<?php
+
+return [
+    "default-search-v36.1"	=>	"Haga un clic derecho del ratón en el campo de entrada de búsqueda al final de estas instrucciones.",
+    "default-search-v36.2"	=>	"Seleccione la opción \"Crear motor de búsqueda ...\" en el menú contextual.",
+    "default-search-v36.3"	=>	"En la ventana emergente, haga clic en \"Crear\".",
+    "default-page-v36.1"	=>	"En la parte superior izquierda del navegador haga clic en el símbolo de Opera o \"Menú\" y pulse en la opción \"Configuración\".",
+    "default-page-v36.2"	=>	"En la sección \"En inicio\", seleccione la opción \"Abrir una página especifica o conjunto de páginas\" y luego haga clic en \"Agregar nueva página\" o \"Establecer página\".",
+    "default-page-v36.3"	=>	"Escriba  \":link\" como URL de la página web en \"Agregar nueva página\".",
+    "default-page-v36.4"	=>	"NOTA: \r\nTodos los sitios web que aparecen ahora en la lista se abrirán cuando se inicie el navegador. Puede borrar las entradas de la lista haciendo clic en \"<i class =\" fas fa-ellipsis-h \"></i>\" junto a la entrada que desea eliminar."
+];
diff --git a/resources/lang/es/plugin-desktop/desktop-vivaldi.php b/resources/lang/es/plugin-desktop/desktop-vivaldi.php
new file mode 100644
index 0000000000000000000000000000000000000000..94ce622de994a974bbc963fe23ff4d4f75eed857
--- /dev/null
+++ b/resources/lang/es/plugin-desktop/desktop-vivaldi.php
@@ -0,0 +1,9 @@
+<?php
+
+return [
+    "default-search-v3-3.1"	=>	"Haga un clic derecho del ratón en el campo de entrada de búsqueda que tiene debajo de la instrucción.",
+    "default-search-v3-3.2"	=>	"En el menú contextual seleccione la opción \"Crear búsqueda...\"",
+    "default-search-v3-3.3"	=>	"En la ventana emergente, haga clic en \"Establecer como búsqueda predeterminada\" y a continuación en \"Agregar\".",
+    "default-page-v3-3.1"	=>	"En la esquina superior izquierda haga clic en el símbolo de Vivaldi y en \"Extras\" seleccione el elemento del menú \"<i class=\" fa fa-cog\" aria-hidden=\" true \"></i> Configuración\"",
+    "default-page-v3-3.2"	=>	"En la ventana que aparece debajo de \"Página de inicio\", seleccione \"Personalizado:\" e ingrese :link."
+];
diff --git a/resources/lang/es/team.php b/resources/lang/es/team.php
index 1ddeb07834c0f7878195f10733261c65982c82d8..44f5d382e2096ee19300b230a90028584727b2dd 100644
--- a/resources/lang/es/team.php
+++ b/resources/lang/es/team.php
@@ -1,15 +1,15 @@
 <?php
 
 return [
-    "role.0" => "Director ejecutivo [CEO]",
-    "role.1" => "la junta directiva",
-    "role.2" => "Moderar y protección de menores",
-    "role.3" => "Revistar la prensa",
-    "role.4" => " Programador | programadora",
-    "role.5" => " Programador | programadora",
-    "role.6" => " Programador | programadora",
-    "role.7" => "La oficina",
-    "role.8" => "fundador",
+    "role.0"    => "Director ejecutivo [CEO]",
+    "role.1"    => "la junta directiva",
+    "role.1.1"  => "la junta directiva",
+    "role.2"    => "Moderar y protección de menores",
+    "role.3"    => "Revistar la prensa",
+    "role.5"    => " Programador | programadora",
+    "role.6"    => " Programador | programadora",
+    "role.7"    => "La oficina",
+    "role.8"    => "fundador",
     "contact.1" => "Preguntas, propuestas....escribir un e-mail a  <a href=\"mailto:office@suma-ev.de\">office@suma-ev.de</a> o usan <a href=\"/kontakt/\">formulario contacto cifrado</a>.",
     "contact.3" => "Solo en caso de emergencia: escribir un e-mail a una persona determinada.",
 ];
diff --git a/resources/lang/es/widget.php b/resources/lang/es/widget.php
index dfa5f706dbe06f450db927e23504843cf50e03f3..59e80441949fd7c7b11f0909f873d8d32091b72f 100644
--- a/resources/lang/es/widget.php
+++ b/resources/lang/es/widget.php
@@ -1,8 +1,9 @@
 <?php
 
 return [
-    "head"	=>	"MetaGer Widget",
-    "body.1"	=>	"MetaGer: un motor de búsqueda for suyo sitio web. Selecciona por favor:",
+    "head"	=>	"Widget de MetaGer",
+    "body.1"	=>	"MetaGer para la integración en su sitio web. Para hacer esto, seleccione dónde buscar:",
     "body.2"	=>	"Búsqueda en el web",
-    "body.3"	=>	"Búsqueda en el dominio solo (sitesearch)"
-];
\ No newline at end of file
+    "body.3"	=>	"Búsqueda en un solo dominio (sitesearch)",
+    "body.4"	=>	"Nota: \r\nNo debe usar el widget si está tratando de dar la impresión en su sitio web de que MetaGer es su propio servicio o si se da la impresión de que sus páginas son las páginas reales de MetaGer (todo esto ya ha sucedido). Por este motivo, en particular, no está permitido eliminar nuestro logotipo."
+];
diff --git a/resources/less/metager/general/specific.less b/resources/less/metager/general/specific.less
index 028c845406144e4477c8459e2c156c52b69a9e5e..2f812a934e7876c25a8f008fd44cb353fbe9af6f 100644
--- a/resources/less/metager/general/specific.less
+++ b/resources/less/metager/general/specific.less
@@ -20,4 +20,14 @@ fieldset input[type=text] {
     padding-right: 10px;
     border-width: 1px;
     overflow: visible;
+}
+
+.copyLink{
+    display:flex;
+    .loadSettings{
+        flex-grow:1;
+        width:100%;
+        background-color:@input-bg;
+        color:@input-text;
+    }
 }
\ No newline at end of file
diff --git a/resources/less/metager/pages/resultpage/result.less b/resources/less/metager/pages/resultpage/result.less
index 7d5d91c64cdc33065b53f02c98e18d9f432441b9..7f4ded151b8f76363922769afa9405134dddff54 100644
--- a/resources/less/metager/pages/resultpage/result.less
+++ b/resources/less/metager/pages/resultpage/result.less
@@ -189,11 +189,7 @@
                 text-decoration: none;
             }
         }
-        @media (max-width: @screen-mobile) {
-            .result-open-newtab {
-                display: none;
-            }
-        }
+
         .result-open-proxy {
             &,
             &:active,
@@ -299,4 +295,4 @@
     filter: invert(1) brightness(0.4);
     height:16px;
     margin-right: 4px;
-}
\ No newline at end of file
+}
diff --git a/resources/less/metager/pages/settings.less b/resources/less/metager/pages/settings.less
index 767d8304624b554810a3282075a05c94ef95c9b3..57987b15f319cf01812c86e86ea756378dfff313 100644
--- a/resources/less/metager/pages/settings.less
+++ b/resources/less/metager/pages/settings.less
@@ -88,14 +88,4 @@
             width:20px;
         }
     }
-    #cookieLink{
-        display:flex;
-        align-items:left;
-        #loadSettings{
-            flex-grow:1;
-            width:100%;
-            background-color:@input-bg;
-            color:@input-text;
-        }
-    }
 }
\ No newline at end of file
diff --git a/resources/less/metager/startpage-only.less b/resources/less/metager/startpage-only.less
index 0a8cf49abf27bc73e648ec74996977f2ddc03bb4..d7019bc90d66e5809ef279201a11d51bb1fc6c1c 100644
--- a/resources/less/metager/startpage-only.less
+++ b/resources/less/metager/startpage-only.less
@@ -75,6 +75,9 @@ html {
     top: 0;
     z-index: 10;
 
+    @media(max-height: 150px){
+        display:none;
+    }
 
     &>:nth-child(1) {
         background-color: @story-privacy-background;
@@ -155,9 +158,11 @@ footer {
     align-items:center;
     min-height: 70vh;
     &:not(:nth-child(1)){
-        padding-bottom: @clippathHeight;
-        padding-top: @clippathHeight;
-        margin-top: -@clippathHeight;
+        @supports(clip-path: polygon(0 0, 30% 0, 50% 30px, 70% 0, 100% 0, 100% 100%, 0 100%)) or (-webkit-clip-path: polygon(0 0, 40% 0, 50% 30px, 60% 0, 100% 0, 100% 100%, 0 100%)){
+            padding-bottom: @clippathHeight;
+            padding-top: @clippathHeight;
+            margin-top: -@clippathHeight;
+        }
     }
 }
 
diff --git a/resources/views/index.blade.php b/resources/views/index.blade.php
index 5d5f9623226cec7cc79443010ef7adb9797d6d97..6748c428f754d00c99f889b252976c0020c06425 100644
--- a/resources/views/index.blade.php
+++ b/resources/views/index.blade.php
@@ -32,57 +32,52 @@
     <div id="story-container">
       <section id="story-privacy">
         <h1>{{ trans('mg-story.privacy.title') }}</h1>
-        <ul class="story-links">
-       <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "about") }}">{{ trans('mg-story.btn-about-us') }}</a></li>
-       <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "datenschutz") }}">{{ trans('mg-story.btn-data-protection') }}</a></li>
-        </ul>
         <figure class="story-icon">
           <img src="/img/lock.svg" alt="{{ trans('mg-story.privacy.image.alt') }}">
         </figure>
         <p>{!! trans('mg-story.privacy.p') !!}</p>
+        <ul class="story-links">
+          <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "about") }}">{{ trans('mg-story.btn-about-us') }}</a></li>
+          <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "datenschutz") }}">{{ trans('mg-story.btn-data-protection') }}</a></li>
+        </ul>
       </section>
       <section id="story-ngo">
         <h1>{{ trans('mg-story.ngo.title') }}</h1>
-
        <ul class="story-links">
         <li><a class="story-button" href="https://suma-ev.de/" target="_blank">{{ trans('mg-story.btn-SUMA-EV') }}</a></li>
         <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "spende") }}">{{ trans('mg-story.btn-donate') }}</a></li>
         <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/beitritt/") }}" target="_blank">{{ trans('mg-story.btn-member') }}</a></li>
         <li><a class="story-button" href="https://suma-ev.de/mitglieder/" target="_blank"> {{ trans('mg-story.btn-member-advantage') }}</a></li>       </ul>
         <figure class="story-icon">
-        <img src="/img/heart.svg" alt="{{ trans('mg-story.ngo.image.alt') }}">
+          <img src="/img/heart.svg" alt="{{ trans('mg-story.ngo.image.alt') }}">
         </figure>
         <p>{!!trans('mg-story.ngo.p') !!}</p>
       </section>
       <section id="story-diversity">
         <h1>{{ trans('mg-story.diversity.title') }}</h1>
+        <figure class="story-icon">
+          <img src="/img/rainbow.svg" alt="{{ trans('mg-story.diversity.image.alt') }}">
+        </figure>
+        <p>{!! trans('mg-story.diversity.p') !!}</p>
         <ul class="story-links">
         <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "about") }}">{{ trans('mg-story.btn-about-us') }}</a></li>
         <li><a class="story-button" href="https://gitlab.metager.de/open-source/MetaGer" target="_blank"><nobr>{{ trans('mg-story.btn-mg-code') }}</nobr></a></li>
         <!--<li><a class="story-button" href="https://metager.de/about">{{ trans('mg-story.btn-mg-algorithm') }}</a></li>-->
         </ul>
-        <figure class="story-icon">
-          <img src="/img/rainbow.svg" alt="{{ trans('mg-story.diversity.image.alt') }}">
-        </figure>
-        <p>{!! trans('mg-story.diversity.p') !!}</p>
       </section>
 
       <section id="story-eco">
         <h1>{{ trans('mg-story.eco.title') }}</h1>
-        <ul class="story-links">
-        <li><a class="story-button" href="https://www.hetzner.de/unternehmen/umweltschutz/" target="_blank">{{ trans('mg-story.btn-more') }}</a></li>
-        </ul>
         <figure class="story-icon">
           <img src="/img/leaf.svg" alt="{{ trans('mg-story.eco.image.alt') }}">
         </figure>
         <p>{!! trans('mg-story.eco.p')!!}</p>
+        <ul class="story-links">
+        <li><a class="story-button" href="https://www.hetzner.de/unternehmen/umweltschutz/" target="_blank">{{ trans('mg-story.btn-more') }}</a></li>
+        </ul>
       </section>
       <section id="story-plugin">
         <h1>{{ trans('mg-story.plugin.title') }}</h1>
-        <ul class="story-links">
-        <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/plugin") }}">{{ trans('mg-story.plugin.btn-add') }}</a></li>
-        <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/app") }}">{{ trans('mg-story.plugin.btn-app') }}</a></li>
-        </ul>
         <figure class="story-icon">
           <picture>
             <source media="(max-width: 760px)" srcset="/img/App.svg">
@@ -91,6 +86,10 @@
 
         </figure>
         <p>{{ trans('mg-story.plugin.p') }}</p>
+        <ul class="story-links">
+          <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/plugin") }}">{{ trans('mg-story.plugin.btn-add') }}</a></li>
+          <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/app") }}">{{ trans('mg-story.plugin.btn-app') }}</a></li>
+        </ul>
       </section>
     </div>
 @endsection
diff --git a/resources/views/key.blade.php b/resources/views/key.blade.php
index 1b66cf0f02ba685c5de512e355b887df7ce5eefe..eec467c0a73225d9dbf3054474f0059f1f8ec135 100644
--- a/resources/views/key.blade.php
+++ b/resources/views/key.blade.php
@@ -21,30 +21,31 @@
         <p>{{ trans('key.p4') }}</p>
         <p>{{ trans('key.p5') }}</p>
         <ol>
-            <li>{!! trans('key.li1', ["url" =>
-                    route("startpage", [
-                        "key" =>
-                            empty(Cookie::get('key')) ?
-                                "enter_key_here" :
-                                Cookie::get('key')
-                            ])])!!} als Startseite im Browser ein.</li>
-            <li>@lang('key.li2', ["url" =>
-                    route("resultpage", [
-                        "key" =>
-                            empty(Cookie::get('key')) ?
-                                "enter_key_here" :
-                                Cookie::get('key')
-                        ]) . "&eingabe=%s"])</li>
+            <li>
+                @lang ('key.li1')
+                <div class="copyLink">
+                    <input id="loadSettings" class="loadSettings" type="text" value="{{$cookieLink}}">
+                    <button class="js-only btn btn-default" onclick="var copyText = document.getElementById('loadSettings');copyText.select();copyText.setSelectionRange(0, 99999);document.execCommand('copy');">@lang('settings.copy')</button>
+                </div>
+            </li>
+            </br>
+            <li>
+                @lang('key.li2')
+                <div class="copyLink">
+                    <input id="searchString" class="loadSettings" type="text" value="{{route("resultpage", ["key" => $cookie]) . "&eingabe=%s"}}">
+                    <button class="js-only btn btn-default" onclick="var copyText = document.getElementById('searchString');copyText.select();copyText.setSelectionRange(0, 99999);document.execCommand('copy');">@lang('settings.copy')</button>
+                </div>
+            </li>
         </ol>
     </div>
     <div class="section">
         <div id="form-wrapper">
             <form method="post">
                 <input type="hidden" name="redirUrl" value="{{ Request::input('redirUrl', '') }}" />
-                <input type="text" name="key" value="{{Cookie::get('key')}}" placeholder="@lang('key.placeholder1')" autofocus>
+                <input type="text" name="keyToSet" value="{{$cookie === 'enter_key_here' ? '' : $cookie}}" placeholder="@lang('key.placeholder1')" autofocus>
                 <button type="submit" class="btn btn-success">OK</button>
             </form>
-            @if(Cookie::get('key') !== NULL)
+            @if($cookie !== 'enter_key_here')
             <form method="post" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), action('KeyController@removeKey', ['redirUrl' => url()->full()])) }}">
                 <input type="hidden" name="redirUrl" value="{{ Request::input('redirUrl', '') }}" />
                 <button type="submit" class="btn btn-default">@lang('key.removeKey')</button>
diff --git a/resources/views/layouts/result.blade.php b/resources/views/layouts/result.blade.php
index 3ada99dcfd0e875f0ef25f1087c98ce0929999c7..07fbc9b0fef49682b740ed95030bcfbb46389aad 100644
--- a/resources/views/layouts/result.blade.php
+++ b/resources/views/layouts/result.blade.php
@@ -5,7 +5,7 @@
 				@if( isset($result->price) && $result->price != 0)
 					<span class="result-price">{!! $result->price_text !!}</span>
 				@endif
-				<a href="{{ $result->link }}" @if($metager->isFramed())target="_top"@endif rel="noopener">
+				<a href="{{ $result->link }}" target="{{ $metager->getNewtab() }}" rel="noopener">
 					{!! $result->titel !!}
 				</a>
 			</h2>
@@ -16,7 +16,7 @@
 			@endif
 		</div>
 		<div class="result-subheadline">
-			<a class="result-link" href="{{ $result->link }}" title="{{ $result->anzeigeLink }}" rel="noopener" @if($metager->isFramed())target="_top"@endif tabindex="-1">
+			<a class="result-link" href="{{ $result->link }}" title="{{ $result->anzeigeLink }}" rel="noopener" target="{{ $metager->getNewtab() }}" tabindex="-1">
 				{{ $result->anzeigeLink }}
 			</a>
 			@if( isset($result->partnershop) && $result->partnershop === TRUE)
@@ -59,7 +59,7 @@
 		<a class="result-open-newtab" href="{{ $result->link }}" target="_blank" rel="noopener">
 			{!! trans('result.options.6') !!}
 		</a>
-		<a class="result-open-proxy" onmouseover="$(this).popover('show');" onmouseout="$(this).popover('hide');" data-toggle="popover" data-placement="auto right" data-container="body" data-content="@lang('result.proxytext')" href="{{ $result->proxyLink }}" target="{{ $metager->getNewtab() }}" rel="noopener">
+		<a class="result-open-proxy" title="@lang('result.proxytext')" href="{{ $result->proxyLink }}" target="{{ $metager->getNewtab() }}" rel="noopener">
 			{!! trans('result.options.5') !!}
 		</a>
 		<label class="open-result-options navigation-element" for="result-toggle-{{$result->hash}}" tabindex='0'>
diff --git a/resources/views/layouts/rich/ad.blade.php b/resources/views/layouts/rich/ad.blade.php
deleted file mode 100644
index 7db614f4ca949f9af42477fa7df35b8481e86a46..0000000000000000000000000000000000000000
--- a/resources/views/layouts/rich/ad.blade.php
+++ /dev/null
@@ -1,17 +0,0 @@
-@if(isset($result) && !$apiAuthorized)
-<article class="search-result ad card elevation-1">
-        <div class="result-content">
-        <h1 class="result-title">{{ $result->titel }}</h1>
-        <h2 class="result-display-link"><a href="{{ $result->link }}">{{ $result->anzeigeLink }}</a></h2>
-        <p class="result-description">{{ $result->descr }}</p>
-        <p class="result-source">Werbung von {!! $result->gefVon[0] !!}</p>
-                @if( isset($result->logo) )
-                <img class="result-thumbnail" src="{{ $metager->getImageProxyLink($result->logo) }}" alt="" />
-                @endif
-        </div>
-        <div class="result-action-area">
-        <a class="result-action primary" href="{{ $result->link }}">Öffnen</a>
-        <a class="result-action primary" target="_blank" href="{{ $result->link }}">Neuer Tab</a>
-        </div>
-</article>
-@endif
diff --git a/resources/views/layouts/rich/result.blade.php b/resources/views/layouts/rich/result.blade.php
deleted file mode 100644
index c5b9d1f28f0f7924a83ec6f8497ed7813c3fc775..0000000000000000000000000000000000000000
--- a/resources/views/layouts/rich/result.blade.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<article class="search-result card elevation-1">
-	<div class="result-content">
-        <h1 class="result-title">{{ $result->titel }}</h1>
-        <h2 class="result-display-link"><a href="{{ $result->link }}">{{ $result->anzeigeLink }}</a></h2>
-        <p class="result-description">{{ $result->descr }}</p>
-        <p class="result-source">gefunden von {!! $result->gefVon[0] !!}</p>
-		@if( isset($result->logo) )
-        	<img class="result-thumbnail" src="{{ $metager->getImageProxyLink($result->logo) }}" alt="" />
-		@endif
-	</div>
-	<div class="result-action-area">
-        <a class="result-action primary" href="{{ $result->link }}">Öffnen</a>
-        <a class="result-action primary" target="_blank" href="{{ $result->link }}">Neuer Tab</a>
-        <a class="result-action" target="_blank" href="{{ $result->proxyLink }}">Anonym Öffnen</a>
-	</div>
-</article>
diff --git a/resources/views/parts/searchbar.blade.php b/resources/views/parts/searchbar.blade.php
index 7c071f02e308d9ce53f9cf6fffca134f06895ac8..f7abe514c3cca3a89e5f349b561607a659f6909e 100644
--- a/resources/views/parts/searchbar.blade.php
+++ b/resources/views/parts/searchbar.blade.php
@@ -3,8 +3,8 @@
 		<div class="searchbar {{$class ?? ''}}">
 			<div class="search-input-submit">
 				<div id="search-key">
-					<a id="key-link" @if(isset($apiAuthorized) && $apiAuthorized)class="authorized" @else class="unauthorized"@endif href="{{ action('KeyController@index', ['redirUrl' => !empty($metager) ? $metager->generateSearchLink($metager->getFokus()) : url()->full() ]) }}" @if(!empty($metager) && $metager->isFramed())target="_top" @endif data-tooltip="{{ trans ('index.key.tooltip') }}" tabindex="0">
-						<img @if(isset($apiAuthorized) && $apiAuthorized)src="/img/key-verified.svg" @else src="/img/key-icon.svg"@endif alt="" aria-hidden="true" id="searchbar-img-key">
+					<a id="key-link" @if(app('App\Models\Key')->getStatus())class="authorized" @else class="unauthorized"@endif href="{{ action('KeyController@index', ['redirUrl' => !empty($metager) ? $metager->generateSearchLink($metager->getFokus()) : url()->full() ]) }}" @if(!empty($metager) && $metager->isFramed())target="_top" @endif data-tooltip="{{ trans ('index.key.tooltip') }}" tabindex="0">
+						<img @if(app('App\Models\Key')->getStatus())src="/img/key-verified.svg" @else src="/img/key-icon.svg"@endif alt="" aria-hidden="true" id="searchbar-img-key">
 					</a>
 				</div>
 				<div class="search-input">
diff --git a/resources/views/plugin-page.blade.php b/resources/views/plugin-page.blade.php
index f262fb346375e14fd7ec16e462b7c8eb23fb8b72..fe86fd72bcc86af80fa06620e235be4173909938 100644
--- a/resources/views/plugin-page.blade.php
+++ b/resources/views/plugin-page.blade.php
@@ -25,6 +25,12 @@
 			{{ trans('plugin-page.head.0') }}
 		@endif
 	</h1>
+	<div class="card-heavy">
+		<h3>{{ trans('plugin-page.search-engine.1') }}</h3>
+		<ul>
+			<p>{{ trans('plugin-page.search-engine.2') }}</p>
+		</ul>
+	</div>
 	@if ($agent->isDesktop())
 		@if ($browser === 'Firefox' || $browser === 'Mozilla')
 			@if (version_compare($agent->version($browser), '61.', '>='))
diff --git a/resources/views/plugin/mobile/firefox/v80.blade.php b/resources/views/plugin/mobile/firefox/v80.blade.php
index 2cd112ad379c5f28a818d2af8dfac0a8a1952647..ffbb95475cabdb97bc52e0ba324e255d46119644 100644
--- a/resources/views/plugin/mobile/firefox/v80.blade.php
+++ b/resources/views/plugin/mobile/firefox/v80.blade.php
@@ -9,9 +9,11 @@
 			<li>{{ trans('plugin-mobile/mobile-firefox.default-search-v80.2') }}</li>
             <li>{{ trans('plugin-mobile/mobile-firefox.default-search-v80.3') }}</li>
             <li>{{ trans('plugin-mobile/mobile-firefox.default-search-v80.4') }}</li>
-            <li>{!! trans('plugin-mobile/mobile-firefox.default-search-v80.5') !!}</li>
+            <li>{{ trans('plugin-mobile/mobile-firefox.default-search-v80.5') }}</li>
 			<li style="list-style:none;">{{ trans('plugin-mobile/mobile-firefox.search-string') }}</li>
 			<code>{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route("resultpage", ["eingabe" => ""])) }}%s</code>
+			<li>{!! trans('plugin-mobile/mobile-firefox.default-search-v80.6') !!}</li>
+			<li>{{ trans('plugin-mobile/mobile-firefox.default-search-v80.7') }}</li>
 		</ol>
 	</div>
 
diff --git a/resources/views/resultpages/metager3resultsatom10.blade.php b/resources/views/resultpages/metager3resultsatom10.blade.php
index 25df6e410513b4f15a9f0dc0cc42797533a71995..e373265aaab7715b7f890b08722f07ae680b0ffd 100644
--- a/resources/views/resultpages/metager3resultsatom10.blade.php
+++ b/resources/views/resultpages/metager3resultsatom10.blade.php
@@ -3,7 +3,7 @@
       xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"
       xmlns:mg="http://metager.de/opensearch/"
       xmlns:ad="http://a9.com/-/opensearch/extensions/advertisement/1.0/">
-  <title>{!! htmlspecialchars($eingabe, ENT_XML1, 'UTF-8'); !!} - MetaGer</title>
+  <title>{{ htmlspecialchars($eingabe, ENT_XML1, 'UTF-8') }} - MetaGer</title>
   <link href="{{ url()->full() }}"/>
   <updated>{{ date('c') }}</updated>
   <opensearch:totalResults>{{ $resultcount }}</opensearch:totalResults>
@@ -11,7 +11,6 @@
   <link rel="next" href="{{ htmlspecialchars($metager->nextSearchLink() ,ENT_QUOTES) }}" type="application/atom+xml"/>
   <id>urn:uuid:1d634a8c-2764-424f-b082-6c96494b7240</id>
   @include('layouts.atom10ad', ['ad' => $metager->popAd()])
-  @if($apiAuthorized)
   @foreach($metager->getResults() as $index => $result)
     @if(($index+1) % 5 === 0)
       @include('layouts.atom10ad', ['ad' => $metager->popAd()])
@@ -25,13 +24,4 @@
       </content>
     </entry>
   @endforeach
-  @else
-  <ad:advertisement>
-   <ad:callOut type="TEXT">Fehler</ad:callOut>
-   <ad:title type="TEXT">Falscher Schlüssel angegeben</ad:title>
-   <ad:displayUrl type="TEXT">https://metager.de/meta/key</ad:displayUrl>
-   <ad:subTitle type="TEXT">Sie haben einen ungültigen Schlüssel angegeben</ad:subTitle>
-   <link href="https://metager.de/meta/key" />
- </ad:advertisement> 
-  @endif
 </feed>
diff --git a/resources/views/resultpages/metager3resultsrss20.blade.php b/resources/views/resultpages/metager3resultsrss20.blade.php
deleted file mode 100644
index 28e2e0149b83cf2605e3f9598fa363f025f6e08c..0000000000000000000000000000000000000000
--- a/resources/views/resultpages/metager3resultsrss20.blade.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xmlversion = "1.0"encoding = "UTF-8"?>
- <rss version="2.0"
-      xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"
-      xmlns:mg="http://metager.de/opensearch/"
-      xmlns:atom="http://www.w3.org/2005/Atom">
-   <channel>
-     <title>{!! htmlspecialchars($eingabe, ENT_XML1, 'UTF-8'); !!} - MetaGer</title>
-     <opensearch:totalResults>{{ $resultcount }}</opensearch:totalResults>
-     <opensearch:Query role="request" searchTerms="{{ htmlspecialchars($eingabe, ENT_QUOTES) }}"/>
-     <mg:nextSearchResults url="{{htmlspecialchars($metager->nextSearchLink() ,ENT_QUOTES)}}" />
-      @if($apiAuthorized)
-        @foreach($metager->getResults() as $result)
-          <item>
-            <title>{!! htmlspecialchars($result->titel, ENT_XML1, 'UTF-8'); !!}</title>
-            <link>{!! htmlspecialchars($result->link, ENT_XML1, 'UTF-8'); !!}</link>
-            <mg:anzeigeLink>{!! htmlspecialchars($result->anzeigeLink, ENT_XML1, 'UTF-8'); !!}</mg:anzeigeLink>
-            <description>
-              {!! htmlspecialchars($result->longDescr, ENT_XML1, 'UTF-8'); !!}
-            </description>
-          </item>
-        @endforeach
-      @endif
-    </channel>
- </rss>
diff --git a/resources/views/resultpages/metager3rich.blade.php b/resources/views/resultpages/metager3rich.blade.php
deleted file mode 100644
index 840e9772c9a7eb13d59aae2d9883467ca2bb8253..0000000000000000000000000000000000000000
--- a/resources/views/resultpages/metager3rich.blade.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
-	<head>
-		<meta charset="UTF-8" />
-		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
-		<title>{{ $eingabe }} - MetaGer</title>
-		<link @if(app('request')->input('theme', 'default')!=='default'&&app('request')->input('theme', 'default')!=='material')rel="alternate stylesheet" @else rel="stylesheet" @endif title="Material" href="{{ mix('/css/material-default.css') }}" />
-		<link @if(app('request')->input('theme', 'default')!=='material-inverse')rel="alternate stylesheet" @else rel="stylesheet" @endif  title="Material-Invers" href="{{ mix('/css/material-inverse.css') }}" />
-		<link href="/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
-		<link href="/favicon.ico" rel="icon" type="image/x-icon" />
-		<link href="/favicon.ico" rel="shortcut icon" type="image/x-icon" />
-		<meta content="width=device-width, initial-scale=1.0, user-scalable=no" name="viewport" />
-		<meta HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE" />
-		<link rel="search" type="application/opensearchdescription+xml" title="{!! trans('resultPage.opensearch') !!}" href="{{  LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), action('StartpageController@loadPlugin', ['params' => base64_encode(serialize(Request::all()))])) }}">
-	</head>
-	<body>
-	<header class="persistent-search">
-			<form class="search-card card elevation-2">
-				<a href="/" class="back">
-					<img src="/img/Logo-square-inverted.svg" alt="MetaGer" title="MetaGer, die sichere Suchmaschine" />
-				</a>
-				<input type="text" name="eingabe" placeholder="MetaGer-Suche" value="{{ $eingabe }}" class="query-input"/>
-				<button type="submit" class="search-button fa"></button>
-				@foreach( $metager->request->all() as $key => $value)
-					@if($key !== "eingabe" && $key !== "page" && $key !== "next")
-						<input type="hidden" name="{{ $key }}" value="{{ $value }}"/>
-					@endif
-				@endforeach
-			</form>
-			</header>
-			<details class="focus-card card elevation-1">
-				<summary class="focus-cell"><div class="focus-cell-label"><span class="icon fa" aria-hidden="true"></span> <b>Web</b></div></summary>
-			</details>
-		<main class="results-container">
-		@foreach($metager->getResults() as $result)
-			@if($result->number % 7 === 0 && !$apiAuthorized)
-				@include('layouts.rich.ad', ['result' => $metager->popAd()])
-			@endif
-				@include('layouts.rich.result', ['result' => $result])
-		@endforeach
-		</main>
-		@if($metager->getPage() === 1)
-		<nav class="pagenav-first">
-			<a class="pagenav-button-next card elevation-1" href="{{ $metager->nextSearchLink() }}"><span class="card-button-text">Weitersuchen</span><span class="icon-right">â–º</span></a>
-		</nav>
-		@else
-		<nav class="pagenav-following">
-			<div>
-			<a class="pagenav-button-first card-inline elevation-1" href="javascript:history.back()">â—„</a>
-			</div>
-			<div class="pagenav-current"><span class="pagenav-current-annotation">Seite </span>{{ $metager->getPage() }}</div>
-			<a class="pagenav-button-next card-inline elevation-1" href="{{ $metager->nextSearchLink() }}"><span class="card-button-text">Weitersuchen</span><span class="icon-right">â–º</span></a>
-		</nav>
-		@endif
-		<footer class="footer-text">
-		<a href="https://metager.de/impressum" target="_blank">Impressum</a>
-		</footer>
-	</body>
-</html>
diff --git a/resources/views/settings/allSettings.blade.php b/resources/views/settings/allSettings.blade.php
index 0eb677d10a271c88e8e853a6e6cb49a3e11df9d6..eb8ae22350d6addb9c57a899e8645f3875bb3b31 100644
--- a/resources/views/settings/allSettings.blade.php
+++ b/resources/views/settings/allSettings.blade.php
@@ -20,7 +20,7 @@
                 <tbody>
                     @foreach(Cookie::get() as $key => $value)
                     <tr>
-                        <td>{{ $key . "=" . $value }}</td>
+                        <td>{{ $key . " = " . $value }}</td>
                         <td>
                         @if(strpos($key, "_engine_") !== FALSE)
                         @lang('settings.engineDisabled', ["engine" => $sumaFile->sumas->{substr($key, strrpos($key, "_")+1)}->{"display-name"}, "focus" => trans('index.foki.' . substr($key, 0, strpos($key, "_")))])
@@ -31,11 +31,13 @@
                                 @endif
                             @endforeach
                         @elseif($key === "key")
-                        @lang('settings.key')
+                            @lang('settings.key')
                         @elseif(strpos($key, "_blpage"))
-                        @lang('settings.blentry')
+                            @lang('settings.blentry')
                         @elseif($key === 'dark_mode')
-                        @lang('settings.dm')
+                            @lang('settings.darkmode')
+                        @elseif($key === 'new_tab')
+                            @lang('settings.newTab')
                         @endif
                         </td>
                         <td>
diff --git a/resources/views/settings/index.blade.php b/resources/views/settings/index.blade.php
index 94ee61fceee304fe2aa59021510ce64c3e3fca17..cf82c1a47a4619958344af022f4033467e81dbcd 100644
--- a/resources/views/settings/index.blade.php
+++ b/resources/views/settings/index.blade.php
@@ -12,8 +12,8 @@
         <h2>@lang('settings.hint.header')</h2>
         <p>@lang('settings.hint.text', ["link" => LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('showAllSettings', ['url' => url()->full()])) ])</p>
         <p>@lang('settings.hint.loadSettings')</p>
-        <div id="cookieLink">
-            <input id="loadSettings" type="text" value="{{$cookieLink}}">
+        <div class="copyLink">
+            <input id="loadSettings" class="loadSettings" type="text" value="{{$cookieLink}}">
             <button class="js-only btn btn-default" onclick="var copyText = document.getElementById('loadSettings');copyText.select();copyText.setSelectionRange(0, 99999);document.execCommand('copy');">@lang('settings.copy')</button>
         </div>
     </div>
@@ -125,6 +125,7 @@
     
         <div class="card-light">
             <h2>Weitere Einstellungen</h2>
+            <p>@lang('settings.hint')</p>
             <form id="setting-form" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('enableSetting')) }}" method="post" class="form">
                 <input type="hidden" name="fokus" value="{{ $fokus }}">
                 <input type="hidden" name="url" value="{{ $url }}">
@@ -135,14 +136,20 @@
                         <option value="off" {{ Cookie::get('dark_mode') === "1" ? "disabled selected" : "" }}>@lang('settings.light')</option>
                         <option value="on" {{ Cookie::get('dark_mode') === "2" ? "disabled selected" : "" }}>@lang('settings.dark')</option>
                     </select>
-                    <small>@lang('settings.darkmode-hint')</small>
+                </div>
+                <div class="form-group">
+                    <label for="nt">@lang('settings.newTab')</label>
+                    <select name="nt" id="nt" class="form-control">
+                        <option value="off" {{ !Cookie::has('new_tab') ? "disabled selected" : "" }}>@lang('settings.off')</option>
+                        <option value="on" {{ Cookie::get('new_tab') === "on" ? "disabled selected" : "" }}>@lang('settings.on')</option>
+                    </select>
                 </div>
                 @if(LaravelLocalization::getCurrentLocale() === "de")
                 <div class="form-group">
                     <label for="zitate">Zitate</label>
                     <select name="zitate" id="zitate" class="form-control">
-                        <option value="on" @if(Cookie::get($fokus . "_setting_zitate") === null)disabled selected @endif>Anzeigen</option>
-                        <option value="off" {{ Cookie::get($fokus . "_setting_zitate") === "off" ? "disabled selected" : "" }}>Nicht Anzeigen</option>
+                        <option value="on" @if(Cookie::get("zitate") === null)disabled selected @endif>Anzeigen</option>
+                        <option value="off" {{ Cookie::get("zitate") === "off" ? "disabled selected" : "" }}>Nicht Anzeigen</option>
                     </select>
                 </div>
                 @endif
diff --git a/resources/views/team/team.blade.php b/resources/views/team/team.blade.php
index da1af7fcae6d4bcc1144e972e3ffc6591edff3dd..e83439ccdd0826b7e6ebf586ed3ed511bbce8d3d 100644
--- a/resources/views/team/team.blade.php
+++ b/resources/views/team/team.blade.php
@@ -16,7 +16,7 @@
 					<a href="mailto:carsten@suma-ev.de">carsten@suma-ev.de</a></p>
 				</li>
 				<li>
-					<p>Branz, Manuela - {!! trans('team.role.3') !!} & {!! trans('team.role.2') !!} -
+					<p>Branz, Manuela - {!! trans('team.role.1.1') !!} & {!! trans('team.role.3') !!} -
 					<a href="mailto:manuela.branz@suma-ev.de">manuela.branz@suma-ev.de</a></p>
 				</li>
 				<li>
@@ -35,6 +35,13 @@
 					<p><a href="https://de.wikipedia.org/wiki/Wolfgang_Sander-Beuermann" target="_blank" rel="noopener">Sander-Beuermann, Wolfgang</a>, Dr.-Ing - {!! trans('team.role.8') !!} -
 					<a href="mailto:wsb@suma-ev.de">wsb@suma-ev.de</a>
 				</li>
+				<li>
+					<p>{!! trans('team.role.2') !!}: Branz, Manuela
+					<a href="mailto:manuela.branz@suma-ev.de">manuela.branz@suma-ev.de</a></p>
+				</li>
+
+
+
 			</ul>
 		</div>
 		<div class="card-heavy">
diff --git a/routes/web.php b/routes/web.php
index 875b21d7f2f49d35c24081b0bb4bcf5ff88f289e..da5dae281108282da61ea83896f0d34393a1172e 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -191,6 +191,9 @@ Route::group(
                 Route::post('queryregexp', 'AdminSpamController@queryregexp');
                 Route::post('deleteRegexp', 'AdminSpamController@deleteRegexp');
             });
+            Route::post('service-desk', 'ServiceDesk@webhook');
+            Route::get('stress', 'Stresstest@index');
+            Route::get('stress/verify', 'Stresstest@index')->middleware('browserverification', 'humanverification');
         });
 
         Route::get('settings', function () {
@@ -218,7 +221,7 @@ Route::group(
                 $redis->expire($key, 30);
             });
 
-            return response(view('layouts.resultpage.verificationCss'), 200)->header("Content-Type", "text/css");
+            return response("", 200)->header("Content-Type", "application/js");
         });
 
         Route::get('meta/picture', 'Pictureproxy@get');
@@ -256,7 +259,7 @@ Route::group(
                     try {
                         $fh = fopen("https://gitlab.metager.de/open-source/app-en/-/raw/latest/app/release_manual/app-release_manual.apk", "r");
                         while (!feof($fh)) {
-                            echo (fread($fh, 1024));
+                            echo(fread($fh, 1024));
                         }
                     } catch (\Exception $e) {
                         abort(404);
@@ -273,7 +276,7 @@ Route::group(
                     try {
                         $fh = fopen("https://gitlab.metager.de/open-source/metager-maps-android/raw/latest/app/release/app-release.apk?inline=false", "r");
                         while (!feof($fh)) {
-                            echo (fread($fh, 1024));
+                            echo(fread($fh, 1024));
                         }
                     } catch (\Exception $e) {
                         abort(404);
@@ -302,4 +305,5 @@ Route::group(
             return response($result, 200)
                 ->header('Content-Type', RenderTextFormat::MIME_TYPE);
         });
-    });
+    }
+);
diff --git a/tests/Browser/Pages/Widget.php b/tests/Browser/Pages/Widget.php
index 4a3d927a0f53b3c1288eb37c2a64d58e75ce197f..f76e540e3defd5c3964a01cf829d0b5637246301 100644
--- a/tests/Browser/Pages/Widget.php
+++ b/tests/Browser/Pages/Widget.php
@@ -31,7 +31,7 @@ class Widget extends Page
             ->waitForText("MetaGer for usage on your website. Please choose the scope of your widget:")
             ->assertTitle("MetaGer Widget")
             ->switchLanguage("Español")
-            ->waitForText("MetaGer: un motor de búsqueda for suyo sitio web. Selecciona por favor:")
+            ->waitForText("MetaGer para la integración en su sitio web. Para hacer esto, seleccione dónde buscar:")
             ->assertTitle("MetaGer Widget")
             ->switchLanguage("Deutsch");