diff --git a/apps/files/appinfo/update.php b/apps/files/appinfo/update.php
index a9b8ccbf824651409bc5d8bb9adb0113f05c39a7..de635e5ce6b93b3dfadd1cda033192ee8404629e 100644
--- a/apps/files/appinfo/update.php
+++ b/apps/files/appinfo/update.php
@@ -6,60 +6,3 @@ if (version_compare(\OCP\Config::getSystemValue('version', '0.0.0'), '7.0.0', '<
 	\OCP\Config::deleteSystemValue('allowZipDownload');
 	\OCP\Config::deleteSystemValue('maxZipInputSize');
 }
-
-if (version_compare(\OCP\Config::getAppValue('files', 'installed_version'), '1.1.9', '<')) {
-
-	// update wrong mimetypes
-	$wrongMimetypes = array(
-		'application/mspowerpoint' => 'application/vnd.ms-powerpoint',
-		'application/msexcel' => 'application/vnd.ms-excel',
-	);
-
-	$stmt = OC_DB::prepare('
-		UPDATE `*PREFIX*mimetypes`
-		SET    `mimetype` = ?
-		WHERE  `mimetype` = ?
-	');
-
-	foreach ($wrongMimetypes as $wrong => $correct) {
-		OC_DB::executeAudited($stmt, array($wrong, $correct));
-	}
-
-	$updatedMimetypes = array(
-		'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
-		'xlsx' => 'application/vnd.ms-excel',
-		'pptx' => 'application/vnd.ms-powerpoint',
-	);
-
-	// separate doc from docx etc
-	foreach ($updatedMimetypes as $extension => $mimetype ) {
-		$result = OC_DB::executeAudited('
-			SELECT count(`mimetype`)
-			FROM   `*PREFIX*mimetypes`
-			WHERE  `mimetype` = ?
-			', array($mimetype)
-		);
-
-		$exists = $result->fetchOne();
-
-		if ( ! $exists ) {
-			// insert mimetype
-			OC_DB::executeAudited('
-				INSERT INTO `*PREFIX*mimetypes` ( `mimetype` )
-				VALUES ( ? )
-				', array($mimetype)
-			);
-		}
-
-		// change mimetype for files with x extension
-		OC_DB::executeAudited('
-			UPDATE `*PREFIX*filecache`
-			SET `mimetype` = (
-				SELECT `id`
-				FROM `*PREFIX*mimetypes`
-				WHERE `mimetype` = ?
-			) WHERE `name` LIKE ?
-			', array($mimetype, '%.'.$extension)
-		);
-	}
-}
\ No newline at end of file
diff --git a/lib/private/repair.php b/lib/private/repair.php
index db2a04433b0d3a1d5337651ed5a8067e2b79cb26..14a917be32c9a59bc9f4d887a02a79972de5ddc2 100644
--- a/lib/private/repair.php
+++ b/lib/private/repair.php
@@ -68,7 +68,9 @@ class Repair extends BasicEmitter {
 	 * @return array of RepairStep instances
 	 */
 	public static function getRepairSteps() {
-		return array();
+		return array(
+			new \OC\Repair\RepairMimeTypes()
+		);
 	}
 
 	/**
@@ -78,7 +80,8 @@ class Repair extends BasicEmitter {
 	 * @return array of RepairStep instances
 	 */
 	public static function getBeforeUpgradeRepairSteps() {
-		return array();
+		return array(
+		);
 	}
 
 	/**
diff --git a/lib/repair/repairmimetypes.php b/lib/repair/repairmimetypes.php
new file mode 100644
index 0000000000000000000000000000000000000000..f7618c6e06055c7c10f60f396888c76c80c7a0bb
--- /dev/null
+++ b/lib/repair/repairmimetypes.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
+ * Copyright (c) 2014 Jörn Dreyer jfd@owncloud.com
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OC\Repair;
+
+use OC\Hooks\BasicEmitter;
+
+class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
+
+	public function getName() {
+		return 'Repair mime types';
+	}
+
+	private function fixOfficeMimeTypes() {
+		// update wrong mimetypes
+		$wrongMimetypes = array(
+			'application/mspowerpoint' => 'application/vnd.ms-powerpoint',
+			'application/msexcel' => 'application/vnd.ms-excel',
+		);
+
+		$existsStmt = \OC_DB::prepare('
+			SELECT count(`mimetype`)
+			FROM   `*PREFIX*mimetypes`
+			WHERE  `mimetype` = ?
+		');
+
+		$getIdStmt = \OC_DB::prepare('
+			SELECT `id`
+			FROM   `*PREFIX*mimetypes`
+			WHERE  `mimetype` = ?
+		');
+
+		$insertStmt = \OC_DB::prepare('
+			INSERT INTO `*PREFIX*mimetypes` ( `mimetype` )
+			VALUES ( ? )
+		');
+
+		$updateWrongStmt = \OC_DB::prepare('
+			UPDATE `*PREFIX*filecache`
+			SET `mimetype` = (
+				SELECT `id`
+				FROM `*PREFIX*mimetypes`
+				WHERE `mimetype` = ?
+			) WHERE `mimetype` = ?
+		');
+
+		$deleteStmt = \OC_DB::prepare('
+			DELETE FROM `*PREFIX*mimetypes`
+			WHERE `id` = ?
+		');
+
+		foreach ($wrongMimetypes as $wrong => $correct) {
+
+
+			// do we need to remove a wrong mimetype?
+			$result = \OC_DB::executeAudited($getIdStmt, array($wrong));
+			$wrongId = $result->fetchOne();
+
+			if ($wrongId !== false) {
+
+				// do we need to insert the correct mimetype?
+				$result = \OC_DB::executeAudited($existsStmt, array($correct));
+				$exists = $result->fetchOne();
+
+				if ( ! $exists ) {
+					// insert mimetype
+					\OC_DB::executeAudited($insertStmt, array($correct));
+				}
+
+				// change wrong mimetype to correct mimetype in filecache
+				\OC_DB::executeAudited($updateWrongStmt, array($correct, $wrongId));
+
+				// delete wrong mimetype
+				\OC_DB::executeAudited($deleteStmt, array($wrongId));
+
+			}
+
+		}
+
+		$updatedMimetypes = array(
+			'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+			'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+			'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+		);
+
+		$updateByNameStmt = \OC_DB::prepare('
+			UPDATE `*PREFIX*filecache`
+			SET `mimetype` = (
+				SELECT `id`
+				FROM `*PREFIX*mimetypes`
+				WHERE `mimetype` = ?
+			) WHERE `name` LIKE ?
+		');
+
+		// separate doc from docx etc
+		foreach ($updatedMimetypes as $extension => $mimetype ) {
+			$result = \OC_DB::executeAudited($existsStmt, array($mimetype));
+			$exists = $result->fetchOne();
+
+			if ( ! $exists ) {
+				// insert mimetype
+				\OC_DB::executeAudited($insertStmt, array($mimetype));
+			}
+
+			// change mimetype for files with x extension
+			\OC_DB::executeAudited($updateByNameStmt, array($mimetype, '%.'.$extension));
+		}
+	}
+
+	/**
+	 * Fix mime types
+	 */
+	public function run() {
+		if ($this->fixOfficeMimeTypes()) {
+			$this->emit('\OC\Repair', 'info', array('Fixed office mime types'));
+		}
+	}
+}
+
diff --git a/tests/lib/repair/repairmimetypes.php b/tests/lib/repair/repairmimetypes.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ed19bd55bb6ee8ff8ae805b25254dac74e078c7
--- /dev/null
+++ b/tests/lib/repair/repairmimetypes.php
@@ -0,0 +1,207 @@
+<?php
+/**
+ * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+/**
+ * Tests for the converting of legacy storages to home storages.
+ *
+ * @see \OC\Repair\RepairMimeTypes
+ */
+class TestRepairMimeTypes extends PHPUnit_Framework_TestCase {
+
+	/** @var \OC\RepairStep */
+	private $repair;
+
+	private $storage;
+
+	public function setUp() {
+		$this->storage = new \OC\Files\Storage\Temporary(array());
+
+		$this->repair = new \OC\Repair\RepairMimeTypes();
+	}
+
+	public function tearDown() {
+		$this->storage->getCache()->clear();
+		$sql = 'DELETE FROM `*PREFIX*storages` WHERE `id` = ?';
+		\OC_DB::executeAudited($sql, array($this->storage->getId()));
+		$this->clearMimeTypes();
+
+		DummyFileCache::clearCachedMimeTypes();
+	}
+
+	private function clearMimeTypes() {
+		$sql = 'DELETE FROM `*PREFIX*mimetypes`';
+		\OC_DB::executeAudited($sql);
+	}
+
+	private function addEntries($entries) {
+		// create files for the different extensions, this
+		// will also automatically create the corresponding mime types
+		foreach ($entries as $entry) {
+			$this->storage->getCache()->put(
+				$entry[0],
+				array(
+					'size' => 0,
+					'mtime' => 0,
+					'mimetype' => $entry[1]
+				)
+			);
+		}
+
+	}
+
+	private function checkEntries($entries) {
+		foreach ($entries as $entry) {
+			$data = $this->storage->getCache()->get($entry[0]);
+			$this->assertEquals($entry[1], $data['mimetype']);
+		}
+	}
+
+	/**
+	 * Returns the id of a given mime type or null
+	 * if it does not exist.
+	 */
+	private function getMimeTypeIdFromDB($mimeType) {
+		$sql = 'SELECT `id` FROM `*PREFIX*mimetypes` WHERE `mimetype` = ?';
+		$results = \OC_DB::executeAudited($sql, array($mimeType));
+		$result = $results->fetchOne();
+		if ($result) {
+			return $result['id'];
+		}
+		return null;
+	}
+
+	/**
+	 * Test renaming and splitting old office mime types
+	 */
+	public function testRenameOfficeMimeTypes() {
+		$this->addEntries(
+			array(
+				array('test.doc', 'application/msword'),
+				array('test.docx', 'application/msword'),
+				array('test.xls', 'application/msexcel'),
+				array('test.xlsx', 'application/msexcel'),
+				array('test.ppt', 'application/mspowerpoint'),
+				array('test.pptx', 'application/mspowerpoint'),
+			)
+		);
+
+		$this->repair->run();
+
+		// force mimetype reload
+		DummyFileCache::clearCachedMimeTypes();
+		$this->storage->getCache()->loadMimeTypes();
+
+		$this->checkEntries(
+			array(
+				array('test.doc', 'application/msword'),
+				array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+				array('test.xls', 'application/vnd.ms-excel'),
+				array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+				array('test.ppt', 'application/vnd.ms-powerpoint'),
+				array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
+			)
+		);
+	}
+
+	/**
+	 * Test renaming and splitting old office mime types when
+	 * new ones already exist
+	 */
+	public function testRenameOfficeMimeTypesWhenExist() {
+		$this->addEntries(
+			array(
+				array('test.doc', 'application/msword'),
+				array('test.docx', 'application/msword'),
+				array('test.xls', 'application/msexcel'),
+				array('test.xlsx', 'application/msexcel'),
+				array('test.ppt', 'application/mspowerpoint'),
+				array('test.pptx', 'application/mspowerpoint'),
+				// make it so that the new mimetypes already exist
+				array('bogus.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+				array('bogus.xlsx', 'application/vnd.ms-excel'),
+				array('bogus.pptx', 'application/vnd.ms-powerpoint'),
+				array('bogus2.docx', 'application/wrong'),
+				array('bogus2.xlsx', 'application/wrong'),
+				array('bogus2.pptx', 'application/wrong'),
+			)
+		);
+
+		$this->repair->run();
+
+		// force mimetype reload
+		DummyFileCache::clearCachedMimeTypes();
+		$this->storage->getCache()->loadMimeTypes();
+
+		$this->checkEntries(
+			array(
+				array('test.doc', 'application/msword'),
+				array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+				array('test.xls', 'application/vnd.ms-excel'),
+				array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+				array('test.ppt', 'application/vnd.ms-powerpoint'),
+				array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
+				array('bogus.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+				array('bogus.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+				array('bogus.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
+				array('bogus2.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+				array('bogus2.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+				array('bogus2.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
+			)
+		);
+
+		// wrong mimetypes are gone
+		$this->assertNull($this->getMimeTypeIdFromDB('application/msexcel'));
+		$this->assertNull($this->getMimeTypeIdFromDB('application/mspowerpoint'));
+	}
+
+	/**
+	 * Test that nothing happens and no error happens when all mimetypes are
+	 * already correct and no old ones exist..
+	 */
+	public function testDoNothingWhenOnlyNewFiles() {
+		$this->addEntries(
+			array(
+				array('test.doc', 'application/msword'),
+				array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+				array('test.xls', 'application/vnd.ms-excel'),
+				array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+				array('test.ppt', 'application/vnd.ms-powerpoint'),
+				array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
+			)
+		);
+
+		$this->repair->run();
+
+		// force mimetype reload
+		DummyFileCache::clearCachedMimeTypes();
+		$this->storage->getCache()->loadMimeTypes();
+
+		$this->checkEntries(
+			array(
+				array('test.doc', 'application/msword'),
+				array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+				array('test.xls', 'application/vnd.ms-excel'),
+				array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+				array('test.ppt', 'application/vnd.ms-powerpoint'),
+				array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
+			)
+		);
+	}
+}
+
+/**
+ * Dummy class to access protected members
+ */
+class DummyFileCache extends \OC\Files\Cache\Cache {
+
+	public static function clearCachedMimeTypes() {
+		self::$mimetypeIds = array();
+		self::$mimetypes = array();
+	}
+}
+