diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseTypes.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseTypes.java
new file mode 100644
index 0000000000000000000000000000000000000000..3a807bd562a04f587e6e541b145cdb8cd30d1f97
--- /dev/null
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseTypes.java
@@ -0,0 +1,34 @@
+package org.briarproject.bramble.db;
+
+class DatabaseTypes {
+
+	private final String hashType, secretType, binaryType;
+    private final String counterType, stringType;
+
+	public DatabaseTypes(String hashType, String secretType, String binaryType,
+			String counterType, String stringType) {
+		this.hashType = hashType;
+		this.secretType = secretType;
+		this.binaryType = binaryType;
+		this.counterType = counterType;
+		this.stringType = stringType;
+	}
+
+	/**
+	 * Replaces database type placeholders in a statement with the actual types.
+	 * These placeholders are currently supported:
+	 *	<li> _HASH
+	 *	<li> _SECRET
+	 *	<li> _BINARY
+	 *	<li> _COUNTER
+	 *	<li> _STRING
+	 */
+	String replaceTypes(String s) {
+		s = s.replaceAll("_HASH", hashType);
+		s = s.replaceAll("_SECRET", secretType);
+		s = s.replaceAll("_BINARY", binaryType);
+		s = s.replaceAll("_COUNTER", counterType);
+		s = s.replaceAll("_STRING", stringType);
+		return s;
+	}
+}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java b/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java
index 85bebb67c55b823ab70f35d1a4cd55893bbadfe6..1d1c4c9f9ce4dbe5fa03a189c77f5beed864fe13 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java
@@ -30,6 +30,8 @@ class H2Database extends JdbcDatabase {
 	private static final String BINARY_TYPE = "BINARY";
 	private static final String COUNTER_TYPE = "INT NOT NULL AUTO_INCREMENT";
 	private static final String STRING_TYPE = "VARCHAR";
+	private static final DatabaseTypes dbTypes = new DatabaseTypes(HASH_TYPE,
+			SECRET_TYPE, BINARY_TYPE, COUNTER_TYPE, STRING_TYPE);
 
 	private final DatabaseConfig config;
 	private final String url;
@@ -40,8 +42,7 @@ class H2Database extends JdbcDatabase {
 	@Inject
 	H2Database(DatabaseConfig config, MessageFactory messageFactory,
 			Clock clock) {
-		super(HASH_TYPE, SECRET_TYPE, BINARY_TYPE, COUNTER_TYPE, STRING_TYPE,
-				messageFactory, clock);
+		super(dbTypes, messageFactory, clock);
 		this.config = config;
 		File dir = config.getDatabaseDirectory();
 		String path = new File(dir, "db").getAbsolutePath();
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/HyperSqlDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/HyperSqlDatabase.java
index e8ba7b33dc564866bffb346c82349104093eb2f2..30b6d050c0ef8c05fc4711baa1c22d5a92bb0794 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/HyperSqlDatabase.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/HyperSqlDatabase.java
@@ -30,6 +30,8 @@ class HyperSqlDatabase extends JdbcDatabase {
 	private static final String COUNTER_TYPE =
 			"INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY(START WITH 1)";
 	private static final String STRING_TYPE = "VARCHAR";
+	private static final DatabaseTypes dbTypes = new DatabaseTypes(HASH_TYPE,
+			SECRET_TYPE, BINARY_TYPE, COUNTER_TYPE, STRING_TYPE);
 
 	private final DatabaseConfig config;
 	private final String url;
@@ -40,8 +42,7 @@ class HyperSqlDatabase extends JdbcDatabase {
 	@Inject
 	HyperSqlDatabase(DatabaseConfig config, MessageFactory messageFactory,
 			Clock clock) {
-		super(HASH_TYPE, SECRET_TYPE, BINARY_TYPE, COUNTER_TYPE, STRING_TYPE,
-				messageFactory, clock);
+		super(dbTypes, messageFactory, clock);
 		this.config = config;
 		File dir = config.getDatabaseDirectory();
 		String path = new File(dir, "db").getAbsolutePath();
@@ -78,7 +79,7 @@ class HyperSqlDatabase extends JdbcDatabase {
 	}
 
 	@Override
-	public long getFreeSpace() throws DbException {
+	public long getFreeSpace() {
 		File dir = config.getDatabaseDirectory();
 		long maxSize = config.getMaxSize();
 		long free = dir.getFreeSpace();
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
index e9d388d9fa6f5854ba08caa912aa0f7a5a9b39b5..f893d0a7f256622230993822456e6618774ffa8e 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
@@ -312,10 +312,9 @@ abstract class JdbcDatabase implements Database<Connection> {
 			Logger.getLogger(JdbcDatabase.class.getName());
 
 	// Different database libraries use different names for certain types
-	private final String hashType, secretType, binaryType;
-	private final String counterType, stringType;
 	private final MessageFactory messageFactory;
 	private final Clock clock;
+	private final DatabaseTypes dbTypes;
 
 	// Locking: connectionsLock
 	private final LinkedList<Connection> connections = new LinkedList<>();
@@ -330,14 +329,9 @@ abstract class JdbcDatabase implements Database<Connection> {
 	private final Lock connectionsLock = new ReentrantLock();
 	private final Condition connectionsChanged = connectionsLock.newCondition();
 
-	JdbcDatabase(String hashType, String secretType, String binaryType,
-			String counterType, String stringType,
-			MessageFactory messageFactory, Clock clock) {
-		this.hashType = hashType;
-		this.secretType = secretType;
-		this.binaryType = binaryType;
-		this.counterType = counterType;
-		this.stringType = stringType;
+	JdbcDatabase(DatabaseTypes databaseTypes, MessageFactory messageFactory,
+			Clock clock) {
+		this.dbTypes = databaseTypes;
 		this.messageFactory = messageFactory;
 		this.clock = clock;
 	}
@@ -432,7 +426,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 		return Arrays.asList(
 				new Migration38_39(),
 				new Migration39_40(),
-				new Migration40_41()
+				new Migration40_41(dbTypes)
 		);
 	}
 
@@ -492,20 +486,20 @@ abstract class JdbcDatabase implements Database<Connection> {
 		Statement s = null;
 		try {
 			s = txn.createStatement();
-			s.executeUpdate(insertTypeNames(CREATE_SETTINGS));
-			s.executeUpdate(insertTypeNames(CREATE_LOCAL_AUTHORS));
-			s.executeUpdate(insertTypeNames(CREATE_CONTACTS));
-			s.executeUpdate(insertTypeNames(CREATE_GROUPS));
-			s.executeUpdate(insertTypeNames(CREATE_GROUP_METADATA));
-			s.executeUpdate(insertTypeNames(CREATE_GROUP_VISIBILITIES));
-			s.executeUpdate(insertTypeNames(CREATE_MESSAGES));
-			s.executeUpdate(insertTypeNames(CREATE_MESSAGE_METADATA));
-			s.executeUpdate(insertTypeNames(CREATE_MESSAGE_DEPENDENCIES));
-			s.executeUpdate(insertTypeNames(CREATE_OFFERS));
-			s.executeUpdate(insertTypeNames(CREATE_STATUSES));
-			s.executeUpdate(insertTypeNames(CREATE_TRANSPORTS));
-			s.executeUpdate(insertTypeNames(CREATE_OUTGOING_KEYS));
-			s.executeUpdate(insertTypeNames(CREATE_INCOMING_KEYS));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_SETTINGS));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_LOCAL_AUTHORS));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_CONTACTS));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_GROUPS));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_GROUP_METADATA));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_GROUP_VISIBILITIES));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_MESSAGES));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_MESSAGE_METADATA));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_MESSAGE_DEPENDENCIES));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_OFFERS));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_STATUSES));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_TRANSPORTS));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_OUTGOING_KEYS));
+			s.executeUpdate(dbTypes.replaceTypes(CREATE_INCOMING_KEYS));
 			s.close();
 		} catch (SQLException e) {
 			tryToClose(s);
@@ -530,15 +524,6 @@ abstract class JdbcDatabase implements Database<Connection> {
 		}
 	}
 
