diff --git a/app/Http/Controllers/MetaGerSearch.php b/app/Http/Controllers/MetaGerSearch.php
index f9896b254e1675d8b4c02e2bdba8ef6ba072fa10..fa62adcf260c166647f0f4d3aff3a7e9b9043d8f 100644
--- a/app/Http/Controllers/MetaGerSearch.php
+++ b/app/Http/Controllers/MetaGerSearch.php
@@ -15,6 +15,7 @@ class MetaGerSearch extends Controller
 {
     public function search(Request $request, MetaGer $metager)
     {
+        #die($request->header('User-Agent'));
         $time = microtime();
         # Mit gelieferte Formulardaten parsen und abspeichern:
         $metager->parseFormData($request);
@@ -43,10 +44,13 @@ class MetaGerSearch extends Controller
 
         # Zunächst den Spruch
         $spruecheFile = storage_path() . "/app/public/sprueche.txt";
-        if( file_exists($spruecheFile) )
+        if( file_exists($spruecheFile) && $_GET['sprueche'])
         {
             $sprueche = file($spruecheFile);
             $spruch = $sprueche[array_rand($sprueche)];
+        }else
+        {
+            $spruch = "";
         }
 
         # Die manuellen Quicktips:
diff --git a/app/Http/Controllers/Pictureproxy.php b/app/Http/Controllers/Pictureproxy.php
new file mode 100644
index 0000000000000000000000000000000000000000..efcea2918e4dcd3a2f12cf2d2d6a71aae8591988
--- /dev/null
+++ b/app/Http/Controllers/Pictureproxy.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Controllers\Controller;
+use Illuminate\Http\Request;
+#use App\MetaGer\Forwarder;
+#use App\MetaGer\Results;
+#use App\MetaGer\Search;
+use App;
+use App\MetaGer;
+use Response;
+
+
+class Pictureproxy extends Controller
+{
+    function get(Request $request) {
+        if( $request->has('url') )
+        {
+            $file = file_get_contents($request->input('url'));
+            $responseCode = explode(" ", $http_response_header[0])[1];
+            $contentType = "";
+            foreach($http_response_header as $header)
+            {
+                if( strpos($header, "Content-Type:") === 0)
+                {
+                    $tmp = explode(": ", $header);
+                    $contentType = $tmp[1];
+                }
+            }
+            $response = Response::make($file, $responseCode);
+            $response->header('Content-Type', $contentType);
+            return $response;
+        }
+    } 
+
+}
\ No newline at end of file
diff --git a/app/Http/Controllers/StartpageController.php b/app/Http/Controllers/StartpageController.php
index b144a13507e6512d5faa47a0adb7d1b85816331e..9df592c56a618f667d6342144c7357010ba1c717 100644
--- a/app/Http/Controllers/StartpageController.php
+++ b/app/Http/Controllers/StartpageController.php
@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\Http\Controllers\Controller;
 use Illuminate\Http\Request;
+use Response;
 
 class StartpageController extends Controller
 {
@@ -64,4 +65,35 @@ class StartpageController extends Controller
         \App::setLocale($locale);
         return loadPage($subpage);
     }
+
+    public function loadPlugin(Request $request, $locale = "de")
+    {
+        $requests = $request->all();
+        $params = [];
+        foreach($requests as $key => $value)
+        {
+            if( strpos($key, "param_") === 0 )
+            {
+                $key = substr($key, strpos($key, "param_") + 6 );
+            }
+            $params[$key] = $value;
+        }
+
+        if(!isset($params['focus']))
+            $params['focus'] = 'web';
+        if(!isset($params['encoding']))
+            $params['encoding'] = 'utf8';
+        if(!isset($params['lang']))
+            $params['lang'] = 'all';
+        $params["eingabe"] = "";
+
+
+        $link = action('MetaGerSearch@search', $params);
+
+        $response = Response::make(
+            view('plugin')->with('link', $link), "200");
+        $response->header('Content-Type', "application/xml");
+        return $response;
+        return $link;
+    }
 }
\ No newline at end of file
diff --git a/app/Http/routes.php b/app/Http/routes.php
index 68ee0bb09d5a75e335ad2502b0e2dad4930c5e5a..ac4592b65ee7e5d34870b796c653fd05f0194987 100644
--- a/app/Http/routes.php
+++ b/app/Http/routes.php
@@ -97,7 +97,9 @@
 
         
         Route::get('meta/meta.ger3', 'MetaGerSearch@search');
+        Route::get('meta/picture', 'Pictureproxy@get');
 
         Route::get('qt', 'MetaGerSearch@quicktips');
         Route::get('tips', 'MetaGerSearch@tips');
+        Route::get('opensearch.xml', 'StartpageController@loadPlugin');
     });
diff --git a/app/MetaGer.php b/app/MetaGer.php
index db6664aca5a8e0f9f2684c85af234b176255ff97..37c4b5cca3183ea8c46befcf0f78bcf1efdafd8e 100644
--- a/app/MetaGer.php
+++ b/app/MetaGer.php
@@ -6,6 +6,8 @@ use Jenssegers\Agent\Agent;
 use App;
 use Storage;
 use Log;
+use Config;
+use Redis;
 use App\lib\TextLanguageDetect\TextLanguageDetect;
 use App\lib\TextLanguageDetect\LanguageDetect\TextLanguageDetectException;
 use Illuminate\Pagination\LengthAwarePaginator;
@@ -49,7 +51,7 @@ class MetaGer
 
 	function __construct()
 	{
-        $this->time = microtime();   
+        $this->starttime = microtime(true);   
         define('CRLF', "\r\n");
         define('BUFFER_LENGTH', 8192);
         if( file_exists(config_path() . "/blacklistDomains.txt") && file_exists(config_path() . "/blacklistUrl.txt") )
@@ -86,12 +88,21 @@ class MetaGer
             $viewResults[] = get_object_vars($result);
         }
 
+        # Wir müssen natürlich noch den Log für die durchgeführte Suche schreiben:
+        $this->createLogs();
+
         if( $this->fokus === "bilder" )
         {
             switch ($this->out) 
             {
                 case 'results':
-                    return '';
+                    return view('metager3bilderresults')
+                        ->with('results', $viewResults)
+                        ->with('eingabe', $this->eingabe)
+                        ->with('mobile', $this->mobile)
+                        ->with('warnings', $this->warnings)
+                        ->with('errors', $this->errors)
+                        ->with('metager', $this);
                 default:
                     return view('metager3bilder')
                         ->with('results', $viewResults)
@@ -113,9 +124,18 @@ class MetaGer
                     ->with('errors', $this->errors)
                     ->with('metager', $this);
                 break;
-            default:
+            case 'results-with-style':
                 return view('metager3')
                     ->with('results', $viewResults)
+                    ->with('eingabe', $this->eingabe)
+                    ->with('mobile', $this->mobile)
+                    ->with('warnings', $this->warnings)
+                    ->with('errors', $this->errors)
+                    ->with('metager', $this)
+                    ->with('suspendheader', "yes");
+                break;
+            default:
+                return view('metager3')
                     ->with('eingabe', $this->eingabe)
                     ->with('mobile', $this->mobile)
                     ->with('warnings', $this->warnings)
@@ -125,6 +145,36 @@ class MetaGer
         }
 	}
 
+    private function createLogs()
+    {
+        $redis = Redis::connection('redisLogs');
+        if( $redis )
+        {
+            $logEntry = "";
+            $logEntry .= "[" . date(DATE_RFC822, mktime(date("H"),date("i"), date("s"), date("m"), date("d"), date("Y"))) . "]";
+            $logEntry .= " From=" . $this->ip;
+            $logEntry .= " pid=" . getmypid();
+            $anonId= md5("MySeCrEtSeEdFoRmd5"
+            .$this->request->header('Accept')
+            .$this->request->header('Accept-Charset')
+            .$this->request->header('Accept-Encoding')
+            .$this->request->header('HTTP_LANGUAGE')
+            .$this->request->header('User-Agent')
+            .$this->request->header('Keep-Alive')
+            .$this->request->header('X-Forwarded-For'));
+            $logEntry .= " anonId=$anonId";
+            $logEntry .= " ref=" . $this->request->header('Referer');
+            $useragent = $this->request->header('User-Agent');
+            $useragent = str_replace("(", " ", $useragent);
+            $useragent = str_replace(")", " ", $useragent);
+            $useragent = str_replace(" ", "", $useragent);
+            $logEntry .= " ua=" . $useragent;
+            $logEntry .= " iter= mm= time=" . round((microtime(true)-$this->starttime), 2) . " serv=" . $this->fokus . " which= hits= stringSearch= QuickTips= SSS= check=";
+            $logEntry .= " search=" . $this->eingabe;
+            $redis->rpush('logs.search', $logEntry);
+        }
+    }
+
     public function removeInvalids ()
     {
         $results = [];
@@ -211,6 +261,19 @@ class MetaGer
         }
 
         $this->results = $paginatedSearchResults;
