diff --git a/lib/private/db/connectionfactory.php b/lib/private/db/connectionfactory.php
index 67e0d86710b04696492aabed7ec17a08162540f0..83a59cddd7f2ebf7aece04a5ca59cd8f8e1632c1 100644
--- a/lib/private/db/connectionfactory.php
+++ b/lib/private/db/connectionfactory.php
@@ -113,6 +113,7 @@ class ConnectionFactory {
 				break;
 			case 'sqlite3':
 				$journalMode = $additionalConnectionParams['sqlite.journal_mode'];
+				$additionalConnectionParams['platform'] = new OCSqlitePlatform();
 				$eventManager->addEventSubscriber(new SQLiteSessionInit(true, $journalMode));
 				break;
 		}
diff --git a/lib/private/db/ocsqliteplatform.php b/lib/private/db/ocsqliteplatform.php
new file mode 100644
index 0000000000000000000000000000000000000000..fe39e20c864ba6541de57e2cc39ac1a6f2b08cee
--- /dev/null
+++ b/lib/private/db/ocsqliteplatform.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Copyright (c) 2015 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OC\DB;
+
+class OCSqlitePlatform extends \Doctrine\DBAL\Platforms\SqlitePlatform {
+	/**
+	 * {@inheritDoc}
+	 */
+	public function getColumnDeclarationSQL($name, array $field) {
+		$def = parent::getColumnDeclarationSQL($name, $field);
+		if (!empty($field['autoincrement'])) {
+			$def .= ' PRIMARY KEY AUTOINCREMENT';
+		}
+		return $def;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected function _getCreateTableSQL($name, array $columns, array $options = array()){
+		// if auto increment is set the column is already defined as primary key
+		foreach ($columns as $column) {
+			if (!empty($column['autoincrement'])) {
+				$options['primary'] = null;
+			}
+		}
+		return parent::_getCreateTableSQL($name, $columns, $options);
+	}
+}
diff --git a/lib/private/repair.php b/lib/private/repair.php
index 19ba53c2bcc93c3f2d66cd9c68e079a2f899b1ee..0674207bbeed5954facfabadc1c0cfd6f5cf504d 100644
--- a/lib/private/repair.php
+++ b/lib/private/repair.php
@@ -32,6 +32,7 @@ use OC\Hooks\Emitter;
 use OC\Repair\AssetCache;
 use OC\Repair\CleanTags;
 use OC\Repair\Collation;
+use OC\Repair\SqliteAutoincrement;
 use OC\Repair\DropOldTables;
 use OC\Repair\FillETags;
 use OC\Repair\InnoDB;
@@ -118,6 +119,7 @@ class Repair extends BasicEmitter {
 		$steps = array(
 			new InnoDB(),
 			new Collation(\OC::$server->getConfig(), \OC_DB::getConnection()),
+			new SqliteAutoincrement(\OC_DB::getConnection()),
 			new SearchLuceneTables(),
 			new RepairConfig()
 		);
diff --git a/lib/repair/sqliteautoincrement.php b/lib/repair/sqliteautoincrement.php
new file mode 100644
index 0000000000000000000000000000000000000000..79b1fe7870efbce83ccbeb1e4667751a09da0e6b
--- /dev/null
+++ b/lib/repair/sqliteautoincrement.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Copyright (c) 2015 Vincent Petry <pvince81@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 Doctrine\DBAL\Platforms\SqlitePlatform;
+use Doctrine\DBAL\Schema\SchemaException;
+use Doctrine\DBAL\Schema\SchemaDiff;
+use Doctrine\DBAL\Schema\TableDiff;
+use Doctrine\DBAL\Schema\ColumnDiff;
+use OC\Hooks\BasicEmitter;
+
+/**
+ * Fixes Sqlite autoincrement by forcing the SQLite table schemas to be
+ * altered in order to retrigger SQL schema generation through OCSqlitePlatform.
+ */
+class SqliteAutoincrement extends BasicEmitter implements \OC\RepairStep {
+	/**
+	 * @var \OC\DB\Connection
+	 */
+	protected $connection;
+
+	/**
+	 * @param \OC\DB\Connection $connection
+	 */
+	public function __construct($connection) {
+		$this->connection = $connection;
+	}
+
+	public function getName() {
+		return 'Repair SQLite autoincrement';
+	}
+
+	/**
+	 * Fix mime types
+	 */
+	public function run() {
+		if (!$this->connection->getDatabasePlatform() instanceof SqlitePlatform) {
+			return;
+		}
+
+		$sourceSchema = $this->connection->getSchemaManager()->createSchema();
+
+		$schemaDiff = new SchemaDiff();
+
+		foreach ($sourceSchema->getTables() as $tableSchema) {
+			$primaryKey = $tableSchema->getPrimaryKey();
+			if (!$primaryKey) {
+				continue;
+			}
+
+			$columnNames = $primaryKey->getColumns();
+
+			// add a column diff for every primary key column,
+			// but do not actually change anything, this will
+			// force the generation of SQL statements to alter
+			// those tables, which will then trigger the
+			// specific SQL code from OCSqlitePlatform
+			try {
+				$tableDiff = new TableDiff($tableSchema->getName());
+				$tableDiff->fromTable = $tableSchema;
+				foreach ($columnNames as $columnName) {
+					$columnSchema = $tableSchema->getColumn($columnName);
+					$columnDiff = new ColumnDiff($columnSchema->getName(), $columnSchema);
+					$tableDiff->changedColumns[] = $columnDiff;
+					$schemaDiff->changedTables[] = $tableDiff;
+				}
+			} catch (SchemaException $e) {
+				// ignore
+			}
+		}
+
+		$this->connection->beginTransaction();
+		foreach ($schemaDiff->toSql($this->connection->getDatabasePlatform()) as $sql) {
+			$this->connection->query($sql);
+		}
+		$this->connection->commit();
+	}
+}
+
diff --git a/tests/lib/files/cache/cache.php b/tests/lib/files/cache/cache.php
index 1bf838351b6db4e6b23bd0314808de69ecb4ea9c..f0ad6cf3ab123eb38e4202fbbb3bd161688de0db 100644
--- a/tests/lib/files/cache/cache.php
+++ b/tests/lib/files/cache/cache.php
@@ -594,6 +594,19 @@ class Cache extends \Test\TestCase {
 		$this->assertEquals($newData, $newDataFromBogus);
 	}
 
+	public function testNoReuseOfFileId() {
+		$data1 = array('size' => 100, 'mtime' => 50, 'mimetype' => 'text/plain');
+		$this->cache->put('somefile.txt', $data1);
+		$info = $this->cache->get('somefile.txt');
+		$fileId = $info['fileid'];
+		$this->cache->remove('somefile.txt');
+		$data2 = array('size' => 200, 'mtime' => 100, 'mimetype' => 'text/plain');
+		$this->cache->put('anotherfile.txt', $data2);
+		$info2 = $this->cache->get('anotherfile.txt');
+		$fileId2 = $info2['fileid'];
+		$this->assertNotEquals($fileId, $fileId2);
+	}
+
 	protected function tearDown() {
 		if ($this->cache) {
 			$this->cache->clear();
diff --git a/tests/lib/repair/repairsqliteautoincrement.php b/tests/lib/repair/repairsqliteautoincrement.php
new file mode 100644
index 0000000000000000000000000000000000000000..f81e08ba78ee4fa1966f2d815d2502bf17129a47
--- /dev/null
+++ b/tests/lib/repair/repairsqliteautoincrement.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test\Repair;
+
+/**
+ * Tests for fixing the SQLite id recycling
+ */
+class TestRepairSqliteAutoincrement extends \Test\TestCase {
+
+	/**
+	 * @var \OC\Repair\SqliteAutoincrement
+	 */
+	private $repair;
+
+	/**
+	 * @var \Doctrine\DBAL\Connection
+	 */
+	private $connection;
+
+	/**
+	 * @var string
+	 */
+	private $tableName;
+
+	/**
+	 * @var \OCP\IConfig
+	 */
+	private $config;
+
+	protected function setUp() {
+		parent::setUp();
+
+		$this->connection = \OC_DB::getConnection();
+		$this->config = \OC::$server->getConfig();
+		if (!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) {
+			$this->markTestSkipped("Test only relevant on Sqlite");
+		}
+
+		$dbPrefix = $this->config->getSystemValue('dbtableprefix', 'oc_');
+		$this->tableName = $this->getUniqueID($dbPrefix . 'autoinc_test');
+		$this->connection->exec('CREATE TABLE ' . $this->tableName . '("someid" INTEGER NOT NULL, "text" VARCHAR(16), PRIMARY KEY("someid"))');
+
+		$this->repair = new \OC\Repair\SqliteAutoincrement($this->connection);
+	}
+
+	protected function tearDown() {
+		$this->connection->getSchemaManager()->dropTable($this->tableName);
+		parent::tearDown();
+	}
+
+	/**
+	 * Tests whether autoincrement works
+	 *
+	 * @return boolean true if autoincrement works, false otherwise
+	 */
+	protected function checkAutoincrement() {
+		$this->connection->executeUpdate('INSERT INTO ' . $this->tableName . ' ("text") VALUES ("test")');
+		$insertId = $this->connection->lastInsertId();
+		$this->connection->executeUpdate('DELETE FROM ' . $this->tableName . ' WHERE "someid" = ?', array($insertId));
+
+		// insert again
+		$this->connection->executeUpdate('INSERT INTO ' . $this->tableName . ' ("text") VALUES ("test2")');
+		$newInsertId = $this->connection->lastInsertId();
+
+		return ($insertId !== $newInsertId);
+	}
+
+	public function testConvertIdColumn() {
+		$this->assertFalse($this->checkAutoincrement());
+
+		$this->repair->run();
+
+		$this->assertTrue($this->checkAutoincrement());
+	}
+}
diff --git a/version.php b/version.php
index 29c84c2c9b263e2ead20d3801e3527f1b9dd404c..0872d7c61f28da6e2776259f756b0e67d71cecdf 100644
--- a/version.php
+++ b/version.php
@@ -23,7 +23,7 @@
 // We only can count up. The 4. digit is only for the internal patchlevel to trigger DB upgrades
 // between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel
 // when updating major/minor version number.
-$OC_Version=array(8, 1, 0, 0);
+$OC_Version=array(8, 1, 0, 1);
 
 // The human readable string
 $OC_VersionString='8.1 pre alpha';