diff --git a/phpBB/phpbb/storage/adapter/adapter_interface.php b/phpBB/phpbb/storage/adapter/adapter_interface.php
index 6d8b561c25..9c97f34a11 100644
--- a/phpBB/phpbb/storage/adapter/adapter_interface.php
+++ b/phpBB/phpbb/storage/adapter/adapter_interface.php
@@ -28,8 +28,7 @@ interface adapter_interface
 	 * @param string	path		The file to be written to.
 	 * @param string	content		The data to write into the file.
 	 *
-	 * @throws \phpbb\storage\exception\exception		When the file already exists
-	 * 													When the file cannot be written
+	 * @throws \phpbb\storage\exception\exception		When the file cannot be written
 	 */
 	public function put_contents($path, $content);
 
@@ -38,8 +37,7 @@ interface adapter_interface
 	 *
 	 * @param string	$path	The file to read
 	 *
-	 * @throws \phpbb\storage\exception\exception	When the file doesn't exist
-	 * 													When cannot read file contents
+	 * @throws \phpbb\storage\exception\exception	When cannot read file contents
 	 *
 	 * @return string	Returns file contents
 	 *
@@ -70,8 +68,7 @@ interface adapter_interface
 	 * @param string	$path_orig	The original file/direcotry
 	 * @param string	$path_dest	The target file/directory
 	 *
-	 * @throws \phpbb\storage\exception\exception		When target exists
-	 * 													When file/directory cannot be renamed
+	 * @throws \phpbb\storage\exception\exception		When file/directory cannot be renamed
 	 */
 	public function rename($path_orig, $path_dest);
 
@@ -81,8 +78,7 @@ interface adapter_interface
 	 * @param string	$path_orig	The original filename
 	 * @param string	$path_dest	The target filename
 	 *
-	 * @throws \phpbb\storage\exception\exception		When target exists
-	 * 													When the file cannot be copied
+	 * @throws \phpbb\storage\exception\exception		When the file cannot be copied
 	 */
 	public function copy($path_orig, $path_dest);
 