+
+        if( isset($this->password) )
+        {
+            # Wir bieten einen bezahlten API-Zugriff an, bei dem dementsprechend die Werbung ausgeblendet wurde:
+            # Aktuell ist es nur die Uni-Mainz. Deshalb überprüfen wir auch nur diese.
+            $password = getenv('mainz');
+            $eingabe = $this->eingabe;
+            $password = md5($eingabe . $password);
+            if( $this->password === $password )
+            {
+                $this->ads = [];
+            }
+        }
 	}
 
 	public function createSearchEngines (Request $request)
@@ -218,12 +281,11 @@ class MetaGer
 
         #die(SocketRocket::get("tls", "dominik-pfennig.de", "", 443));
 
-
 		# Überprüfe, welche Sumas eingeschaltet sind
         $xml = simplexml_load_file($this->sumaFile);
         $enabledSearchengines = [];
         $overtureEnabled = FALSE;
-        
+        $countSumas = 0;
         if($this->fokus === "angepasst")
         {
             $sumas = $xml->xpath("suma");
@@ -239,12 +301,12 @@ class MetaGer
             foreach($sumas as $suma)
             {
                 if($request->has($suma["service"]) 
-                	|| ( $this->fokus !== "bilder" 
-                		&& ($suma["name"]->__toString() === "qualigo" 
-                			|| $suma["name"]->__toString() === "similar_product_ads" 
-                			|| ( !$overtureEnabled && $suma["name"]->__toString() === "overtureAds" )
-                			)
-                		)
+                	#|| ( $this->fokus !== "bilder" 
+                	#	&& ($suma["name"]->__toString() === "qualigo" 
+                	#		|| $suma["name"]->__toString() === "similar_product_ads" 
+                	#		|| ( !$overtureEnabled && $suma["name"]->__toString() === "overtureAds" )
+                	#		)
+                	#	)
                     #|| 1 === 1  #Todo: entfernen
                 	){
 
@@ -254,7 +316,8 @@ class MetaGer
                         {
                             $overtureEnabled = TRUE;
                         }
-
+                        if( $suma["name"]->__toString() !== "qualigo" && $suma["name"]->__toString() !== "similar_product_ads" && $suma["name"]->__toString() !== "overtureAds" )
+                            $countSumas += 1;
                         $enabledSearchengines[] = $suma;
                     }
                 }
@@ -277,13 +340,15 @@ class MetaGer
                         {
                             $overtureEnabled = TRUE;
                         }
+                        if( $suma["name"]->__toString() !== "qualigo" && $suma["name"]->__toString() !== "similar_product_ads" && $suma["name"]->__toString() !== "overtureAds" )
+                            $countSumas += 1;
                         $enabledSearchengines[] = $suma;
                     }
                 }
             }
         }
 
-        if( ( $this->fokus !== "bilder" && sizeof($enabledSearchengines) <= 3 ) || ( $this->fokus === "bilder" && sizeof($enabledSearchengines) === 0) )
+        if( $countSumas <= 0 )
         {
             $this->errors[] = "Achtung: Sie haben in ihren Einstellungen keine Suchmaschine ausgewählt.";
         }
@@ -313,19 +378,48 @@ class MetaGer
                 $this->sockets[$tmp->name] = $tmp->fp;
             }
 		}
-
         # Nun passiert ein elementarer Schritt.
         # Wir warten auf die Antwort der Suchmaschinen, da wir vorher nicht weiter machen können.
         # aber natürlich nicht ewig.
         # Die Verbindung steht zu diesem Zeitpunkt und auch unsere Request wurde schon gesendet.
         # Wir geben der Suchmaschine nun bis zu 500ms Zeit zu antworten.
-        usleep(500000);
+
         # Jetzt lesen wir alles aus, was da ist und verwerfen den Rest:
-        foreach($engines as $engine)
+        $enginesToLoad = count($engines);
+        $loadedEngines = 0;
+        $time = 0;
+        while( true )
         {
-            $engine->retrieveResults();
+            # Abbruchbedingung
+            if($time < 500)
+            {
+                if($loadedEngines >= $enginesToLoad)
+                    break;
+            }elseif( $time >= 500 && $time < $this->time)
+            {
+                if( ($loadedEngines / ($enginesToLoad * 1.0)) >= 0.8 )
+                    break;
+            }else
+            {
+                break;
+            }
+            foreach($engines as $engine)
+            {
+                if(!$engine->loaded)
+                {
+                    $success = $engine->retrieveResults();
+                    if($engine->loaded)
+                        $loadedEngines += 1;
+                }
+            }
+            usleep(50000);
+            $time += 50;
+        }
+        foreach( $engines as $engine )
+        {
+            if( !$engine->loaded )
+                $engine->shutdown();
         }
-
 
         $this->engines = $engines;
 	}
@@ -372,13 +466,8 @@ class MetaGer
         $this->q = $this->eingabe;
 
         # IP:
-        if( isset($_SERVER['HTTP_FROM']) )
-        {
-            $this->ip = $_SERVER['HTTP_FROM'];
-        }else
-        {
-            $this->ip = "127.0.0.1";
-        }
+        $this->ip = $request->ip();
+
         # Language:
         if( isset($_SERVER['HTTP_LANGUAGE']) )
         {
@@ -390,7 +479,8 @@ class MetaGer
         # Category
         $this->category = $request->input('category', '');
         # Request Times:
-        $this->time = $request->input('time', 1);
+        $this->time = $request->input('time', 1000);
+       
         # Page
         $this->page = $request->input('page', 1);
         # Lang
@@ -401,20 +491,25 @@ class MetaGer
         }
         $this->agent = new Agent();
         $this->mobile = $this->agent->isMobile();
+
         #Sprüche
-        $this->sprueche = $request->input('sprueche', 'on');
+        $this->sprueche = $request->input('sprueche', 'off');
+        if($this->sprueche === "off" )
+            $this->sprueche = true;
+        else
+            $this->sprueche = false;
         # Ergebnisse pro Seite:
         $this->resultCount = $request->input('resultCount', '20');
 
         # Manchmal müssen wir Parameter anpassen um den Sucheinstellungen gerecht zu werden:
         if( $request->has('dart') )
         {
-        	$this->time = 10;
+        	$this->time = 10000;
         	$this->warnings[] = "Hinweis: Sie haben Dart-Europe aktiviert. Die Suche kann deshalb länger dauern und die maximale Suchzeit wurde auf 10 Sekunden hochgesetzt.";
         }
-        if( $this->time < 0 || $this->time > 20 )
+        if( $this->time <= 500 || $this->time > 20000 )
         {
-        	$this->time = 1;
+        	$this->time = 1000;
         }
         if( $request->has('minism') && ( $request->has('fportal') || $request->has('harvest') ) )
         {
@@ -431,7 +526,7 @@ class MetaGer
         }
         if( $request->has('ebay') )
         {
-        	$this->time = 2;
+        	$this->time = 2000;
         	$this->warnings[] = "Hinweis: Sie haben Ebay aktiviert. Die Suche kann deshalb länger dauern und die maximale Suchzeit wurde auf 2 Sekunden hochgesetzt.";
         }
         if( App::isLocale("en") )
@@ -460,6 +555,13 @@ class MetaGer
         {
             $this->tab = "_blank";
         }
+        if( $request->has('password') )
+            $this->password = $request->input('password');
+        if( $request->has('quicktips') )
+            $this->quicktips = false;
+        else
+            $this->quicktips = true;
+
         $this->out = $request->input('out', "html");
         if($this->out !== "html" && $this->out !== "json" && $this->out !== "results" && $this->out !== "results-with-style")
             $this->out = "html";
