diff --git a/apps/files_encryption/lib/helper.php b/apps/files_encryption/lib/helper.php
index 314ac577b2ff8afe7c3e698e7744360502c14067..0ac6fcf403a67a8bd626de4b2a05645d31f0e773 100755
--- a/apps/files_encryption/lib/helper.php
+++ b/apps/files_encryption/lib/helper.php
@@ -165,7 +165,7 @@ class Helper {
 	public static function isPartialFilePath($path) {
 
 		$extension = pathinfo($path, PATHINFO_EXTENSION);
-		if ( $extension === 'part' || $extension === 'etmp') {
+		if ( $extension === 'part') {
 			return true;
 		} else {
 			return false;
@@ -183,7 +183,7 @@ class Helper {
 	public static function stripPartialFileExtension($path) {
 		$extension = pathinfo($path, PATHINFO_EXTENSION);
 
-		if ( $extension === 'part' || $extension === 'etmp') {
+		if ( $extension === 'part') {
 
 			$newLength = strlen($path) - 5; // 5 = strlen(".part") = strlen(".etmp")
 			$fPath = substr($path, 0, $newLength);
@@ -256,24 +256,53 @@ class Helper {
 	}
 
 	/**
-	 * @brief get path to the correspondig file in data/user/files
+	 * @brief get path to the correspondig file in data/user/files if path points
+	 *        to a version or to a file in cache
 	 * @param string $path path to a version or a file in the trash
 	 * @return string path to correspondig file relative to data/user/files
 	 */
 	public static function getPathToRealFile($path) {
 		$trimmed = ltrim($path, '/');
 		$split = explode('/', $trimmed);
-
-		if (count($split) < 3 || $split[1] !== "files_versions") {
-			return false;
+		$result = false;
+
+		if (count($split) >= 3 && ($split[1] === "files_versions" || $split[1] === 'cache')) {
+			$sliced = array_slice($split, 2);
+			$result = implode('/', $sliced);
+			if ($split[1] === "files_versions") {
+				// we skip user/files
+				$sliced = array_slice($split, 2);
+				$relPath = implode('/', $sliced);
+				//remove the last .v
+				$result = substr($relPath, 0, strrpos($relPath, '.v'));
+			}
+			if ($split[1] === "cache") {
+				// we skip /user/cache/transactionId
+				$sliced = array_slice($split, 3);
+				$result = implode('/', $sliced);
+				//prepare the folders
+				self::mkdirr($path, new \OC\Files\View('/'));
+			}
 		}
 
-		$sliced = array_slice($split, 2);
-		$realPath = implode('/', $sliced);
-		//remove the last .v
-		$realPath = substr($realPath, 0, strrpos($realPath, '.v'));
+		return $result;
+	}
 
-		return $realPath;
+	/**
+	 * @brief create directory recursively
+	 * @param string $path
+	 * @param \OC\Files\View $view
+	 */
+	public static function mkdirr($path, $view) {
+		$dirname = \OC_Filesystem::normalizePath(dirname($path));
+		$dirParts = explode('/', $dirname);
+		$dir = "";
+		foreach ($dirParts as $part) {
+			$dir = $dir . '/' . $part;
+			if (!$view->file_exists($dir)) {
+				$view->mkdir($dir);
+			}
+		}
 	}
 
 	/**
diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php
index e2bc8f6b16387e9365fa3738e6d995cd12823a6d..54c3b9caa156a68a74e258623ac90dfe580948e3 100644
--- a/apps/files_encryption/lib/proxy.php
+++ b/apps/files_encryption/lib/proxy.php
@@ -90,7 +90,13 @@ class Proxy extends \OC_FileProxy {
 					return true;
 				}
 
-				$handle = fopen('crypt://' . $path . '.etmp', 'w');
+				// create random cache folder
+				$cacheFolder = rand();
+				$path_slices = explode('/', \OC_Filesystem::normalizePath($path));
+				$path_slices[2] = "cache/".$cacheFolder;
+				$tmpPath = implode('/', $path_slices);
+
+				$handle = fopen('crypt://' . $tmpPath, 'w');
 				if (is_resource($handle)) {
 
 					// write data to stream
@@ -104,10 +110,10 @@ class Proxy extends \OC_FileProxy {
 					\OC_FileProxy::$enabled = false;
 
 					// get encrypted content
-					$data = $view->file_get_contents($path . '.etmp');
+					$data = $view->file_get_contents($tmpPath);
 
 					// remove our temp file
-					$view->unlink($path . '.etmp');
+					$view->deleteAll('/' . \OCP\User::getUser() . '/cache/' . $cacheFolder);
 
 					// re-enable proxy - our work is done
 					\OC_FileProxy::$enabled = $proxyStatus;
diff --git a/apps/files_encryption/lib/stream.php b/apps/files_encryption/lib/stream.php
index 5ce5caf80ce21d44e6ce001e1280137df5c329a4..8c81bb82bef10c13aa2cc63492fdaef8bf5500e3 100644
--- a/apps/files_encryption/lib/stream.php
+++ b/apps/files_encryption/lib/stream.php
@@ -108,7 +108,7 @@ class Stream {
 		}
 
 		if($this->relPath === false) {
-			\OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '" expecting a path to user/files or to user/files_versions', \OCP\Util::ERROR);
+			\OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '" expecting a path to "files", "files_versions" or "cache"', \OCP\Util::ERROR);
 			return false;
 		}
 
diff --git a/apps/files_encryption/tests/helper.php b/apps/files_encryption/tests/helper.php
index 067fc763a95d2cffc9a18933a9b4221878eb7150..cd2be70a8fee7388047d14e846134619ff9ec28a 100644
--- a/apps/files_encryption/tests/helper.php
+++ b/apps/files_encryption/tests/helper.php
@@ -51,4 +51,17 @@ class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase {
 		$this->assertEquals('testfile.txt', Encryption\Helper::stripPartialFileExtension($filename));
 	}
 
-}
\ No newline at end of file
+	function testGetPathToRealFile() {
+
+		// the relative path to /user/files/ that's what we want to get from getPathToRealFile()
+		$relativePath = "foo/bar/test.txt";
+
+		// test paths
+		$versionPath = "/user/files_versions/foo/bar/test.txt.v456756835";
+		$cachePath = "/user/cache/transferid636483/foo/bar/test.txt";
+
+		$this->assertEquals($relativePath, Encryption\Helper::getPathToRealFile($versionPath));
+		$this->assertEquals($relativePath, Encryption\Helper::getPathToRealFile($cachePath));
+	}
+
+}