diff --git a/lib/private/files/storage/wrapper/encryption.php b/lib/private/files/storage/wrapper/encryption.php
index 24b0ca4acac37e40f5d95f9ef4036f438e8cd2af..8f5a7a05f01e05c3923c8804267e65e8152414ee 100644
--- a/lib/private/files/storage/wrapper/encryption.php
+++ b/lib/private/files/storage/wrapper/encryption.php
@@ -480,6 +480,7 @@ class Encryption extends Wrapper {
 	 * @param bool $preserveMtime
 	 * @param bool $isRename
 	 * @return bool
+	 * @throws \Exception
 	 */
 	private function copyBetweenStorage(Storage $sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime, $isRename) {
 
@@ -487,7 +488,18 @@ class Encryption extends Wrapper {
 		// key from the original file. Just create a 1:1 copy and done
 		if ($this->isVersion($targetInternalPath) ||
 			$this->isVersion($sourceInternalPath)) {
-			return $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
+			$result = $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
+			if ($result) {
+				$info = $this->getCache('', $sourceStorage)->get($sourceInternalPath);
+				// make sure that we update the unencrypted size for the version
+				if (isset($info['encrypted']) && $info['encrypted'] === true) {
+					$this->updateUnencryptedSize(
+						$this->getFullPath($targetInternalPath),
+						$info['size']
+					);
+				}
+			}
+			return $result;
 		}
 
 		// first copy the keys that we reuse the existing file key on the target location
diff --git a/tests/lib/files/storage/wrapper/encryption.php b/tests/lib/files/storage/wrapper/encryption.php
index 095405462df6f4d8168102bc091585bc22ba5961..2b93aa86db08ed068c1a7d06836e3950bb2ead49 100644
--- a/tests/lib/files/storage/wrapper/encryption.php
+++ b/tests/lib/files/storage/wrapper/encryption.php
@@ -559,6 +559,102 @@ class Encryption extends \Test\Files\Storage\Storage {
 		$this->assertFalse(false);
 	}
 
+	/**
+	 * @dataProvider dataTestCopyBetweenStorageVersions
+	 *
+	 * @param string $sourceInternalPath
+	 * @param string $targetInternalPath
+	 * @param bool $copyResult
+	 * @param bool $encrypted
+	 */
+	public function  testCopyBetweenStorageVersions($sourceInternalPath, $targetInternalPath, $copyResult, $encrypted) {
+
+		$sourceStorage = $this->getMockBuilder('OCP\Files\Storage')
+			->disableOriginalConstructor()
+			->getMock();
+
+		$targetStorage = $this->getMockBuilder('OCP\Files\Storage')
+			->disableOriginalConstructor()
+			->getMock();
+
+		$cache = $this->getMockBuilder('\OC\Files\Cache\Cache')
+			->disableOriginalConstructor()->getMock();
+
+		$mountPoint = '/mountPoint';
+
+		/** @var \OC\Files\Storage\Wrapper\Encryption |\PHPUnit_Framework_MockObject_MockObject  $instance */
+		$instance = $this->getMockBuilder('\OC\Files\Storage\Wrapper\Encryption')
+			->setConstructorArgs(
+				[
+					[
+						'storage' => $targetStorage,
+						'root' => 'foo',
+						'mountPoint' => $mountPoint,
+						'mount' => $this->mount
+					],
+					$this->encryptionManager,
+					$this->util,
+					$this->logger,
+					$this->file,
+					null,
+					$this->keyStore,
+					$this->update,
+					$this->mountManager
+				]
+			)
+			->setMethods(['updateUnencryptedSize', 'getCache'])
+			->getMock();
+
+		$targetStorage->expects($this->once())->method('copyFromStorage')
+			->with($sourceStorage, $sourceInternalPath, $targetInternalPath)
+			->willReturn($copyResult);
+
+		if ($copyResult) {
+			$instance->expects($this->once())->method('getCache')
+				->with('', $sourceStorage)
+				->willReturn($cache);
+			$cache->expects($this->once())->method('get')
+				->with($sourceInternalPath)
+				->willReturn(['encrypted' => $encrypted, 'size' => 42]);
+			if ($encrypted) {
+				$instance->expects($this->once())->method('updateUnencryptedSize')
+					->with($mountPoint . $targetInternalPath, 42);
+			} else {
+				$instance->expects($this->never())->method('updateUnencryptedSize');
+			}
+		} else {
+			$instance->expects($this->never())->method('updateUnencryptedSize');
+		}
+
+		$result = $this->invokePrivate(
+			$instance,
+			'copyBetweenStorage',
+			[
+				$sourceStorage,
+				$sourceInternalPath,
+				$targetInternalPath,
+				false,
+				false
+			]
+		);
+
+		$this->assertSame($copyResult, $result);
+	}
+
+	public function dataTestCopyBetweenStorageVersions() {
+		return [
+			['/files/foo.txt', '/files_versions/foo.txt.768743', true, true],
+			['/files/foo.txt', '/files_versions/foo.txt.768743', true, false],
+			['/files/foo.txt', '/files_versions/foo.txt.768743', false, true],
+			['/files/foo.txt', '/files_versions/foo.txt.768743', false, false],
+			['/files_versions/foo.txt.6487634', '/files/foo.txt', true, true],
+			['/files_versions/foo.txt.6487634', '/files/foo.txt', true, false],
+			['/files_versions/foo.txt.6487634', '/files/foo.txt', false, true],
+			['/files_versions/foo.txt.6487634', '/files/foo.txt', false, false],
+
+		];
+	}
+
 	/**
 	 * @dataProvider dataTestIsVersion
 	 * @param string $path