diff --git a/apps/files_remote/appinfo/app.php b/apps/files_remote/appinfo/app.php
new file mode 100644
index 0000000000000000000000000000000000000000..f94e813ea5fa752cad493bbda06d5b1aaa0efb88
--- /dev/null
+++ b/apps/files_remote/appinfo/app.php
@@ -0,0 +1,9 @@
+<?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.
+ */
+
+OC::$CLASSPATH['OC_Filestorage_FTP']='apps/files_remote/lib/ftp.php';
diff --git a/apps/files_remote/appinfo/info.xml b/apps/files_remote/appinfo/info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0720b6095b918ff6ef5107f2b37e37989ac734db
--- /dev/null
+++ b/apps/files_remote/appinfo/info.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<info>
+	<id>files_remote</id>
+	<name>Remote storage support</name>
+	<description>Mount remote storage sources</description>
+	<version>0.1</version>
+	<licence>AGPL</licence>
+	<author>Robin Appelman</author>
+	<require>3</require>
+</info>
diff --git a/apps/files_remote/lib/ftp.php b/apps/files_remote/lib/ftp.php
new file mode 100644
index 0000000000000000000000000000000000000000..802446b4fd8536345bee78d33397bb1910ac9013
--- /dev/null
+++ b/apps/files_remote/lib/ftp.php
@@ -0,0 +1,157 @@
+<?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.
+ */
+
+class OC_FileStorage_FTP extends OC_Filestorage_Common{
+	private $password;
+	private $user;
+	private $host;
+	private $secure;
+	private $root;
+
+	private static $tempFiles=array();
+	
+	public function __construct($params){
+		$this->host=$params['host'];
+		$this->user=$params['user'];
+		$this->password=$params['password'];
+		$this->secure=isset($params['secure'])?(bool)$params['secure']:false;
+		$this->root=isset($params['root'])?$params['root']:'/';
+		if(substr($this->root,0,1)!='/'){
+			$this->root='/'.$this->root;
+		}
+		
+		//create the root folder if necesary
+		mkdir($this->constructUrl(''));
+	}
+
+	/**
+	 * construct the ftp url
+	 * @param string path
+	 * @return string
+	 */
+	public function constructUrl($path){
+		$url='ftp';
+		if($this->secure){
+			$url.='s';
+		}
+		$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':
+			case 'rb':
+			case 'w':
+			case 'wb':
+			case 'a':
+			case 'ab':
+				//these are supported by the wrapper
+				$context = stream_context_create(array('ftp' => array('overwrite' => true)));
+				return fopen($this->constructUrl($path),$mode,false,$context);
+			case 'r+':
+			case 'w+':
+			case 'wb+':
+			case 'a+':
+			case 'x':
+			case 'x+':
+			case 'c':
+			case 'c+':
+				//emulate these
+				if(strrpos($path,'.')!==false){
+					$ext=substr($path,strrpos($path,'.'));
+				}else{
+					$ext='';
+				}
+				$tmpFile=OC_Helper::tmpFile($ext);
+				OC_CloseStreamWrapper::$callBacks[$tmpFile]=array($this,'writeBack');
+				if($this->file_exists($path)){
+					$this->getFile($path,$tmpFile);
+				}
+				self::$tempFiles[$tmpFile]=$path;
+				return fopen('close://'.$tmpFile,$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_remote/tests/config.php b/apps/files_remote/tests/config.php
new file mode 100644
index 0000000000000000000000000000000000000000..541057829195e84b64ea4e0f31d16cfe761994f7
--- /dev/null
+++ b/apps/files_remote/tests/config.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+	'ftp'=>array(
+		'host'=>'localhost',
+		'user'=>'test',
+		'password'=>'test',
+		'root'=>'/test',
+	)
+);
diff --git a/apps/files_remote/tests/ftp.php b/apps/files_remote/tests/ftp.php
new file mode 100644
index 0000000000000000000000000000000000000000..2d5405ccda606fe6916308724792f373510dea23
--- /dev/null
+++ b/apps/files_remote/tests/ftp.php
@@ -0,0 +1,28 @@
+<?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.
+ */
+
+class Test_Filestorage_FTP extends Test_FileStorage {
+	/**
+	 * @var string tmpDir
+	 */
+	private $config;
+	private $id;
+
+	public function setUp(){
+		$id=uniqid();
+		$this->config=include('apps/files_remote/tests/config.php');
+		$this->config['ftp']['root'].='/'.$id;//make sure we have an new empty folder to work in
+		$this->instance=new OC_Filestorage_FTP($this->config['ftp']);
+	}
+
+	public function tearDown(){
+		OC_Helper::rmdirr($this->instance->constructUrl(''));
+	}
+}
+
+?>
\ No newline at end of file