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/files_sharing/get.php b/apps/files_sharing/get.php
index 3a3db6dd38ead4a0733ca9654daa72bdce0808a8..fa3535fd14457a35d5bed9b7ca86bb09f043961e 100644
--- a/apps/files_sharing/get.php
+++ b/apps/files_sharing/get.php
@@ -62,6 +62,8 @@ if ($source !== false) {
 		$tmpl->assign("fileList", $list->fetchPage());
 		$tmpl->assign("breadcrumb", $breadcrumbNav->fetchPage());
 		$tmpl->assign("readonly", true);
+		$tmpl->assign("allowZipDownload", false);
+		$tmpl->assign("dir", 'shared dir');
 		$tmpl->printPage();
 	} else {
 		//get time mimetype and set the headers
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index fc9e17c25c7f75e57c64c7f01620eb5148eb5774..54d749d833e5e7c94d5e6ee3b3dada6e866b04bc 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -2,8 +2,11 @@ $(document).ready(function() {
 	var shared_status = {};
 	if (typeof FileActions !== 'undefined') {
 		FileActions.register('all', 'Share', function(filename) {
-			if (scanFiles.scanning){return;}//workaround to prevent aditional http request block scanning feedback
+			if (scanFiles.scanning){return;}//workaround to prevent additional http request block scanning feedback
 			var icon;
+			if (typeof filename == 'undefined') {
+				return false;
+			}
 			var file = $('#dir').val()+'/'+filename;
 			if(shared_status[file])
 				return shared_status[file].icon;
@@ -145,7 +148,7 @@ $(document).ready(function() {
 				data: data,
 				success: function(token) {
 					if (token) {
-						showPublicLink(token);
+						showPublicLink(token, source.substr(source.lastIndexOf('/')));
 					}
 				}
 			});
@@ -203,7 +206,7 @@ function createDropdown(filename, files) {
 		if (users) {
 			$.each(users, function(index, row) {
 				if (row.uid_shared_with == 'public') {
-					showPublicLink(row.token);
+					showPublicLink(row.token, '/'+filename);
 				} else if (isNaN(index)) {
 					addUser(row.uid_shared_with, row.permissions, index.substr(0, index.lastIndexOf('-')));
 				} else {
@@ -234,9 +237,9 @@ function addUser(uid_shared_with, permissions, parentFolder) {
 	$(user).appendTo('#shared_list');
 }
 
-function showPublicLink(token) {
+function showPublicLink(token, file) {
 	$('#makelink').attr('checked', true);
 	$('#link').data('token', token);
-	$('#link').val(parent.location.protocol+'//'+location.host+OC.linkTo('files_sharing','get.php')+'?token='+token);
+	$('#link').val(parent.location.protocol+'//'+location.host+OC.linkTo('files_sharing','get.php')+'?token='+token+'&f='+file);
 	$('#link').show('blind');
 }
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/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php
index 3521a9d90cf678e5735f8fe1614337802a4b49ab..1e8dc6aaccec6d771b28c78e778873783f6461b2 100644
--- a/apps/user_ldap/user_ldap.php
+++ b/apps/user_ldap/user_ldap.php
@@ -94,10 +94,6 @@ class OC_USER_LDAP extends OC_User_Backend {
 		if( !$this->ldap_dc )
 			return false;
 
-		$email = OC_Preferences::getValue($uid, 'settings', 'email', '');
-		if ( !empty( $email ) )
-			return false;
-
 		$email = $this->ldap_dc[$this->ldap_email_attr][0];
 		OC_Preferences::setValue($uid, 'settings', 'email', $email);
 	}
diff --git a/lib/app.php b/lib/app.php
index 1c81fbd42425457335dbed33339dc4aed623d190..807d8955d8fa31daf8d6af8109dfed0b56965913 100755
--- a/lib/app.php
+++ b/lib/app.php
@@ -139,13 +139,18 @@ class OC_App{
 			if(!is_numeric($app)){
 				OC_Installer::installShippedApp($app);
 			}else{
-                                $download=OC_OCSClient::getApplicationDownload($app,1);
-				if(isset($download['downloadlink']) and $download['downloadlink']<>'') {
+				$download=OC_OCSClient::getApplicationDownload($app,1);
+				if(isset($download['downloadlink']) and $download['downloadlink']!='') {
 					$app=OC_Installer::installApp(array('source'=>'http','href'=>$download['downloadlink']));
 				}
 			}
 		}
-		OC_Appconfig::setValue( $app, 'enabled', 'yes' );
+		if($app!==false){
+			OC_Appconfig::setValue( $app, 'enabled', 'yes' );
+			return true;
+		}else{
+			return false;
+		}
 	}
 
 	/**
diff --git a/lib/files.php b/lib/files.php
index 051cfd4b81c4b5c42ded5ce9eeedb28218319055..01558a68588c01c5239f21fe36ab0004bc92a066 100644
--- a/lib/files.php
+++ b/lib/files.php
@@ -63,7 +63,7 @@ class OC_Files {
 			$executionTime = intval(ini_get('max_execution_time'));
 			set_time_limit(0);
 			$zip = new ZipArchive();
-			$filename = get_temp_dir().'/ownCloud_'.mt_rand(10000,99999).'.zip';
+			$filename = OC_Helper::tmpFile('.zip');
 			if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==TRUE) {
 				exit("cannot open <$filename>\n");
 			}
@@ -84,7 +84,7 @@ class OC_Files {
 			$executionTime = intval(ini_get('max_execution_time'));
 			set_time_limit(0);
 			$zip = new ZipArchive();
-			$filename = get_temp_dir().'/ownCloud_'.mt_rand(10000,99999).'.zip';
+			$filename = OC_Helper::tmpFile('.zip');
 			if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==TRUE) {
 				exit("cannot open <$filename>\n");
 			}
diff --git a/lib/filesystemview.php b/lib/filesystemview.php
index 9d530c7ad6343807fdf283d1d99556bd00655a57..95873bd87cfabd61f519611d7ade6716dadf8497 100644
--- a/lib/filesystemview.php
+++ b/lib/filesystemview.php
@@ -283,8 +283,12 @@ class OC_FilesystemView {
 		if(OC_Filesystem::isValidPath($path)){
 			$source=$this->fopen($path,'r');
 			if($source){
-				$extention=substr($path,strrpos($path,'.'));
-				$tmpFile=OC_Helper::tmpFile($extention);
+				$extension='';
+				$extOffset=strpos($path,'.');
+				if($extOffset !== false) {
+					$extension=substr($path,strrpos($path,'.'));
+				}
+				$tmpFile=OC_Helper::tmpFile($extension);
 				file_put_contents($tmpFile,$source);
 				return $tmpFile;
 			}
diff --git a/lib/helper.php b/lib/helper.php
index f5626bccaa73c17322a67c7f50b7b0f1f8cbe033..2026286352a8cddf8d1a4dd2a335439be540cb9d 100755
--- a/lib/helper.php
+++ b/lib/helper.php
@@ -27,7 +27,7 @@
 class OC_Helper {
 	private static $mimetypes=array();
 	private static $tmpFiles=array();
-	
+
 	/**
 	 * @brief Creates an url
 	 * @param $app app
@@ -123,7 +123,7 @@ class OC_Helper {
 		}elseif( file_exists( OC::$SERVERROOT."/core/img/$image" )){
 			return OC::$WEBROOT."/core/img/$image";
 		}else{
-			echo('image not found: image:'.$image.' webroot:'.OC::$WEBROOT.' serverroot:'.OC::$SERVERROOT);	
+			echo('image not found: image:'.$image.' webroot:'.OC::$WEBROOT.' serverroot:'.OC::$SERVERROOT);
 			die();
 		}
 	}
@@ -188,7 +188,7 @@ class OC_Helper {
 		$bytes = round( $bytes / 1024, 1 );
 		return "$bytes GB";
 	}
-	
+
 	/**
 	 * @brief Make a computer file size
 	 * @param $str file size in a fancy format
@@ -224,9 +224,9 @@ class OC_Helper {
 
 		$bytes = round($bytes, 2);
 
-		return $bytes; 
+		return $bytes;
 	}
-	
+
 	/**
 	 * @brief Recusive editing of file permissions
 	 * @param $path path to file or folder
@@ -276,7 +276,7 @@ class OC_Helper {
 			copy($src, $dest);
 		}
 	}
-	
+
 	/**
 	 * @brief Recusive deletion of folders
 	 * @param string $dir path to the folder
@@ -294,6 +294,9 @@ class OC_Helper {
 		}elseif(file_exists($dir)){
 			unlink($dir);
 		}
+		if(file_exists($dir)) {
+			return false;
+		}
 	}
 
 	/**
@@ -349,7 +352,7 @@ class OC_Helper {
 		}
 		return $mimeType;
 	}
-	
+
 	/**
 	 * @brief Checks $_REQUEST contains a var for the $s key. If so, returns the html-escaped value of this var; otherwise returns the default value provided by $d.
 	 * @param $s name of the var to escape, if set.
@@ -357,16 +360,16 @@ class OC_Helper {
 	 * @returns the print-safe value.
 	 *
 	 */
-	 
+
 	//FIXME: should also check for value validation (i.e. the email is an email).
 	public static function init_var($s, $d="") {
 		$r = $d;
 		if(isset($_REQUEST[$s]) && !empty($_REQUEST[$s]))
 			$r = stripslashes(htmlspecialchars($_REQUEST[$s]));
-		
+
 		return $r;
 	}
-	
+
 	/**
 	 * returns "checked"-attribut if request contains selected radio element OR if radio element is the default one -- maybe?
 	 * @param string $s Name of radio-button element name
@@ -422,7 +425,7 @@ class OC_Helper {
 		}
 		return false;
 	}
-	
+
 	/**
 	 * copy the contents of one stream to another
 	 * @param resource source
@@ -439,7 +442,7 @@ class OC_Helper {
 		}
 		return $count;
 	}
-	
+
 	/**
 	 * create a temporary file with an unique filename
 	 * @param string postfix
@@ -467,14 +470,25 @@ class OC_Helper {
 		self::$tmpFiles[]=$path;
 		return $path.'/';
 	}
-	
+
 	/**
 	 * remove all files created by self::tmpFile
 	 */
 	public static function cleanTmp(){
+		$leftoversFile='/tmp/oc-not-deleted';
+		if(file_exists($leftoversFile)){
+			$leftovers=file($leftoversFile);
+			foreach($leftovers as $file) {
+				self::rmdirr($file);
+			}
+			unlink($leftoversFile);
+		}
+
 		foreach(self::$tmpFiles as $file){
 			if(file_exists($file)){
-				self::rmdirr($file);
+				if(!self::rmdirr($file)) {
+					file_put_contents($leftoversFile, $file."\n", FILE_APPEND);
+				}
 			}
 		}
 	}
diff --git a/lib/remote/cloud.php b/lib/remote/cloud.php
deleted file mode 100644
index a9c74e8bf5fad0931d9af65d3b5e25f8a451a06f..0000000000000000000000000000000000000000
--- a/lib/remote/cloud.php
+++ /dev/null
@@ -1,204 +0,0 @@
-<?php
-/**
- * Class for connection to a remote owncloud installation
- *
- */
-class OC_REMOTE_CLOUD{
-	private $path;
-	private $connected=false;
-	private $cookiefile=false;
-
-	/**
-	* make an api call to the remote cloud
-	* @param string $action
-	* @param array parameters
-	* @param bool assoc   when set to true, the result will be parsed as associative array
-	*
-	*/
-	private function apiCall($action,$parameters=false,$assoc=false){
-		if(!$this->cookiefile){
-			$this->cookiefile=get_temp_dir().'/remoteCloudCookie'.uniqid();
-		}
-		$url=$this->path.='/files/api.php';
-		$fields_string="action=$action&";
-		if(is_array($parameters)){
-			foreach($parameters as $key=>$value){
-				$fields_string.=$key.'='.$value.'&';
-			}
-			rtrim($fields_string,'&');
-		}
-		$ch=curl_init();
-		curl_setopt($ch,CURLOPT_URL,$url);
-		curl_setopt($ch,CURLOPT_POST,count($parameters));
-		curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
-		curl_setopt($ch, CURLOPT_COOKIEFILE,$this->cookiefile);
-		curl_setopt($ch, CURLOPT_COOKIEJAR,$this->cookiefile);
-		curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
-		$result=curl_exec($ch);
-		$result=trim($result);
-		$info=curl_getinfo($ch);
-		$httpCode=$info['http_code'];
-		curl_close($ch);
-		if($httpCode==200 or $httpCode==0){
-			return json_decode($result,$assoc);
-		}else{
-			return false;
-		}
-	}
-
-	public function __construct($path,$user,$password){
-		$this->path=$path;
-		$this->connected=$this->apiCall('login',array('username'=>$user,'password'=>$password));
-	}
-
-	/**
-	* check if we are stull logged in on the remote cloud
-	*
-	*/
-	public function isLoggedIn(){
-		if(!$this->connected){
-			return false;
-		}
-		return $this->apiCall('checklogin');
-	}
-
-	public function __get($name){
-		switch($name){
-			case 'connected':
-				return $this->connected;
-		}
-	}
-
-	/**
-	* disconnect from the remote cloud
-	*
-	*/
-	public function disconnect(){
-		$this->connected=false;
-		if(is_file($this->cookiefile)){
-			unlink($this->cookiefile);
-		}
-		$this->cookiefile=false;
-	}
-
-	/**
-	* create a new file or directory
-	* @param string $dir
-	* @param string $name
-	* @param string $type
-	*/
-	public function newFile($dir,$name,$type){
-		if(!$this->connected){
-			return false;
-		}
-		return $this->apiCall('new',array('dir'=>$dir,'name'=>$name,'type'=>$type),true);
-	}
-
-	/**
-	* deletes a file or directory
-	* @param string $dir
-	* @param string $file
-	*/
-	public function delete($dir,$name){
-		if(!$this->connected){
-			return false;
-		}
-		return $this->apiCall('delete',array('dir'=>$dir,'file'=>$name),true);
-	}
-
-	/**
-	* moves a file or directory
-	* @param string $sorceDir
-	* @param string $sorceFile
-	* @param string $targetDir
-	* @param string $targetFile
-	*/
-	public function move($sourceDir,$sourceFile,$targetDir,$targetFile){
-		if(!$this->connected){
-			return false;
-		}
-		return $this->apiCall('move',array('sourcedir'=>$sourceDir,'source'=>$sourceFile,'targetdir'=>$targetDir,'target'=>$targetFile),true);
-	}
-
-	/**
-	* copies a file or directory
-	* @param string $sorceDir
-	* @param string $sorceFile
-	* @param string $targetDir
-	* @param string $targetFile
-	*/
-	public function copy($sourceDir,$sourceFile,$targetDir,$targetFile){
-		if(!$this->connected){
-			return false;
-		}
-		return $this->apiCall('copy',array('sourcedir'=>$sourceDir,'source'=>$sourceFile,'targetdir'=>$targetDir,'target'=>$targetFile),true);
-	}
-
-	/**
-	* get a file tree
-	* @param string $dir
-	*/
-	public function getTree($dir){
-		if(!$this->connected){
-			return false;
-		}
-		return $this->apiCall('gettree',array('dir'=>$dir),true);
-	}
-
-	/**
-	* get the files inside a directory of the remote cloud
-	* @param string $dir
-	*/
-	public function getFiles($dir){
-		if(!$this->connected){
-			return false;
-		}
-		return $this->apiCall('getfiles',array('dir'=>$dir),true);
-	}
-
-	/**
-	* get a remove file and save it in a temporary file and return the path of the temporary file
-	* @param string $dir
-	* @param string $file
-	* @return string
-	*/
-	public function getFile($dir, $file){
-		if(!$this->connected){
-			return false;
-		}
-		$ch=curl_init();
-		if(!$this->cookiefile){
-			$this->cookiefile=get_temp_dir().'/remoteCloudCookie'.uniqid();
-		}
-		$tmpfile=tempnam(get_temp_dir(),'remoteCloudFile');
-		$fp=fopen($tmpfile,'w+');
-		$url=$this->path.="/files/api.php?action=get&dir=$dir&file=$file";
-		curl_setopt($ch,CURLOPT_URL,$url);
-		curl_setopt($ch, CURLOPT_COOKIEFILE,$this->cookiefile);
-		curl_setopt($ch, CURLOPT_COOKIEJAR,$this->cookiefile);
-		curl_setopt($ch, CURLOPT_FILE, $fp);
-		curl_exec($ch);
-		fclose($fp);
-		curl_close($ch);
-		return $tmpfile;
-	}
-
-	public function sendFile($sourceDir,$sourceFile,$targetDir,$targetFile){
-		$source=$sourceDir.'/'.$sourceFile;
-		$tmp=OC_Filesystem::toTmpFile($source);
-		return $this->sendTmpFile($tmp,$targetDir,$targetFile);
-	}
-
-	public function sendTmpFile($tmp,$targetDir,$targetFile){
-		$token=sha1(uniqid().$tmp);
-		$file=get_temp_dir().'/'.'remoteCloudFile'.$token;
-		rename($tmp,$file);
-		if( OC_Config::getValue( "forcessl", false ) or isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] == 'on') {
-			$url = "https://". $_SERVER['SERVER_NAME'] . OC::$WEBROOT;
-		}else{
-			$url = "http://". $_SERVER['SERVER_NAME'] . OC::$WEBROOT;
-		}
-		return $this->apiCall('pull',array('dir'=>$targetDir,'file'=>$targetFile,'token'=>$token,'source'=>$url),true);
-	}
-}
- 
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){
diff --git a/lib/user/database.php b/lib/user/database.php
index 3eade276dd9e05a97d2e0a8d73e2c4a0652759e4..c1bac1bb0b5f22599ff3e4a61ce12c661b9650a1 100644
--- a/lib/user/database.php
+++ b/lib/user/database.php
@@ -172,7 +172,7 @@ class OC_User_Database extends OC_User_Backend {
 	 * @return boolean
 	 */
 	public function userExists($uid){
-		$query = OC_DB::prepare( "SELECT * FROM `*PREFIX*users` WHERE uid = ?" );
+		$query = OC_DB::prepare( "SELECT * FROM `*PREFIX*users` WHERE uid LIKE ?" );
 		$result = $query->execute( array( $uid ));
 		
 		return $result->numRows() > 0;
diff --git a/lib/user/dummy.php b/lib/user/dummy.php
new file mode 100644
index 0000000000000000000000000000000000000000..cfc96c5c52de0dbe074dbcf993487e5d79a713dc
--- /dev/null
+++ b/lib/user/dummy.php
@@ -0,0 +1,114 @@
+<?php
+
+/**
+* ownCloud
+*
+* @author Frank Karlitschek
+* @copyright 2010 Frank Karlitschek karlitschek@kde.org
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+/**
+ * dummy user backend, does not keep state, only for testing use
+ */
+class OC_User_Dummy extends OC_User_Backend {
+	private $users=array();
+	/**
+		* @brief Create a new user
+		* @param $uid The username of the user to create
+		* @param $password The password of the new user
+		* @returns true/false
+		*
+		* Creates a new user. Basic checking of username is done in OC_User
+		* itself, not in its subclasses.
+		*/
+	public function createUser($uid, $password){
+		if(isset($this->users[$uid])){
+			return false;
+		}else{
+			$this->users[$uid]=$password;
+			return true;
+		}
+	}
+
+	/**
+		* @brief delete a user
+		* @param $uid The username of the user to delete
+		* @returns true/false
+		*
+		* Deletes a user
+		*/
+	public function deleteUser( $uid ){
+		if(isset($this->users[$uid])){
+			unset($this->users[$uid]);
+			return true;
+		}else{
+			return false;
+		}
+	}
+
+	/**
+		* @brief Set password
+		* @param $uid The username
+		* @param $password The new password
+		* @returns true/false
+		*
+		* Change the password of a user
+		*/
+	public function setPassword($uid, $password){
+		if(isset($this->users[$uid])){
+			$this->users[$uid]=$password;
+			return true;
+		}else{
+			return false;
+		}
+	}
+
+	/**
+		* @brief Check if the password is correct
+		* @param $uid The username
+		* @param $password The password
+		* @returns true/false
+		*
+		* Check if the password is correct without logging in the user
+		*/
+	public function checkPassword($uid, $password){
+		if(isset($this->users[$uid])){
+			return ($this->users[$uid]==$password);
+		}else{
+			return false;
+		}
+	}
+
+	/**
+		* @brief Get a list of all users
+		* @returns array with all uids
+		*
+		* Get a list of all users.
+		*/
+	public function getUsers(){
+		return array_keys($this->users);
+	}
+
+	/**
+		* @brief check if a user exists
+		* @param string $uid the username
+		* @return boolean
+		*/
+	public function userExists($uid){
+		return isset($this->users[$uid]);
+	}
+}
diff --git a/settings/ajax/disableapp.php b/settings/ajax/disableapp.php
index 06dd3c2ac6bfd5dc9fddc8959a10b8fd41c234b1..53e9be379e19eae172eff3b15215a60425060c66 100644
--- a/settings/ajax/disableapp.php
+++ b/settings/ajax/disableapp.php
@@ -6,4 +6,4 @@ OC_JSON::setContentTypeHeader();
 
 OC_App::disable($_POST['appid']);
 
-?>
+OC_JSON::success();
diff --git a/settings/ajax/enableapp.php b/settings/ajax/enableapp.php
index 639df2aecc0fad9505acdcdc12d1691d998b863a..cb116ebe4e84bf1a3e88431d684f12ec03ad8d55 100644
--- a/settings/ajax/enableapp.php
+++ b/settings/ajax/enableapp.php
@@ -5,6 +5,8 @@ require_once('../../lib/base.php');
 OC_JSON::checkAdminUser();
 OC_JSON::setContentTypeHeader();
 
-OC_App::enable($_POST['appid']);
-
-?>
+if(OC_App::enable($_POST['appid'])){
+	OC_JSON::success();
+}else{
+	OC_JSON::error();
+}
diff --git a/settings/js/apps.js b/settings/js/apps.js
index e2f882c6fec7f1760861812888dacb207bbea2e7..bd7a8e9f84c32b3b62ec7adb3b6f81303d810223 100644
--- a/settings/js/apps.js
+++ b/settings/js/apps.js
@@ -28,10 +28,18 @@ $(document).ready(function(){
 		var active=$(this).data('active');
 		if(app){
 			if(active){
-				$.post(OC.filePath('settings','ajax','disableapp.php'),{appid:app});
+				$.post(OC.filePath('settings','ajax','disableapp.php'),{appid:app},function(result){
+					if(!result || result.status!='succes'){
+						OC.dialogs.alert('Error','Error while disabling app');
+					}
+				},'json');
 				$('#leftcontent li[data-id="'+app+'"]').removeClass('active');
 			}else{
-				$.post(OC.filePath('settings','ajax','enableapp.php'),{appid:app});
+				$.post(OC.filePath('settings','ajax','enableapp.php'),{appid:app},function(result){
+					if(!result || result.status!='succes'){
+						OC.dialogs.alert('Error','Error while enabling app');
+					}
+				},'json');
 				$('#leftcontent li[data-id="'+app+'"]').addClass('active');
 			}
 			active=!active;
diff --git a/tests/lib/user/backend.php b/tests/lib/user/backend.php
new file mode 100644
index 0000000000000000000000000000000000000000..5dab5afb186b40bf023ceb23d7e0ed8ce3f38757
--- /dev/null
+++ b/tests/lib/user/backend.php
@@ -0,0 +1,89 @@
+<?php
+/**
+* ownCloud
+*
+* @author Robin Appelman
+* @copyright 2012 Robin Appelman icewind@owncloud.com
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+abstract class Test_User_Backend extends UnitTestCase {
+	/**
+	 * @var OC_User_Backend $backend
+	 */
+	protected $backend;
+
+	/**
+	 * get a new unique user name
+	 * test cases can override this in order to clean up created user
+	 * @return array
+	 */
+	public function getUser(){
+		return uniqid('test_');
+	}
+
+	public function testAddRemove(){
+		//get the number of groups we start with, in case there are exising groups
+		$startCount=count($this->backend->getUsers());
+
+		$name1=$this->getUser();
+		$name2=$this->getUser();
+		$this->backend->createUser($name1,'');
+		$count=count($this->backend->getUsers())-$startCount;
+		$this->assertEqual(1,$count);
+		$this->assertTrue((array_search($name1,$this->backend->getUsers())!==false));
+		$this->assertFalse((array_search($name2,$this->backend->getUsers())!==false));
+		$this->backend->createUser($name2,'');
+		$count=count($this->backend->getUsers())-$startCount;
+		$this->assertEqual(2,$count);
+		$this->assertTrue((array_search($name1,$this->backend->getUsers())!==false));
+		$this->assertTrue((array_search($name2,$this->backend->getUsers())!==false));
+
+		$this->backend->deleteUser($name2);
+		$count=count($this->backend->getUsers())-$startCount;
+		$this->assertEqual(1,$count);
+		$this->assertTrue((array_search($name1,$this->backend->getUsers())!==false));
+		$this->assertFalse((array_search($name2,$this->backend->getUsers())!==false));
+	}
+	
+	public function testLogin(){
+		$name1=$this->getUser();
+		$name2=$this->getUser();
+		
+		$this->assertFalse($this->backend->userExists($name1));
+		$this->assertFalse($this->backend->userExists($name2));
+		
+		$this->backend->createUser($name1,'pass1');
+		$this->backend->createUser($name2,'pass2');
+		
+		$this->assertTrue($this->backend->userExists($name1));
+		$this->assertTrue($this->backend->userExists($name2));
+		
+		$this->assertTrue($this->backend->checkPassword($name1,'pass1'));
+		$this->assertTrue($this->backend->checkPassword($name2,'pass2'));
+		
+		$this->assertFalse($this->backend->checkPassword($name1,'pass2'));
+		$this->assertFalse($this->backend->checkPassword($name2,'pass1'));
+		
+		$this->assertFalse($this->backend->checkPassword($name1,'dummy'));
+		$this->assertFalse($this->backend->checkPassword($name2,'foobar'));
+		
+		$this->backend->setPassword($name1,'newpass1');
+		$this->assertFalse($this->backend->checkPassword($name1,'pass1'));
+		$this->assertTrue($this->backend->checkPassword($name1,'newpass1'));
+		$this->assertFalse($this->backend->checkPassword($name2,'newpass1'));
+	}
+}
diff --git a/tests/lib/user/database.php b/tests/lib/user/database.php
new file mode 100644
index 0000000000000000000000000000000000000000..b2fcce93c5bb89f43d4aab53396616233c74716f
--- /dev/null
+++ b/tests/lib/user/database.php
@@ -0,0 +1,45 @@
+<?php
+/**
+* ownCloud
+*
+* @author Robin Appelman
+* @copyright 2012 Robin Appelman icewind@owncloud.com
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+class Test_User_Database extends Test_User_Backend {
+	private $user=array();
+	/**
+	 * get a new unique user name
+	 * test cases can override this in order to clean up created user
+	 * @return array
+	 */
+	public function getUser(){
+		$user=uniqid('test_');
+		$this->users[]=$user;
+		return $user;
+	}
+	
+	public function setUp(){
+		$this->backend=new OC_User_Dummy();
+	}
+	
+	public function tearDown(){
+		foreach($this->users as $user){
+			$this->backend->deleteUser($user);
+		}
+	}
+}
diff --git a/tests/lib/user/dummy.php b/tests/lib/user/dummy.php
new file mode 100644
index 0000000000000000000000000000000000000000..062f55ba07930364c0ccc7606efec1217d1ca83c
--- /dev/null
+++ b/tests/lib/user/dummy.php
@@ -0,0 +1,27 @@
+<?php
+/**
+* ownCloud
+*
+* @author Robin Appelman
+* @copyright 2012 Robin Appelman icewind@owncloud.com
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+class Test_User_Dummy extends Test_User_Backend {
+	public function setUp(){
+		$this->backend=new OC_User_Dummy();
+	}
+}