diff --git a/briar-api/src/org/briarproject/api/StringMap.java b/briar-api/src/org/briarproject/api/StringMap.java
index e0480bbfa8279f44bfe47fa308a5463879dc98b6..7b897f45e69ae4449a91530f9bc936dbc686d6d6 100644
--- a/briar-api/src/org/briarproject/api/StringMap.java
+++ b/briar-api/src/org/briarproject/api/StringMap.java
@@ -26,4 +26,18 @@ abstract class StringMap extends Hashtable<String, String> {
 	public void putBoolean(String key, boolean value) {
 		put(key, String.valueOf(value));
 	}
+
+	public int getInt(String key, int defaultValue) {
+		String s = get(key);
+		if (s == null) return defaultValue;
+		try {
+			return Integer.valueOf(s);
+		} catch (NumberFormatException e) {
+			return defaultValue;
+		}
+	}
+
+	public void putInt(String key, int value) {
+		put(key, String.valueOf(value));
+	}
 }
diff --git a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
index 63125cc02c9f195edd72f80baabf8e4ee9dd885e..33f89394990eae130346a5788f2bae17340d5222 100644
--- a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
+++ b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
@@ -31,7 +31,7 @@ import java.util.Map;
 public interface DatabaseComponent {
 
 	/** Opens the database and returns true if the database already existed. */
-	boolean open() throws DbException, IOException;
+	boolean open() throws DbException;
 
 	/** Waits for any open transactions to finish and closes the database. */
 	void close() throws DbException, IOException;
diff --git a/briar-core/src/org/briarproject/db/Database.java b/briar-core/src/org/briarproject/db/Database.java
index 917744c8029d7fb3593f00b7fe4d86d57a871bdc..e539d8d4cf834e30efe0290b23ed65af9b757634 100644
--- a/briar-core/src/org/briarproject/db/Database.java
+++ b/briar-core/src/org/briarproject/db/Database.java
@@ -40,7 +40,7 @@ interface Database<T> {
 	 * <p>
 	 * Locking: write.
 	 */
-	boolean open() throws DbException, IOException;
+	boolean open() throws DbException;
 
 	/**
 	 * Prevents new transactions from starting, waits for all current
diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
index 833f850a22bf7bd34dba5079f65095543557b24f..2b01c7e6f5fb96398b0d987a5cac237007db8f49 100644
--- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
+++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
@@ -94,7 +94,7 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 		this.shutdown = shutdown;
 	}
 
-	public boolean open() throws DbException, IOException {
+	public boolean open() throws DbException {
 		Runnable shutdownHook = new Runnable() {
 			public void run() {
 				lock.writeLock().lock();
diff --git a/briar-core/src/org/briarproject/db/H2Database.java b/briar-core/src/org/briarproject/db/H2Database.java
index de8997334865328aee105f3dc6cf06c5e5eefb2d..c786ea319cc6750e558f3ff9a04affc05e4dd6f3 100644
--- a/briar-core/src/org/briarproject/db/H2Database.java
+++ b/briar-core/src/org/briarproject/db/H2Database.java
@@ -6,7 +6,6 @@ import org.briarproject.api.system.Clock;
 import org.briarproject.util.StringUtils;
 
 import java.io.File;
-import java.io.IOException;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
@@ -18,7 +17,7 @@ import javax.inject.Inject;
 /** Contains all the H2-specific code for the database. */
 class H2Database extends JdbcDatabase {
 
-	private static final String HASH_TYPE = "BINARY(48)";
+	private static final String HASH_TYPE = "BINARY(32)";
 	private static final String BINARY_TYPE = "BINARY";
 	private static final String COUNTER_TYPE = "INT NOT NULL AUTO_INCREMENT";
 	private static final String SECRET_TYPE = "BINARY(32)";
@@ -30,13 +29,14 @@ class H2Database extends JdbcDatabase {
 	H2Database(DatabaseConfig config, Clock clock) {
 		super(HASH_TYPE, BINARY_TYPE, COUNTER_TYPE, SECRET_TYPE, clock);
 		this.config = config;
-		String path = new File(config.getDatabaseDirectory(), "db").getAbsolutePath();
+		File dir = config.getDatabaseDirectory();
+		String path = new File(dir, "db").getAbsolutePath();
 		// FIXME: Remove WRITE_DELAY=0 after implementing BTPv2?
 		url = "jdbc:h2:split:" + path + ";CIPHER=AES;MULTI_THREADED=1"
 				+ ";WRITE_DELAY=0;DB_CLOSE_ON_EXIT=false";
 	}
 
-	public boolean open() throws DbException, IOException {
+	public boolean open() throws DbException {
 		boolean reopen = config.databaseExists();
 		if (!reopen) config.getDatabaseDirectory().mkdirs();
 		super.open("org.h2.Driver", reopen);
diff --git a/briar-core/src/org/briarproject/db/JdbcDatabase.java b/briar-core/src/org/briarproject/db/JdbcDatabase.java
index fc892e513341571d8b8863ef90925a8aa9d4c4ea..9f2f2c9a9e1bdd23d9d473c578037910936ad52c 100644
--- a/briar-core/src/org/briarproject/db/JdbcDatabase.java
+++ b/briar-core/src/org/briarproject/db/JdbcDatabase.java
@@ -25,7 +25,6 @@ import org.briarproject.api.transport.IncomingKeys;
 import org.briarproject.api.transport.OutgoingKeys;
 import org.briarproject.api.transport.TransportKeys;
 
-import java.io.IOException;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -271,8 +270,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 		this.clock = clock;
 	}
 
-	protected void open(String driverClass, boolean reopen) throws DbException,
-			IOException {
+	protected void open(String driverClass, boolean reopen) throws DbException {
 		// Load the JDBC driver
 		try {
 			Class.forName(driverClass);
@@ -286,10 +284,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 				if (!checkSchemaVersion(txn)) throw new DbException();
 			} else {
 				createTables(txn);
-				Settings s = new Settings();
-				s.put("schemaVersion", String.valueOf(SCHEMA_VERSION));
-				s.put("minSchemaVersion", String.valueOf(MIN_SCHEMA_VERSION));
-				mergeSettings(txn, s, "db");
+				storeSchemaVersion(txn);
 			}
 			commitTransaction(txn);
 		} catch (DbException e) {
@@ -299,16 +294,19 @@ abstract class JdbcDatabase implements Database<Connection> {
 	}
 
 	private boolean checkSchemaVersion(Connection txn) throws DbException {
-		try {
-			Settings s = getSettings(txn, "db");
-			int schemaVersion = Integer.valueOf(s.get("schemaVersion"));
-			if (schemaVersion == SCHEMA_VERSION) return true;
-			if (schemaVersion < MIN_SCHEMA_VERSION) return false;
-			int minSchemaVersion = Integer.valueOf(s.get("minSchemaVersion"));
-			return SCHEMA_VERSION >= minSchemaVersion;
-		} catch (NumberFormatException e) {
-			throw new DbException(e);
-		}
+		Settings s = getSettings(txn, "db");
+		int schemaVersion = s.getInt("schemaVersion", -1);
+		if (schemaVersion == SCHEMA_VERSION) return true;
+		if (schemaVersion < MIN_SCHEMA_VERSION) return false;
+		int minSchemaVersion = s.getInt("minSchemaVersion", -1);
+		return SCHEMA_VERSION >= minSchemaVersion;
+	}
+
+	private void storeSchemaVersion(Connection txn) throws DbException {
+		Settings s = new Settings();
+		s.putInt("schemaVersion", SCHEMA_VERSION);
+		s.putInt("minSchemaVersion", MIN_SCHEMA_VERSION);
+		mergeSettings(txn, s, "db");
 	}
 
 	private void tryToClose(ResultSet rs) {
@@ -2352,7 +2350,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 	}
 
 	public void setContactStatus(Connection txn, ContactId c, StorageStatus s)
-		throws DbException {
+			throws DbException {
 		PreparedStatement ps = null;
 		try {
 			String sql = "UPDATE contacts SET status = ? WHERE contactId = ?";
@@ -2387,7 +2385,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 	}
 
 	public void setMessageValidity(Connection txn, MessageId m, boolean valid)
-		throws DbException {
+			throws DbException {
 		PreparedStatement ps = null;
 		try {
 			String sql = "UPDATE messages SET valid = ? WHERE messageId = ?";
diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java
index f5a8c215c5f95fecd44cfe914a83e317cf3538c0..aba60f16b147645e738cda56f258a17d73766c8c 100644
--- a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java
+++ b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java
@@ -1,11 +1,12 @@
 package org.briarproject.lifecycle;
 
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.ALREADY_RUNNING;
-import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.DB_ERROR;
-import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.SERVICE_ERROR;
-import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.SUCCESS;
+import org.briarproject.api.db.DatabaseComponent;
+import org.briarproject.api.db.DbException;
+import org.briarproject.api.event.EventBus;
+import org.briarproject.api.event.ShutdownEvent;
+import org.briarproject.api.lifecycle.LifecycleManager;
+import org.briarproject.api.lifecycle.Service;
+import org.briarproject.api.system.Clock;
 
 import java.io.IOException;
 import java.util.Collection;
@@ -17,13 +18,12 @@ import java.util.logging.Logger;
 
 import javax.inject.Inject;
 
-import org.briarproject.api.db.DatabaseComponent;
-import org.briarproject.api.db.DbException;
-import org.briarproject.api.event.EventBus;
-import org.briarproject.api.event.ShutdownEvent;
-import org.briarproject.api.lifecycle.LifecycleManager;
-import org.briarproject.api.lifecycle.Service;
-import org.briarproject.api.system.Clock;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
+import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.ALREADY_RUNNING;
+import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.DB_ERROR;
+import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.SERVICE_ERROR;
+import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.SUCCESS;
 
 class LifecycleManagerImpl implements LifecycleManager {
 
@@ -98,9 +98,6 @@ class LifecycleManagerImpl implements LifecycleManager {
 		} catch (DbException e) {
 			if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
 			return DB_ERROR;
-		} catch (IOException e) {
-			if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
-			return DB_ERROR;
 		} finally {
 			startStopSemaphore.release();
 		}