diff --git a/apps/files_versions/ajax/rollbackVersion.php b/apps/files_versions/ajax/rollbackVersion.php
index 127592f3b58095bf55c48b95ae13562c1a049b0c..8d1092f8b8e217f03bf59f97ec3896d6cd90beb3 100644
--- a/apps/files_versions/ajax/rollbackVersion.php
+++ b/apps/files_versions/ajax/rollbackVersion.php
@@ -2,8 +2,6 @@
 
 OCP\JSON::checkAppEnabled('files_versions');
 
-require_once('apps/files_versions/versions.php');
-
 $userDirectory = "/".OCP\USER::getUser()."/files";
 
 $file = $_GET['file'];
diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php
index af7ae11a25889e058b36c4f41046fdae4811ab75..fb78e0a56c046854b226e44dcbd7d5d3ab350c89 100644
--- a/apps/files_versions/lib/versions.php
+++ b/apps/files_versions/lib/versions.php
@@ -75,6 +75,11 @@ class Storage {
 	 */
 	public function store($filename) {
 		if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
+		
+			$files_view = \OCP\Files::getStorage("files");
+			$users_view = \OCP\Files::getStorage("files_versions");
+			$users_view->chroot(\OCP\User::getUser().'/');
+			
 			if (\OCP\App::isEnabled('files_sharing') && $source = \OC_Share::getSource('/'.\OCP\User::getUser().'/files'.$filename)) {
 				$pos = strpos($source, '/files', 1);
 				$uid = substr($source, 1, $pos - 1);
@@ -86,8 +91,13 @@ class Storage {
 			$filesfoldername=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/files';
 			Storage::init();
 
+			//check if source file already exist as version to avoid recursions.
+			if ($users_view->file_exists($filename)) {
+				return false;
+			}
+			
 			// check if filename is a directory
-			if(is_dir($filesfoldername.'/'.$filename)){
+			if($files_view->is_dir($filename)){
 				return false;
 			}
 
@@ -102,7 +112,7 @@ class Storage {
 			}
 			
 			// check filesize
-			if(filesize($filesfoldername.'/'.$filename)>\OCP\Config::getSystemValue('files_versionsmaxfilesize', Storage::DEFAULTMAXFILESIZE)){
+			if($files_view->filesize($filename)>\OCP\Config::getSystemValue('files_versionsmaxfilesize', Storage::DEFAULTMAXFILESIZE)){
 				return false;
 			}
 
@@ -123,10 +133,10 @@ class Storage {
 			if(!file_exists($versionsFolderName.'/'.$info['dirname'])) mkdir($versionsFolderName.'/'.$info['dirname'],0700,true);	
 
 			// store a new version of a file
-			copy($filesfoldername.'/'.$filename,$versionsFolderName.'/'.$filename.'.v'.time());
+			@$users_view->copy('files'.$filename, 'versions'.$filename.'.v'.time());
         
 			// expire old revisions if necessary
-			$this->expire($filename);
+			Storage::expire($filename);
 		}
 	}
 
@@ -134,7 +144,7 @@ class Storage {
 	/**
 	 * rollback to an old version of a file.
 	 */
-	public function rollback( $filename, $revision ) {
+	public static function rollback($filename,$revision) {
 	
 		if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
 			if (\OCP\App::isEnabled('files_sharing') && $source = \OC_Share::getSource('/'.\OCP\User::getUser().'/files'.$filename)) {
@@ -149,11 +159,11 @@ class Storage {
 			$filesfoldername=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/files';
 			
 			// rollback
-			if ( copy( $versionsFolderName.'/'.$filename.'.v'.$revision, $filesfoldername.'/'.$filename ) ) {
+			if ( @copy($versionsFolderName.'/'.$filename.'.v'.$revision,$filesfoldername.'/'.$filename) ) {
 			
 				return true;
 				
-			} else {
+			}else{
 			
 				return false;
 				
@@ -271,7 +281,7 @@ class Storage {
         /**
          * @brief Erase a file's versions which exceed the set quota
          */
-        public function expire( $filename ) {
+        public static function expire($filename) {
                 if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
 
 			if (\OCP\App::isEnabled('files_sharing') && $source = \OC_Share::getSource('/'.\OCP\User::getUser().'/files'.$filename)) {
@@ -295,7 +305,7 @@ class Storage {
 				
 				foreach( $deleteItems as $de ) {
 				
-					$this->view->unlink( $versionsFolderName.'/'.$filename.'.v'.$de );
+					unlink( $versionsFolderName.'/'.$filename.'.v'.$de );
 					
 				}
 			}
@@ -327,7 +337,7 @@ class Storage {
         	if(Storage::isversioned($rel_path)) {
         		$versions = Storage::getVersions($rel_path);
         		foreach ($versions as $v){
-        			$this->view->unlink( $abs_path . $v['version'] );
+        			unlink($abs_path . $v['version']);
         		}
         	}
         }
diff --git a/lib/filesystem.php b/lib/filesystem.php
index 0ab3bd69acd85836bf05dc30da853ba5a5782e50..65318fa3ab695214e52723d16aa289fa2610c19d 100644
--- a/lib/filesystem.php
+++ b/lib/filesystem.php
@@ -153,6 +153,7 @@ class OC_Filesystem{
 		if($path[0]!=='/'){
 			$path='/'.$path;
 		}
+		$path=str_replace('//', '/',$path);
 		$foundMountPoint='';
 		foreach(OC_Filesystem::$mounts as $mountpoint=>$storage){
 			if($mountpoint==$path){
diff --git a/lib/filesystemview.php b/lib/filesystemview.php
index 99e08c50e75e92446f553b007ffd45fc30910165..448663bb0811b5906499d2c15a11ab910e343e69 100644
--- a/lib/filesystemview.php
+++ b/lib/filesystemview.php
@@ -276,7 +276,7 @@ class OC_FilesystemView {
 				}else{
 					$source=$this->fopen($path1,'r');
 					$target=$this->fopen($path2,'w');
-					$count=OC_Helper::streamCopy($data,$target);
+					$count=OC_Helper::streamCopy($source,$target);
 					$storage1=$this->getStorage($path1);
 					$storage1->unlink($this->getInternalPath($path1));
 					$result=$count>0;
@@ -314,7 +314,7 @@ class OC_FilesystemView {
 				}else{
 					$source=$this->fopen($path1,'r');
 					$target=$this->fopen($path2,'w');
-					$count=OC_Helper::streamCopy($data,$target);
+					$result=OC_Helper::streamCopy($source,$target);
 				}
         OC_Hook::emit( OC_Filesystem::CLASSNAME, OC_Filesystem::signal_post_copy, array( OC_Filesystem::signal_param_oldpath => $path1 , OC_Filesystem::signal_param_newpath=>$path2));
 				if(!$exists){