diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php
index fac042232a4c14834777c7ddfdc5376abf490f36..87846f1713855e4bef7297ab78a1b411ec94a9e6 100644
--- a/apps/files_external/appinfo/app.php
+++ b/apps/files_external/appinfo/app.php
@@ -6,6 +6,7 @@
  * See the COPYING-README file.
  */
 
+ OC::$CLASSPATH['OC_FileStorage_StreamWrapper']='apps/files_external/lib/streamwrapper.php';
 OC::$CLASSPATH['OC_Filestorage_FTP']='apps/files_external/lib/ftp.php';
 OC::$CLASSPATH['OC_Filestorage_DAV']='apps/files_external/lib/webdav.php';
 OC::$CLASSPATH['OC_Filestorage_Google']='apps/files_external/lib/google.php';
diff --git a/apps/files_external/lib/ftp.php b/apps/files_external/lib/ftp.php
index c431070e24b37632c1fa7b1e304823d9d62a21a1..4d5ae670de59c2ff341671e15365f8362d621795 100644
--- a/apps/files_external/lib/ftp.php
+++ b/apps/files_external/lib/ftp.php
@@ -6,7 +6,7 @@
  * See the COPYING-README file.
  */
 
-class OC_FileStorage_FTP extends OC_Filestorage_Common{
+class OC_FileStorage_FTP extends OC_FileStorage_StreamWrapper{
 	private $password;
 	private $user;
 	private $host;
@@ -42,47 +42,6 @@ class OC_FileStorage_FTP extends OC_Filestorage_Common{
 		$url.='://'.$this->user.':'.$this->password.'@'.$this->host.$this->root.$path;
 		return $url;
 	}
-
-	public function mkdir($path){
-		return mkdir($this->constructUrl($path));
-	}
-
-	public function rmdir($path){
-		if($this->file_exists($path)){
-			$succes=rmdir($this->constructUrl($path));
-			clearstatcache();
-			return $succes;
-		}else{
-			return false;
-		}
-	}
-
-	public function opendir($path){
-		return opendir($this->constructUrl($path));
-	}
-
-	public function filetype($path){
-		return filetype($this->constructUrl($path));
-	}
-
-	public function is_readable($path){
-		return true;//not properly supported
-	}
-
-	public function is_writable($path){
-		return true;//not properly supported
-	}
-
-	public function file_exists($path){
-		return file_exists($this->constructUrl($path));
-	}
-
-	public function unlink($path){
-		$succes=unlink($this->constructUrl($path));
-		clearstatcache();
-		return $succes;
-	}
-
 	public function fopen($path,$mode){
 		switch($mode){
 			case 'r':
@@ -124,34 +83,4 @@ class OC_FileStorage_FTP extends OC_Filestorage_Common{
 			unlink($tmpFile);
 		}
 	}
-
-	public function free_space($path){
-		return 0;
-	}
-
-	public function touch($path,$mtime=null){
-		if(is_null($mtime)){
-			$fh=$this->fopen($path,'a');
-			fwrite($fh,'');
-			fclose($fh);
-		}else{
-			return false;//not supported
-		}
-	}
-
-	public function getFile($path,$target){
-		return copy($this->constructUrl($path),$target);
-	}
-
-	public function uploadFile($path,$target){
-		return copy($path,$this->constructUrl($target));
-	}
-
-	public function rename($path1,$path2){
-		return rename($this->constructUrl($path1),$this->constructUrl($path2));
-	}
-
-	public function stat($path){
-		return stat($this->constructUrl($path));
-	}
 }
diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php
index c769d29032dd8d6524a82e62192ba6c4debd95c3..f5e6d78e7761ab3699fc4524021cee126216d1f5 100644
--- a/apps/files_external/lib/smb.php
+++ b/apps/files_external/lib/smb.php
@@ -8,7 +8,7 @@
 
 require_once('smb4php/smb.php');
 
-class OC_FileStorage_SMB extends OC_Filestorage_Common{
+class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{
 	private $password;
 	private $user;
 	private $host;
@@ -33,88 +33,4 @@ class OC_FileStorage_SMB extends OC_Filestorage_Common{
 		return 'smb://'.$this->user.':'.$this->password.'@'.$this->host.$this->root.$path;
 		
 	}
-
-	public function mkdir($path){
-		return mkdir($this->constructUrl($path));
-	}
-
-	public function rmdir($path){
-		if($this->file_exists($path)){
-			$succes=rmdir($this->constructUrl($path));
-			clearstatcache();
-			return $succes;
-		}else{
-			return false;
-		}
-	}
-
-	public function opendir($path){
-		return opendir($this->constructUrl($path));
-	}
-
-	public function filetype($path){
-		return filetype($this->constructUrl($path));
-	}
-
-	public function is_readable($path){
-		return true;//not properly supported
-	}
-
-	public function is_writable($path){
-		return true;//not properly supported
-	}
-
-	public function file_exists($path){
-		return file_exists($this->constructUrl($path));
-	}
-
-	public function unlink($path){
-		$succes=unlink($this->constructUrl($path));
-		clearstatcache();
-		return $succes;
-	}
-
-	public function fopen($path,$mode){
-		return fopen($this->constructUrl($path),$mode);
-	}
-
-	public function writeBack($tmpFile){
-		if(isset(self::$tempFiles[$tmpFile])){
-			$this->uploadFile($tmpFile,self::$tempFiles[$tmpFile]);
-			unlink($tmpFile);
-		}
-	}
-
-	public function free_space($path){
-		return 0;
-	}
-
-	public function touch($path,$mtime=null){
-		if(is_null($mtime)){
-			$fh=$this->fopen($path,'a');
-			fwrite($fh,'');
-			fclose($fh);
-		}else{
-			return false;//not supported
-		}
-	}
-
-	public function getFile($path,$target){
-		return copy($this->constructUrl($path),$target);
-	}
-
-	public function uploadFile($path,$target){
-		return copy($path,$this->constructUrl($target));
-	}
-
-	public function rename($path1,$path2){
-		return rename($this->constructUrl($path1),$this->constructUrl($path2));
-	}
-
-	public function stat($path){
-		return stat($this->constructUrl($path));
-	}
-	
-
-	
 }
diff --git a/apps/files_external/lib/streamwrapper.php b/apps/files_external/lib/streamwrapper.php
new file mode 100644
index 0000000000000000000000000000000000000000..7d56445361e23a1ee5c61b0469a3098ce8f6f022
--- /dev/null
+++ b/apps/files_external/lib/streamwrapper.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+
+abstract class OC_FileStorage_StreamWrapper extends OC_Filestorage_Common{
+	abstract public function constructUrl($path);
+
+	public function mkdir($path){
+		return mkdir($this->constructUrl($path));
+	}
+
+	public function rmdir($path){
+		if($this->file_exists($path)){
+			$succes=rmdir($this->constructUrl($path));
+			clearstatcache();
+			return $succes;
+		}else{
+			return false;
+		}
+	}
+
+	public function opendir($path){
+		return opendir($this->constructUrl($path));
+	}
+
+	public function filetype($path){
+		return filetype($this->constructUrl($path));
+	}
+
+	public function is_readable($path){
+		return true;//not properly supported
+	}
+
+	public function is_writable($path){
+		return true;//not properly supported
+	}
+
+	public function file_exists($path){
+		return file_exists($this->constructUrl($path));
+	}
+
+	public function unlink($path){
+		$succes=unlink($this->constructUrl($path));
+		clearstatcache();
+		return $succes;
+	}
+
+	public function fopen($path,$mode){
+		return fopen($this->constructUrl($path),$mode);
+	}
+
+	public function free_space($path){
+		return 0;
+	}
+
+	public function touch($path,$mtime=null){
+		if(is_null($mtime)){
+			$fh=$this->fopen($path,'a');
+			fwrite($fh,'');
+			fclose($fh);
+		}else{
+			return false;//not supported
+		}
+	}
+
+	public function getFile($path,$target){
+		return copy($this->constructUrl($path),$target);
+	}
+
+	public function uploadFile($path,$target){
+		return copy($path,$this->constructUrl($target));
+	}
+
+	public function rename($path1,$path2){
+		return rename($this->constructUrl($path1),$this->constructUrl($path2));
+	}
+
+	public function stat($path){
+		return stat($this->constructUrl($path));
+	}
+
+
+
+}