@@ -475,6 +577,11 @@ class MetaGer
 			$this->q = $match[1] . $match[3];
 			$this->warnings[] = "Sie führen eine Sitesearch durch. Es werden nur Ergebnisse von der Seite: \"" . $this->site . "\" angezeigt.";
 		}
+        if( $request->has('site') )
+        {
+            $this->site = $request->input('site');
+            $this->warnings[] = "Sie führen eine Sitesearch durch. Es werden nur Ergebnisse von der Seite: \"" . $this->site . "\" angezeigt.";
+        }
 		# Wenn die Suchanfrage um das Schlüsselwort "-host:*" ergänzt ist, sollen bestimmte Hosts nicht eingeblendet werden
 		# Wir prüfen, ob das hier der Fall ist:
 		while(preg_match("/(.*)(^|\s)-host:(\S+)(.*)/si", $this->q, $match))
@@ -676,7 +783,7 @@ class MetaGer
     public function generateSiteSearchLink($host)
     {
         $host = urlencode($host);
-        $requestData = $this->request->except('page');
+        $requestData = $this->request->except(['page','out']);
         $requestData['eingabe'] .= " site:$host";
         $requestData['focus'] = "web";
         $link = action('MetaGerSearch@search', $requestData);
@@ -686,7 +793,7 @@ class MetaGer
     public function generateRemovedHostLink ($host)
     {
         $host = urlencode($host);
-        $requestData = $this->request->except('page');
+        $requestData = $this->request->except(['page','out']);
         $requestData['eingabe'] .= " -host:$host";
         $link = action('MetaGerSearch@search', $requestData);
         return $link;
@@ -695,7 +802,7 @@ class MetaGer
     public function generateRemovedDomainLink ($domain)
     {
         $domain = urlencode($domain);
-        $requestData = $this->request->except('page');
+        $requestData = $this->request->except(['page','out']);
         $requestData['eingabe'] .= " -domain:$domain";
         $link = action('MetaGerSearch@search', $requestData);
         return $link;
@@ -716,4 +823,15 @@ class MetaGer
         else
             return null;
     }
+    public function getImageProxyLink($link)
+    {
+        $requestData = [];
+        $requestData["url"] = $link;
+        $link = action('Pictureproxy@get', $requestData);
+        return $link;
+    }
+    public function showQuicktips ()
+    {
+        return $this->quicktips;
+    }
 }
\ No newline at end of file
diff --git a/app/Models/Result.php b/app/Models/Result.php
index 5170afc6a8d0f25f16a902e782fe28eb38c8c9b6..65e4ffa8f911302e6cc92f4a889e91e8ad626f97 100644
--- a/app/Models/Result.php
+++ b/app/Models/Result.php
@@ -105,18 +105,23 @@ class Result
 		foreach(explode(" ", trim($tmpEingabe)) as $el)
 		{
 			$el = preg_quote($el, "/");
-			if(preg_match("/\b$el\b/si", $tmpTitle))
+			if(strlen($tmpTitle) > 0)
 			{
-				$tmpRank += .7 * .6 * $maxRank;
-			}elseif (strpos($tmpTitle, $el) !== false) {
-				$tmpRank += .3 * .6 * $maxRank;
+				if(preg_match("/\b$el\b/si", $tmpTitle))
+				{
+					$tmpRank += .7 * .6 * $maxRank;
+				}elseif (strpos($tmpTitle, $el) !== false) {
+					$tmpRank += .3 * .6 * $maxRank;
+				}
 			}
-
-			if(preg_match("/\b$el\b/si", $tmpDescription))
+			if( strlen($tmpDescription) > 0 )
 			{
-				$tmpRank += .7 * .4 * $maxRank;
-			}elseif (strpos($tmpDescription, $el) !== false) {
-				$tmpRank += .3 * .4 * $maxRank;
+				if(preg_match("/\b$el\b/si", $tmpDescription))
+				{
+					$tmpRank += .7 * .4 * $maxRank;
+				}elseif (strpos($tmpDescription, $el) !== false) {
+					$tmpRank += .3 * .4 * $maxRank;
+				}
 			}
 		}
 		$tmpRank /= sizeof(explode(" ", trim($tmpEingabe))) * 10;
diff --git a/app/Models/Searchengine.php b/app/Models/Searchengine.php
index 6e0bdce4b04c9df3c9e3a447d0040257acd6e0e4..3feafc2223a1b2c5bd92e17c43514ede00d9cb37 100644
--- a/app/Models/Searchengine.php
+++ b/app/Models/Searchengine.php
@@ -19,6 +19,7 @@ abstract class Searchengine
 	public $ads = [];
 	public $write_time = 0;
 	public $connection_time = 0;
+	public $loaded = false;
 
 	function __construct(\SimpleXMLElement $engine, MetaGer $metager)
 	{
@@ -231,6 +232,7 @@ abstract class Searchengine
 		// end of headers
 		if(sizeof($headers) > 1){
 			$bodySize = 0;
+			stream_set_blocking($this->fp, 1);
 			if( isset($headers["Transfer-Encoding"]) && $headers["Transfer-Encoding"] === "chunked" )
 			{
 				$body = $this->readChunked();
@@ -245,6 +247,10 @@ abstract class Searchengine
 			{
 				die("Konnte nicht herausfinden, wie ich die Serverantwort von: " . $this->name . " auslesen soll. Header war: " . print_r($headers));
 			}
+			$this->loaded = true;
+		}else
+		{
+			return;
 		}
 
 		Redis::del($this->host . "." . $this->socketNumber);
@@ -253,7 +259,6 @@ abstract class Searchengine
 		{
 			$body = $this->gunzip($body);
 		}
-
 		#print_r($headers);
 		#print($body);
 		#print("\r\n". $bodySize);
@@ -265,6 +270,12 @@ abstract class Searchengine
 		#exit;
 	}
 
+	public function shutdown()
+	{
+		fclose($this->fp);
+		Redis::del($this->host . "." . $this->socketNumber);
+	}
+
 	private function readBody($length)
 	{
 		$theData = '';
diff --git a/app/Models/parserSkripte/Ecoshopper.php b/app/Models/parserSkripte/Ecoshopper.php
index ea59aecc614ae62176b09729f0925a7759289072..1ab99ce68dd4dd71a2c61e334c45361d7f51a394 100644
--- a/app/Models/parserSkripte/Ecoshopper.php
+++ b/app/Models/parserSkripte/Ecoshopper.php
@@ -43,6 +43,7 @@ class Ecoshopper extends Searchengine
 				$anzeigeLink = $link;
 			}
 			$descr = $result->xpath('//doc/str[@name="artikelBeschreibung"]')[0]->__toString();
+			$image = $result->xpath('//doc/str[@name="artikelImageurl"]')[0]->__toString();
 			$this->counter++;
 			$this->results[] = new \App\Models\Result(
 				$this->engine,
@@ -51,7 +52,9 @@ class Ecoshopper extends Searchengine
 				$anzeigeLink,
 				$descr,
 				$this->gefVon,
-				$this->counter
+				$this->counter,
+				false,
+				$image
 			);
 		}
 	}
diff --git a/app/Models/parserSkripte/Mg_produkt2.php b/app/Models/parserSkripte/Mg_produkt2.php
index 04f76a9062d09dbfda39de924a4a86044da00844..e6688252b6723b9ba4d748e332d327078145888b 100644
--- a/app/Models/parserSkripte/Mg_produkt2.php
+++ b/app/Models/parserSkripte/Mg_produkt2.php
@@ -35,6 +35,7 @@ class Mg_produkt2 extends Searchengine
 			parse_str($anzeigeLink['query'], $query);
 			$anzeigeLink = $query['diurl'];
 			$descr = $result->xpath('/doc/arr[@name="artikelBeschreibung"]')[0]->{"str"}->__toString();
+			$image = $result->xpath('/doc/arr[@name="artikelImageurl"]')[0]->{"str"}->__toString();
 			$this->counter++;
 			$this->results[] = new \App\Models\Result(
 				$this->engine,
@@ -43,7 +44,9 @@ class Mg_produkt2 extends Searchengine
 				$anzeigeLink,
 				$descr,
 				$this->gefVon,
-				$this->counter
+				$this->counter,
+				false,
+				$image
 			);
 		}
 	}
