diff --git a/apps/files_versions/ajax/expireAll.php b/apps/files_versions/ajax/expireAll.php
index f9cd74aed025f2af1e9079d6654a154caddcaf3e..238e3bdad4ddb31532a7f35ff1d487dfe20cf227 100644
--- a/apps/files_versions/ajax/expireAll.php
+++ b/apps/files_versions/ajax/expireAll.php
@@ -28,7 +28,9 @@
 OCP\JSON::checkLoggedIn();
 OCP\App::checkAppEnabled('files_versions');
 
-if( OCA_Versions\Storage::expireAll() ){
+$versions = new OCA_Versions\Storage( new OC_FilesystemView('') );
+
+if( $versions->expireAll() ){
 	
 	OCP\JSON::success();
 	die();
diff --git a/apps/files_versions/ajax/getVersions.php b/apps/files_versions/ajax/getVersions.php
index f29d1760b6f8b9027f97fa96108b092ba0beed59..1a0e21732ccb9fb4be6b2288777eb1d0425012c9 100644
--- a/apps/files_versions/ajax/getVersions.php
+++ b/apps/files_versions/ajax/getVersions.php
@@ -1,8 +1,6 @@
 <?php
 OCP\JSON::checkAppEnabled('files_versions');
 
-require_once('apps/files_versions/versions.php');
-
 $userDirectory = "/".OCP\USER::getUser()."/files";
 $source = $_GET['source'];
 
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/appinfo/app.php b/apps/files_versions/appinfo/app.php
index 105c5a102cbdd8ef041f522b52489706e67ac1f8..dba612e4b79399213c5a62306769dbec4a93e274 100644
--- a/apps/files_versions/appinfo/app.php
+++ b/apps/files_versions/appinfo/app.php
@@ -1,6 +1,8 @@
 <?php
 
-require_once('files_versions/versions.php');
+//require_once('files_versions/versions.php');
+OC::$CLASSPATH['OCA_Versions\Storage'] = 'apps/files_versions/lib/versions.php';
+OC::$CLASSPATH['OCA_Versions\Hooks'] = 'apps/files_versions/lib/hooks.php';
 
 OCP\App::registerAdmin('files_versions', 'settings');
 OCP\App::registerPersonal('files_versions','settings-personal');
@@ -8,7 +10,7 @@ OCP\App::registerPersonal('files_versions','settings-personal');
 OCP\Util::addscript('files_versions', 'versions');
 
 // Listen to write signals
-OCP\Util::connectHook('OC_Filesystem', 'post_write', "OCA_Versions\Storage", "write_hook");
+OCP\Util::connectHook('OC_Filesystem', 'post_write', "OCA_Versions\Hooks", "write_hook");
 // Listen to delete and rename signals
 OCP\Util::connectHook('OC_Filesystem', 'delete', "OCA_Versions\Storage", "removeVersions");
 OCP\Util::connectHook('OC_Filesystem', 'rename', "OCA_Versions\Storage", "renameVersions");
\ No newline at end of file
diff --git a/apps/files_versions/history.php b/apps/files_versions/history.php
index ca03de0472bb8b3b6bcfea008cf569211212bb8d..e3332d7cdb6086319356604f41e37ba844927125 100644
--- a/apps/files_versions/history.php
+++ b/apps/files_versions/history.php
@@ -30,11 +30,12 @@ if ( isset( $_GET['path'] ) ) {
 	$path = $_GET['path'];
 	$path = strip_tags( $path );
 	$tmpl->assign( 'path', $path );
+	$versions = new OCA_Versions\Storage( new OC_FilesystemView('') );
 
 	// roll back to old version if button clicked
         if( isset( $_GET['revert'] ) ) {
         	
-        	if( \OCA_Versions\Storage::rollback( $path, $_GET['revert'] ) ) {
+        	if( $versions->rollback( $path, $_GET['revert'] ) ) {
 			
 			$tmpl->assign( 'outcome_stat', 'success' );
 			
diff --git a/apps/files_versions/lib/hooks.php b/apps/files_versions/lib/hooks.php
new file mode 100644
index 0000000000000000000000000000000000000000..8a7467053296c132f18d67ab67034e8f3c3abda5
--- /dev/null
+++ b/apps/files_versions/lib/hooks.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Copyright (c) 2012 Sam Tuke <samtuke@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+/**
+ * This class contains all hooks.
+ */
+ 
+namespace OCA_Versions;
+
+class Hooks {
+
+	/**
+	 * listen to write event.
+	 */
+	public static function write_hook( $params ) {
+	
+		if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
+			
+			$versions = new Storage( new \OC_FilesystemView('') );
+			
+			$path = $params[\OC_Filesystem::signal_param_path];
+			
+			if($path<>'') $versions->store( $path );
+			
+		}
+	}
+	
+}
+
+?>
diff --git a/apps/files_versions/versions.php b/apps/files_versions/lib/versions.php
similarity index 89%
rename from apps/files_versions/versions.php
rename to apps/files_versions/lib/versions.php
index 7ed5f257505ea95ac300450cc112d5c9e11d7e78..fb78e0a56c046854b226e44dcbd7d5d3ab350c89 100644
--- a/apps/files_versions/versions.php
+++ b/apps/files_versions/lib/versions.php
@@ -1,322 +1,337 @@
-<?php
-/**
- * Copyright (c) 2012 Frank Karlitschek <frank@owncloud.org>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-/**
- * Versions
- *
- * A class to handle the versioning of files.
- */
-
-namespace OCA_Versions;
-
-class Storage {
-
-
-	// config.php configuration:
-	//   - files_versions
-	//   - files_versionsfolder
-	//   - files_versionsblacklist
-	//   - files_versionsmaxfilesize
-	//   - files_versionsinterval 
-	//   - files_versionmaxversions 
-	//
-	// todo:
-	//   - port to oc_filesystem to enable network transparency
-	//   - implement expire all function. And find a place to call it ;-)
-	//   - add transparent compression. first test if it´s worth it.
-
-	const DEFAULTENABLED=true; 
-	const DEFAULTFOLDER='versions'; 
-	const DEFAULTBLACKLIST='avi mp3 mpg mp4 ctmp'; 
-	const DEFAULTMAXFILESIZE=1048576; // 10MB 
-	const DEFAULTMININTERVAL=1; // 2 min
-	const DEFAULTMAXVERSIONS=50; 
-
-	/**
-	 * init the versioning and create the versions folder.
-	 */
-	public static function init() {
-		if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
-			// create versions folder
-			$foldername=\OCP\Config::getSystemValue('datadirectory').'/'. \OCP\USER::getUser() .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
-			if(!is_dir($foldername)){
-				mkdir($foldername);
-			}
-		}
-	}
-
-
-	/**
-	 * listen to write event.
-	 */
-	public static function write_hook($params) {
-		if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
-			$path = $params[\OC_Filesystem::signal_param_path];
-			if($path<>'') Storage::store($path);
-		}
-	}
-
-
-
-	/**
-	 * store a new version of a file.
-	 */
-	public static function store($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)) {
-				$pos = strpos($source, '/files', 1);
-				$uid = substr($source, 1, $pos - 1);
-				$filename = substr($source, $pos + 6);
-			} else {
-				$uid = \OCP\User::getUser();
-			}
-			$versionsFolderName=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
-			$filesfoldername=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/files';
-			Storage::init();
-
-			// check if filename is a directory
-			if(is_dir($filesfoldername.'/'.$filename)){
-				return false;
-			}
-
-			// check filetype blacklist
-			$blacklist=explode(' ',\OCP\Config::getSystemValue('files_versionsblacklist', Storage::DEFAULTBLACKLIST));
-			foreach($blacklist as $bl) {
-				$parts=explode('.', $filename);
-				$ext=end($parts);
-				if(strtolower($ext)==$bl) {
-					return false;
-				}
-			}
-			
-			// check filesize
-			if(filesize($filesfoldername.'/'.$filename)>\OCP\Config::getSystemValue('files_versionsmaxfilesize', Storage::DEFAULTMAXFILESIZE)){
-				return false;
-			}
-
-
-			// check mininterval if the file is being modified by the owner (all shared files should be versioned despite mininterval)
-			if ($uid == \OCP\User::getUser()) {
-				$matches=glob($versionsFolderName.'/'.$filename.'.v*');
-				sort($matches);
-				$parts=explode('.v',end($matches));
-				if((end($parts)+Storage::DEFAULTMININTERVAL)>time()){
-					return false;
-				}
-			}
-
-
-			// create all parent folders
-			$info=pathinfo($filename);	
-			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());
-        
-			// expire old revisions if necessary
-			Storage::expire($filename);
-		}
-	}
-
-
-	/**
-	 * rollback to an old version of a file.
-	 */
-	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)) {
-				$pos = strpos($source, '/files', 1);
-				$uid = substr($source, 1, $pos - 1);
-				$filename = substr($source, $pos + 6);
-			} else {
-				$uid = \OCP\User::getUser();
-			}
-			$versionsFolderName=\OCP\Config::getSystemValue('datadirectory').'/'.$uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
-			
-			$filesfoldername=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/files';
-			
-			// rollback
-			if ( @copy($versionsFolderName.'/'.$filename.'.v'.$revision,$filesfoldername.'/'.$filename) ) {
-			
-				return true;
-				
-			}else{
-			
-				return false;
-				
-			}
-			
-		}
-		
-	}
-
-	/**
-	 * check if old versions of a file exist.
-	 */
-	public static function isversioned($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)) {
-				$pos = strpos($source, '/files', 1);
-				$uid = substr($source, 1, $pos - 1);
-				$filename = substr($source, $pos + 6);
-			} else {
-				$uid = \OCP\User::getUser();
-			}
-			$versionsFolderName=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
-
-			// check for old versions
-			$matches=glob($versionsFolderName.'/'.$filename.'.v*');
-			if(count($matches)>1){
-				return true;
-			}else{
-				return false;
-			}
-		}else{
-			return(false);
-		}
-	}
-
-
-        
-        /**
-         * @brief get a list of all available versions of a file in descending chronological order
-         * @param $filename file to find versions of, relative to the user files dir
-         * @param $count number of versions to return
-         * @returns array
-         */
-        public static function getVersions( $filename, $count = 0 ) {
-        
-                if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) {
-                
-			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);
-				$filename = substr($source, $pos + 6);
-			} else {
-				$uid = \OCP\User::getUser();
-			}
-			$versionsFolderName = \OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
-			$versions = array();         
-			
-			// fetch for old versions
-			$matches = glob( $versionsFolderName.'/'.$filename.'.v*' );
-			
-			sort( $matches );
-			
-			$i = 0;
-			
-			foreach( $matches as $ma ) {
-				
-				$i++;
-				$versions[$i]['cur'] = 0;
-				$parts = explode( '.v', $ma );
-				$versions[$i]['version'] = ( end( $parts ) );
-				
-				// if file with modified date exists, flag it in array as currently enabled version
-				$curFile['fileName'] = basename( $parts[0] );
-				$curFile['filePath'] = \OCP\Config::getSystemValue('datadirectory').\OC_Filesystem::getRoot().'/'.$curFile['fileName'];
-				
-				( \md5_file( $ma ) == \md5_file( $curFile['filePath'] ) ? $versions[$i]['fileMatch'] = 1 : $versions[$i]['fileMatch'] = 0 );
-				
-			}
-			
-			$versions = array_reverse( $versions );
-			
-			foreach( $versions as $key => $value ) {
-				
-				// flag the first matched file in array (which will have latest modification date) as current version
-				if ( $versions[$key]['fileMatch'] ) {
-				
-					$versions[$key]['cur'] = 1;
-					break;
-					
-				}
-			
-			}
-			
-			$versions = array_reverse( $versions );
-			
-			// only show the newest commits
-			if( $count != 0 and ( count( $versions )>$count ) ) {
-			
-				$versions = array_slice( $versions, count( $versions ) - $count );
-				
-			}
-	
-			return( $versions );
-
-
-                } else {
-                
-			// if versioning isn't enabled then return an empty array
-                        return( array() );
-                        
-                }
-                
-        }
-
-        /**
-         * @brief Erase a file's versions which exceed the set quota
-         */
-        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)) {
-				$pos = strpos($source, '/files', 1);
-				$uid = substr($source, 1, $pos - 1);
-				$filename = substr($source, $pos + 6);
-			} else {
-				$uid = \OCP\User::getUser();
-			}
-			$versionsFolderName=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
-
-			// check for old versions
-			$matches = glob( $versionsFolderName.'/'.$filename.'.v*' );
-			
-			if( count( $matches ) > \OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS ) ) {
-			
-				$numberToDelete = count( $matches-\OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS ) );
-
-				// delete old versions of a file
-				$deleteItems = array_slice( $matches, 0, $numberToDelete );
-				
-				foreach( $deleteItems as $de ) {
-				
-					unlink( $versionsFolderName.'/'.$filename.'.v'.$de );
-					
-				}
-			}
-                }
-        }
-
-        /**
-         * @brief Erase all old versions of all user files
-         * @return true/false
-         */
-        public static function expireAll() {
-		
-		$view = new \OC_FilesystemView('');
-		
-		$dir = \OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
-		
-		return $view->deleteAll( $dir, true );
-	
-        }
-
+<?php
+/**
+ * Copyright (c) 2012 Frank Karlitschek <frank@owncloud.org>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+/**
+ * Versions
+ *
+ * A class to handle the versioning of files.
+ */
+
+namespace OCA_Versions;
+
+class Storage {
+
+
+	// config.php configuration:
+	//   - files_versions
+	//   - files_versionsfolder
+	//   - files_versionsblacklist
+	//   - files_versionsmaxfilesize
+	//   - files_versionsinterval 
+	//   - files_versionmaxversions 
+	//
+	// todo:
+	//   - finish porting to OC_FilesystemView to enable network transparency
+	//   - add transparent compression. first test if it´s worth it.
+
+	const DEFAULTENABLED=true; 
+	const DEFAULTFOLDER='versions'; 
+	const DEFAULTBLACKLIST='avi mp3 mpg mp4 ctmp'; 
+	const DEFAULTMAXFILESIZE=1048576; // 10MB 
+	const DEFAULTMININTERVAL=1; // 2 min
+	const DEFAULTMAXVERSIONS=50;
+	
+	private $view;
+	
+	function __construct( $view ) {
+	
+		$this->view = $view;
+		
+	}
+
+	/**
+	 * init the versioning and create the versions folder.
+	 */
+	public static function init() {
+		if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
+			// create versions folder
+			$foldername=\OCP\Config::getSystemValue('datadirectory').'/'. \OCP\USER::getUser() .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
+			if(!is_dir($foldername)){
+				mkdir($foldername);
+			}
+		}
+	}
+
+
+	/**
+	 * listen to write event.
+	 */
+	public static function write_hook($params) {
+		if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
+			$path = $params[\OC_Filesystem::signal_param_path];
+			if($path<>'') $this->store($path);
+		}
+	}
+
+
+
+	/**
+	 * store a new version of a file.
+	 */
+	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);
+				$filename = substr($source, $pos + 6);
+			} else {
+				$uid = \OCP\User::getUser();
+			}
+			$versionsFolderName=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
+			$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($files_view->is_dir($filename)){
+				return false;
+			}
+
+			// check filetype blacklist
+			$blacklist=explode(' ',\OCP\Config::getSystemValue('files_versionsblacklist', Storage::DEFAULTBLACKLIST));
+			foreach($blacklist as $bl) {
+				$parts=explode('.', $filename);
+				$ext=end($parts);
+				if(strtolower($ext)==$bl) {
+					return false;
+				}
+			}
+			
+			// check filesize
+			if($files_view->filesize($filename)>\OCP\Config::getSystemValue('files_versionsmaxfilesize', Storage::DEFAULTMAXFILESIZE)){
+				return false;
+			}
+
+
+			// check mininterval if the file is being modified by the owner (all shared files should be versioned despite mininterval)
+			if ($uid == \OCP\User::getUser()) {
+				$matches=glob($versionsFolderName.'/'.$filename.'.v*');
+				sort($matches);
+				$parts=explode('.v',end($matches));
+				if((end($parts)+Storage::DEFAULTMININTERVAL)>time()){
+					return false;
+				}
+			}
+
+
+			// create all parent folders
+			$info=pathinfo($filename);	
+			if(!file_exists($versionsFolderName.'/'.$info['dirname'])) mkdir($versionsFolderName.'/'.$info['dirname'],0700,true);	
+
+			// store a new version of a file
+			@$users_view->copy('files'.$filename, 'versions'.$filename.'.v'.time());
+        
+			// expire old revisions if necessary
+			Storage::expire($filename);
+		}
+	}
+
+
+	/**
+	 * rollback to an old version of a file.
+	 */
+	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)) {
+				$pos = strpos($source, '/files', 1);
+				$uid = substr($source, 1, $pos - 1);
+				$filename = substr($source, $pos + 6);
+			} else {
+				$uid = \OCP\User::getUser();
+			}
+			$versionsFolderName=\OCP\Config::getSystemValue('datadirectory').'/'.$uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
+			
+			$filesfoldername=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/files';
+			
+			// rollback
+			if ( @copy($versionsFolderName.'/'.$filename.'.v'.$revision,$filesfoldername.'/'.$filename) ) {
+			
+				return true;
+				
+			}else{
+			
+				return false;
+				
+			}
+			
+		}
+		
+	}
+
+	/**
+	 * check if old versions of a file exist.
+	 */
+	public static function isversioned($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)) {
+				$pos = strpos($source, '/files', 1);
+				$uid = substr($source, 1, $pos - 1);
+				$filename = substr($source, $pos + 6);
+			} else {
+				$uid = \OCP\User::getUser();
+			}
+			$versionsFolderName=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
+
+			// check for old versions
+			$matches=glob($versionsFolderName.'/'.$filename.'.v*');
+			if(count($matches)>1){
+				return true;
+			}else{
+				return false;
+			}
+		}else{
+			return(false);
+		}
+	}
+
+
+        
         /**
-         * @brief Erase versions of deleted file
-         * @param array
-         *          
-         * This function is connected to the delete signal of OC_Filesystem
+         * @brief get a list of all available versions of a file in descending chronological order
+         * @param $filename file to find versions of, relative to the user files dir
+         * @param $count number of versions to return
+         * @returns array
+         */
+        public static function getVersions( $filename, $count = 0 ) {
+        
+                if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) {
+                
+			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);
+				$filename = substr($source, $pos + 6);
+			} else {
+				$uid = \OCP\User::getUser();
+			}
+			$versionsFolderName = \OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
+			$versions = array();         
+			
+			// fetch for old versions
+			$matches = glob( $versionsFolderName.'/'.$filename.'.v*' );
+			
+			sort( $matches );
+			
+			$i = 0;
+			
+			foreach( $matches as $ma ) {
+				
+				$i++;
+				$versions[$i]['cur'] = 0;
+				$parts = explode( '.v', $ma );
+				$versions[$i]['version'] = ( end( $parts ) );
+				
+				// if file with modified date exists, flag it in array as currently enabled version
+				$curFile['fileName'] = basename( $parts[0] );
+				$curFile['filePath'] = \OCP\Config::getSystemValue('datadirectory').\OC_Filesystem::getRoot().'/'.$curFile['fileName'];
+				
+				( \md5_file( $ma ) == \md5_file( $curFile['filePath'] ) ? $versions[$i]['fileMatch'] = 1 : $versions[$i]['fileMatch'] = 0 );
+				
+			}
+			
+			$versions = array_reverse( $versions );
+			
+			foreach( $versions as $key => $value ) {
+				
+				// flag the first matched file in array (which will have latest modification date) as current version
+				if ( $versions[$key]['fileMatch'] ) {
+				
+					$versions[$key]['cur'] = 1;
+					break;
+					
+				}
+			
+			}
+			
+			$versions = array_reverse( $versions );
+			
+			// only show the newest commits
+			if( $count != 0 and ( count( $versions )>$count ) ) {
+			
+				$versions = array_slice( $versions, count( $versions ) - $count );
+				
+			}
+	
+			return( $versions );
+
+
+                } else {
+                
+			// if versioning isn't enabled then return an empty array
+                        return( array() );
+                        
+                }
+                
+        }
+
+        /**
+         * @brief Erase a file's versions which exceed the set quota
+         */
+        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)) {
+				$pos = strpos($source, '/files', 1);
+				$uid = substr($source, 1, $pos - 1);
+				$filename = substr($source, $pos + 6);
+			} else {
+				$uid = \OCP\User::getUser();
+			}
+			$versionsFolderName=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
+
+			// check for old versions
+			$matches = glob( $versionsFolderName.'/'.$filename.'.v*' );
+			
+			if( count( $matches ) > \OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS ) ) {
+			
+				$numberToDelete = count( $matches-\OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS ) );
+
+				// delete old versions of a file
+				$deleteItems = array_slice( $matches, 0, $numberToDelete );
+				
+				foreach( $deleteItems as $de ) {
+				
+					unlink( $versionsFolderName.'/'.$filename.'.v'.$de );
+					
+				}
+			}
+                }
+        }
+
+        /**
+         * @brief Erase all old versions of all user files
+         * @return true/false
+         */
+        public function expireAll() {
+		
+		$dir = \OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
+		
+		return $this->view->deleteAll( $dir, true );
+	
+        }
+
+        /**
+         * @brief Erase versions of deleted file
+         * @param array
+         *          
+         * This function is connected to the delete signal of OC_Filesystem
          * cleanup the versions directory if the actual file gets deleted
-         */
-        public static function removeVersions($params) {
+         */
+        public static function removeVersions($params) {
         	$rel_path =  $params['path'];
         	$abs_path = \OCP\Config::getSystemValue('datadirectory').'/'.\OCP\User::getUser()."/versions".$rel_path.'.v';
         	if(Storage::isversioned($rel_path)) {
@@ -325,24 +340,24 @@ class Storage {
         			unlink($abs_path . $v['version']);
         		}
         	}
-        }
-        
+        }
+        
         /**
-         * @brief rename/move versions of renamed/moved files
-         * @param array with oldpath and newpath
-         * 
-         * This function is connected to the rename signal of OC_Filesystem and adjust the name and location
+         * @brief rename/move versions of renamed/moved files
+         * @param array with oldpath and newpath
+         * 
+         * This function is connected to the rename signal of OC_Filesystem and adjust the name and location
          * of the stored versions along the actual file
          */
         public static function renameVersions($params) {
-        	$rel_oldpath =  $params['oldpath'];
-        	$abs_oldpath = \OCP\Config::getSystemValue('datadirectory').'/'.\OCP\User::getUser()."/versions".$rel_oldpath.'.v';
+        	$rel_oldpath =  $params['oldpath'];
+        	$abs_oldpath = \OCP\Config::getSystemValue('datadirectory').'/'.\OCP\User::getUser()."/versions".$rel_oldpath.'.v';
         	$abs_newpath = \OCP\Config::getSystemValue('datadirectory').'/'.\OCP\User::getUser()."/versions".$params['newpath'].'.v';
-        	if(Storage::isversioned($rel_oldpath)) {
+        	if(Storage::isversioned($rel_oldpath)) {
         		$versions = Storage::getVersions($rel_oldpath);
-        		foreach ($versions as $v){
-        			rename($abs_oldpath.$v['version'], $abs_newpath.$v['version']);
-        		}
+        		foreach ($versions as $v){
+        			rename($abs_oldpath.$v['version'], $abs_newpath.$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 d474b61b98ce1f0be352738275f1fc73e1ed7c90..448663bb0811b5906499d2c15a11ab910e343e69 100644
--- a/lib/filesystemview.php
+++ b/lib/filesystemview.php
@@ -314,7 +314,7 @@ class OC_FilesystemView {
 				}else{
 					$source=$this->fopen($path1,'r');
 					$target=$this->fopen($path2,'w');
-					$count=OC_Helper::streamCopy($source,$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){