-	private String insertTypeNames(String s) {
-		s = s.replaceAll("_HASH", hashType);
-		s = s.replaceAll("_SECRET", secretType);
-		s = s.replaceAll("_BINARY", binaryType);
-		s = s.replaceAll("_COUNTER", counterType);
-		s = s.replaceAll("_STRING", stringType);
-		return s;
-	}
-
 	@Override
 	public Connection startTransaction() throws DbException {
 		Connection txn;
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/Migration40_41.java b/bramble-core/src/main/java/org/briarproject/bramble/db/Migration40_41.java
index 4d5ecea18a16234f4b75706927daa6d7019be599..59bc567cb56d6dedb0538c497ce738da15c32f13 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/Migration40_41.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/Migration40_41.java
@@ -17,6 +17,12 @@ class Migration40_41 implements Migration<Connection> {
 
 	private static final Logger LOG = getLogger(Migration40_41.class.getName());
 
+	private final DatabaseTypes dbTypes;
+
+	public Migration40_41(DatabaseTypes databaseTypes) {
+		this.dbTypes = databaseTypes;
+	}
+
 	@Override
 	public int getStartVersion() {
 		return 40;
@@ -33,8 +39,7 @@ class Migration40_41 implements Migration<Connection> {
 		try {
 			s = txn.createStatement();
 			s.execute("ALTER TABLE contacts"
-					// TODO how to insertTypeNames _STRING ?
-					+ " ADD alias VARCHAR");
+					+ dbTypes.replaceTypes(" ADD alias VARCHAR"));
 		} catch (SQLException e) {
 			tryToClose(s);
 			throw new DbException(e);