diff --git a/app/Http/Controllers/KeyController.php b/app/Http/Controllers/KeyController.php
index f9f36a49c27a1ab5d2f7cbba69d31c54076bbd8b..417b95bf8df3d68cd38c076ed771524163e8f9e1 100644
--- a/app/Http/Controllers/KeyController.php
+++ b/app/Http/Controllers/KeyController.php
@@ -22,7 +22,7 @@ class KeyController extends Controller
         $redirUrl = $request->input('redirUrl', "");
         $key = $request->input('key', '');
 
-        if ($this->authorizeKey($key)) {
+        if (app('App\Models\Key')->getStatus()) {
             # Valid Key
             $host = $request->header("X_Forwarded_Host", "");
             if (empty($host)) {
@@ -45,32 +45,4 @@ class KeyController extends Controller
         $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/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 07ffe38a1841dd8ee7c6161bf43392b80beba42c..8d00cdb988874ca604b7c648b4e401c3ddc777e2 100644
--- a/app/MetaGer.php
+++ b/app/MetaGer.php
@@ -206,14 +206,13 @@ class MetaGer
                         ->with('browser', (new Agent())->browser())
                         ->with('fokus', $this->fokus);
                     break;
-                /* WIP
+                
                 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');
-                    break;*/
+                    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:
                     return sizeof($viewResults) . ";" . round((microtime(true) - $this->starttime), 2);
@@ -557,30 +556,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();
     }
 
     /*
@@ -1227,7 +1203,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" /*WIP && $this->out !== "atom10" && $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
diff --git a/app/Models/Key.php b/app/Models/Key.php
new file mode 100644
index 0000000000000000000000000000000000000000..6e81d21f737190c4ca3fc2282e6cd4cdbadf7ed4
--- /dev/null
+++ b/app/Models/Key.php
@@ -0,0 +1,73 @@
+<?php 
+
+namespace App\Models;
+
+class Key{
+    public $key;
+    public $status; # valid key = true, invalid key = false, unidentified key = null
+
+
+    public function __construct($key, $status = null){
+        $this->key = $key;
+        $this->status = $status;
+    }
+
+    # 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 = "https://key.metager3.de/" . 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 = "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 {
+                $this->status = false; 
+                return false;
+            }
+        } catch (\ErrorException $e) {
+            return false;
+        }
+    }
+}
\ 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/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/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>