diff --git a/apps/bookmarks/lib/search.php b/apps/bookmarks/lib/search.php
index 235587855d9aeaa0c4e039f36fef79e970830d8d..d7e32558617198ce1b1abedc6fdbf76a967db45d 100644
--- a/apps/bookmarks/lib/search.php
+++ b/apps/bookmarks/lib/search.php
@@ -20,8 +20,8 @@
  *
  */
 
-class OC_Search_Provider_Bookmarks implements OC_Search_Provider{
-	static function search($query){
+class OC_Search_Provider_Bookmarks extends OC_Search_Provider{
+	function search($query){
 		$results=array();
 		
 		$offset = 0;
diff --git a/apps/calendar/lib/search.php b/apps/calendar/lib/search.php
index 8405866392d709630d503b0cb509ec387018b182..da5fa35bc21caa6830b91a39b45d78458fc0b46e 100644
--- a/apps/calendar/lib/search.php
+++ b/apps/calendar/lib/search.php
@@ -1,6 +1,6 @@
 <?php
-class OC_Search_Provider_Calendar implements OC_Search_Provider{
-	static function search($query){
+class OC_Search_Provider_Calendar extends OC_Search_Provider{
+	function search($query){
 		$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser(), 1);
 		if(count($calendars)==0 || !OC_App::isEnabled('calendar')){
 			//return false;
diff --git a/apps/contacts/lib/search.php b/apps/contacts/lib/search.php
index cf0a5fe69974b59d8bc8bf4ce86f217f2b06e8ce..31d8542091e8a4a787e48c78f886df345ea528cd 100644
--- a/apps/contacts/lib/search.php
+++ b/apps/contacts/lib/search.php
@@ -1,6 +1,6 @@
 <?php
-class OC_Search_Provider_Contacts implements OC_Search_Provider{
-	static function search($query){
+class OC_Search_Provider_Contacts extends OC_Search_Provider{
+	function search($query){
 		$addressbooks = OC_Contacts_Addressbook::all(OC_User::getUser(), 1);
 // 		if(count($calendars)==0 || !OC_App::isEnabled('contacts')){
 // 			//return false;
diff --git a/apps/gallery/appinfo/app.php b/apps/gallery/appinfo/app.php
index f7e0651275e19f26d15ea612660309677bff0ded..325c2acf2491b432ca626adfc691f25c5843018d 100644
--- a/apps/gallery/appinfo/app.php
+++ b/apps/gallery/appinfo/app.php
@@ -41,8 +41,8 @@ OC_App::addNavigationEntry( array(
  'icon' => OC_Helper::imagePath('core', 'places/picture.svg'),
  'name' => $l->t('Pictures')));
 
- class OC_GallerySearchProvider implements OC_Search_Provider{
-	static function search($query){
+class OC_GallerySearchProvider extends OC_Search_Provider{
+	function search($query){
 		$stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_albums WHERE uid_owner = ? AND album_name LIKE ?');
 		$result = $stmt->execute(array(OC_User::getUser(),'%'.$query.'%'));
 		$results=array();
diff --git a/apps/media/lib_media.php b/apps/media/lib_media.php
index 9de291e8da2ca4620cbd0c0b67823cde7ba392ef..a4e5a5dfebc35d3c6dd2855448e1d3eb6353cdb1 100644
--- a/apps/media/lib_media.php
+++ b/apps/media/lib_media.php
@@ -82,8 +82,8 @@ class OC_MEDIA{
 	}
 }
 
-class OC_MediaSearchProvider implements OC_Search_Provider{
-	static function search($query){
+class OC_MediaSearchProvider extends OC_Search_Provider{
+	function search($query){
 		require_once('lib_collection.php');
 		$artists=OC_MEDIA_COLLECTION::getArtists($query);
 		$albums=OC_MEDIA_COLLECTION::getAlbums(0,$query);
diff --git a/lib/search.php b/lib/search.php
index 6b33fa38140fb0ce21a729a64a0a06e13b702a62..12055418687be42f5f0e849d5c7db1019b0af23f 100644
--- a/lib/search.php
+++ b/lib/search.php
@@ -26,13 +26,22 @@
  */
 class OC_Search{
 	static private $providers=array();
+	static private $registeredProviders=array();
+	
+	/**
+	 * remove all registered search providers
+	 */
+	public static function clearProviders(){
+		self::$providers=array();
+		self::$registeredProviders=array();
+	}
 	
 	/**
 	 * register a new search provider to be used
 	 * @param string $provider class name of a OC_Search_Provider
 	 */
-	public static function registerProvider($provider){
-		self::$providers[]=$provider;
+	public static function registerProvider($class,$options=array()){
+		self::$registeredProviders[]=array('class'=>$class,'options'=>$options);
 	}
 	
 	/**
@@ -41,10 +50,25 @@ class OC_Search{
 	 * @return array An array of OC_Search_Result's
 	 */
 	public static function search($query){
+		self::initProviders();
 		$results=array();
 		foreach(self::$providers as $provider){
-			$results=array_merge($results, $provider::search($query));
+			$results=array_merge($results, $provider->search($query));
 		}
 		return $results;
 	}
+	
+	/**
+	 * create instances of all the registered search providers
+	 */
+	private static function initProviders(){
+		if(count(self::$providers)>0){
+			return;
+		}
+		foreach(self::$registeredProviders as $provider){
+			$class=$provider['class'];
+			$options=$provider['options'];
+			self::$providers[]=new $class($options);
+		}
+	}
 }
diff --git a/lib/search/provider.php b/lib/search/provider.php
index 9487ca51f2b94640f33b09535578e0a0ac6b6a5c..838ab696d0420e6d44d777e8e4ed85cb8ac1b9c2 100644
--- a/lib/search/provider.php
+++ b/lib/search/provider.php
@@ -2,11 +2,13 @@
 /**
  * provides search functionalty
  */
-interface OC_Search_Provider {
+class OC_Search_Provider {
+	public function __construct($options){}
+	
 	/**
 	 * search for $query
 	 * @param string $query
 	 * @return array An array of OC_Search_Result's
 	 */
-	static function search($query);
+	public function search($query){}
 }
diff --git a/lib/search/provider/file.php b/lib/search/provider/file.php
index 3bdb3bcd2af197718b9f91ae772cc0cf410dc100..a37af4955999cb44a43bfca5ce6016887d92835b 100644
--- a/lib/search/provider/file.php
+++ b/lib/search/provider/file.php
@@ -1,7 +1,7 @@
 <?php
 
-class OC_Search_Provider_File implements OC_Search_Provider{
-	static function search($query){
+class OC_Search_Provider_File extends OC_Search_Provider{
+	function search($query){
 		$files=OC_FileCache::search($query,true);
 		$results=array();
 		foreach($files as $fileData){