diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/client/ContactGroupFactory.java b/bramble-api/src/main/java/org/briarproject/bramble/api/client/ContactGroupFactory.java
index 6b4ba6b4c23d022475c6f436050316c48ca996c7..896acb221fe9bb07d7b8f69a07172bdb4bff4dbd 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/client/ContactGroupFactory.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/client/ContactGroupFactory.java
@@ -12,19 +12,19 @@ public interface ContactGroupFactory {
 	/**
 	 * Creates a group that is not shared with any contacts.
 	 */
-	Group createLocalGroup(ClientId clientId, int clientVersion);
+	Group createLocalGroup(ClientId clientId, int majorVersion);
 
 	/**
 	 * Creates a group for the given client to share with the given contact.
 	 */
-	Group createContactGroup(ClientId clientId, int clientVersion,
+	Group createContactGroup(ClientId clientId, int majorVersion,
 			Contact contact);
 
 	/**
 	 * Creates a group for the given client to share between the given authors
 	 * identified by their AuthorIds.
 	 */
-	Group createContactGroup(ClientId clientId, int clientVersion,
+	Group createContactGroup(ClientId clientId, int majorVersion,
 			AuthorId authorId1, AuthorId authorId2);
 
 }
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java
index 5e50efdc29b76e75785a9a37de39aad8522c237f..3715674413fe008428753cbad66bcd4f2601c3cd 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java
@@ -241,7 +241,7 @@ public interface DatabaseComponent {
 	 * <p/>
 	 * Read-only.
 	 */
-	Collection<Group> getGroups(Transaction txn, ClientId c, int clientVersion)
+	Collection<Group> getGroups(Transaction txn, ClientId c, int majorVersion)
 			throws DbException;
 
 	/**
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java
index ed18409bf57d84bc073c55f712893d72e5d092e2..8a8ec4dad2c1be9929e872e8600657781b1c9a36 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java
@@ -18,9 +18,9 @@ public interface TransportPropertyManager {
 	ClientId CLIENT_ID = new ClientId("org.briarproject.bramble.properties");
 
 	/**
-	 * The current version of the transport property client.
+	 * The current major version of the transport property client.
 	 */
-	int CLIENT_VERSION = 0;
+	int MAJOR_VERSION = 0;
 
 	/**
 	 * Stores the given properties received while adding a contact - they will
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java
index 781ce4b4e41e42cdc75951c6cd0224db8f4c1034..d2a9dac37cec5ccaf13b24ac4f652efd9da69f62 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java
@@ -17,22 +17,22 @@ public interface ClientVersioningManager {
 	ClientId CLIENT_ID = new ClientId("org.briarproject.bramble.versioning");
 
 	/**
-	 * The current version of the versioning client.
+	 * The current major version of the versioning client.
 	 */
-	int CLIENT_VERSION = 0;
+	int MAJOR_VERSION = 0;
 
 	/**
 	 * Registers a client that will be advertised to contacts. This method
 	 * should be called before {@link LifecycleManager#startServices(String)}.
 	 */
-	void registerClient(ClientId clientId, int clientVersion);
+	void registerClient(ClientId clientId, int majorVersion);
 
 	/**
 	 * Registers a hook that will be called when the visibility of the given
 	 * client changes. This method should be called before
 	 * {@link LifecycleManager#startServices(String)}.
 	 */
-	void registerClientVersioningHook(ClientId clientId, int clientVersion,
+	void registerClientVersioningHook(ClientId clientId, int majorVersion,
 			ClientVersioningHook hook);
 
 	/**
@@ -40,7 +40,7 @@ public interface ClientVersioningManager {
 	 * contact.
 	 */
 	Visibility getClientVisibility(Transaction txn, ContactId contactId,
-			ClientId clientId, int clientVersion) throws DbException;
+			ClientId clientId, int majorVersion) throws DbException;
 
 	interface ClientVersioningHook {
 
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java
index d44423cbc0ab06947e69edd8512c023cfc4ccd4a..2d395cce55e59a5703423f0c43c3540c7f91dc80 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java
@@ -32,16 +32,16 @@ public class Group {
 
 	private final GroupId id;
 	private final ClientId clientId;
-	private final int clientVersion;
+	private final int majorVersion;
 	private final byte[] descriptor;
 
-	public Group(GroupId id, ClientId clientId, int clientVersion,
+	public Group(GroupId id, ClientId clientId, int majorVersion,
 			byte[] descriptor) {
 		if (descriptor.length > MAX_GROUP_DESCRIPTOR_LENGTH)
 			throw new IllegalArgumentException();
 		this.id = id;
 		this.clientId = clientId;
-		this.clientVersion = clientVersion;
+		this.majorVersion = majorVersion;
 		this.descriptor = descriptor;
 	}
 
@@ -60,10 +60,10 @@ public class Group {
 	}
 
 	/**
-	 * Returns the version of the client to which the group belongs.
+	 * Returns the major version of the client to which the group belongs.
 	 */
-	public int getClientVersion() {
-		return clientVersion;
+	public int getMajorVersion() {
+		return majorVersion;
 	}
 
 	/**
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/GroupFactory.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/GroupFactory.java
index 844ded0e14863172165246aa13d534433c91df87..9924c51b8507a861e9439bdf625ed69bad785618 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/GroupFactory.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/GroupFactory.java
@@ -6,7 +6,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 public interface GroupFactory {
 
 	/**
-	 * Creates a group with the given client ID, client version and descriptor.
+	 * Creates a group with the given client ID, major version and descriptor.
 	 */
-	Group createGroup(ClientId c, int clientVersion, byte[] descriptor);
+	Group createGroup(ClientId c, int majorVersion, byte[] descriptor);
 }
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java
index 56571ad97603496f3ddea9a830f0066ee9335673..1718cac8101fc0b9a03719219b5bdaad23f72d84 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java
@@ -37,7 +37,7 @@ public interface ValidationManager {
 	 * Registers the message validator for the given client. This method
 	 * should be called before {@link LifecycleManager#startServices(String)}.
 	 */
-	void registerMessageValidator(ClientId c, int clientVersion,
+	void registerMessageValidator(ClientId c, int majorVersion,
 			MessageValidator v);
 
 	/**
@@ -46,7 +46,7 @@ public interface ValidationManager {
 	 * method should be called before
 	 * {@link LifecycleManager#startServices(String)}.
 	 */
-	void registerIncomingMessageHook(ClientId c, int clientVersion,
+	void registerIncomingMessageHook(ClientId c, int majorVersion,
 			IncomingMessageHook hook);
 
 	interface MessageValidator {
diff --git a/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java b/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java
index 0bff1a547dbbd2e223d822c11d6a3ab0d99f5462..c77fde6e9921f5b5c337a29ef3873ce2b96c7456 100644
--- a/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java
+++ b/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java
@@ -117,16 +117,16 @@ public class TestUtils {
 		return new Author(id, FORMAT_VERSION, name, publicKey);
 	}
 
-	public static Group getGroup(ClientId clientId, int clientVersion) {
+	public static Group getGroup(ClientId clientId, int majorVersion) {
 		int descriptorLength = 1 + random.nextInt(MAX_GROUP_DESCRIPTOR_LENGTH);
-		return getGroup(clientId, clientVersion, descriptorLength);
+		return getGroup(clientId, majorVersion, descriptorLength);
 	}
 
-	public static Group getGroup(ClientId clientId, int clientVersion,
+	public static Group getGroup(ClientId clientId, int majorVersion,
 			int descriptorLength) {
 		GroupId groupId = new GroupId(getRandomId());
 		byte[] descriptor = getRandomBytes(descriptorLength);
-		return new Group(groupId, clientId, clientVersion, descriptor);
+		return new Group(groupId, clientId, majorVersion, descriptor);
 	}
 
 	public static Message getMessage(GroupId groupId) {
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/client/ContactGroupFactoryImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/client/ContactGroupFactoryImpl.java
index fba2aa745a72fca908df892714ee9305df9ef02b..6b35c9281853010344150d0fb1d6771a6cb3e1ac 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/client/ContactGroupFactoryImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/client/ContactGroupFactoryImpl.java
@@ -32,25 +32,25 @@ class ContactGroupFactoryImpl implements ContactGroupFactory {
 	}
 
 	@Override
-	public Group createLocalGroup(ClientId clientId, int clientVersion) {
-		return groupFactory.createGroup(clientId, clientVersion,
+	public Group createLocalGroup(ClientId clientId, int majorVersion) {
+		return groupFactory.createGroup(clientId, majorVersion,
 				LOCAL_GROUP_DESCRIPTOR);
 	}
 
 	@Override
-	public Group createContactGroup(ClientId clientId, int clientVersion,
+	public Group createContactGroup(ClientId clientId, int majorVersion,
 			Contact contact) {
 		AuthorId local = contact.getLocalAuthorId();
 		AuthorId remote = contact.getAuthor().getId();
 		byte[] descriptor = createGroupDescriptor(local, remote);
-		return groupFactory.createGroup(clientId, clientVersion, descriptor);
+		return groupFactory.createGroup(clientId, majorVersion, descriptor);
 	}
 
 	@Override
-	public Group createContactGroup(ClientId clientId, int clientVersion,
+	public Group createContactGroup(ClientId clientId, int majorVersion,
 			AuthorId authorId1, AuthorId authorId2) {
 		byte[] descriptor = createGroupDescriptor(authorId1, authorId2);
-		return groupFactory.createGroup(clientId, clientVersion, descriptor);
+		return groupFactory.createGroup(clientId, majorVersion, descriptor);
 	}
 
 	private byte[] createGroupDescriptor(AuthorId local, AuthorId remote) {
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java
index 7a132510fcd670056d21418bb285b58afc9a2189..f20c0da5edf4ad11d411b959139cadf36ea4d7e5 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java
@@ -266,7 +266,7 @@ interface Database<T> {
 	 * <p/>
 	 * Read-only.
 	 */
-	Collection<Group> getGroups(T txn, ClientId c, int clientVersion)
+	Collection<Group> getGroups(T txn, ClientId c, int majorVersion)
 			throws DbException;
 
 	/**
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java
index b24567bf30aeeb1ea2bccf94363850adc98eb99c..1534a9d81bfb47d68d03f4ab90620f2b1397d0b4 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java
@@ -436,9 +436,9 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 
 	@Override
 	public Collection<Group> getGroups(Transaction transaction, ClientId c,
-			int clientVersion) throws DbException {
+			int majorVersion) throws DbException {
 		T txn = unbox(transaction);
-		return db.getGroups(txn, c, clientVersion);
+		return db.getGroups(txn, c, majorVersion);
 	}
 
 	@Override
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 3bffa8529665b78fd4f8ccd2bef7e0db372c15e9..7115808e289bd8fc51a871b10970f70bc7579605 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
@@ -74,7 +74,7 @@ import static org.briarproject.bramble.db.ExponentialBackoff.calculateExpiry;
 abstract class JdbcDatabase implements Database<Connection> {
 
 	// Package access for testing
-	static final int CODE_SCHEMA_VERSION = 37;
+	static final int CODE_SCHEMA_VERSION = 38;
 
 	// Rotation period offsets for incoming transport keys
 	private static final int OFFSET_PREV = -1;
@@ -117,7 +117,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 			"CREATE TABLE groups"
 					+ " (groupId _HASH NOT NULL,"
 					+ " clientId _STRING NOT NULL,"
-					+ " clientVersion INT NOT NULL,"
+					+ " majorVersion INT NOT NULL,"
 					+ " descriptor _BINARY NOT NULL,"
 					+ " PRIMARY KEY (groupId))";
 
@@ -276,9 +276,9 @@ abstract class JdbcDatabase implements Database<Connection> {
 			"CREATE INDEX IF NOT EXISTS contactsByAuthorId"
 					+ " ON contacts (authorId)";
 
-	private static final String INDEX_GROUPS_BY_CLIENT_ID_CLIENT_VERSION =
-			"CREATE INDEX IF NOT EXISTS groupsByClientIdClientVersion"
-					+ " ON groups (clientId, clientVersion)";
+	private static final String INDEX_GROUPS_BY_CLIENT_ID_MAJOR_VERSION =
+			"CREATE INDEX IF NOT EXISTS groupsByClientIdMajorVersion"
+					+ " ON groups (clientId, majorVersion)";
 
 	private static final String INDEX_MESSAGE_METADATA_BY_GROUP_ID_STATE =
 			"CREATE INDEX IF NOT EXISTS messageMetadataByGroupIdState"
@@ -445,7 +445,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 		try {
 			s = txn.createStatement();
 			s.executeUpdate(INDEX_CONTACTS_BY_AUTHOR_ID);
-			s.executeUpdate(INDEX_GROUPS_BY_CLIENT_ID_CLIENT_VERSION);
+			s.executeUpdate(INDEX_GROUPS_BY_CLIENT_ID_MAJOR_VERSION);
 			s.executeUpdate(INDEX_MESSAGE_METADATA_BY_GROUP_ID_STATE);
 			s.executeUpdate(INDEX_MESSAGE_DEPENDENCIES_BY_DEPENDENCY_ID);
 			s.executeUpdate(INDEX_STATUSES_BY_CONTACT_ID_GROUP_ID);
@@ -614,12 +614,12 @@ abstract class JdbcDatabase implements Database<Connection> {
 		PreparedStatement ps = null;
 		try {
 			String sql = "INSERT INTO groups"
-					+ " (groupId, clientId, clientVersion, descriptor)"
+					+ " (groupId, clientId, majorVersion, descriptor)"
 					+ " VALUES (?, ?, ?, ?)";
 			ps = txn.prepareStatement(sql);
 			ps.setBytes(1, g.getId().getBytes());
 			ps.setString(2, g.getClientId().getString());
-			ps.setInt(3, g.getClientVersion());
+			ps.setInt(3, g.getMajorVersion());
 			ps.setBytes(4, g.getDescriptor());
 			int affected = ps.executeUpdate();
 			if (affected != 1) throw new DbStateException();
@@ -1349,18 +1349,18 @@ abstract class JdbcDatabase implements Database<Connection> {
 		PreparedStatement ps = null;
 		ResultSet rs = null;
 		try {
-			String sql = "SELECT clientId, clientVersion, descriptor"
+			String sql = "SELECT clientId, majorVersion, descriptor"
 					+ " FROM groups WHERE groupId = ?";
 			ps = txn.prepareStatement(sql);
 			ps.setBytes(1, g.getBytes());
 			rs = ps.executeQuery();
 			if (!rs.next()) throw new DbStateException();
 			ClientId clientId = new ClientId(rs.getString(1));
-			int clientVersion = rs.getInt(2);
+			int majorVersion = rs.getInt(2);
 			byte[] descriptor = rs.getBytes(3);
 			rs.close();
 			ps.close();
-			return new Group(g, clientId, clientVersion, descriptor);
+			return new Group(g, clientId, majorVersion, descriptor);
 		} catch (SQLException e) {
 			tryToClose(rs);
 			tryToClose(ps);
@@ -1370,21 +1370,21 @@ abstract class JdbcDatabase implements Database<Connection> {
 
 	@Override
 	public Collection<Group> getGroups(Connection txn, ClientId c,
-			int clientVersion) throws DbException {
+			int majorVersion) throws DbException {
 		PreparedStatement ps = null;
 		ResultSet rs = null;
 		try {
 			String sql = "SELECT groupId, descriptor FROM groups"
-					+ " WHERE clientId = ? AND clientVersion = ?";
+					+ " WHERE clientId = ? AND majorVersion = ?";
 			ps = txn.prepareStatement(sql);
 			ps.setString(1, c.getString());
-			ps.setInt(2, clientVersion);
+			ps.setInt(2, majorVersion);
 			rs = ps.executeQuery();
 			List<Group> groups = new ArrayList<>();
 			while (rs.next()) {
 				GroupId id = new GroupId(rs.getBytes(1));
 				byte[] descriptor = rs.getBytes(2);
-				groups.add(new Group(id, c, clientVersion, descriptor));
+				groups.add(new Group(id, c, majorVersion, descriptor));
 			}
 			rs.close();
 			ps.close();
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/properties/PropertiesModule.java b/bramble-core/src/main/java/org/briarproject/bramble/properties/PropertiesModule.java
index 1fca633dea71c4a5f979d2939c77618bb245e76a..763e0d636d9bc286e3723e2d3e7743a988fa114b 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/properties/PropertiesModule.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/properties/PropertiesModule.java
@@ -16,7 +16,7 @@ import dagger.Module;
 import dagger.Provides;
 
 import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID;
-import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_VERSION;
+import static org.briarproject.bramble.api.properties.TransportPropertyManager.MAJOR_VERSION;
 
 @Module
 public class PropertiesModule {
@@ -35,7 +35,7 @@ public class PropertiesModule {
 			Clock clock) {
 		TransportPropertyValidator validator = new TransportPropertyValidator(
 				clientHelper, metadataEncoder, clock);
-		validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
 				validator);
 		return validator;
 	}
@@ -48,12 +48,12 @@ public class PropertiesModule {
 			ClientVersioningManager clientVersioningManager,
 			TransportPropertyManagerImpl transportPropertyManager) {
 		lifecycleManager.registerClient(transportPropertyManager);
-		validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
 				transportPropertyManager);
 		contactManager.registerContactHook(transportPropertyManager);
-		clientVersioningManager.registerClient(CLIENT_ID, CLIENT_VERSION);
+		clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION);
 		clientVersioningManager.registerClientVersioningHook(CLIENT_ID,
-				CLIENT_VERSION, transportPropertyManager);
+				MAJOR_VERSION, transportPropertyManager);
 		return transportPropertyManager;
 	}
 }
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java
index c9e0662b41192a369918751453bf9a91488e17f4..341776612a1a22a2fa01703bd4b5e1a8981f2594 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java
@@ -69,7 +69,7 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
 		this.contactGroupFactory = contactGroupFactory;
 		this.clock = clock;
 		localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID,
-				CLIENT_VERSION);
+				MAJOR_VERSION);
 	}
 
 	@Override
@@ -88,7 +88,7 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
 		db.addGroup(txn, g);
 		// Apply the client's visibility to the contact group
 		Visibility client = clientVersioningManager.getClientVisibility(txn,
-				c.getId(), CLIENT_ID, CLIENT_VERSION);
+				c.getId(), CLIENT_ID, MAJOR_VERSION);
 		if (LOG.isLoggable(INFO))
 			LOG.info("Applying visibility " + client + " to new contact group");
 		db.setGroupVisibility(txn, c.getId(), g.getId(), client);
@@ -313,7 +313,7 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
 
 	private Group getContactGroup(Contact c) {
 		return contactGroupFactory.createContactGroup(CLIENT_ID,
-				CLIENT_VERSION, c);
+				MAJOR_VERSION, c);
 	}
 
 	private void storeMessage(Transaction txn, GroupId g, TransportId t,
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java
index 202176a65cfdccb5b9877a81a9194d847b569eeb..39738122088aee1ffee8189b1f713adc6dad9089 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java
@@ -10,11 +10,11 @@ import javax.annotation.concurrent.Immutable;
 class ClientVersion implements Comparable<ClientVersion> {
 
 	final ClientId clientId;
-	final int clientVersion;
+	final int majorVersion;
 
-	ClientVersion(ClientId clientId, int clientVersion) {
+	ClientVersion(ClientId clientId, int majorVersion) {
 		this.clientId = clientId;
-		this.clientVersion = clientVersion;
+		this.majorVersion = majorVersion;
 	}
 
 	@Override
@@ -22,26 +22,26 @@ class ClientVersion implements Comparable<ClientVersion> {
 		if (o instanceof ClientVersion) {
 			ClientVersion cv = (ClientVersion) o;
 			return clientId.equals(cv.clientId)
-					&& clientVersion == cv.clientVersion;
+					&& majorVersion == cv.majorVersion;
 		}
 		return false;
 	}
 
 	@Override
 	public int hashCode() {
-		return (clientId.hashCode() << 16) + clientVersion;
+		return (clientId.hashCode() << 16) + majorVersion;
 	}
 
 	@Override
 	public int compareTo(ClientVersion c) {
 		int compare = clientId.compareTo(c.clientId);
 		if (compare != 0) return compare;
-		return clientVersion - c.clientVersion;
+		return majorVersion - c.majorVersion;
 	}
 
 	@Override
 	public String toString() {
-		return clientId.getString() + ":" + clientVersion;
+		return clientId.getString() + ":" + majorVersion;
 	}
 }
 
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java
index 0e9d7998926a91f9260853cadb34beb97c690814..7c4b670a2098f4c11a0c6620f93b04f30081bb13 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java
@@ -75,23 +75,23 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
 		this.contactGroupFactory = contactGroupFactory;
 		this.clock = clock;
 		localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID,
-				CLIENT_VERSION);
+				MAJOR_VERSION);
 	}
 
 	@Override
-	public void registerClient(ClientId clientId, int clientVersion) {
-		clients.add(new ClientVersion(clientId, clientVersion));
+	public void registerClient(ClientId clientId, int majorVersion) {
+		clients.add(new ClientVersion(clientId, majorVersion));
 	}
 
 	@Override
 	public void registerClientVersioningHook(ClientId clientId,
-			int clientVersion, ClientVersioningHook hook) {
-		hooks.put(new ClientVersion(clientId, clientVersion), hook);
+			int majorVersion, ClientVersioningHook hook) {
+		hooks.put(new ClientVersion(clientId, majorVersion), hook);
 	}
 
 	@Override
 	public Visibility getClientVisibility(Transaction txn,
-			ContactId contactId, ClientId clientId, int clientVersion)
+			ContactId contactId, ClientId clientId, int majorVersion)
 			throws DbException {
 		try {
 			Contact contact = db.getContact(txn, contactId);
@@ -106,7 +106,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
 			Update remoteUpdate = loadUpdate(txn, latest.remote.messageId);
 			Map<ClientVersion, Visibility> visibilities =
 					getVisibilities(localUpdate.states, remoteUpdate.states);
-			ClientVersion cv = new ClientVersion(clientId, clientVersion);
+			ClientVersion cv = new ClientVersion(clientId, majorVersion);
 			Visibility v = visibilities.get(cv);
 			return v == null ? INVISIBLE : v;
 		} catch (FormatException e) {
@@ -245,7 +245,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
 	private BdfList encodeClientVersions(List<ClientVersion> versions) {
 		BdfList encoded = new BdfList();
 		for (ClientVersion cv : versions)
-			encoded.add(BdfList.of(cv.clientId.getString(), cv.clientVersion));
+			encoded.add(BdfList.of(cv.clientId.getString(), cv.majorVersion));
 		return encoded;
 	}
 
@@ -282,8 +282,8 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
 		for (int i = 0; i < size; i++) {
 			BdfList cv = body.getList(i);
 			ClientId clientId = new ClientId(cv.getString(0));
-			int clientVersion = cv.getLong(1).intValue();
-			parsed.add(new ClientVersion(clientId, clientVersion));
+			int majorVersion = cv.getLong(1).intValue();
+			parsed.add(new ClientVersion(clientId, majorVersion));
 		}
 		return parsed;
 	}
@@ -325,7 +325,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
 
 	private Group getContactGroup(Contact c) {
 		return contactGroupFactory.createContactGroup(CLIENT_ID,
-				CLIENT_VERSION, c);
+				MAJOR_VERSION, c);
 	}
 
 	private LatestUpdates findLatestUpdates(Transaction txn, GroupId g)
@@ -372,11 +372,11 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
 
 	private ClientState parseClientState(BdfList clientState)
 			throws FormatException {
-		// Client ID, client version, active
+		// Client ID, major version, active
 		ClientId clientId = new ClientId(clientState.getString(0));
-		int clientVersion = clientState.getLong(1).intValue();
+		int majorVersion = clientState.getLong(1).intValue();
 		boolean active = clientState.getBoolean(2);
-		return new ClientState(clientId, clientVersion, active);
+		return new ClientState(clientId, majorVersion, active);
 	}
 
 	private long parseUpdateVersion(BdfList body) throws FormatException {
@@ -420,7 +420,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
 
 	private BdfList encodeClientState(ClientState cs) {
 		return BdfList.of(cs.version.clientId.getString(),
-				cs.version.clientVersion, cs.active);
+				cs.version.majorVersion, cs.active);
 	}
 
 	private Map<ClientVersion, Visibility> getVisibilities(
@@ -536,9 +536,9 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
 			this.active = active;
 		}
 
-		private ClientState(ClientId clientId, int clientVersion,
+		private ClientState(ClientId clientId, int majorVersion,
 				boolean active) {
-			this(new ClientVersion(clientId, clientVersion), active);
+			this(new ClientVersion(clientId, majorVersion), active);
 		}
 
 		@Override
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java
index 2795523a148931ff8d4a2af9d611f4fb3808911b..7306f22c50c97c8ecfa409fb3b3747fb265559e7 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java
@@ -39,13 +39,13 @@ class ClientVersioningValidator extends BdfMessageValidator {
 		int size = states.size();
 		for (int i = 0; i < size; i++) {
 			BdfList clientState = states.getList(i);
-			// Client ID, client version, active
+			// Client ID, major version, active
 			checkSize(clientState, 3);
 			String clientId = clientState.getString(0);
 			checkLength(clientId, 1, MAX_CLIENT_ID_LENGTH);
-			int clientVersion = clientState.getLong(1).intValue();
-			if (clientVersion < 0) throw new FormatException();
-			boolean active = clientState.getBoolean(2);
+			int majorVersion = clientState.getLong(1).intValue();
+			if (majorVersion < 0) throw new FormatException();
+			clientState.getBoolean(2);
 		}
 		// Update version
 		long updateVersion = body.getLong(1);
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/GroupFactoryImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/GroupFactoryImpl.java
index 6f12e6ff8f0d4adf33df7850ab8647a0f8a0ae07..5a46a4aad5287d4e896778834681b703ae0336aa 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/sync/GroupFactoryImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/GroupFactoryImpl.java
@@ -28,12 +28,12 @@ class GroupFactoryImpl implements GroupFactory {
 	}
 
 	@Override
-	public Group createGroup(ClientId c, int clientVersion, byte[] descriptor) {
-		byte[] clientVersionBytes = new byte[INT_32_BYTES];
-		ByteUtils.writeUint32(clientVersion, clientVersionBytes, 0);
+	public Group createGroup(ClientId c, int majorVersion, byte[] descriptor) {
+		byte[] majorVersionBytes = new byte[INT_32_BYTES];
+		ByteUtils.writeUint32(majorVersion, majorVersionBytes, 0);
 		byte[] hash = crypto.hash(LABEL, new byte[] {FORMAT_VERSION},
-				StringUtils.toUtf8(c.getString()), clientVersionBytes,
+				StringUtils.toUtf8(c.getString()), majorVersionBytes,
 				descriptor);
-		return new Group(new GroupId(hash), c, clientVersion, descriptor);
+		return new Group(new GroupId(hash), c, majorVersion, descriptor);
 	}
 }
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java
index f83e4d64c2488899411104e7c446368bacb4c825..04c6ca0dbfb2e5c2ccaa7f79c7d23a8fc2c4a650 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java
@@ -28,7 +28,7 @@ import dagger.Module;
 import dagger.Provides;
 
 import static org.briarproject.bramble.api.sync.ClientVersioningManager.CLIENT_ID;
-import static org.briarproject.bramble.api.sync.ClientVersioningManager.CLIENT_VERSION;
+import static org.briarproject.bramble.api.sync.ClientVersioningManager.MAJOR_VERSION;
 
 @Module
 public class SyncModule {
@@ -111,7 +111,7 @@ public class SyncModule {
 		lifecycleManager.registerClient(clientVersioningManager);
 		lifecycleManager.registerService(clientVersioningManager);
 		contactManager.registerContactHook(clientVersioningManager);
-		validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
 				clientVersioningManager);
 		return clientVersioningManager;
 	}
@@ -123,7 +123,7 @@ public class SyncModule {
 			Clock clock, ValidationManager validationManager) {
 		ClientVersioningValidator validator = new ClientVersioningValidator(
 				clientHelper, metadataEncoder, clock);
-		validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
 				validator);
 		return validator;
 	}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java
index 16ce78a4324a0d29d15e5c70a0877d9640664cf4..f6f977b7305d6af334a670ed0a9022f9200b1ae7 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java
@@ -81,15 +81,15 @@ class ValidationManagerImpl implements ValidationManager, Service,
 	}
 
 	@Override
-	public void registerMessageValidator(ClientId c, int clientVersion,
+	public void registerMessageValidator(ClientId c, int majorVersion,
 			MessageValidator v) {
-		validators.put(new ClientVersion(c, clientVersion), v);
+		validators.put(new ClientVersion(c, majorVersion), v);
 	}
 
 	@Override
-	public void registerIncomingMessageHook(ClientId c, int clientVersion,
+	public void registerIncomingMessageHook(ClientId c, int majorVersion,
 			IncomingMessageHook hook) {
-		hooks.put(new ClientVersion(c, clientVersion), hook);
+		hooks.put(new ClientVersion(c, majorVersion), hook);
 	}
 
 	private void validateOutstandingMessagesAsync() {
@@ -200,11 +200,11 @@ class ValidationManagerImpl implements ValidationManager, Service,
 						Message m = messageFactory.createMessage(id, raw);
 						Group g = db.getGroup(txn, m.getGroupId());
 						ClientId c = g.getClientId();
-						int clientVersion = g.getClientVersion();
+						int majorVersion = g.getMajorVersion();
 						Metadata meta =
 								db.getMessageMetadataForValidator(txn, id);
 						DeliveryResult result =
-								deliverMessage(txn, m, c, clientVersion, meta);
+								deliverMessage(txn, m, c, majorVersion, meta);
 						if (result.valid) {
 							pending.addAll(getPendingDependents(txn, id));
 							if (result.share) {
@@ -241,7 +241,7 @@ class ValidationManagerImpl implements ValidationManager, Service,
 	@ValidationExecutor
 	private void validateMessage(Message m, Group g) {
 		ClientVersion cv =
-				new ClientVersion(g.getClientId(), g.getClientVersion());
+				new ClientVersion(g.getClientId(), g.getMajorVersion());
 		MessageValidator v = validators.get(cv);
 		if (v == null) {
 			if (LOG.isLoggable(WARNING)) LOG.warning("No validator for " + cv);
@@ -249,7 +249,7 @@ class ValidationManagerImpl implements ValidationManager, Service,
 			try {
 				MessageContext context = v.validateMessage(m, g);
 				storeMessageContextAsync(m, g.getClientId(),
-						g.getClientVersion(), context);
+						g.getMajorVersion(), context);
 			} catch (InvalidMessageException e) {
 				if (LOG.isLoggable(INFO))
 					LOG.log(INFO, e.toString(), e);
@@ -261,13 +261,13 @@ class ValidationManagerImpl implements ValidationManager, Service,
 	}
 
 	private void storeMessageContextAsync(Message m, ClientId c,
-			int clientVersion, MessageContext result) {
+			int majorVersion, MessageContext result) {
 		dbExecutor.execute(() ->
-				storeMessageContext(m, c, clientVersion, result));
+				storeMessageContext(m, c, majorVersion, result));
 	}
 
 	@DatabaseExecutor
-	private void storeMessageContext(Message m, ClientId c, int clientVersion,
+	private void storeMessageContext(Message m, ClientId c, int majorVersion,
 			MessageContext context) {
 		try {
 			MessageId id = m.getId();
@@ -299,7 +299,7 @@ class ValidationManagerImpl implements ValidationManager, Service,
 					db.mergeMessageMetadata(txn, id, meta);
 					if (allDelivered) {
 						DeliveryResult result =
-								deliverMessage(txn, m, c, clientVersion, meta);
+								deliverMessage(txn, m, c, majorVersion, meta);
 						if (result.valid) {
 							pending = getPendingDependents(txn, id);
 							if (result.share) {
@@ -331,10 +331,10 @@ class ValidationManagerImpl implements ValidationManager, Service,
 
 	@DatabaseExecutor
 	private DeliveryResult deliverMessage(Transaction txn, Message m,
-			ClientId c, int clientVersion, Metadata meta) throws DbException {
+			ClientId c, int majorVersion, Metadata meta) throws DbException {
 		// Deliver the message to the client if it's registered a hook
 		boolean shareMsg = false;
-		ClientVersion cv = new ClientVersion(c, clientVersion);
+		ClientVersion cv = new ClientVersion(c, majorVersion);
 		IncomingMessageHook hook = hooks.get(cv);
 		if (hook != null) {
 			try {
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java
index 5d08264f7dc2c3e230099c24b5c81308af85d8f4..c228bf67ebc20ab3ad35ce8fa7300cc2ee848bd5 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java
@@ -89,7 +89,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase {
 
 	private final Object txn = new Object();
 	private final ClientId clientId;
-	private final int clientVersion;
+	private final int majorVersion;
 	private final GroupId groupId;
 	private final Group group;
 	private final Author author;
@@ -107,8 +107,8 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase {
 
 	public DatabaseComponentImplTest() {
 		clientId = getClientId();
-		clientVersion = 123;
-		group = getGroup(clientId, clientVersion);
+		majorVersion = 123;
+		group = getGroup(clientId, majorVersion);
 		groupId = group.getId();
 		author = getAuthor();
 		localAuthor = getLocalAuthor();
@@ -177,7 +177,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase {
 			oneOf(database).containsGroup(txn, groupId);
 			will(returnValue(true));
 			// getGroups()
-			oneOf(database).getGroups(txn, clientId, clientVersion);
+			oneOf(database).getGroups(txn, clientId, majorVersion);
 			will(returnValue(singletonList(group)));
 			// removeGroup()
 			oneOf(database).containsGroup(txn, groupId);
@@ -217,7 +217,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase {
 			db.addGroup(transaction, group); // First time - listeners called
 			db.addGroup(transaction, group); // Second time - not called
 			assertEquals(singletonList(group),
-					db.getGroups(transaction, clientId, clientVersion));
+					db.getGroups(transaction, clientId, majorVersion));
 			db.removeGroup(transaction, group);
 			db.removeContact(transaction, contactId);
 			db.removeLocalAuthor(transaction, localAuthor.getId());
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java
index 71f7b298546a5ffea7bcfda010f4b1bb6ccf003f..d5b29dc65775931bc492247c265071478f83d1f9 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java
@@ -82,7 +82,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 	private final File testDir = TestUtils.getTestDirectory();
 	private final GroupId groupId;
 	private final ClientId clientId;
-	private final int clientVersion;
+	private final int majorVersion;
 	private final Group group;
 	private final Author author;
 	private final LocalAuthor localAuthor;
@@ -97,8 +97,8 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 
 	JdbcDatabaseTest() throws Exception {
 		clientId = getClientId();
-		clientVersion = 123;
-		group = getGroup(clientId, clientVersion);
+		majorVersion = 123;
+		group = getGroup(clientId, majorVersion);
 		groupId = group.getId();
 		author = getAuthor();
 		localAuthor = getLocalAuthor();
@@ -1835,12 +1835,12 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		Database<Connection> db = open(false);
 		Connection txn = db.startTransaction();
 
-		assertEquals(emptyList(), db.getGroups(txn, clientId, clientVersion));
+		assertEquals(emptyList(), db.getGroups(txn, clientId, majorVersion));
 		db.addGroup(txn, group);
 		assertEquals(singletonList(group),
-				db.getGroups(txn, clientId, clientVersion));
+				db.getGroups(txn, clientId, majorVersion));
 		db.removeGroup(txn, groupId);
-		assertEquals(emptyList(), db.getGroups(txn, clientId, clientVersion));
+		assertEquals(emptyList(), db.getGroups(txn, clientId, majorVersion));
 
 		db.commitTransaction(txn);
 		db.close();
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java
index e0a84d6c6b4ac3565c4b45cd42ed9b5fc3932711..174d6fde927d6226f90e5e08e40480a8d867cdc4 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java
@@ -32,7 +32,7 @@ import java.util.Map;
 
 import static java.util.Collections.singletonList;
 import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID;
-import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_VERSION;
+import static org.briarproject.bramble.api.properties.TransportPropertyManager.MAJOR_VERSION;
 import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
 import static org.briarproject.bramble.api.sync.SyncConstants.MAX_MESSAGE_BODY_LENGTH;
 import static org.briarproject.bramble.test.TestUtils.getAuthor;
@@ -55,7 +55,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 			context.mock(ContactGroupFactory.class);
 	private final Clock clock = context.mock(Clock.class);
 
-	private final Group localGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
+	private final Group localGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
 	private final LocalAuthor localAuthor = getLocalAuthor();
 	private final BdfDictionary fooPropertiesDict = BdfDictionary.of(
 			new BdfEntry("fooKey1", "fooValue1"),
@@ -81,7 +81,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 	private TransportPropertyManagerImpl createInstance() {
 		context.checking(new Expectations() {{
 			oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID,
-					CLIENT_VERSION);
+					MAJOR_VERSION);
 			will(returnValue(localGroup));
 		}});
 		return new TransportPropertyManagerImpl(db, clientHelper,
@@ -93,7 +93,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 	public void testCreatesGroupsAtStartup() throws Exception {
 		Transaction txn = new Transaction(null, false);
 		Contact contact = getContact(true);
-		Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
+		Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
 
 		context.checking(new Expectations() {{
 			oneOf(db).containsGroup(txn, localGroup.getId());
@@ -102,11 +102,11 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContacts(txn);
 			will(returnValue(singletonList(contact)));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(db).addGroup(txn, contactGroup);
 			oneOf(clientVersioningManager).getClientVisibility(txn,
-					contact.getId(), CLIENT_ID, CLIENT_VERSION);
+					contact.getId(), CLIENT_ID, MAJOR_VERSION);
 			will(returnValue(SHARED));
 			oneOf(db).setGroupVisibility(txn, contact.getId(),
 					contactGroup.getId(), SHARED);
@@ -140,16 +140,16 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 	public void testCreatesContactGroupWhenAddingContact() throws Exception {
 		Transaction txn = new Transaction(null, false);
 		Contact contact = getContact(true);
-		Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
+		Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
 
 		context.checking(new Expectations() {{
 			// Create the group and share it with the contact
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(db).addGroup(txn, contactGroup);
 			oneOf(clientVersioningManager).getClientVisibility(txn,
-					contact.getId(), CLIENT_ID, CLIENT_VERSION);
+					contact.getId(), CLIENT_ID, MAJOR_VERSION);
 			will(returnValue(SHARED));
 			oneOf(db).setGroupVisibility(txn, contact.getId(),
 					contactGroup.getId(), SHARED);
@@ -169,11 +169,11 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 	public void testRemovesGroupWhenRemovingContact() throws Exception {
 		Transaction txn = new Transaction(null, false);
 		Contact contact = getContact(true);
-		Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
+		Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
 
 		context.checking(new Expectations() {{
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(db).removeGroup(txn, contactGroup);
 		}});
@@ -304,7 +304,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 	@Test
 	public void testStoresRemotePropertiesWithVersion0() throws Exception {
 		Contact contact = getContact(true);
-		Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
+		Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
 		Transaction txn = new Transaction(null, false);
 		Map<TransportId, TransportProperties> properties =
 				new LinkedHashMap<>();
@@ -315,7 +315,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContact(txn, contact.getId());
 			will(returnValue(contact));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 		}});
 		expectStoreMessage(txn, contactGroup.getId(), "foo", fooPropertiesDict,
@@ -418,8 +418,8 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 		Contact contact3 = getContact(true);
 		List<Contact> contacts =
 				Arrays.asList(contact1, contact2, contact3);
-		Group contactGroup2 = getGroup(CLIENT_ID, CLIENT_VERSION);
-		Group contactGroup3 = getGroup(CLIENT_ID, CLIENT_VERSION);
+		Group contactGroup2 = getGroup(CLIENT_ID, MAJOR_VERSION);
+		Group contactGroup3 = getGroup(CLIENT_ID, MAJOR_VERSION);
 		Map<MessageId, BdfDictionary> messageMetadata3 =
 				new LinkedHashMap<>();
 		// A remote update for another transport should be ignored
@@ -453,14 +453,14 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 			// First contact: skipped because not active
 			// Second contact: no updates
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact2);
+					MAJOR_VERSION, contact2);
 			will(returnValue(contactGroup2));
 			oneOf(clientHelper).getMessageMetadataAsDictionary(txn,
 					contactGroup2.getId());
 			will(returnValue(Collections.emptyMap()));
 			// Third contact: returns an update
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact3);
+					MAJOR_VERSION, contact3);
 			will(returnValue(contactGroup3));
 			oneOf(clientHelper).getMessageMetadataAsDictionary(txn,
 					contactGroup3.getId());
@@ -521,7 +521,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 	public void testMergingNewPropertiesCreatesUpdate() throws Exception {
 		Transaction txn = new Transaction(null, false);
 		Contact contact = getContact(true);
-		Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
+		Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
 
 		context.checking(new Expectations() {{
 			oneOf(db).startTransaction(false);
@@ -537,7 +537,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContacts(txn);
 			will(returnValue(singletonList(contact)));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(clientHelper).getMessageMetadataAsDictionary(txn,
 					contactGroup.getId());
@@ -556,7 +556,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 	public void testMergingUpdatedPropertiesCreatesUpdate() throws Exception {
 		Transaction txn = new Transaction(null, false);
 		Contact contact = getContact(true);
-		Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
+		Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
 		BdfDictionary oldMetadata = BdfDictionary.of(
 				new BdfEntry("transportId", "foo"),
 				new BdfEntry("version", 1),
@@ -596,7 +596,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContacts(txn);
 			will(returnValue(singletonList(contact)));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(clientHelper).getMessageMetadataAsDictionary(txn,
 					contactGroup.getId());
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java
index 600fb2ef8e5295890aba19343ec72b91a7d7bc3f..717e5370d0f5dbfb8bcb2c6530695624b39d2588 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java
@@ -19,7 +19,7 @@ import java.io.IOException;
 
 import static org.briarproject.bramble.api.plugin.TransportId.MAX_TRANSPORT_ID_LENGTH;
 import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID;
-import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_VERSION;
+import static org.briarproject.bramble.api.properties.TransportPropertyManager.MAJOR_VERSION;
 import static org.briarproject.bramble.test.TestUtils.getGroup;
 import static org.briarproject.bramble.test.TestUtils.getMessage;
 import static org.briarproject.bramble.test.TestUtils.getTransportId;
@@ -43,7 +43,7 @@ public class TransportPropertyValidatorTest extends BrambleMockTestCase {
 		transportProperties = new TransportProperties();
 		transportProperties.put("foo", "bar");
 
-		group = getGroup(CLIENT_ID, CLIENT_VERSION);
+		group = getGroup(CLIENT_ID, MAJOR_VERSION);
 		message = getMessage(group.getId());
 
 		MetadataEncoder metadataEncoder = context.mock(MetadataEncoder.class);
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTest.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTest.java
index 593a8ef71eeb034799dcd22d80a2e53e145ebf9a..1ceedbb20e3102ca52db0812ca866546acd44bce 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTest.java
@@ -81,9 +81,9 @@ public class SyncIntegrationTest extends BrambleTestCase {
 		streamNumber = 123;
 		// Create a group
 		ClientId clientId = getClientId();
-		int clientVersion = 1234567890;
+		int majorVersion = 1234567890;
 		byte[] descriptor = new byte[MAX_GROUP_DESCRIPTOR_LENGTH];
-		Group group = groupFactory.createGroup(clientId, clientVersion,
+		Group group = groupFactory.createGroup(clientId, majorVersion,
 				descriptor);
 		// Add two messages to the group
 		long timestamp = System.currentTimeMillis();
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java
index 3131c4fb5466bec6dd2b567dcc020b4a6f62049d..e3d7520e5ea8c67c277fe6ba6d1efe6f2c49373b 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java
@@ -53,11 +53,11 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
 	private final Executor dbExecutor = new ImmediateExecutor();
 	private final Executor validationExecutor = new ImmediateExecutor();
 	private final ClientId clientId = getClientId();
-	private final int clientVersion = 123;
+	private final int majorVersion = 123;
 	private final MessageId messageId = new MessageId(getRandomId());
 	private final MessageId messageId1 = new MessageId(getRandomId());
 	private final MessageId messageId2 = new MessageId(getRandomId());
-	private final Group group = getGroup(clientId, clientVersion);
+	private final Group group = getGroup(clientId, majorVersion);
 	private final GroupId groupId = group.getId();
 	private final long timestamp = System.currentTimeMillis();
 	private final byte[] raw = new byte[123];
@@ -86,8 +86,8 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
 	public void setUp() {
 		vm = new ValidationManagerImpl(db, dbExecutor, validationExecutor,
 				messageFactory);
-		vm.registerMessageValidator(clientId, clientVersion, validator);
-		vm.registerIncomingMessageHook(clientId, clientVersion, hook);
+		vm.registerMessageValidator(clientId, majorVersion, validator);
+		vm.registerIncomingMessageHook(clientId, majorVersion, hook);
 	}
 
 	@Test
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java
index bbf1da0944381d3d290a682a29c7405285cd4525..c32f16736eda5f71d713bc0acfa4163eca4042f2 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java
@@ -22,9 +22,9 @@ public interface BlogManager {
 	ClientId CLIENT_ID = new ClientId("org.briarproject.briar.blog");
 
 	/**
-	 * The current version of the blog client.
+	 * The current major version of the blog client.
 	 */
-	int CLIENT_VERSION = 0;
+	int MAJOR_VERSION = 0;
 
 	/**
 	 * Adds the given {@link Blog).}
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogSharingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogSharingManager.java
index e4b68bd6b42cf4576414e4f01ace74aacc66cde8..2e4a02d3bff2f80767ae7bb156234eec0b180211 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogSharingManager.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogSharingManager.java
@@ -11,7 +11,7 @@ public interface BlogSharingManager extends SharingManager<Blog> {
 	ClientId CLIENT_ID = new ClientId("org.briarproject.briar.blog.sharing");
 
 	/**
-	 * The current version of the blog sharing client.
+	 * The current major version of the blog sharing client.
 	 */
-	int CLIENT_VERSION = 0;
+	int MAJOR_VERSION = 0;
 }
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java b/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java
index 50f67963a5e2d0bdc9367e068df28d05ed39d92e..98adcea29e040f1c73d03ec8e7b6ad8994bf9e53 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java
@@ -16,9 +16,9 @@ public interface FeedManager {
 	ClientId CLIENT_ID = new ClientId("org.briarproject.briar.feed");
 
 	/**
-	 * The current version of the RSS feed client.
+	 * The current major version of the RSS feed client.
 	 */
-	int CLIENT_VERSION = 0;
+	int MAJOR_VERSION = 0;
 
 	/**
 	 * Adds an RSS feed as a new dedicated blog.
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumManager.java b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumManager.java
index 8eb7eb1ad3504f31b38ccae8228873250574cfe8..0d67a9c4267318e582da8f51cbab1cd2483674b0 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumManager.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumManager.java
@@ -23,9 +23,9 @@ public interface ForumManager {
 	ClientId CLIENT_ID = new ClientId("org.briarproject.briar.forum");
 
 	/**
-	 * The current version of the forum client.
+	 * The current major version of the forum client.
 	 */
-	int CLIENT_VERSION = 0;
+	int MAJOR_VERSION = 0;
 
 	/**
 	 * Subscribes to a forum.
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumSharingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumSharingManager.java
index 5620e024c11f99af1886f0fe51be03ae3a58138a..c021a23a9c9cd9267b9672f6ed5ea08f0b78534a 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumSharingManager.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumSharingManager.java
@@ -11,7 +11,7 @@ public interface ForumSharingManager extends SharingManager<Forum> {
 	ClientId CLIENT_ID = new ClientId("org.briarproject.briar.forum.sharing");
 
 	/**
-	 * The current version of the forum sharing client.
+	 * The current major version of the forum sharing client.
 	 */
-	int CLIENT_VERSION = 0;
+	int MAJOR_VERSION = 0;
 }
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java
index 9a267c5c205304087f62c4add918d73bd1613c2c..c337dd44ca5506581d7f7d1dd589fc7824ddad3c 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java
@@ -21,9 +21,9 @@ public interface IntroductionManager extends ConversationClient {
 	ClientId CLIENT_ID = new ClientId("org.briarproject.briar.introduction");
 
 	/**
-	 * The current version of the introduction client.
+	 * The current major version of the introduction client.
 	 */
-	int CLIENT_VERSION = 1;
+	int MAJOR_VERSION = 1;
 
 	/**
 	 * Returns true if both contacts can be introduced at this moment.
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java
index 65f406a6faa8bb9274110ee54af624136982fff4..be28aaa7bb9a132adc719d7ddf296d2e921acd9f 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java
@@ -19,9 +19,9 @@ public interface MessagingManager extends ConversationClient {
 	ClientId CLIENT_ID = new ClientId("org.briarproject.briar.messaging");
 
 	/**
-	 * The current version of the messaging client.
+	 * The current major version of the messaging client.
 	 */
-	int CLIENT_VERSION = 0;
+	int MAJOR_VERSION = 0;
 
 	/**
 	 * Stores a local private message.
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java
index 7d08ae016dfd8e6be85c03eafe7cd35dbb9f6017..4034c4d613caaaefef477a36c570aff4433aa386 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java
@@ -22,9 +22,9 @@ public interface PrivateGroupManager {
 	ClientId CLIENT_ID = new ClientId("org.briarproject.briar.privategroup");
 
 	/**
-	 * The current version of the private group client.
+	 * The current major version of the private group client.
 	 */
-	int CLIENT_VERSION = 0;
+	int MAJOR_VERSION = 0;
 
 	/**
 	 * Adds a new private group and joins it.
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationManager.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationManager.java
index fc3ca339f30ba6f9c9822dcc9944c6728e3493bf..e510c6dec652f61e3fec30e12559a9458fb5f3e9 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationManager.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationManager.java
@@ -26,9 +26,9 @@ public interface GroupInvitationManager extends ConversationClient {
 			new ClientId("org.briarproject.briar.privategroup.invitation");
 
 	/**
-	 * The current version of the private group invitation client.
+	 * The current major version of the private group invitation client.
 	 */
-	int CLIENT_VERSION = 0;
+	int MAJOR_VERSION = 0;
 
 	/**
 	 * Sends an invitation to share the given private group with the given
diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogFactoryImpl.java
index aecc020f93d868d56bab87ddc3482aa7563aa7e8..ca7887f0d76707b9b7c3fde120bbd71d39a34938 100644
--- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogFactoryImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogFactoryImpl.java
@@ -15,7 +15,7 @@ import javax.inject.Inject;
 
 import static org.briarproject.bramble.util.ValidationUtils.checkSize;
 import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID;
-import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.blog.BlogManager.MAJOR_VERSION;
 
 @Immutable
 @NotNullByDefault
@@ -45,7 +45,7 @@ class BlogFactoryImpl implements BlogFactory {
 		try {
 			BdfList blog = BdfList.of(clientHelper.toList(a), rssFeed);
 			byte[] descriptor = clientHelper.toByteArray(blog);
-			Group g = groupFactory.createGroup(CLIENT_ID, CLIENT_VERSION,
+			Group g = groupFactory.createGroup(CLIENT_ID, MAJOR_VERSION,
 					descriptor);
 			return new Blog(g, a, rssFeed);
 		} catch (FormatException e) {
diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java
index dab2efccb1ac0e8e40fcd47af2fc908da9aa8bde..6a05b9a1542b00d463ddad795f864b97079a2d7e 100644
--- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java
@@ -425,7 +425,7 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager,
 			Collection<Group> groups;
 			Transaction txn = db.startTransaction(true);
 			try {
-				groups = db.getGroups(txn, CLIENT_ID, CLIENT_VERSION);
+				groups = db.getGroups(txn, CLIENT_ID, MAJOR_VERSION);
 				for (Group g : groups) {
 					blogs.add(blogFactory.parseBlog(g));
 				}
diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java
index 54f8b961417240ad9da546ca2f4db915263c4730..dcc829d392c01cbd817a32a658b1dc10298f91ad 100644
--- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java
+++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java
@@ -19,7 +19,7 @@ import dagger.Module;
 import dagger.Provides;
 
 import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID;
-import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.blog.BlogManager.MAJOR_VERSION;
 
 @Module
 public class BlogModule {
@@ -38,7 +38,7 @@ public class BlogModule {
 			ValidationManager validationManager) {
 		lifecycleManager.registerClient(blogManager);
 		contactManager.registerContactHook(blogManager);
-		validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
 				blogManager);
 		return blogManager;
 	}
@@ -64,7 +64,7 @@ public class BlogModule {
 		BlogPostValidator validator = new BlogPostValidator(groupFactory,
 				messageFactory, blogFactory, clientHelper, metadataEncoder,
 				clock);
-		validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
 				validator);
 		return validator;
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogPostValidator.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogPostValidator.java
index 6dc845623967bf04289ba1f7b187bd18bf3c2132..0b53468df84f2c1efab4669b08f8c9c465531925 100644
--- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogPostValidator.java
+++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogPostValidator.java
@@ -42,7 +42,7 @@ import static org.briarproject.briar.api.blog.BlogConstants.KEY_TYPE;
 import static org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_COMMENT_LENGTH;
 import static org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_POST_BODY_LENGTH;
 import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID;
-import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.blog.BlogManager.MAJOR_VERSION;
 import static org.briarproject.briar.api.blog.BlogPostFactory.SIGNING_LABEL_COMMENT;
 import static org.briarproject.briar.api.blog.BlogPostFactory.SIGNING_LABEL_POST;
 import static org.briarproject.briar.api.blog.MessageType.COMMENT;
@@ -195,7 +195,7 @@ class BlogPostValidator extends BdfMessageValidator {
 		checkLength(signature, 1, MAX_SIGNATURE_LENGTH);
 
 		// Get and Validate the Wrapped Message
-		Group wGroup = groupFactory.createGroup(CLIENT_ID, CLIENT_VERSION,
+		Group wGroup = groupFactory.createGroup(CLIENT_ID, MAJOR_VERSION,
 				descriptor);
 		Blog wBlog = blogFactory.parseBlog(wGroup);
 		BdfList wBodyList = BdfList.of(POST.getInt(), content, signature);
@@ -258,7 +258,7 @@ class BlogPostValidator extends BdfMessageValidator {
 		MessageId parentId = new MessageId(parentIdBytes);
 
 		// Get and Validate the Wrapped Comment
-		Group wGroup = groupFactory.createGroup(CLIENT_ID, CLIENT_VERSION,
+		Group wGroup = groupFactory.createGroup(CLIENT_ID, MAJOR_VERSION,
 				descriptor);
 		BdfList wBodyList = BdfList.of(COMMENT.getInt(), comment, pOriginalId,
 				oldId, signature);
diff --git a/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java
index f4d94413d9634fd6861b5799a77e849682c55d99..a4d58d3614a07c8486318e876a176303836b7b37 100644
--- a/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java
@@ -496,7 +496,7 @@ class FeedManagerImpl implements FeedManager, Client, EventListener,
 	}
 
 	private Group getLocalGroup() {
-		return contactGroupFactory.createLocalGroup(CLIENT_ID, CLIENT_VERSION);
+		return contactGroupFactory.createLocalGroup(CLIENT_ID, MAJOR_VERSION);
 	}
 
 }
diff --git a/briar-core/src/main/java/org/briarproject/briar/forum/ForumFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/forum/ForumFactoryImpl.java
index 4588db4c8e185edce9365403e38879f4e24b4414..e49acc5eef62ac7809b2d9a6c1589feb0bdedadf 100644
--- a/briar-core/src/main/java/org/briarproject/briar/forum/ForumFactoryImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/forum/ForumFactoryImpl.java
@@ -18,7 +18,7 @@ import javax.inject.Inject;
 import static org.briarproject.briar.api.forum.ForumConstants.FORUM_SALT_LENGTH;
 import static org.briarproject.briar.api.forum.ForumConstants.MAX_FORUM_NAME_LENGTH;
 import static org.briarproject.briar.api.forum.ForumManager.CLIENT_ID;
-import static org.briarproject.briar.api.forum.ForumManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.forum.ForumManager.MAJOR_VERSION;
 
 @Immutable
 @NotNullByDefault
@@ -52,7 +52,7 @@ class ForumFactoryImpl implements ForumFactory {
 		try {
 			BdfList forum = BdfList.of(name, salt);
 			byte[] descriptor = clientHelper.toByteArray(forum);
-			Group g = groupFactory.createGroup(CLIENT_ID, CLIENT_VERSION,
+			Group g = groupFactory.createGroup(CLIENT_ID, MAJOR_VERSION,
 					descriptor);
 			return new Forum(g, name, salt);
 		} catch (FormatException e) {
diff --git a/briar-core/src/main/java/org/briarproject/briar/forum/ForumManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/forum/ForumManagerImpl.java
index edac994cdad404a3724323e6b583a448cb7ed6d2..3a386420801b0a7645b7cb5d81d9e717bf7cae95 100644
--- a/briar-core/src/main/java/org/briarproject/briar/forum/ForumManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/forum/ForumManagerImpl.java
@@ -188,7 +188,7 @@ class ForumManagerImpl extends BdfIncomingMessageHook implements ForumManager {
 			Collection<Group> groups;
 			Transaction txn = db.startTransaction(true);
 			try {
-				groups = db.getGroups(txn, CLIENT_ID, CLIENT_VERSION);
+				groups = db.getGroups(txn, CLIENT_ID, MAJOR_VERSION);
 				db.commitTransaction(txn);
 			} finally {
 				db.endTransaction(txn);
diff --git a/briar-core/src/main/java/org/briarproject/briar/forum/ForumModule.java b/briar-core/src/main/java/org/briarproject/briar/forum/ForumModule.java
index a6732fadb061a4150efed90a2cbc7001261af2b5..fd1703232b06c5f933683a17895aef72aaa7bc12 100644
--- a/briar-core/src/main/java/org/briarproject/briar/forum/ForumModule.java
+++ b/briar-core/src/main/java/org/briarproject/briar/forum/ForumModule.java
@@ -15,7 +15,7 @@ import dagger.Module;
 import dagger.Provides;
 
 import static org.briarproject.briar.api.forum.ForumManager.CLIENT_ID;
-import static org.briarproject.briar.api.forum.ForumManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.forum.ForumManager.MAJOR_VERSION;
 
 @Module
 public class ForumModule {
@@ -31,7 +31,7 @@ public class ForumModule {
 	@Singleton
 	ForumManager provideForumManager(ForumManagerImpl forumManager,
 			ValidationManager validationManager) {
-		validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
 				forumManager);
 		return forumManager;
 	}
@@ -54,7 +54,7 @@ public class ForumModule {
 			MetadataEncoder metadataEncoder, Clock clock) {
 		ForumPostValidator validator = new ForumPostValidator(clientHelper,
 				metadataEncoder, clock);
-		validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
 				validator);
 		return validator;
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java
index 31273d00a0a76956b24dcda1e12e060bf11eebf8..0725c147e61226dad198160a89da67aef6641685 100644
--- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java
@@ -127,7 +127,7 @@ class IntroductionManagerImpl extends ConversationClientImpl
 		db.addGroup(txn, g);
 		// Apply the client's visibility to the contact group
 		Visibility client = clientVersioningManager.getClientVisibility(txn,
-				c.getId(), CLIENT_ID, CLIENT_VERSION);
+				c.getId(), CLIENT_ID, MAJOR_VERSION);
 		if (LOG.isLoggable(INFO))
 			LOG.info("Applying visibility " + client + " to new contact group");db.setGroupVisibility(txn, c.getId(), g.getId(), client);
 		db.setGroupVisibility(txn, c.getId(), g.getId(), client);
diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java
index f7e55c99ba77d787b6c0d745feb442070833bcc4..1f3c7d7a56ccb5300abd5eff093eb350872c82e5 100644
--- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java
+++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java
@@ -17,7 +17,7 @@ import dagger.Module;
 import dagger.Provides;
 
 import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_ID;
-import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.introduction.IntroductionManager.MAJOR_VERSION;
 
 @Module
 public class IntroductionModule {
@@ -37,7 +37,7 @@ public class IntroductionModule {
 		IntroductionValidator introductionValidator =
 				new IntroductionValidator(messageEncoder, clientHelper,
 						metadataEncoder, clock);
-		validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
 				introductionValidator);
 		return introductionValidator;
 	}
@@ -53,11 +53,11 @@ public class IntroductionModule {
 		lifecycleManager.registerClient(introductionManager);
 		contactManager.registerContactHook(introductionManager);
 		validationManager.registerIncomingMessageHook(CLIENT_ID,
-				CLIENT_VERSION, introductionManager);
+				MAJOR_VERSION, introductionManager);
 		conversationManager.registerConversationClient(introductionManager);
-		clientVersioningManager.registerClient(CLIENT_ID, CLIENT_VERSION);
+		clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION);
 		clientVersioningManager.registerClientVersioningHook(CLIENT_ID,
-				CLIENT_VERSION, introductionManager);
+				MAJOR_VERSION, introductionManager);
 		return introductionManager;
 	}
 
diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java
index 81db870d758b18b5392811e60344579a27e0eb1c..3bbb3f03da6d740843ee5d3a2fe419d1269b9586 100644
--- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java
@@ -65,7 +65,7 @@ class MessagingManagerImpl extends ConversationClientImpl
 	public void createLocalState(Transaction txn) throws DbException {
 		// Create a local group to indicate that we've set this client up
 		Group localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID,
-				CLIENT_VERSION);
+				MAJOR_VERSION);
 		if (db.containsGroup(txn, localGroup.getId())) return;
 		db.addGroup(txn, localGroup);
 		// Set things up for any pre-existing contacts
@@ -80,7 +80,7 @@ class MessagingManagerImpl extends ConversationClientImpl
 		db.addGroup(txn, g);
 		// Apply the client's visibility to the contact group
 		Visibility client = clientVersioningManager.getClientVisibility(txn,
-				c.getId(), CLIENT_ID, CLIENT_VERSION);
+				c.getId(), CLIENT_ID, MAJOR_VERSION);
 		if (LOG.isLoggable(INFO))
 			LOG.info("Applying visibility " + client + " to new contact group");
 		db.setGroupVisibility(txn, c.getId(), g.getId(), client);
@@ -97,7 +97,7 @@ class MessagingManagerImpl extends ConversationClientImpl
 	@Override
 	public Group getContactGroup(Contact c) {
 		return contactGroupFactory.createContactGroup(CLIENT_ID,
-				CLIENT_VERSION, c);
+				MAJOR_VERSION, c);
 	}
 
 	@Override
diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java
index 95c49b41cc0777ab95dbe0e287eed0828c76fc73..0916a942668492ff063bdb9811df7d1e6f40e224 100644
--- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java
+++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java
@@ -18,7 +18,7 @@ import dagger.Module;
 import dagger.Provides;
 
 import static org.briarproject.briar.api.messaging.MessagingManager.CLIENT_ID;
-import static org.briarproject.briar.api.messaging.MessagingManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.messaging.MessagingManager.MAJOR_VERSION;
 
 @Module
 public class MessagingModule {
@@ -45,7 +45,7 @@ public class MessagingModule {
 			Clock clock) {
 		PrivateMessageValidator validator = new PrivateMessageValidator(
 				clientHelper, metadataEncoder, clock);
-		validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
 				validator);
 		return validator;
 	}
@@ -59,12 +59,12 @@ public class MessagingModule {
 			MessagingManagerImpl messagingManager) {
 		lifecycleManager.registerClient(messagingManager);
 		contactManager.registerContactHook(messagingManager);
-		validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
 				messagingManager);
 		conversationManager.registerConversationClient(messagingManager);
-		clientVersioningManager.registerClient(CLIENT_ID, CLIENT_VERSION);
+		clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION);
 		clientVersioningManager.registerClientVersioningHook(CLIENT_ID,
-				CLIENT_VERSION, messagingManager);
+				MAJOR_VERSION, messagingManager);
 		return messagingManager;
 	}
 
diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupFactoryImpl.java
index 4cff80dd94e03c0ddb64071712760fb8f683a485..864ad23aba1d802980e3b8f09b29758a3fe74608 100644
--- a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupFactoryImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupFactoryImpl.java
@@ -21,7 +21,7 @@ import static org.briarproject.bramble.util.ValidationUtils.checkSize;
 import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROUP_SALT_LENGTH;
 import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH;
 import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID;
-import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.privategroup.PrivateGroupManager.MAJOR_VERSION;
 
 @Immutable
 @NotNullByDefault
@@ -57,7 +57,7 @@ class PrivateGroupFactoryImpl implements PrivateGroupFactory {
 			BdfList creatorList = clientHelper.toList(creator);
 			BdfList group = BdfList.of(creatorList, name, salt);
 			byte[] descriptor = clientHelper.toByteArray(group);
-			Group g = groupFactory.createGroup(CLIENT_ID, CLIENT_VERSION,
+			Group g = groupFactory.createGroup(CLIENT_ID, MAJOR_VERSION,
 					descriptor);
 			return new PrivateGroup(g, name, creator, salt);
 		} catch (FormatException e) {
diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java
index 63b6807d174b400b22512fdb530def894721bd69..531282fdf000f129f642a93126b4106b7238fdc6 100644
--- a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java
@@ -271,7 +271,7 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook
 		Collection<Group> groups;
 		Transaction txn = db.startTransaction(true);
 		try {
-			groups = db.getGroups(txn, CLIENT_ID, CLIENT_VERSION);
+			groups = db.getGroups(txn, CLIENT_ID, MAJOR_VERSION);
 			db.commitTransaction(txn);
 		} finally {
 			db.endTransaction(txn);
diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupModule.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupModule.java
index c105df88d953dcaf691e4d408749b7dfd6220c18..61901bc8bc101ae6d3ce8e9cac2d6d37e3e250eb 100644
--- a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupModule.java
+++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupModule.java
@@ -16,7 +16,7 @@ import dagger.Module;
 import dagger.Provides;
 
 import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID;
-import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.privategroup.PrivateGroupManager.MAJOR_VERSION;
 
 @Module
 public class PrivateGroupModule {
@@ -33,7 +33,7 @@ public class PrivateGroupModule {
 	PrivateGroupManager provideGroupManager(
 			PrivateGroupManagerImpl groupManager,
 			ValidationManager validationManager) {
-		validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
 				groupManager);
 		return groupManager;
 	}
@@ -60,7 +60,7 @@ public class PrivateGroupModule {
 		GroupMessageValidator validator = new GroupMessageValidator(
 				privateGroupFactory, clientHelper, metadataEncoder, clock,
 				groupInvitationFactory);
-		validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
 				validator);
 		return validator;
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java
index c37c267251932db3b62f57ef021f300ad7dfbe81..e981610ce5041932ac359b91590cfb3efbfc89d0 100644
--- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java
+++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java
@@ -30,7 +30,7 @@ import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
 
 import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID;
-import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.privategroup.PrivateGroupManager.MAJOR_VERSION;
 import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.GROUP_KEY_CONTACT_ID;
 import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT;
 import static org.briarproject.briar.privategroup.invitation.MessageType.INVITE;
@@ -101,7 +101,7 @@ abstract class AbstractProtocolEngine<S extends Session>
 		// Apply min of preferred visibility and client's visibility
 		ContactId contactId = getContactId(txn, session.getContactGroupId());
 		Visibility client = clientVersioningManager.getClientVisibility(txn,
-				contactId, CLIENT_ID, CLIENT_VERSION);
+				contactId, CLIENT_ID, MAJOR_VERSION);
 		Visibility min = Visibility.min(preferred, client);
 		db.setGroupVisibility(txn, contactId, session.getPrivateGroupId(), min);
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationFactoryImpl.java
index 29ca211f6debe399d920fe954aebc30be956fef1..c8fc2b4ba5c3a6541eeda14286f659393591166e 100644
--- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationFactoryImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationFactoryImpl.java
@@ -17,7 +17,7 @@ import javax.annotation.concurrent.Immutable;
 import javax.inject.Inject;
 
 import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID;
-import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.MAJOR_VERSION;
 
 @Immutable
 @NotNullByDefault
@@ -53,7 +53,7 @@ class GroupInvitationFactoryImpl implements GroupInvitationFactory {
 	public BdfList createInviteToken(AuthorId creatorId, AuthorId memberId,
 			GroupId privateGroupId, long timestamp) {
 		Group contactGroup = contactGroupFactory.createContactGroup(CLIENT_ID,
-				CLIENT_VERSION, creatorId, memberId);
+				MAJOR_VERSION, creatorId, memberId);
 		return BdfList.of(
 				timestamp,
 				contactGroup.getId(),
diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java
index 6275fad7039712b96ea80ab3a5ad6fbd6dbbda4c..58da3f2de3035ff20d3326006782ebf098769091 100644
--- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java
@@ -108,7 +108,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
 	public void createLocalState(Transaction txn) throws DbException {
 		// Create a local group to indicate that we've set this client up
 		Group localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID,
-				CLIENT_VERSION);
+				MAJOR_VERSION);
 		if (db.containsGroup(txn, localGroup.getId())) return;
 		db.addGroup(txn, localGroup);
 		// Set things up for any pre-existing contacts
@@ -122,7 +122,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
 		// Store the group and share it with the contact
 		db.addGroup(txn, g);
 		Visibility client = clientVersioningManager.getClientVisibility(txn,
-				c.getId(), CLIENT_ID, CLIENT_VERSION);
+				c.getId(), CLIENT_ID, MAJOR_VERSION);
 		if (LOG.isLoggable(INFO))
 			LOG.info("Applying visibility " + client + " to new contact group");
 		db.setGroupVisibility(txn, c.getId(), g.getId(), client);
@@ -136,7 +136,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
 		}
 		// If the contact belongs to any private groups, create a peer session
 		for (Group pg : db.getGroups(txn, PrivateGroupManager.CLIENT_ID,
-				PrivateGroupManager.CLIENT_VERSION)) {
+				PrivateGroupManager.MAJOR_VERSION)) {
 			if (privateGroupManager.isMember(txn, pg.getId(), c.getAuthor()))
 				addingMember(txn, pg.getId(), c);
 		}
@@ -151,7 +151,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
 	@Override
 	public Group getContactGroup(Contact c) {
 		return contactGroupFactory.createContactGroup(CLIENT_ID,
-				CLIENT_VERSION, c);
+				MAJOR_VERSION, c);
 	}
 
 	@Override
@@ -599,7 +599,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
 		try {
 			Collection<Group> shareables =
 					db.getGroups(txn, PrivateGroupManager.CLIENT_ID,
-							PrivateGroupManager.CLIENT_VERSION);
+							PrivateGroupManager.MAJOR_VERSION);
 			Map<GroupId, Visibility> m = getPreferredVisibilities(txn, c);
 			for (Group g : shareables) {
 				Visibility preferred = m.get(g.getId());
diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java
index f02287574328dfade4ccf0a23c888ef00d011a1c..f00192af7ed4dfeec03df5b2fdcc922cad735dff 100644
--- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java
+++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java
@@ -20,7 +20,7 @@ import dagger.Module;
 import dagger.Provides;
 
 import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID;
-import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.MAJOR_VERSION;
 
 @Module
 public class GroupInvitationModule {
@@ -42,21 +42,21 @@ public class GroupInvitationModule {
 			ConversationManager conversationManager,
 			ClientVersioningManager clientVersioningManager) {
 		lifecycleManager.registerClient(groupInvitationManager);
-		validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
 				groupInvitationManager);
 		contactManager.registerContactHook(groupInvitationManager);
 		privateGroupManager.registerPrivateGroupHook(groupInvitationManager);
 		conversationManager.registerConversationClient(groupInvitationManager);
-		clientVersioningManager.registerClient(CLIENT_ID, CLIENT_VERSION);
+		clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION);
 		clientVersioningManager.registerClientVersioningHook(CLIENT_ID,
-				CLIENT_VERSION, groupInvitationManager);
+				MAJOR_VERSION, groupInvitationManager);
 		// The group invitation manager handles client visibility changes for
 		// the private group manager
 		clientVersioningManager.registerClient(PrivateGroupManager.CLIENT_ID,
-				PrivateGroupManager.CLIENT_VERSION);
+				PrivateGroupManager.MAJOR_VERSION);
 		clientVersioningManager.registerClientVersioningHook(
 				PrivateGroupManager.CLIENT_ID,
-				PrivateGroupManager.CLIENT_VERSION,
+				PrivateGroupManager.MAJOR_VERSION,
 				groupInvitationManager.getPrivateGroupClientVersioningHook());
 		return groupInvitationManager;
 	}
@@ -71,7 +71,7 @@ public class GroupInvitationModule {
 		GroupInvitationValidator validator = new GroupInvitationValidator(
 				clientHelper, metadataEncoder, clock, privateGroupFactory,
 				messageEncoder);
-		validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION,
+		validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
 				validator);
 		return validator;
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java
index 3ab61521d8342c044b48a83c56438ca1a42afd87..fdc6427f88778285b7ad1b3793ad19c6710ec3a1 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java
@@ -24,7 +24,7 @@ import javax.annotation.concurrent.Immutable;
 import javax.inject.Inject;
 
 import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID;
-import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.blog.BlogManager.MAJOR_VERSION;
 
 @Immutable
 @NotNullByDefault
@@ -42,7 +42,7 @@ class BlogProtocolEngineImpl extends ProtocolEngineImpl<Blog> {
 			InvitationFactory<Blog, BlogInvitationResponse> invitationFactory) {
 		super(db, clientHelper, clientVersioningManager, messageEncoder,
 				messageParser, messageTracker, clock, CLIENT_ID,
-				CLIENT_VERSION);
+				MAJOR_VERSION);
 		this.blogManager = blogManager;
 		this.invitationFactory = invitationFactory;
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java
index 41554bcf4999fa601014b011663b39d814da9ffe..92cd057015b1deac7a547cbaa0c083bcbd04abfb 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java
@@ -55,7 +55,7 @@ class BlogSharingManagerImpl extends SharingManagerImpl<Blog>
 
 	@Override
 	protected int getClientVersion() {
-		return CLIENT_VERSION;
+		return MAJOR_VERSION;
 	}
 
 	@Override
@@ -65,7 +65,7 @@ class BlogSharingManagerImpl extends SharingManagerImpl<Blog>
 
 	@Override
 	protected int getShareableClientVersion() {
-		return BlogManager.CLIENT_VERSION;
+		return BlogManager.MAJOR_VERSION;
 	}
 
 	@Override
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java
index 90ad6888d9bedebc2ddc12ee3c1101479b29d08c..14411b7d0361782406b5c921a897d5b7372a8693 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java
@@ -24,7 +24,7 @@ import javax.annotation.concurrent.Immutable;
 import javax.inject.Inject;
 
 import static org.briarproject.briar.api.forum.ForumManager.CLIENT_ID;
-import static org.briarproject.briar.api.forum.ForumManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.forum.ForumManager.MAJOR_VERSION;
 
 @Immutable
 @NotNullByDefault
@@ -44,7 +44,7 @@ class ForumProtocolEngineImpl extends ProtocolEngineImpl<Forum> {
 			InvitationFactory<Forum, ForumInvitationResponse> invitationFactory) {
 		super(db, clientHelper, clientVersioningManager, messageEncoder,
 				messageParser, messageTracker, clock, CLIENT_ID,
-				CLIENT_VERSION);
+				MAJOR_VERSION);
 		this.forumManager = forumManager;
 		this.invitationFactory = invitationFactory;
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java
index 2f1ac5efbd403b5c16f5feb3b003962348f9d155..9fbe749eadb19a8b050c629aad44d6f08a352225 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java
@@ -43,7 +43,7 @@ class ForumSharingManagerImpl extends SharingManagerImpl<Forum>
 
 	@Override
 	protected int getClientVersion() {
-		return CLIENT_VERSION;
+		return MAJOR_VERSION;
 	}
 
 	@Override
@@ -53,7 +53,7 @@ class ForumSharingManagerImpl extends SharingManagerImpl<Forum>
 
 	@Override
 	protected int getShareableClientVersion() {
-		return ForumManager.CLIENT_VERSION;
+		return ForumManager.MAJOR_VERSION;
 	}
 
 	@Override
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java
index b31bfe68c7ca19bcdc56fab97ab3337dbd4ce10e..921ab756986cd66c8b6c994d163de19cbfe82cbc 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java
@@ -64,7 +64,7 @@ public class SharingModule {
 				messageEncoder, clientHelper, metadataEncoder, clock,
 				blogFactory);
 		validationManager.registerMessageValidator(BlogSharingManager.CLIENT_ID,
-				BlogSharingManager.CLIENT_VERSION, validator);
+				BlogSharingManager.MAJOR_VERSION, validator);
 		return validator;
 	}
 
@@ -79,21 +79,21 @@ public class SharingModule {
 		lifecycleManager.registerClient(blogSharingManager);
 		contactManager.registerContactHook(blogSharingManager);
 		validationManager.registerIncomingMessageHook(
-				BlogSharingManager.CLIENT_ID, BlogSharingManager.CLIENT_VERSION,
+				BlogSharingManager.CLIENT_ID, BlogSharingManager.MAJOR_VERSION,
 				blogSharingManager);
 		conversationManager.registerConversationClient(blogSharingManager);
 		blogManager.registerRemoveBlogHook(blogSharingManager);
 		clientVersioningManager.registerClient(BlogSharingManager.CLIENT_ID,
-				BlogSharingManager.CLIENT_VERSION);
+				BlogSharingManager.MAJOR_VERSION);
 		clientVersioningManager.registerClientVersioningHook(
-				BlogSharingManager.CLIENT_ID, BlogSharingManager.CLIENT_VERSION,
+				BlogSharingManager.CLIENT_ID, BlogSharingManager.MAJOR_VERSION,
 				blogSharingManager);
 		// The blog sharing manager handles client visibility changes for the
 		// blog manager
 		clientVersioningManager.registerClient(BlogManager.CLIENT_ID,
-				BlogManager.CLIENT_VERSION);
+				BlogManager.MAJOR_VERSION);
 		clientVersioningManager.registerClientVersioningHook(
-				BlogManager.CLIENT_ID, BlogManager.CLIENT_VERSION,
+				BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION,
 				blogSharingManager.getShareableClientVersioningHook());
 		return blogSharingManager;
 	}
@@ -127,7 +127,7 @@ public class SharingModule {
 				forumFactory);
 		validationManager.registerMessageValidator(
 				ForumSharingManager.CLIENT_ID,
-				ForumSharingManager.CLIENT_VERSION, validator);
+				ForumSharingManager.MAJOR_VERSION, validator);
 		return validator;
 	}
 
@@ -143,20 +143,20 @@ public class SharingModule {
 		contactManager.registerContactHook(forumSharingManager);
 		validationManager.registerIncomingMessageHook(
 				ForumSharingManager.CLIENT_ID,
-				ForumSharingManager.CLIENT_VERSION, forumSharingManager);
+				ForumSharingManager.MAJOR_VERSION, forumSharingManager);
 		conversationManager.registerConversationClient(forumSharingManager);
 		forumManager.registerRemoveForumHook(forumSharingManager);
 		clientVersioningManager.registerClient(ForumSharingManager.CLIENT_ID,
-				ForumSharingManager.CLIENT_VERSION);
+				ForumSharingManager.MAJOR_VERSION);
 		clientVersioningManager.registerClientVersioningHook(
 				ForumSharingManager.CLIENT_ID,
-				ForumSharingManager.CLIENT_VERSION, forumSharingManager);
+				ForumSharingManager.MAJOR_VERSION, forumSharingManager);
 		// The forum sharing manager handles client visibility changes for the
 		// forum manager
 		clientVersioningManager.registerClient(ForumManager.CLIENT_ID,
-				ForumManager.CLIENT_VERSION);
+				ForumManager.MAJOR_VERSION);
 		clientVersioningManager.registerClientVersioningHook(
-				ForumManager.CLIENT_ID, ForumManager.CLIENT_VERSION,
+				ForumManager.CLIENT_ID, ForumManager.MAJOR_VERSION,
 				forumSharingManager.getShareableClientVersioningHook());
 		return forumSharingManager;
 	}
diff --git a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java
index 3f636748a448b5cf33fd7f713676f0e1a2a707ee..524b7ea39b3909758252bd5595c396b78ba3fa05 100644
--- a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java
@@ -50,7 +50,7 @@ import static org.briarproject.briar.api.blog.BlogConstants.KEY_TIME_RECEIVED;
 import static org.briarproject.briar.api.blog.BlogConstants.KEY_TYPE;
 import static org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_COMMENT_LENGTH;
 import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID;
-import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.blog.BlogManager.MAJOR_VERSION;
 import static org.briarproject.briar.api.blog.MessageType.COMMENT;
 import static org.briarproject.briar.api.blog.MessageType.POST;
 import static org.briarproject.briar.api.blog.MessageType.WRAPPED_COMMENT;
@@ -868,7 +868,7 @@ public class BlogManagerImplTest extends BriarTestCase {
 	}
 
 	private Blog createBlog(LocalAuthor localAuthor, boolean rssFeed) {
-		Group group = getGroup(CLIENT_ID, CLIENT_VERSION);
+		Group group = getGroup(CLIENT_ID, MAJOR_VERSION);
 		return new Blog(group, localAuthor, rssFeed);
 	}
 
diff --git a/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java
index 77290aa7aac9048d67def2b8cc96ac5571d37b80..7d00fb4138d7c4ed580f4459e79cdd4c9f3838ff 100644
--- a/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java
@@ -36,7 +36,7 @@ import static org.briarproject.briar.api.blog.BlogConstants.KEY_PARENT_MSG_ID;
 import static org.briarproject.briar.api.blog.BlogConstants.KEY_READ;
 import static org.briarproject.briar.api.blog.BlogConstants.KEY_RSS_FEED;
 import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID;
-import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.blog.BlogManager.MAJOR_VERSION;
 import static org.briarproject.briar.api.blog.BlogPostFactory.SIGNING_LABEL_COMMENT;
 import static org.briarproject.briar.api.blog.BlogPostFactory.SIGNING_LABEL_POST;
 import static org.briarproject.briar.api.blog.MessageType.COMMENT;
@@ -64,7 +64,7 @@ public class BlogPostValidatorTest extends BriarTestCase {
 	private final String body = getRandomString(42);
 
 	public BlogPostValidatorTest() {
-		group = getGroup(CLIENT_ID, CLIENT_VERSION);
+		group = getGroup(CLIENT_ID, MAJOR_VERSION);
 		descriptor = group.getDescriptor();
 		author = getAuthor();
 		authorList = BdfList.of(
@@ -206,7 +206,7 @@ public class BlogPostValidatorTest extends BriarTestCase {
 		byte[] originalBody = getRandomBytes(42);
 
 		context.checking(new Expectations() {{
-			oneOf(groupFactory).createGroup(CLIENT_ID, CLIENT_VERSION,
+			oneOf(groupFactory).createGroup(CLIENT_ID, MAJOR_VERSION,
 					descriptor);
 			will(returnValue(b.getGroup()));
 			oneOf(blogFactory).parseBlog(b.getGroup());
@@ -250,7 +250,7 @@ public class BlogPostValidatorTest extends BriarTestCase {
 		byte[] originalBody = getRandomBytes(42);
 
 		context.checking(new Expectations() {{
-			oneOf(groupFactory).createGroup(CLIENT_ID, CLIENT_VERSION,
+			oneOf(groupFactory).createGroup(CLIENT_ID, MAJOR_VERSION,
 					descriptor);
 			will(returnValue(blog.getGroup()));
 			oneOf(clientHelper).toByteArray(originalList);
diff --git a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerImplTest.java
index 4074cebe61a0e7c89ec974b3d9b8434210f993d2..4f104feb9b46016c44e344d76267669755657174 100644
--- a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerImplTest.java
@@ -43,7 +43,7 @@ import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
 import static org.briarproject.bramble.test.TestUtils.getRandomId;
 import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEEDS;
 import static org.briarproject.briar.api.feed.FeedManager.CLIENT_ID;
-import static org.briarproject.briar.api.feed.FeedManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.feed.FeedManager.MAJOR_VERSION;
 
 public class FeedManagerImplTest extends BrambleMockTestCase {
 
@@ -61,10 +61,10 @@ public class FeedManagerImplTest extends BrambleMockTestCase {
 	private final Clock clock = context.mock(Clock.class);
 	private final Dns noDnsLookups = context.mock(Dns.class);
 
-	private final Group localGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
+	private final Group localGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
 	private final GroupId localGroupId = localGroup.getId();
 	private final Group blogGroup =
-			getGroup(BlogManager.CLIENT_ID, BlogManager.CLIENT_VERSION);
+			getGroup(BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION);
 	private final GroupId blogGroupId = blogGroup.getId();
 	private final LocalAuthor localAuthor = getLocalAuthor();
 	private final Blog blog = new Blog(blogGroup, localAuthor, true);
@@ -132,7 +132,7 @@ public class FeedManagerImplTest extends BrambleMockTestCase {
 	private void expectGetLocalGroup() {
 		context.checking(new Expectations() {{
 			oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID,
-					CLIENT_VERSION);
+					MAJOR_VERSION);
 			will(returnValue(localGroup));
 		}});
 	}
diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java
index 7441186e8ba3bc017e294bf826ee11bf7596085a..f860e702e0ad032579ef1e528b2377879d8c083d 100644
--- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java
@@ -47,7 +47,7 @@ import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
 import static org.briarproject.bramble.test.TestUtils.getTransportProperties;
 import static org.briarproject.bramble.test.TestUtils.getTransportPropertiesMap;
 import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_ID;
-import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.introduction.IntroductionManager.MAJOR_VERSION;
 import static org.briarproject.briar.introduction.IntroduceeState.AWAIT_RESPONSES;
 import static org.briarproject.briar.introduction.IntroduceeState.LOCAL_DECLINED;
 import static org.briarproject.briar.introduction.IntroducerState.A_DECLINED;
@@ -1284,7 +1284,7 @@ public class IntroductionIntegrationTest
 	}
 
 	private Group getLocalGroup() {
-		return contactGroupFactory.createLocalGroup(CLIENT_ID, CLIENT_VERSION);
+		return contactGroupFactory.createLocalGroup(CLIENT_ID, MAJOR_VERSION);
 	}
 
 }
diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java
index 8c8056512f5f5d406405b9ab5504e3c80b0ac84f..9e014cbab471cb01f8e5a1d71aacc79f480668bd 100644
--- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java
@@ -36,7 +36,7 @@ import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROU
 import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_INVITATION_MSG_LENGTH;
 import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH;
 import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID;
-import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.privategroup.PrivateGroupManager.MAJOR_VERSION;
 import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.GROUP_KEY_CONTACT_ID;
 import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT;
 import static org.briarproject.briar.privategroup.invitation.MessageType.INVITE;
@@ -71,7 +71,7 @@ public abstract class AbstractProtocolEngineTest extends BrambleMockTestCase {
 	protected final Transaction txn = new Transaction(null, false);
 	protected final GroupId contactGroupId = new GroupId(getRandomId());
 	protected final Group privateGroupGroup =
-			getGroup(CLIENT_ID, CLIENT_VERSION);
+			getGroup(CLIENT_ID, MAJOR_VERSION);
 	protected final GroupId privateGroupId = privateGroupGroup.getId();
 	protected final Author author = getAuthor();
 	protected final PrivateGroup privateGroup =
@@ -191,7 +191,7 @@ public abstract class AbstractProtocolEngineTest extends BrambleMockTestCase {
 		expectGetContactId();
 		context.checking(new Expectations() {{
 			oneOf(clientVersioningManager).getClientVisibility(txn, contactId,
-					CLIENT_ID, CLIENT_VERSION);
+					CLIENT_ID, MAJOR_VERSION);
 			will(returnValue(SHARED));
 			oneOf(db).setGroupVisibility(txn, contactId, privateGroupId, v);
 		}});
diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java
index e7db720c76355ff246156d83c65698e66e14c1d9..6792e51e394b98f1efc0845ff50e63374321e122 100644
--- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java
@@ -56,7 +56,7 @@ import static org.briarproject.bramble.util.StringUtils.getRandomString;
 import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROUP_SALT_LENGTH;
 import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH;
 import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID;
-import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.MAJOR_VERSION;
 import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.GROUP_KEY_CONTACT_ID;
 import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT;
 import static org.briarproject.briar.privategroup.invitation.MessageType.INVITE;
@@ -102,9 +102,9 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 	private final Author author = getAuthor();
 	private final Contact contact = new Contact(contactId, author,
 			new AuthorId(getRandomId()), true, true);
-	private final Group localGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
-	private final Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
-	private final Group privateGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
+	private final Group localGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
+	private final Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
+	private final Group privateGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
 	private final BdfDictionary meta = BdfDictionary.of(new BdfEntry("m", "e"));
 	private final Message message =
 			new Message(new MessageId(getRandomId()), contactGroup.getId(),
@@ -154,7 +154,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 	public void testCreateLocalStateFirstTime() throws Exception {
 		context.checking(new Expectations() {{
 			oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID,
-					CLIENT_VERSION);
+					MAJOR_VERSION);
 			will(returnValue(localGroup));
 			oneOf(db).containsGroup(txn, localGroup.getId());
 			will(returnValue(false));
@@ -170,7 +170,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 	public void testCreateLocalStateSubsequentTime() throws Exception {
 		context.checking(new Expectations() {{
 			oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID,
-					CLIENT_VERSION);
+					MAJOR_VERSION);
 			will(returnValue(localGroup));
 			oneOf(db).containsGroup(txn, localGroup.getId());
 			will(returnValue(true));
@@ -184,18 +184,18 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 
 		context.checking(new Expectations() {{
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, c);
+					MAJOR_VERSION, c);
 			will(returnValue(contactGroup));
 			oneOf(db).addGroup(txn, contactGroup);
 			oneOf(clientVersioningManager).getClientVisibility(txn, contactId,
-					CLIENT_ID, CLIENT_VERSION);
+					CLIENT_ID, MAJOR_VERSION);
 			will(returnValue(SHARED));
 			oneOf(db).setGroupVisibility(txn, c.getId(), contactGroup.getId(),
 					SHARED);
 			oneOf(clientHelper)
 					.mergeGroupMetadata(txn, contactGroup.getId(), meta);
 			oneOf(db).getGroups(txn, PrivateGroupManager.CLIENT_ID,
-					PrivateGroupManager.CLIENT_VERSION);
+					PrivateGroupManager.MAJOR_VERSION);
 			will(returnValue(Collections.singletonList(privateGroup)));
 			oneOf(privateGroupManager).isMember(txn, privateGroup.getId(),
 					c.getAuthor());
@@ -207,7 +207,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 	private void expectAddingMember(GroupId g, Contact c) throws Exception {
 		context.checking(new Expectations() {{
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, c);
+					MAJOR_VERSION, c);
 			will(returnValue(contactGroup));
 		}});
 		expectGetSession(noResults, new SessionId(g.getBytes()),
@@ -263,7 +263,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 	public void testRemovingContact() throws Exception {
 		context.checking(new Expectations() {{
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(db).removeGroup(txn, contactGroup);
 		}});
@@ -478,7 +478,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContact(txn, contactId);
 			will(returnValue(contact));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 		}});
 		expectCreateStorageId();
@@ -510,7 +510,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContact(txn, contactId);
 			will(returnValue(contact));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(sessionParser)
 					.parseCreatorSession(contactGroup.getId(), bdfSession);
@@ -539,7 +539,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContact(txn, contactId);
 			will(returnValue(contact));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(db).endTransaction(txn);
 		}});
@@ -591,7 +591,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContact(txn, contactId);
 			will(returnValue(contact));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(sessionParser)
 					.parseInviteeSession(contactGroup.getId(), bdfSession);
@@ -613,7 +613,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContact(txn, contactId);
 			will(returnValue(contact));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(sessionParser)
 					.parsePeerSession(contactGroup.getId(), bdfSession);
@@ -638,7 +638,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContact(txn, contactId);
 			will(returnValue(contact));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(db).endTransaction(txn);
 		}});
@@ -677,7 +677,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContact(txn, contactId);
 			will(returnValue(contact));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(messageParser).getMessagesVisibleInUiQuery();
 			will(returnValue(query));
@@ -754,7 +754,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContacts(txn);
 			will(returnValue(Collections.singletonList(contact)));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(clientHelper).getMessageMetadataAsDictionary(txn,
 					contactGroup.getId(), query);
@@ -822,7 +822,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 		expectGetSession(oneResult, sessionId, contactGroup.getId());
 		context.checking(new Expectations() {{
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(db).startTransaction(true);
 			will(returnValue(txn));
@@ -855,8 +855,8 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 		Collection<Contact> contacts =
 				Arrays.asList(contact, contact2, contact3);
 
-		Group contactGroup2 = getGroup(CLIENT_ID, CLIENT_VERSION);
-		Group contactGroup3 = getGroup(CLIENT_ID, CLIENT_VERSION);
+		Group contactGroup2 = getGroup(CLIENT_ID, MAJOR_VERSION);
+		Group contactGroup3 = getGroup(CLIENT_ID, MAJOR_VERSION);
 
 		MessageId storageId2 = new MessageId(getRandomId());
 		MessageId storageId3 = new MessageId(getRandomId());
@@ -875,13 +875,13 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContacts(txn);
 			will(returnValue(contacts));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact2);
+					MAJOR_VERSION, contact2);
 			will(returnValue(contactGroup2));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact3);
+					MAJOR_VERSION, contact3);
 			will(returnValue(contactGroup3));
 			// session 1
 			oneOf(sessionParser).getRole(bdfSession);
diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java
index 37bbe16e19261f980bee6d036b07a0f50254e2c6..1fbc64387bb0bca36ed5819ec69d683286a634c8 100644
--- a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java
@@ -32,7 +32,7 @@ import java.util.Collection;
 import java.util.List;
 
 import static org.briarproject.briar.api.blog.BlogSharingManager.CLIENT_ID;
-import static org.briarproject.briar.api.blog.BlogSharingManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.blog.BlogSharingManager.MAJOR_VERSION;
 import static org.briarproject.briar.test.BriarTestUtils.assertGroupCount;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -126,7 +126,7 @@ public class BlogSharingIntegrationTest
 
 		// get sharing group and assert group message count
 		GroupId g = contactGroupFactory.createContactGroup(CLIENT_ID,
-				CLIENT_VERSION, contact1From0).getId();
+				MAJOR_VERSION, contact1From0).getId();
 		assertGroupCount(messageTracker0, g, 1, 0);
 
 		// sync first request message
@@ -201,7 +201,7 @@ public class BlogSharingIntegrationTest
 
 		// get sharing group and assert group message count
 		GroupId g = contactGroupFactory.createContactGroup(CLIENT_ID,
-				CLIENT_VERSION, contact1From0).getId();
+				MAJOR_VERSION, contact1From0).getId();
 		assertGroupCount(messageTracker0, g, 1, 0);
 
 		// sync first request message
diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java
index 5b109533c9545aff783accf1e242dc52146c3a65..10a8f5fc5a1addcf2f86514ceb34d3238051bca4 100644
--- a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java
@@ -39,7 +39,7 @@ import static org.briarproject.bramble.test.TestUtils.getLocalAuthor;
 import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
 import static org.briarproject.bramble.test.TestUtils.getRandomId;
 import static org.briarproject.briar.api.blog.BlogSharingManager.CLIENT_ID;
-import static org.briarproject.briar.api.blog.BlogSharingManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.blog.BlogSharingManager.MAJOR_VERSION;
 import static org.briarproject.briar.sharing.SharingConstants.GROUP_KEY_CONTACT_ID;
 
 public class BlogSharingManagerImplTest extends BrambleMockTestCase {
@@ -66,13 +66,13 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase {
 			new Contact(contactId, author, localAuthor.getId(), true, true);
 	private final Collection<Contact> contacts =
 			Collections.singletonList(contact);
-	private final Group localGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
-	private final Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
+	private final Group localGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
+	private final Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
 	private final Group blogGroup =
-			getGroup(BlogManager.CLIENT_ID, BlogManager.CLIENT_VERSION);
+			getGroup(BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION);
 	private final Blog blog = new Blog(blogGroup, author, false);
 	private final Group localBlogGroup =
-			getGroup(BlogManager.CLIENT_ID, BlogManager.CLIENT_VERSION);
+			getGroup(BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION);
 	private final Blog localBlog = new Blog(localBlogGroup, localAuthor, false);
 	@SuppressWarnings("unchecked")
 	private final ProtocolEngine<Blog> engine =
@@ -100,7 +100,7 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase {
 		context.checking(new Expectations() {{
 			// The local group doesn't exist - we need to set things up
 			oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID,
-					CLIENT_VERSION);
+					MAJOR_VERSION);
 			will(returnValue(localGroup));
 			oneOf(db).containsGroup(txn, localGroup.getId());
 			will(returnValue(false));
@@ -123,11 +123,11 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase {
 		context.checking(new Expectations() {{
 			// Create the contact group and share it with the contact
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(db).addGroup(txn, contactGroup);
 			oneOf(clientVersioningManager).getClientVisibility(txn, contactId,
-					CLIENT_ID, CLIENT_VERSION);
+					CLIENT_ID, MAJOR_VERSION);
 			will(returnValue(SHARED));
 			oneOf(db).setGroupVisibility(txn, contactId, contactGroup.getId(),
 					SHARED);
@@ -154,7 +154,7 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase {
 		context.checking(new Expectations() {{
 			// The local group exists - everything has been set up
 			oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID,
-					CLIENT_VERSION);
+					MAJOR_VERSION);
 			will(returnValue(localGroup));
 			oneOf(db).containsGroup(txn, localGroup.getId());
 			will(returnValue(true));
@@ -196,13 +196,13 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase {
 	private void expectPreShareShareable(Transaction txn, Contact contact,
 			Blog blog, Map<MessageId, BdfDictionary> sessions)
 			throws Exception {
-		Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION);
+		Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
 		BdfDictionary sessionDict = new BdfDictionary();
 		Message message = new Message(new MessageId(getRandomId()),
 				contactGroup.getId(), 42L, getRandomBytes(1337));
 		context.checking(new Expectations() {{
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(sessionParser)
 					.getSessionQuery(new SessionId(blog.getId().getBytes()));
@@ -214,7 +214,7 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase {
 				oneOf(db).addGroup(txn, blog.getGroup());
 				oneOf(clientVersioningManager).getClientVisibility(txn,
 						contactId, BlogManager.CLIENT_ID,
-						BlogManager.CLIENT_VERSION);
+						BlogManager.MAJOR_VERSION);
 				will(returnValue(SHARED));
 				oneOf(db).setGroupVisibility(txn, contact.getId(),
 						blog.getGroup().getId(), SHARED);
@@ -240,7 +240,7 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase {
 			oneOf(db).getContacts(txn);
 			will(returnValue(contacts));
 			oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
-					CLIENT_VERSION, contact);
+					MAJOR_VERSION, contact);
 			will(returnValue(contactGroup));
 			oneOf(sessionParser)
 					.getSessionQuery(new SessionId(blog.getId().getBytes()));
diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java
index bbc83660a006de207252894a6088eb52cd373308..2683ea715bdf6e17aefdfe72ad2c95cb1d7ae41d 100644
--- a/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java
@@ -39,7 +39,7 @@ import java.util.List;
 import static junit.framework.Assert.assertNotNull;
 import static org.briarproject.bramble.util.StringUtils.getRandomString;
 import static org.briarproject.briar.api.forum.ForumSharingManager.CLIENT_ID;
-import static org.briarproject.briar.api.forum.ForumSharingManager.CLIENT_VERSION;
+import static org.briarproject.briar.api.forum.ForumSharingManager.MAJOR_VERSION;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -402,7 +402,7 @@ public class ForumSharingIntegrationTest
 
 		// response and invitation got tracked
 		Group group = contactGroupFactory.createContactGroup(CLIENT_ID,
-				CLIENT_VERSION, contact0From1);
+				MAJOR_VERSION, contact0From1);
 		assertEquals(2, c1.getMessageTracker().getGroupCount(group.getId())
 				.getMsgCount());
 
@@ -434,7 +434,7 @@ public class ForumSharingIntegrationTest
 
 		// assert that the invitation arrived
 		Group group = contactGroupFactory.createContactGroup(CLIENT_ID,
-				CLIENT_VERSION, contact0From1);
+				MAJOR_VERSION, contact0From1);
 		assertEquals(1, c1.getMessageTracker().getGroupCount(group.getId())
 				.getMsgCount());