diff --git a/phpBB/phpbb/storage/adapter/local.php b/phpBB/phpbb/storage/adapter/local.php
index c7fbe544e9..7f55590fd8 100644
--- a/phpBB/phpbb/storage/adapter/local.php
+++ b/phpBB/phpbb/storage/adapter/local.php
@@ -118,11 +118,6 @@ class local implements adapter_interface, stream_interface
 	{
 		$this->ensure_directory_exists($path);
 
-		if ($this->exists($path))
-		{
-			throw new exception('STORAGE_FILE_EXISTS', $path);
-		}
-
 		try
 		{
 			$this->filesystem->dump_file($this->root_path . $this->get_path($path) . $this->get_filename($path), $content);
diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php
index 97d71048ee..b9c20ed7cf 100644
--- a/phpBB/phpbb/storage/storage.php
+++ b/phpBB/phpbb/storage/storage.php
@@ -106,8 +106,22 @@ class storage
 	 */
 	public function put_contents($path, $content)
 	{
-		$this->get_adapter()->put_contents($path, $content);
-		$this->track_file($path);
+		if ($this->exists($path))
+		{
+			throw new exception('STORAGE_FILE_EXISTS', $path);
+		}
+
+		try
+		{
+			$this->get_adapter()->put_contents($path, $content);
+			$this->track_file($path);
+		}
+		catch (\Exception $e)
+		{
+			$this->get_adapter()->delete($path);
+			$this->untrack_file($path);
+			throw $e;
+		}
 	}
 
 	/**
@@ -123,6 +137,11 @@ class storage
 	 */
 	public function get_contents($path)
 	{
+		if (!$this->exists($path))
+		{
+			throw new exception('STORAGE_FILE_NO_EXIST', $path);
+		}
+
 		return $this->get_adapter()->get_contents($path);
 	}
 
@@ -147,6 +166,11 @@ class storage
 	 */
 	public function delete($path)
 	{
+		if (!$this->exists($path))
+		{
+			throw new exception('STORAGE_FILE_NO_EXIST', $path);
+		}
+
 		$this->get_adapter()->delete($path);
 		$this->untrack_file($path);
 	}
@@ -157,13 +181,31 @@ class storage
 	 * @param string	$path_orig	The original file/direcotry
 	 * @param string	$path_dest	The target file/directory
 	 *
-	 * @throws \phpbb\storage\exception\exception		When target exists
+	 * @throws \phpbb\storage\exception\exception		When the file doesn't exist
+	 *													When target exists
 	 * 													When file/directory cannot be renamed
 	 */
 	public function rename($path_orig, $path_dest)
 	{
-		$this->get_adapter()->rename($path_orig, $path_dest);
-		$this->track_rename($path_orig, $path_dest);
+		if (!$this->exists($path_orig))
+		{
+			throw new exception('STORAGE_FILE_NO_EXIST', $path_orig);
+		}
+
+		if ($this->exists($path_dest))
+		{
+			throw new exception('STORAGE_FILE_EXISTS', $path_dest);
+		}
+
+		try {
+			$this->get_adapter()->rename($path_orig, $path_dest);
+			$this->track_rename($path_orig, $path_dest);
+		}
+		catch (\Exception $e)
+		{
+			$this->untrack_file($path_dest);
+			throw $e;
+		}
 	}
 
 	/**
@@ -172,13 +214,32 @@ class storage
 	 * @param string	$path_orig	The original filename
 	 * @param string	$path_dest	The target filename
 	 *
-	 * @throws \phpbb\storage\exception\exception		When target exists
+	 * @throws \phpbb\storage\exception\exception		When the file doesn't exist
+	 *													When target exists
 	 * 													When the file cannot be copied
 	 */
 	public function copy($path_orig, $path_dest)
 	{
-		$this->get_adapter()->copy($path_orig, $path_dest);
-		$this->track_file($path_dest);
+		if (!$this->exists($path_orig))
+		{
+			throw new exception('STORAGE_FILE_NO_EXIST', $path_orig);
+		}
+
+		if ($this->exists($path_dest))
+		{
+			throw new exception('STORAGE_FILE_EXISTS', $path_dest);
+		}
+
+		try
+		{
+			$this->get_adapter()->copy($path_orig, $path_dest);
+			$this->track_file($path_dest);
+		}
+		catch (\Exception $e)
+		{
+			$this->untrack_file($path_dest);
+			throw $e;
+		}
 	}
 
 	/**
@@ -186,12 +247,18 @@ class storage
 	 *
 	 * @param string	$path	File to read
 	 *
-	 * @throws \phpbb\storage\exception\exception		When unable to open file
+	 * @throws \phpbb\storage\exception\exception		When the file doesn't exist
+	 *													When unable to open file
 	 *
 	 * @return resource	Returns a file pointer
 	 */
 	public function read_stream($path)
 	{
+		if (!$this->exists($path))
+		{
+			throw new exception('STORAGE_FILE_NO_EXIST', $path);
+		}
+
 		$stream = null;
 		$adapter = $this->get_adapter();
 
@@ -217,15 +284,29 @@ class storage
 	 * @param string	$path		The target file
 	 * @param resource	$resource	The resource
 	 *
-	 * @throws \phpbb\storage\exception\exception		When target file cannot be created
+	 * @throws \phpbb\storage\exception\exception		When the file exist
+	 *													When target file cannot be created
 	 */
 	public function write_stream($path, $resource)
 	{
+		if ($this->exists($path))
+		{
+			throw new exception('STORAGE_FILE_EXISTS', $path);
+		}
+
 		$adapter = $this->get_adapter();
 
 		if ($adapter instanceof stream_interface)
 		{
-			$adapter->write_stream($path, $resource);
+			try
+			{
+				$adapter->write_stream($path, $resource);
+			}
+			catch (\Exception $e)
+			{
+				$this->get_adapter()->delete($path);
+				$this->untrack_file($path);
+			}
 		}
 		else
 		{