             throw SQLiteError.FailedToPrepareStatement(sqlite3_errcode(db), String.fromCString(sqlite3_errmsg(db)))
         }
         self.setSnapshotStmt = setSnapshotStmt
+
+        var getExtensionDetailsStmt: COpaquePointer = nil
+        if sqlite3_prepare_v2(db, "SELECT version, data, turf_version FROM \(TurfExtensionsTableName) WHERE name=?;",  -1, &getExtensionDetailsStmt, nil).isNotOK {
+            throw SQLiteError.FailedToPrepareStatement(sqlite3_errcode(db), String.fromCString(sqlite3_errmsg(db)))
+        }
+        self.getExtensionDetailsStmt = getExtensionDetailsStmt
+
+        var setExtensionDetailsStmt: COpaquePointer = nil
+        if sqlite3_prepare_v2(db, "INSERT OR REPLACE INTO \(TurfExtensionsTableName) (name, version, data, turf_version) VALUES (?, ?, ?, 0);",  -1, &setExtensionDetailsStmt, nil).isNotOK {
+            throw SQLiteError.FailedToPrepareStatement(sqlite3_errcode(db), String.fromCString(sqlite3_errmsg(db)))
+        }
+        self.setExtensionDetailsStmt = setExtensionDetailsStmt
     }
 
     private func finalizePreparedStatements() {

        sqlite3_reset(setSnapshotStmt)
    }

    // MARK: Private methods

    private func prepareStatements() throws {

    private var rollbackTransactionStmt: SQLStatement!
    private var getSnapshotStmt: SQLStatement!
    private var setSnapshotStmt: SQLStatement!
    private var getExtensionDetailsStmt: SQLStatement!
    private var setExtensionDetailsStmt: SQLStatement!

    // MARK: Object lifecycle