diff --git a/app/Models/parserSkripte/Zeitde.php b/app/Models/parserSkripte/Zeitde.php
index 756a6b241a1b0509043a2c1b9c38ae438360e540..99014cc0bb611ac8284e171cc91d0e42bcf9fa9d 100644
--- a/app/Models/parserSkripte/Zeitde.php
+++ b/app/Models/parserSkripte/Zeitde.php
@@ -20,6 +20,8 @@ class Zeitde extends Searchengine
 			return;
 		foreach( $results->{"matches"} as $result )
 		{
+			if( !isset($result->{"title"}) || !isset($result->{"href"}) || !isset($result->{"snippet"}))
+				continue;
 			$title = $result->{"title"};
 			$link = $result->{"href"};
 			$anzeigeLink = $link;
diff --git a/config/database.php b/config/database.php
index 8451a62fbf2635da0714f17996c7b14683489f14..076fc54e5d82e13b4cf00bdf7499b5090c647789 100755
--- a/config/database.php
+++ b/config/database.php
@@ -114,6 +114,12 @@ return [
             'port' => env('REDIS_PORT', 6379),
             'database' => 0,
         ],
+        'redisLogs' => [
+            'host' => env('REDIS_LOGS_HOST', 'localhost'),
+            'password' => env('REDIS_LOGS_PASSWORD', null),
+            'port' => env('REDIS_MAIN_PORT', 6379),
+            'database' => 1,
+        ],
 
     ],
 
diff --git a/public/css/styleResultPage.css b/public/css/styleResultPage.css
index 3c214cc4c02413dac6425efb16b28e50fa913b06..cfd178a1fa9a073e996a01225adf3bc0dc8c3195 100644
--- a/public/css/styleResultPage.css
+++ b/public/css/styleResultPage.css
@@ -361,6 +361,14 @@ a:hover
 	margin-right:2px
 }
 
+.result .image {
+	padding:0;
+}
+
+.result .image > img{
+	max-width: 100%;
+}
+
 .popover-content{
 	/*padding-left: 0;
 	padding-right:0;*/
diff --git a/public/css/styleResultPageMobile.css b/public/css/styleResultPageMobile.css
new file mode 100644
index 0000000000000000000000000000000000000000..87ef3e072db479b173927f08b122639b47282816
--- /dev/null
+++ b/public/css/styleResultPageMobile.css
@@ -0,0 +1,105 @@
+* {
+	
+}
+
+.content-wrapper {
+    padding-top: 50px;
+}
+
+div#fokiChanger {
+    margin-bottom: 0;
+}
+
+#fokiChanger a {
+    color: grey;
+}
+
+li.list-group-item.selected {
+    background-color: #f5f5f5;
+}
+
+select#fokiChanger {
+    width: 100%;
+    height: 30px;
+    text-align: center;
+    background-color: inherit;
+    border: 0;
+}
+
+header#research {
+    width: 100%;
+    margin-left: -50%;
+}
+
+p.link {
+    white-space: nowrap;
+}
+
+header nav {
+    width: 100%;
+    padding: 0 10px;
+    margin-left: 0;
+}
+/* Research Bar */
+#researchBar{
+	width:100%;
+	margin-left: -50%;
+	padding-left:0;
+	padding-right:0;
+}
+
+/* Result Boxen */
+.result{
+	padding:0;
+}
+.result > .resultInformation{
+	margin-left:0;
+	padding-left:0;
+}
+.result .link a{
+	white-space:nowrap;
+	overflow:hidden;
+}
+
+.result.ad .link > a {
+    width: 50%;
+    max-width: 15ch;
+    overflow: hidden;
+    display: inline-flex;
+    text-overflow: ellipsis;
+}
+.result .hoster{
+	white-space:nowrap;
+}
+
+.row{
+	margin: 10px 0;
+}
+
+.row .col-md-8 {
+   padding: 0 10px;
+}
+
+.container-fluid {
+    padding: 5px 0;
+}
+
+.panel .panel-heading {
+    padding-top: 5px;
+    padding-bottom: 5px;
+}
+
+.content-wrapper{
+	width: 100%;
+}
+
+.result .link-link{
+	max-width:90%;
+}
+
+.alert ul {
+	padding-left:0px;	
+}
+.resultContainer {
+    padding: 0!important;
+}
\ No newline at end of file
diff --git a/public/index.php b/public/index.php
index 21b064cbfea8cd67b61943a17730eaf0ca2dd654..79a6cbfc5b5b79827ca11c38bbac1d0aabb64378 100644
--- a/public/index.php
+++ b/public/index.php
@@ -11,9 +11,19 @@
  # nicht einmal wir selbst noch Zugriff auf die Daten haben:
 if( !isset($_SERVER['HTTP_X_FORWARDED_FOR'] ))
 {
-	$_SERVER['REMOTE_ADDR'] = substr($_SERVER['REMOTE_ADDR'], 0, strrpos($_SERVER['REMOTE_ADDR'], ".")) . ".0";
-	$_SERVER['HTTP_USER_AGENT'] = substr($_SERVER['HTTP_USER_AGENT'], 0, 23);
+	$_SERVER['REMOTE_ADDR'] = preg_replace("/(\d+)\.(\d+)\.\d+.\d+/s", "$1.$2.0.0", $_SERVER['REMOTE_ADDR']);
+}else
+{
+	$_SERVER['HTTP_X_FORWARDED_FOR'] = preg_replace("/(\d+)\.(\d+)\.\d+.\d+/s", "$1.$2.0.0", $_SERVER['HTTP_X_FORWARDED_FOR']);
+}
+$agentPieces = explode(" ", $_SERVER['HTTP_USER_AGENT']);
+
+for($i = 0; $i < count($agentPieces); $i++)
+{
+	$agentPieces[$i] = preg_replace("/(\d+\.\d+)/s", "0.0", $agentPieces[$i]);
+	$agentPieces[$i] = preg_replace("/([^\/]*)\/\w+/s", "$1/0.0", $agentPieces[$i]);
 }
+$_SERVER['HTTP_USER_AGENT'] = implode(" ", $agentPieces);
 
 /*
 |--------------------------------------------------------------------------
diff --git a/public/js/scriptStartPage.js b/public/js/scriptStartPage.js
index 6863515c76a294559e2cf323e108f57c2635014c..b53290789dc48cbe9fbdc12b389b093b014dcfd8 100644
--- a/public/js/scriptStartPage.js
+++ b/public/js/scriptStartPage.js
@@ -50,7 +50,7 @@ function checkPlugin(){
 		$("#plugin-modal .modal-header h4").html("MetaGer zum Firefox hinzufügen");
 		var content = "" +
 				"<ol>" +
-				"<li>Klicken Sie <a href=\"javascript:window.external.AddSearchProvider('https://metager.de/plugins/opensearchplugin.xml')\">hier</a> um MetaGer als Suchmaschine hinzuzufügen.</li>" +
+				"<li>Klicken Sie <a href=\"javascript:window.external.AddSearchProvider($('link[rel=search]').attr('href'))\">hier</a> um MetaGer als Suchmaschine hinzuzufügen.</li>" +
 				"<li>Setzen Sie einen Haken bei \"Diese als aktuelle Suchmaschine setzen\"</li>" +
 				"<li>Klicken Sie auf \"Hinzufügen\"</li>" +
 				"</ol>";
@@ -59,7 +59,7 @@ function checkPlugin(){
 		$("#plugin-modal .modal-header h4").html("MetaGer zum Chrome hinzufügen");
 		var content = "" +
 				"<ol>" +
-				"<li>Klicken Sie <a href=\"javascript:window.external.AddSearchProvider('https://metager.de/plugins/opensearchplugin.xml')\" onclick=\"$('#more').removeClass('hidden');\">hier</a>, um MetaGer als Suchmaschine hinzuzufügen" +
+				"<li>Klicken Sie <a href=\"javascript:window.external.AddSearchProvider($('link[rel=search]').attr('href'))\" onclick=\"$('#more').removeClass('hidden');\">hier</a>, um MetaGer als Suchmaschine hinzuzufügen" +
 				"<ul id=\"more\" class=\"hidden list-unstyled\">" +
 				"<li>Klicken Sie im Popup auf OK</li>" +
 				"<li><small>(Sollte der OK-Knopf deaktiviert sein, ist MetaGer bereits in Ihren Suchmaschinen. Klicken Sie dann auf Abbrechen und fahren mit Schritt 2 fort.)</small></li>" +
@@ -85,7 +85,7 @@ function checkPlugin(){
 		$("#plugin-modal .modal-header h4").html("MetaGer zum Internet Explorer hinzufügen");
 		var content = "" +
 			"<ol>" +
-			"<li>Klicken Sie <a href=\"javascript:window.external.addSearchProvider('https://metager.de/plugins/opensearchplugin.xml');\">hier</a>, um MetaGer als Suchmaschine hinzuzufügen" +
+			"<li>Klicken Sie <a href=\"javascript:window.external.addSearchProvider($('link[rel=search]').attr('href'));\">hier</a>, um MetaGer als Suchmaschine hinzuzufügen" +
 			"<li>Klicken Sie in Ihrem Browser oben rechts auf Extras (<span class=\"glyphicon glyphicon-cog\"></span>)</li>" +
 			"<li>Wählen Sie den Menüpunkt \"Add-Ons verwalten\"</li>" +
 			"<li>Klicken Sie im Bereich Add-On-Typen auf \"Suchanbieter\" und danach im rechten Bereich auf \"MetaGer\"</li>" +
diff --git a/public/js/settings.js b/public/js/settings.js
index 10ab643fd7316fb590d7623bcf55006b81c7da0f..eb7c6f1f3bdbda14cdc32ccc00ced9c3586beafb 100644
--- a/public/js/settings.js
+++ b/public/js/settings.js
@@ -32,6 +32,10 @@ $(document).ready(function(){
 	$("#unten").click(function(){
 		alert("Auf der folgenden Startseite sind Ihre Einstellungen nun einmalig gespeichert. Nach Ihrer ersten Suche sind diese wieder verloren. Wenn Sie diese speichern möchten, können Sie sich allerdings ein Lesezeichnen einrichten.");
 	});
+	$("#plugin").click(function(){
+		$("form").attr('action', '/#plugin-modal');
+		alert("Ihr Browserplugin mit den persönlichen Sucheinstellungen wurde generiert. Folgen Sie bitte der Anleitung auf der folgenden Seite um es zu installieren. Beachten Sie: Zuvor sollten Sie ein eventuell bereits installiertes MetaGer-Plugin entfernen.");
+	});
 });
 
 function tickOptions(){
diff --git a/resources/views/layouts/researchandtabs.blade.php b/resources/views/layouts/researchandtabs.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..689ff152f4dc9669f77be69cf0d79c78ffca590c
--- /dev/null
+++ b/resources/views/layouts/researchandtabs.blade.php
@@ -0,0 +1,229 @@
+<div class="content-wrapper">
+        <header id="research">
+            <nav>
+                <ul class="list-inline">
+                    <li class="hidden-xs hidden-sm pull-left">
+                        <div class="logo"><a href="/"><h1>MetaGer</h1></a>
+                        </div>
+                    </li>
+                    <li class="visible-xs visible-sm pull-left">
+                        <div class="logo"><a href="/"><h1>MG</h1></a>
+                        </div>
+                    </li>
+                    <li class="pull-right">
+                        <form method="get" accept-charset="UTF-8" class="form" id="submitForm">
+                            <div class="input-group">
+                                <input autocomplete="off" class="form-control" form="submitForm" id="eingabeTop" name="eingabe" placeholder="Suchbegriffe erweitern/verändern, oder völlig neue Suche:" tabindex="1" type="text" value="{{ $eingabe }}" />
+                                <div class="input-group-addon">
+                                    <button type='submit' form="submitForm" id='search'><span class="glyphicon glyphicon-search"></span>
+                                    </button>
+                                </div>
+                            </div>
+
+                            @foreach( $metager->request->all() as $key => $value)
+                                @if($key !== "eingabe" && $key !== "page")
+                                <input type='hidden' name='{{ $key }}' value='{{ $value }}' form='submitForm' />
+                                @endif
+                            @endforeach
+
+                        </form>
+                    </li>
+                </ul>
+            </nav>
+        </header>
+        <ul class="nav nav-tabs" id="foki" role="tablist">
+        @if( $metager->getFokus() === "web" )
+        <li id="webTabSelector" role="presentation" data-loaded="1" class="active">
+            <a aria-controls="web" data-href="#web" href="#web">
+                <span class='glyphicon glyphicon-globe'></span> 
+                <span class="hidden-xs">Web</span>
+            </a>
+        </li>
+        @else
+            <li data-loaded="0" id="webTabSelector" role="presentation">
+                <a aria-controls="web" data-href="{{ $metager->generateSearchLink('web') }}" href="{{ $metager->generateSearchLink('web') }}">
+                    <span class='glyphicon glyphicon-globe'></span> 
+                    <span class="hidden-xs">Web</span>
+                </a>
+            </li>
+        @endif
+
+        @if( $metager->getFokus() === "bilder" )
+        <li id="bilderTabSelector" role="presentation" data-loaded="1" class="active">
+            <a aria-controls="bilder" data-href="#bilder" href="#bilder">
+                <span class='glyphicon glyphicon-picture'></span> 
+                <span class="hidden-xs">Bilder</span>
+            </a>
+        </li>
+        @else
+        <li data-loaded="0" id="bilderTabSelector" role="presentation">
+            <a aria-controls="bilder" data-href="{{ $metager->generateSearchLink('bilder') }}" href="{{ $metager->generateSearchLink('bilder') }}">
+                <span class='glyphicon glyphicon-picture'></span> 
+                <span class="hidden-xs">Bilder</span>
+            </a>
+        </li>
+        @endif
+
+        @if( $metager->getFokus() === "nachrichten" )
+        <li id="nachrichtenTabSelector" role="presentation" data-loaded="1" class="active">
+            <a aria-controls="nachrichten" data-href="#nachrichten" href="#nachrichten">
+                <span class='glyphicon glyphicon-bullhorn'></span> 
+                <span class="hidden-xs">Nachrichten</span>
+            </a>
+        </li>
+        @else
+        <li data-loaded="0" id="nachrichtenTabSelector" role="presentation" >
+            <a aria-controls="nachrichten" data-href="{{ $metager->generateSearchLink('nachrichten') }}" href="{{ $metager->generateSearchLink('nachrichten') }}">
+                <span class='glyphicon glyphicon-bullhorn'></span> 
+                <span class="hidden-xs">Nachrichten</span>
+            </a>
+        </li>
+        @endif
+
+        @if( $metager->getFokus() === "wissenschaft" )
+        <li id="wissenschaftTabSelector" role="presentation" data-loaded="1" class="active">
+            <a aria-controls="wissenschaft" data-href="#wissenschaft" href="#wissenschaft">
+                <span class='glyphicon glyphicon-file'></span> 
+                <span class="hidden-xs">Wissenschaft</span>
+            </a>
+        </li>
+        @else
+        <li data-loaded="0" id="wissenschaftTabSelector" role="presentation">
+            <a aria-controls="wissenschaft" data-href="{{ $metager->generateSearchLink('wissenschaft') }}" href="{{ $metager->generateSearchLink('wissenschaft') }}">
+                <span class='glyphicon glyphicon-file'></span> 
+                <span class="hidden-xs">Wissenschaft</span>
+            </a>
+        </li>
+        @endif
+
+        @if( $metager->getFokus() === "produktsuche" )
+        <li id="produktsucheTabSelector" role="presentation" data-loaded="1" class="active">
+            <a aria-controls="produktsuche" data-href="#produktsuche" href="#produktsuche">
+                <span class='glyphicon glyphicon-shopping-cart'></span> 
+                <span class="hidden-xs">Produktsuche</span>
+            </a>
+        </li>
+        @else
+        <li data-loaded="0" id="produktsucheTabSelector" role="presentation" >
+            <a aria-controls="produktsuche" data-href="{{ $metager->generateSearchLink('produktsuche') }}" href="{{ $metager->generateSearchLink('produktsuche') }}">
+                <span class='glyphicon glyphicon-shopping-cart'></span> 
+                <span class="hidden-xs">Produktsuche</span>
+            </a>
+        </li>
+        @endif
+
+        @if( $metager->getFokus() === "angepasst" )
+        <li id="angepasstTabSelector" role="presentation" data-loaded="1" class="active">
+            <a aria-controls="angepasst" data-href="#angepasst" href="#angepasst">
+                <span class='glyphicon glyphicon-cog'></span> 
+                <span class="hidden-xs">angepasst</span>
+            </a>
+        </li>
+        @endif
+        </ul>
+
+        <div class="tab-content container-fluid">
+            @if( sizeof($errors) > 0 )
+                <div class="alert alert-danger">
+                    <ul>
+                        @foreach($errors as $error)
+                        <li>{{ $error }}</li>
+                        @endforeach
+                    </ul>
+                </div>
+            @endif
+            @if( sizeof($warnings) > 0)
+                <div class="alert alert-warning">
+                    <ul>
+                        @foreach($warnings as $warning)
+                        <li>{{ $warning }}</li>
+                        @endforeach
+                    </ul>
+                </div>
+                @endif
+            
+            @if( $metager->getFokus() === "web" )
+            <div role="tabpanel" class="tab-pane active" id="web">
+                <div class="row">
+                    @yield('results')
+                </div>
+            </div>
+            @else
+            <div role="tabpanel" class="tab-pane" id="web">
+                <div class="loader">
+                    <img src="/img/ajax-loader.gif" alt="" />
+                </div>
+            </div>
+            @endif
+            
+
+            
+            @if( $metager->getFokus() === "bilder" )
+            <div role="tabpanel" class="tab-pane active" id="bilder">
+                <div class="row">
+                    @yield('results')
+                </div>
+            </div>
+            @else
+            <div role="tabpanel" class="tab-pane" id="bilder">
+                <div class="loader">
+                    <img src="/img/ajax-loader.gif" alt="" />
+                </div>
+            </div>
+            @endif
+            
+
+            
+            @if( $metager->getFokus() === "nachrichten" )
+            <div role="tabpanel" class="tab-pane active" id="nachrichten">
+                <div class="row">
+                    @yield('results')
+                </div>
+            </div>
+            @else
+            <div role="tabpanel" class="tab-pane" id="nachrichten">
+                <div class="loader">
+                    <img src="/img/ajax-loader.gif" alt="" />
+                </div>
+            </div>
+            @endif
+            
+            @if( $metager->getFokus() === "wissenschaft" )
+            <div role="tabpanel" class="tab-pane active" id="wissenschaft">
+                <div class="row">
+                    @yield('results')
+                </div>
+             </div>
+            @else
+            <div role="tabpanel" class="tab-pane" id="wissenschaft">
+                <div class="loader">
+                    <img src="/img/ajax-loader.gif" alt="" />
+                </div>
+            </div>
+            @endif
+            
+            @if( $metager->getFokus() === "produktsuche" )
+            <div role="tabpanel" class="tab-pane active" id="produktsuche">
+                <div class="row">
+                        @yield('results')
+                </div>
+             </div>
+            @else
+            <div role="tabpanel" class="tab-pane" id="produktsuche">
+                <div class="loader">
+                    <img src="/img/ajax-loader.gif" alt="" />
+                </div>
+            </div>
+            @endif
+           
+
+            
+            @if( $metager->getFokus() === "angepasst" )
+            <div role="tabpanel" class="tab-pane active" id="angepasst">
+                <div class="row">
+                        @yield('results')
+                </div>
+            </div>
+            @endif
+        </div>
+    </div>
\ No newline at end of file
diff --git a/resources/views/layouts/result.blade.php b/resources/views/layouts/result.blade.php
index 529d4c42c5f1c0168719851be824cc1652625da2..ce6e00da09f67a97df8ed0ecfa16337d5e6a9c34 100644
--- a/resources/views/layouts/result.blade.php
+++ b/resources/views/layouts/result.blade.php
@@ -1,14 +1,14 @@
 <div class="result row">
-	<div class="number col-sm-1" style="color:{{ $result->color }}">
+	<div class="number col-sm-1 hidden-xs" style="color:{{ $result->color }}">
 		{{ $result->number }})
 	</div>
 
 		@if( $result->image !== "" )
-		<div class="image col-sm-1">
-			<img src="{{ $result->image }}" alt="" height="50px" />
+		<div class="image col-xs-2 col-sm-1">
+			<img src="{{ $metager->getImageProxyLink($result->image) }}" alt="" />
 		</div>
 		@endif
-		<div class="resultInformation col-sm-10">
+		<div class="resultInformation col-xs-10 col-sm-10">
 			<p class="title">
 				<a class="title" href="{{ $result->link }}" target="{{ $metager->getTab() }}" data-hoster="{{ $result->gefVon }}" data-count="{{ $result->number }}">
 				{{ $result->titel }}
diff --git a/resources/views/layouts/resultPage.blade.php b/resources/views/layouts/resultPage.blade.php
index f9f1cd0ab52da135d6b997a257372d893d57b833..eb0d11dee3754e4d1a548a92c46c5d9ede910c34 100644
--- a/resources/views/layouts/resultPage.blade.php
+++ b/resources/views/layouts/resultPage.blade.php
@@ -5,7 +5,7 @@
     <title>{{ $metager->getQ() }} - MetaGer</title>
     <link href="/css/bootstrap.css" rel="stylesheet" />
     <link href="/css/styleResultPage.css" rel="stylesheet" />
-    @if( isset($mobile) )
+    @if( isset($mobile) && $mobile )
     <link href="/css/styleResultPageMobile.css" rel="stylesheet" />
     @endif
     <link href="/css/theme.css.php" rel="stylesheet" />
@@ -18,236 +18,32 @@
 </head>
 
 <body id="resultBody">
-    <div class="content-wrapper">
-        <header id="research">
-            <nav>
-                <ul class="list-inline">
-                    <li class="hidden-xs hidden-sm pull-left">
-                        <div class="logo"><a href="/"><h1>MetaGer</h1></a>
-                        </div>
-                    </li>
-                    <li class="visible-xs visible-sm pull-left">
-                        <div class="logo"><a href="/"><h1>MG</h1></a>
-                        </div>
-                    </li>
-                    <li class="pull-right">
-                        <form method="get" accept-charset="UTF-8" class="form" id="submitForm">
-                            <div class="input-group">
-                                <input autocomplete="off" class="form-control" form="submitForm" id="eingabeTop" name="eingabe" placeholder="Suchbegriffe erweitern/verändern, oder völlig neue Suche:" tabindex="1" type="text" value="{{ $eingabe }}" />
-                                <div class="input-group-addon">
-                                    <button type='submit' form="submitForm" id='search'><span class="glyphicon glyphicon-search"></span>
-                                    </button>
-                                </div>
-                            </div>
-
-                            @foreach( $metager->request->all() as $key => $value)
-                                @if($key !== "eingabe")
-                                <input type='hidden' name='{{ $key }}' value='{{ $value }}' form='submitForm' />
-                                @endif
-                            @endforeach
-
-                        </form>
-                    </li>
-                </ul>
-            </nav>
-        </header>
-        <ul class="nav nav-tabs" id="foki" role="tablist">
-        @if( $metager->getFokus() === "web" )
-        <li id="webTabSelector" role="presentation" data-loaded="1" class="active">
-            <a aria-controls="web" data-href="#web" href="#web">
-                <span class='glyphicon glyphicon-globe'></span> 
-                <span class="hidden-xs">Web</span>
-            </a>
-        </li>
-        @else
-            <li data-loaded="0" id="webTabSelector" role="presentation">
-                <a aria-controls="web" data-href="{{ $metager->generateSearchLink('web') }}" href="{{ $metager->generateSearchLink('web') }}">
-                    <span class='glyphicon glyphicon-globe'></span> 
-                    <span class="hidden-xs">Web</span>
-                </a>
-            </li>
-        @endif
-
-        @if( $metager->getFokus() === "bilder" )
-        <li id="bilderTabSelector" role="presentation" data-loaded="1" class="active">
-            <a aria-controls="bilder" data-href="#bilder" href="#bilder">
-                <span class='glyphicon glyphicon-picture'></span> 
-                <span class="hidden-xs">Bilder</span>
-            </a>
-        </li>
-        @else
-        <li data-loaded="0" id="bilderTabSelector" role="presentation">
-            <a aria-controls="bilder" data-href="{{ $metager->generateSearchLink('bilder') }}" href="{{ $metager->generateSearchLink('bilder') }}">
-                <span class='glyphicon glyphicon-picture'></span> 
-                <span class="hidden-xs">Bilder</span>
-            </a>
-        </li>
-        @endif
-
-        @if( $metager->getFokus() === "nachrichten" )
-        <li id="nachrichtenTabSelector" role="presentation" data-loaded="1" class="active">
-            <a aria-controls="nachrichten" data-href="#nachrichten" href="#nachrichten">
-                <span class='glyphicon glyphicon-bullhorn'></span> 
-                <span class="hidden-xs">Nachrichten</span>
-            </a>
-        </li>
-        @else
-        <li data-loaded="0" id="nachrichtenTabSelector" role="presentation" >
-            <a aria-controls="nachrichten" data-href="{{ $metager->generateSearchLink('nachrichten') }}" href="{{ $metager->generateSearchLink('nachrichten') }}">
-                <span class='glyphicon glyphicon-bullhorn'></span> 
-                <span class="hidden-xs">Nachrichten</span>
-            </a>
-        </li>
-        @endif
-
-        @if( $metager->getFokus() === "wissenschaft" )
-        <li id="wissenschaftTabSelector" role="presentation" data-loaded="1" class="active">
-            <a aria-controls="wissenschaft" data-href="#wissenschaft" href="#wissenschaft">
-                <span class='glyphicon glyphicon-file'></span> 
-                <span class="hidden-xs">Wissenschaft</span>
-            </a>
-        </li>
-        @else
-        <li data-loaded="0" id="wissenschaftTabSelector" role="presentation">
-            <a aria-controls="wissenschaft" data-href="{{ $metager->generateSearchLink('wissenschaft') }}" href="{{ $metager->generateSearchLink('wissenschaft') }}">
-                <span class='glyphicon glyphicon-file'></span> 
-                <span class="hidden-xs">Wissenschaft</span>
-            </a>
-        </li>
-        @endif
-
-        @if( $metager->getFokus() === "produktsuche" )
-        <li id="produktsucheTabSelector" role="presentation" data-loaded="1" class="active">
-            <a aria-controls="produktsuche" data-href="#produktsuche" href="#produktsuche">
-                <span class='glyphicon glyphicon-shopping-cart'></span> 
-                <span class="hidden-xs">Produktsuche</span>
-            </a>
-        </li>
-        @else
-        <li data-loaded="0" id="produktsucheTabSelector" role="presentation" >
-            <a aria-controls="produktsuche" data-href="{{ $metager->generateSearchLink('produktsuche') }}" href="{{ $metager->generateSearchLink('produktsuche') }}">
-                <span class='glyphicon glyphicon-shopping-cart'></span> 
-                <span class="hidden-xs">Produktsuche</span>
-            </a>
-        </li>
-        @endif
-
-        @if( $metager->getFokus() === "angepasst" )
-        <li id="angepasstTabSelector" role="presentation" data-loaded="1" class="active">
-            <a aria-controls="angepasst" data-href="#angepasst" href="#angepasst">
-                <span class='glyphicon glyphicon-cog'></span> 
-                <span class="hidden-xs">angepasst</span>
-            </a>
-        </li>
-        @endif
+    
+    @if( !isset($suspendheader) )
+    @include('layouts.researchandtabs')
+    @else
+    <div class="tab-content container-fluid">
+    @if( sizeof($errors) > 0 )
+    <div class="alert alert-danger">
+        <ul>
+            @foreach($errors as $error)
+            <li>{{ $error }}</li>
+            @endforeach
         </ul>
-
-        <div class="tab-content container-fluid">
-            @if( sizeof($errors) > 0 )
-                <div class="alert alert-danger">
-                    <ul>
-                        @foreach($errors as $error)
-                        <li>{{ $error }}</li>
-                        @endforeach
-                    </ul>
-                </div>
-            @endif
-            @if( sizeof($warnings) > 0)
-                <div class="alert alert-warning">
-                    <ul>
-                        @foreach($warnings as $warning)
-                        <li>{{ $warning }}</li>
-                        @endforeach
-                    </ul>
-                </div>
-                @endif
-            
-            @if( $metager->getFokus() === "web" )
-            <div role="tabpanel" class="tab-pane active" id="web">
-                <div class="row">
-                    @yield('results')
-                </div>
-            </div>
-            @else
-            <div role="tabpanel" class="tab-pane" id="web">
-                <div class="loader">
-                    <img src="/img/ajax-loader.gif" alt="" />
-                </div>
-            </div>
-            @endif
-            
-
-            
-            @if( $metager->getFokus() === "bilder" )
-            <div role="tabpanel" class="tab-pane active" id="bilder">
-                <div class="row">
-                    @yield('results')
-                </div>
-            </div>
-            @else
-            <div role="tabpanel" class="tab-pane" id="bilder">
-                <div class="loader">
-                    <img src="/img/ajax-loader.gif" alt="" />
-                </div>
-            </div>
-            @endif
-            
-
-            
-            @if( $metager->getFokus() === "nachrichten" )
-            <div role="tabpanel" class="tab-pane active" id="nachrichten">
-                <div class="row">
-                    @yield('results')
-                </div>
-            </div>
-            @else
-            <div role="tabpanel" class="tab-pane" id="nachrichten">
-                <div class="loader">
-                    <img src="/img/ajax-loader.gif" alt="" />
-                </div>
-            </div>
-            @endif
-            
-            @if( $metager->getFokus() === "wissenschaft" )
-            <div role="tabpanel" class="tab-pane active" id="wissenschaft">
-                <div class="row">
-                    @yield('results')
-                </div>
-             </div>
-            @else
-            <div role="tabpanel" class="tab-pane" id="wissenschaft">
-                <div class="loader">
-                    <img src="/img/ajax-loader.gif" alt="" />
-                </div>
-            </div>
-            @endif
-            
-            @if( $metager->getFokus() === "produktsuche" )
-            <div role="tabpanel" class="tab-pane active" id="produktsuche">
-                <div class="row">
-                        @yield('results')
-                </div>
-             </div>
-            @else
-            <div role="tabpanel" class="tab-pane" id="produktsuche">
-                <div class="loader">
-                    <img src="/img/ajax-loader.gif" alt="" />
-                </div>
-            </div>
-            @endif
-           
-
-            
-            @if( $metager->getFokus() === "angepasst" )
-            <div role="tabpanel" class="tab-pane active" id="angepasst">
-                <div class="row">
-                        @yield('results')
-                </div>
-            </div>
-            @endif
-        </div>
     </div>
-
+    @endif
+    @if( sizeof($warnings) > 0)
+    <div class="alert alert-warning">
+        <ul>
+            @foreach($warnings as $warning)
+            <li>{{ $warning }}</li>
+            @endforeach
+        </ul>
+    </div>
+    @endif
+    @yield('results')
+    </div>
+    @endif
         
     <footer>
         <ul class="list-unstyled list-inline footer">
diff --git a/resources/views/layouts/staticPages.blade.php b/resources/views/layouts/staticPages.blade.php
index 0a2e75344599ed3d51b4b1203b8746e1638e1058..84499f7c13af74f4cbab11fe97b91efd9e2da8b0 100644
--- a/resources/views/layouts/staticPages.blade.php
+++ b/resources/views/layouts/staticPages.blade.php
@@ -12,7 +12,7 @@
         <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
         <meta rel="icon" type="image/x-icon" href="/favicon.ico" />
         <meta rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
-        <link rel="search" type="application/opensearchdescription+xml" title="MetaGer: Sicher suchen &amp; finden, Privatsph&auml;re sch&uuml;tzen" href="https://metager.de/plugins/opensearchplugin.xml" />
+        <link rel="search" type="application/opensearchdescription+xml" title="MetaGer: Sicher suchen &amp; finden, Privatsph&auml;re sch&uuml;tzen" href="{{ action('StartpageController@loadPlugin', Request::all()) }}">
         <link href="/css/bootstrap.css" rel="stylesheet" />
         <link href="/css/style.css" rel="stylesheet" />
         @if (isset($css))
diff --git a/resources/views/metager3.blade.php b/resources/views/metager3.blade.php
index 00f191a9dc00bf2e18cc613616ab94fdd3bba6e3..87aec49caa45c747334d565f109ac100d0b4089f 100644
--- a/resources/views/metager3.blade.php
+++ b/resources/views/metager3.blade.php
@@ -2,7 +2,11 @@
 
 @section('results')
 
-<div class="col-md-8">
+@if( $metager->showQuicktips() )
+<div class="col-xs-12 col-md-8 resultContainer">
+@else
+<div class="col-xs-12 col-md-12 resultContainer">
+@endif
 	{{-- 3-Mal Werbung --}}
 	@for($i = 0; $i <= 2; $i++)
 		@include('layouts.ad', ['ad' => $metager->popAd()])
@@ -18,9 +22,11 @@
         {!! $metager->getResults()->links() !!}
     </nav>
 </div>
-<div class="col-md-4" id="quicktips">
-	<iframe class="col-mod-4 hidden-xs hidden-sm" src="/qt?q={{ $metager->getQ() }}"></iframe>
+@if( $metager->showQuicktips() )
+<div class="hidden-xs col-md-4" id="quicktips">
+	<iframe class="col-mod-4 hidden-xs hidden-sm" src="/qt?q={{ $metager->getQ() }}&sprueche={{ $metager->getSprueche() }}"></iframe>
 </div>
+@endif
 
 @endsection
 
diff --git a/resources/views/metager3bilder.blade.php b/resources/views/metager3bilder.blade.php
index d9cc2295b1fa413a92e0a8473a2e2c6ea9889ef3..d5f267f77547df5a3b451f4fbcef62fc60795971 100644
--- a/resources/views/metager3bilder.blade.php
+++ b/resources/views/metager3bilder.blade.php
@@ -7,7 +7,7 @@
 	<div class="item">
 		<div class="img">
 			<a href="{{ $result->link }}" target="{{ $metager->getTab() }}">
-			<img src="{{ $result->image }}" width="150px" alt="Bild nicht gefunden"/>
+			<img src="{{ $metager->getImageProxyLink($result->image) }}" width="150px" alt="Bild nicht gefunden"/>
 			</a>
 		</div>
 	</div>
diff --git a/resources/views/metager3bilderresults.blade.php b/resources/views/metager3bilderresults.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..249135498207446410e730e0ac7aaa8e0a251423
--- /dev/null
+++ b/resources/views/metager3bilderresults.blade.php
@@ -0,0 +1,14 @@
+<div id="container">
+@foreach($metager->getResults()->items() as $result)
+	<div class="item">
+		<div class="img">
+			<a href="{{ $result->link }}" target="{{ $metager->getTab() }}">
+			<img src="{{ $metager->getImageProxyLink($result->image) }}" width="150px" alt="Bild nicht gefunden"/>
+			</a>
+		</div>
+	</div>
+@endforeach
+</div>
+<nav class="pager">
+        {!! $metager->getResults()->links() !!}
+</nav>
\ No newline at end of file
diff --git a/resources/views/metager3results.blade.php b/resources/views/metager3results.blade.php
index 45ecbdb2794a0a3ba936a5ccfa1137e635a81c99..d5bc429fc226fc2ea769a97210e2c64d5e5672ad 100644
--- a/resources/views/metager3results.blade.php
+++ b/resources/views/metager3results.blade.php
@@ -1,4 +1,4 @@
-<div class="col-md-8">
+<div class="col-xs-12 col-md-8">
 	{{-- 3-Mal Werbung --}}
 	@for($i = 0; $i <= 2; $i++)
 		@include('layouts.ad', ['ad' => $metager->popAd()])
@@ -14,7 +14,7 @@
         {!! $metager->getResults()->links() !!}
     </nav>
 </div>
-<div class="col-md-4" id="quicktips">
-	<iframe class="col-mod-4 hidden-xs hidden-sm" src="/qt?q={{ $metager->getQ() }}"></iframe>
+<div class="hidden-xs col-md-4" id="quicktips">
+	<iframe class="col-mod-4 hidden-xs hidden-sm" src="/qt?q={{ $metager->getQ() }}&sprueche={{ $metager->getSprueche() }}"></iframe>
 </div>
 
diff --git a/resources/views/plugin.blade.php b/resources/views/plugin.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..197e4f232aa27ad5091b13a8ae7ac030de4bb1c5
--- /dev/null
+++ b/resources/views/plugin.blade.php
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
+	<ShortName>MetaGer</ShortName>
+	<Description>MetaGer: Sicher suchen &amp; finden, Privatsphäre schützen</Description>
+	<Contact>office@suma-ev.de</Contact>
+	<Image width="16" height="16" type="image/x-icon">{{ url('/favicon.ico') }}</Image>
+	<Url type="text/html" template="{{ $link }}{searchTerms}" method="get"></Url>
+	<InputEncoding>UTF-8</InputEncoding>
+</OpenSearchDescription>
\ No newline at end of file
diff --git a/resources/views/quicktip.blade.php b/resources/views/quicktip.blade.php
index b951fd67de71f3c31cc45723fa92402dd1d9c4db..3ff1a0b48f9943d8aef617822d94fe912d285557 100644
--- a/resources/views/quicktip.blade.php
+++ b/resources/views/quicktip.blade.php
@@ -49,7 +49,9 @@
 		</style>
 	</head>
 	<body>
+	@if( $spruch !== "" )
 	<blockquote id="spruch">{!! $spruch !!}</blockquote>
+	@endif
 
 	@foreach( $mqs as $mq)
 		<div class="quicktip">
diff --git a/resources/views/settings.blade.php b/resources/views/settings.blade.php
index 78f8fed062eef4d829b6e24d81b02c0249698940..b96b1d739c2e456501cd09b371b2e4d8961761db 100644
--- a/resources/views/settings.blade.php
+++ b/resources/views/settings.blade.php
@@ -247,5 +247,6 @@
             <input type="checkbox" name="param_loklak">loklak</label><a class="glyphicon glyphicon-link" target="_blank" href="http://loklak.org/"></a></div></div></div></div>
   <input id="unten" type="submit" class="btn btn-primary" value="Startseite f&uuml;r einmalige Nutzung generieren">
   <input type="button" class="btn btn-primary hidden" id="save" value="Einstellungen dauerhaft speichern">
+  <input id="plugin" type="submit" class="btn btn-primary" value="Plugin mit diesen Einstellungen generieren.">
   <input type="button" class="btn btn-danger hidden" id="reset" value="Einstellungen Zur&uuml;cksetzen"></form>
 @endsection
\ No newline at end of file
diff --git a/storage/app/public/tips.txt b/storage/app/public/tips.txt
index eed771ef5de05a5e81eff78ee445765cdd9cb9fb..4ca3a2ac98b921627898e9d60c08468346f98ff7 100755
--- a/storage/app/public/tips.txt
+++ b/storage/app/public/tips.txt
@@ -6,7 +6,6 @@ MetaGer wird zum großen Teil aus <a href="/spende/" target="_blank">Spenden</a>
 Wir respektieren Ihre Privatsphäre: Wir speichern keine personenbezogenen Daten und verwenden keine Tracking-Techniken wie Browser-Fingerprinting oder Cookies o.ä.. Lesen Sie die Details unter: <a href="/datenschutz/" target="_blank">/datenschutz/</a>.
 Wenn Sie den "anonym öffnen"-Link rechts neben den Suchergebnissen anklicken bleiben Sie auch beim Besuch der Ergebnis-Webseiten und den Folgeklicks anonym.
 Wenn Sie mit höchster Sicherheit anonym surfen wollen, dann empfehlen wir, den  <a href="http://forum.suma-ev.de/viewtopic.php?f=3&amp;t=43&amp;sid=8a76fac2507f6d2926981b2642de7ab3" target="_blank">TOR-Hidden-Zugang von MetaGer</a> zu nutzen.
-Wenn Sie nichts anderes einstellen, dann werden immer solche Ergebnisse gesucht, die sämtliche Suchwörter, aber evtl. in anderer Reihenfolge, enthalten. Wenn Ihre Suchwörter in genau dieser Reihenfolge gefunden werden sollen, dann "schließen Sie sie in Anführungsstriche" ein.
 Wenn Sie auf der <a href="/" target="_blank">MetaGer-Startseite</a> oder dieser Ergebnisseite auf "Bilder" oder "Nachrichten" usw. klicken, dann wird NUR in diesen Kategorien gesucht.
 Wenn Sie auf der <a href="/" target="_blank">MetaGer-Startseite </a> auf "anpassen" klicken, dann können Sie Ihre Sucheinstellungen sehr individuell anpassen.
 Sie können MetaGer in den meisten Browsern als Standard-Suchmaschine einstellen. Dadurch haben Sie die Möglichkeit, dass Sucheingaben in der Adressleiste des Browsers direkt mit MetaGer durchgeführt werden. Für eine Anleitung besuchen Sie unsere <a href="/" target="_blank">Startseite</a> und klicken unter dem Sucheingabefeld auf den Link "MetaGer-Plugin hinzufügen".