diff --git a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java
index 2e3e19442773f4239413447da75a8cf605a52ac7..1d0a7d70f348b403f8c5712a265385ae706a3483 100644
--- a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java
+++ b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java
@@ -14,6 +14,7 @@ import org.briarproject.api.sync.PacketWriterFactory;
 import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamReaderFactory;
 import org.briarproject.api.transport.StreamWriterFactory;
+import org.briarproject.clients.ClientsModule;
 import org.briarproject.contact.ContactModule;
 import org.briarproject.crypto.CryptoModule;
 import org.briarproject.data.DataModule;
@@ -33,7 +34,7 @@ import dagger.Component;
 		LifecycleModule.class, ContactModule.class, CryptoModule.class,
 		DatabaseModule.class, EventModule.class, SyncModule.class,
 		DataModule.class, TransportModule.class, IdentityModule.class,
-		MessagingModule.class})
+		MessagingModule.class, ClientsModule.class})
 public interface SimplexMessagingComponent {
 	void inject(SimplexMessagingIntegrationTest testCase);
 	LifecycleManager getLifeCycleManager();
diff --git a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java
index dbc1b6a4f35d32d2b16dc2d6e6ba6a22706954ad..d8eefc25b3c388b49aca08f53b5ffafc7f5efb6c 100644
--- a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java
+++ b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java
@@ -1,6 +1,7 @@
 package org.briarproject.sync;
 
 import org.briarproject.BriarTestCase;
+import org.briarproject.ImmediateExecutor;
 import org.briarproject.TestDatabaseModule;
 import org.briarproject.TestUtils;
 import org.briarproject.api.TransportId;
@@ -8,7 +9,7 @@ import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.crypto.SecretKey;
 import org.briarproject.api.db.DatabaseComponent;
-import org.briarproject.api.db.StorageStatus;
+import org.briarproject.api.db.Transaction;
 import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.EventListener;
@@ -31,7 +32,6 @@ import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamContext;
 import org.briarproject.api.transport.StreamReaderFactory;
 import org.briarproject.api.transport.StreamWriterFactory;
-import org.briarproject.plugins.ImmediateExecutor;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -79,6 +79,140 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
 		read(write());
 	}
 
+	private byte[] write() throws Exception {
+		// Instantiate Alice's services
+		LifecycleManager lifecycleManager = alice.getLifeCycleManager();
+		DatabaseComponent db = alice.getDatabaseComponent();
+		IdentityManager identityManager = alice.getIdentityManager();
+		ContactManager contactManager = alice.getContactManager();
+		MessagingManager messagingManager = alice.getMessagingManager();
+		KeyManager keyManager = alice.getKeyManager();
+		PrivateMessageFactory privateMessageFactory =
+				alice.getPrivateMessageFactory();
+		PacketWriterFactory packetWriterFactory =
+				alice.getPacketWriterFactory();
+		EventBus eventBus = alice.getEventBus();
+		StreamWriterFactory streamWriterFactory =
+				alice.getStreamWriterFactory();
+
+		// Start the lifecycle manager
+		lifecycleManager.startServices();
+		lifecycleManager.waitForStartup();
+		// Add a transport
+		Transaction txn = db.startTransaction();
+		try {
+			db.addTransport(txn, transportId, MAX_LATENCY);
+			txn.setComplete();
+		} finally {
+			db.endTransaction(txn);
+		}
+		// Add an identity for Alice
+		LocalAuthor aliceAuthor = new LocalAuthor(aliceId, "Alice",
+				new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp);
+		identityManager.addLocalAuthor(aliceAuthor);
+		// Add Bob as a contact
+		Author bobAuthor = new Author(bobId, "Bob",
+				new byte[MAX_PUBLIC_KEY_LENGTH]);
+		ContactId contactId = contactManager.addContact(bobAuthor, aliceId,
+				master, timestamp, true, true);
+
+		// Send Bob a message
+		GroupId groupId = messagingManager.getConversationId(contactId);
+		byte[] body = "Hi Bob!".getBytes("UTF-8");
+		PrivateMessage message = privateMessageFactory.createPrivateMessage(
+				groupId, timestamp, null, "text/plain", body);
+		messagingManager.addLocalMessage(message);
+		// Get a stream context
+		StreamContext ctx = keyManager.getStreamContext(contactId, transportId);
+		assertNotNull(ctx);
+		// Create a stream writer
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		OutputStream streamWriter = streamWriterFactory.createStreamWriter(
+				out, ctx);
+		// Create an outgoing sync session
+		PacketWriter packetWriter = packetWriterFactory.createPacketWriter(
+				streamWriter);
+		SyncSession session = new SimplexOutgoingSession(db,
+				new ImmediateExecutor(), eventBus, contactId, transportId,
+				MAX_LATENCY, packetWriter);
+		// Write whatever needs to be written
+		session.run();
+		streamWriter.close();
+
+		// Clean up
+		lifecycleManager.stopServices();
+		lifecycleManager.waitForShutdown();
+
+		// Return the contents of the stream
+		return out.toByteArray();
+	}
+
+	private void read(byte[] stream) throws Exception {
+		// Instantiate Bob's services
+		LifecycleManager lifecycleManager = bob.getLifeCycleManager();
+		DatabaseComponent db = bob.getDatabaseComponent();
+		IdentityManager identityManager = bob.getIdentityManager();
+		ContactManager contactManager = bob.getContactManager();
+		KeyManager keyManager = bob.getKeyManager();
+		StreamReaderFactory streamReaderFactory = bob.getStreamReaderFactory();
+		PacketReaderFactory packetReaderFactory = bob.getPacketReaderFactory();
+		EventBus eventBus = bob.getEventBus();
+		// Bob needs a MessagingManager even though we're not using it directly
+		bob.getMessagingManager();
+
+		// Start the lifecyle manager
+		lifecycleManager.startServices();
+		lifecycleManager.waitForStartup();
+		// Add a transport
+		Transaction txn = db.startTransaction();
+		try {
+			db.addTransport(txn, transportId, MAX_LATENCY);
+			txn.setComplete();
+		} finally {
+			db.endTransaction(txn);
+		}
+		// Add an identity for Bob
+		LocalAuthor bobAuthor = new LocalAuthor(bobId, "Bob",
+				new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp);
+		identityManager.addLocalAuthor(bobAuthor);
+		// Add Alice as a contact
+		Author aliceAuthor = new Author(aliceId, "Alice",
+				new byte[MAX_PUBLIC_KEY_LENGTH]);
+		ContactId contactId = contactManager.addContact(aliceAuthor, bobId,
+				master, timestamp, false, true);
+
+		// Set up an event listener
+		MessageListener listener = new MessageListener();
+		bob.getEventBus().addListener(listener);
+		// Read and recognise the tag
+		ByteArrayInputStream in = new ByteArrayInputStream(stream);
+		byte[] tag = new byte[TAG_LENGTH];
+		int read = in.read(tag);
+		assertEquals(tag.length, read);
+		StreamContext ctx = keyManager.getStreamContext(transportId, tag);
+		assertNotNull(ctx);
+		// Create a stream reader
+		InputStream streamReader = streamReaderFactory.createStreamReader(
+				in, ctx);
+		// Create an incoming sync session
+		PacketReader packetReader = packetReaderFactory.createPacketReader(
+				streamReader);
+		SyncSession session = new IncomingSession(db, new ImmediateExecutor(),
+				eventBus, contactId, transportId, packetReader);
+		// No messages should have been added yet
+		assertFalse(listener.messageAdded);
+		// Read whatever needs to be read
+		session.run();
+		streamReader.close();
+		// The private message from Alice should have been added
+		assertTrue(listener.messageAdded);
+
+		// Clean up
+		lifecycleManager.stopServices();
+		lifecycleManager.waitForShutdown();
+	}
+
+	/*
 	private byte[] write() throws Exception {
 		// Instantiate Alice's services
 		LifecycleManager lifecycleManager = alice.getLifeCycleManager();
@@ -201,6 +335,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
 		lifecycleManager.stopServices();
 		lifecycleManager.waitForShutdown();
 	}
+	*/
 
 	@After
 	public void tearDown() {
diff --git a/briar-android/res/values/roboguice.xml b/briar-android/res/values/roboguice.xml
deleted file mode 100644
index 60265f1c219178cfa4cab1e9b272a8775ac9a0bb..0000000000000000000000000000000000000000
--- a/briar-android/res/values/roboguice.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-	<string-array name="roboguice_modules">
-		<item>org.briarproject.android.AndroidModule</item>
-		<item>org.briarproject.clients.ClientsModule</item>
-		<item>org.briarproject.contact.ContactModule</item>
-		<item>org.briarproject.crypto.CryptoModule</item>
-		<item>org.briarproject.data.DataModule</item>
-		<item>org.briarproject.db.DatabaseModule</item>
-		<item>org.briarproject.event.EventModule</item>
-		<item>org.briarproject.forum.ForumModule</item>
-		<item>org.briarproject.identity.IdentityModule</item>
-		<item>org.briarproject.invitation.InvitationModule</item>
-		<item>org.briarproject.lifecycle.LifecycleModule</item>
-		<item>org.briarproject.messaging.MessagingModule</item>
-		<item>org.briarproject.plugins.AndroidPluginsModule</item>
-		<item>org.briarproject.properties.PropertiesModule</item>
-		<item>org.briarproject.sync.SyncModule</item>
-		<item>org.briarproject.system.AndroidSystemModule</item>
-		<item>org.briarproject.transport.TransportModule</item>
-		<item>org.briarproject.settings.SettingsModule</item>
-	</string-array>
-</resources>
diff --git a/briar-android/src/org/briarproject/android/AndroidComponent.java b/briar-android/src/org/briarproject/android/AndroidComponent.java
index e360a10ec02d376f2ae705684def790c11ead76f..caf43416ae358fb2699326bae7b3e4c71fff8854 100644
--- a/briar-android/src/org/briarproject/android/AndroidComponent.java
+++ b/briar-android/src/org/briarproject/android/AndroidComponent.java
@@ -14,6 +14,7 @@ import org.briarproject.android.identity.CreateIdentityActivity;
 import org.briarproject.android.invitation.AddContactActivity;
 import org.briarproject.android.panic.PanicPreferencesActivity;
 import org.briarproject.android.panic.PanicResponderActivity;
+import org.briarproject.clients.ClientsModule;
 import org.briarproject.contact.ContactModule;
 import org.briarproject.crypto.CryptoModule;
 import org.briarproject.data.DataModule;
@@ -44,7 +45,7 @@ import dagger.Component;
 				EventModule.class, DataModule.class, ContactModule.class,
 				AndroidSystemModule.class, AndroidPluginsModule.class,
 				PropertiesModule.class, TransportModule.class, SyncModule.class,
-				SettingsModule.class})
+				SettingsModule.class, ClientsModule.class})
 public interface AndroidComponent {
 	void inject(SplashScreenActivity activity);
 	void inject(SetupActivity activity);
diff --git a/briar-core/src/org/briarproject/clients/ClientHelperImpl.java b/briar-core/src/org/briarproject/clients/ClientHelperImpl.java
index 65740a391c13e21461a2251dbfd5fe648302dead..40640c17ab397c780f6cd97ad0253ec3af946009 100644
--- a/briar-core/src/org/briarproject/clients/ClientHelperImpl.java
+++ b/briar-core/src/org/briarproject/clients/ClientHelperImpl.java
@@ -1,7 +1,5 @@
 package org.briarproject.clients;
 
-import com.google.inject.Inject;
-
 import org.briarproject.api.FormatException;
 import org.briarproject.api.clients.ClientHelper;
 import org.briarproject.api.data.BdfDictionary;
@@ -30,6 +28,8 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import javax.inject.Inject;
+
 import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH;
 
 class ClientHelperImpl implements ClientHelper {
diff --git a/briar-core/src/org/briarproject/clients/ClientsModule.java b/briar-core/src/org/briarproject/clients/ClientsModule.java
index b4c1a306cee9f43240883584eae7144ed906f365..10bcbc3c7101a66fc4f6f14f21fcdc20cf912cce 100644
--- a/briar-core/src/org/briarproject/clients/ClientsModule.java
+++ b/briar-core/src/org/briarproject/clients/ClientsModule.java
@@ -1,19 +1,36 @@
 package org.briarproject.clients;
 
-import com.google.inject.AbstractModule;
-
 import org.briarproject.api.clients.ClientHelper;
-import org.briarproject.api.clients.MessageQueueManager;
 import org.briarproject.api.clients.PrivateGroupFactory;
-import org.briarproject.api.clients.QueueMessageFactory;
+import org.briarproject.api.data.BdfReaderFactory;
+import org.briarproject.api.data.BdfWriterFactory;
+import org.briarproject.api.data.MetadataEncoder;
+import org.briarproject.api.data.MetadataParser;
+import org.briarproject.api.db.DatabaseComponent;
+import org.briarproject.api.sync.GroupFactory;
+import org.briarproject.api.sync.MessageFactory;
 
-public class ClientsModule extends AbstractModule {
+import dagger.Module;
+import dagger.Provides;
 
-	@Override
-	protected void configure() {
-		bind(ClientHelper.class).to(ClientHelperImpl.class);
-		bind(MessageQueueManager.class).to(MessageQueueManagerImpl.class);
-		bind(PrivateGroupFactory.class).to(PrivateGroupFactoryImpl.class);
-		bind(QueueMessageFactory.class).to(QueueMessageFactoryImpl.class);
+@Module
+public class ClientsModule {
+
+	@Provides
+	ClientHelper provideClientHelper(DatabaseComponent db,
+			MessageFactory messageFactory, BdfReaderFactory bdfReaderFactory,
+			BdfWriterFactory bdfWriterFactory, MetadataParser metadataParser,
+			MetadataEncoder metadataEncoder) {
+		return new ClientHelperImpl(db, messageFactory, bdfReaderFactory,
+				bdfWriterFactory, metadataParser, metadataEncoder);
+	}
+
+	@Provides
+	PrivateGroupFactory providePrivateGroupFactory(GroupFactory groupFactory,
+			BdfWriterFactory bdfWriterFactory) {
+		return new PrivateGroupFactoryImpl(groupFactory, bdfWriterFactory);
 	}
+
+		bind(QueueMessageFactory.class).to(QueueMessageFactoryImpl.class);
+
 }
diff --git a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java
index 83de8540da507d3b8ee0374dc2cfb528664d3cb3..df75b73e1a17fbce161b1c527086dd2808233710 100644
--- a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java
+++ b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java
@@ -19,22 +19,9 @@ import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-<<<<<<< 08099714bab27d1ed48a8bee431a35a38098ecec
-class ContactManagerImpl implements ContactManager, RemoveIdentityHook {
-=======
 import javax.inject.Inject;
 
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.api.db.StorageStatus.ACTIVE;
-import static org.briarproject.api.db.StorageStatus.ADDING;
-import static org.briarproject.api.db.StorageStatus.REMOVING;
-
-class ContactManagerImpl implements ContactManager, Service,
-		RemoveIdentityHook {
-
-	private static final Logger LOG =
-			Logger.getLogger(ContactManagerImpl.class.getName());
->>>>>>> Switched Roboguice/Guice out for Dagger 2
+class ContactManagerImpl implements ContactManager, RemoveIdentityHook {
 
 	private final DatabaseComponent db;
 	private final KeyManager keyManager;
diff --git a/briar-core/src/org/briarproject/contact/ContactModule.java b/briar-core/src/org/briarproject/contact/ContactModule.java
index 55bb854b3374e746b2d2819f03e794031ba934ad..f2009be57d6d1421ab1c8bbe325c5d41678ccb0e 100644
--- a/briar-core/src/org/briarproject/contact/ContactModule.java
+++ b/briar-core/src/org/briarproject/contact/ContactModule.java
@@ -17,7 +17,6 @@ public class ContactModule {
 	ContactManager getContactManager(LifecycleManager lifecycleManager,
 			IdentityManager identityManager,
 			ContactManagerImpl contactManager) {
-		lifecycleManager.register(contactManager);
 		identityManager.registerRemoveIdentityHook(contactManager);
 		return contactManager;
 	}
diff --git a/briar-core/src/org/briarproject/forum/ForumModule.java b/briar-core/src/org/briarproject/forum/ForumModule.java
index e58b7e2a0114516bc10f187d9e19d7599680074d..5712c165eb2158377dfc0d46e8439ad54d4ed508 100644
--- a/briar-core/src/org/briarproject/forum/ForumModule.java
+++ b/briar-core/src/org/briarproject/forum/ForumModule.java
@@ -27,11 +27,10 @@ public class ForumModule {
 	@Provides
 	@Singleton
 	ForumManager provideForumManager(DatabaseComponent db,
-			ContactManager contactManager,
-			BdfReaderFactory bdfReaderFactory, MetadataEncoder metadataEncoder,
-			MetadataParser metadataParser) {
-		return new ForumManagerImpl(db, contactManager, bdfReaderFactory,
-				metadataEncoder, metadataParser);
+			ContactManager contactManager, BdfReaderFactory bdfReaderFactory,
+			MetadataEncoder metadataEncoder, MetadataParser metadataParser) {
+		return new ForumManagerImpl(db, bdfReaderFactory, metadataEncoder,
+				metadataParser);
 	}
 
 	@Provides
diff --git a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java
index c916a54e6675f8190935a3626e88b15009e5f74e..b0e8fd486f810180ea15631ba8d2eb57135db72b 100644
--- a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java
+++ b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java
@@ -37,12 +37,8 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
-<<<<<<< 08099714bab27d1ed48a8bee431a35a38098ecec
-=======
 import javax.inject.Inject;
 
-import static java.util.logging.Level.WARNING;
->>>>>>> Switched Roboguice/Guice out for Dagger 2
 import static org.briarproject.api.forum.ForumConstants.FORUM_SALT_LENGTH;
 import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_NAME_LENGTH;
 import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH;
diff --git a/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java b/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java
index a35a85f6d69780e8fb9464e29fb18cf40387555c..997456d2941dad65c40509e8507dc0eb9a5ca06e 100644
--- a/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java
+++ b/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java
@@ -11,22 +11,9 @@ import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-<<<<<<< 08099714bab27d1ed48a8bee431a35a38098ecec
-class IdentityManagerImpl implements IdentityManager {
-=======
 import javax.inject.Inject;
 
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.api.db.StorageStatus.ACTIVE;
-import static org.briarproject.api.db.StorageStatus.ADDING;
-import static org.briarproject.api.db.StorageStatus.REMOVING;
-
-class IdentityManagerImpl implements IdentityManager, Service {
-
-	private static final Logger LOG =
-			Logger.getLogger(IdentityManagerImpl.class.getName());
->>>>>>> Switched Roboguice/Guice out for Dagger 2
-
+class IdentityManagerImpl implements IdentityManager {
 	private final DatabaseComponent db;
 	private final List<AddIdentityHook> addHooks;
 	private final List<RemoveIdentityHook> removeHooks;
diff --git a/briar-core/src/org/briarproject/identity/IdentityModule.java b/briar-core/src/org/briarproject/identity/IdentityModule.java
index 78d2b776c8802df999e79feb6d16b56fe744e8be..99e8eeb0f15d7e0e862c240124801cc230941db6 100644
--- a/briar-core/src/org/briarproject/identity/IdentityModule.java
+++ b/briar-core/src/org/briarproject/identity/IdentityModule.java
@@ -1,8 +1,14 @@
 package org.briarproject.identity;
 
+import org.briarproject.api.crypto.CryptoComponent;
+import org.briarproject.api.data.BdfWriterFactory;
+import org.briarproject.api.data.ObjectReader;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.event.EventBus;
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.identity.AuthorFactory;
 import org.briarproject.api.identity.IdentityManager;
+import org.briarproject.api.system.Clock;
 
 import javax.inject.Singleton;
 
@@ -13,8 +19,18 @@ import dagger.Provides;
 public class IdentityModule {
 
 	@Provides
-	@Singleton
-	IdentityManager provideIdendityModule(DatabaseComponent db, EventBus eventBus) {
-		return new IdentityManagerImpl(db, eventBus);
+	AuthorFactory provideAuthorFactory(CryptoComponent crypto,
+			BdfWriterFactory bdfWriterFactory, Clock clock) {
+		return new AuthorFactoryImpl(crypto, bdfWriterFactory, clock);
+	}
+
+	@Provides
+	IdentityManager provideIdendityModule(DatabaseComponent db) {
+		return new IdentityManagerImpl(db);
+	}
+
+	@Provides
+	ObjectReader<Author> provideAuthorReader(AuthorFactory authorFactory) {
+		return new AuthorReader(authorFactory);
 	}
 }
diff --git a/briar-core/src/org/briarproject/invitation/InvitationModule.java b/briar-core/src/org/briarproject/invitation/InvitationModule.java
index de6d8bde2599ffac19ea0628518f41258fa46389..1a604c9e6b89aebf1d75e69807bdbd859b8aaa11 100644
--- a/briar-core/src/org/briarproject/invitation/InvitationModule.java
+++ b/briar-core/src/org/briarproject/invitation/InvitationModule.java
@@ -30,13 +30,12 @@ public class InvitationModule {
 			BdfWriterFactory bdfWriterFactory,
 			StreamReaderFactory streamReaderFactory,
 			StreamWriterFactory streamWriterFactory,
-			AuthorFactory authorFactory, GroupFactory groupFactory,
-			KeyManager keyManager, ConnectionManager connectionManager,
+			AuthorFactory authorFactory, ConnectionManager connectionManager,
 			IdentityManager identityManager, ContactManager contactManager,
 			Clock clock, PluginManager pluginManager) {
 		return new InvitationTaskFactoryImpl(crypto, bdfReaderFactory,
 				bdfWriterFactory, streamReaderFactory, streamWriterFactory,
-				authorFactory, groupFactory, keyManager, connectionManager,
-				identityManager, contactManager, clock, pluginManager);
+				authorFactory, connectionManager, identityManager,
+				contactManager, clock, pluginManager);
 	}
 }
diff --git a/briar-core/src/org/briarproject/plugins/PluginsModule.java b/briar-core/src/org/briarproject/plugins/PluginsModule.java
index 67f27b08ba56b5038f9e52c478bd6f20632345c3..6b750c2149846f20d5aa577c56942bf687b064b5 100644
--- a/briar-core/src/org/briarproject/plugins/PluginsModule.java
+++ b/briar-core/src/org/briarproject/plugins/PluginsModule.java
@@ -5,6 +5,7 @@ import javax.inject.Singleton;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.lifecycle.IoExecutor;
 import org.briarproject.api.lifecycle.LifecycleManager;
+import org.briarproject.api.plugins.BackoffFactory;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.ConnectionRegistry;
 import org.briarproject.api.plugins.PluginManager;
@@ -14,6 +15,7 @@ import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamReaderFactory;
 import org.briarproject.api.transport.StreamWriterFactory;
 
+import java.security.SecureRandom;
 import java.util.concurrent.Executor;
 
 import dagger.Module;
@@ -23,10 +25,16 @@ import dagger.Provides;
 @Module
 public class PluginsModule {
 
+	@Provides
+	BackoffFactory provideBackoffFactory() {
+		return new BackoffFactoryImpl();
+	}
+
 	@Provides
 	Poller providePoller(@IoExecutor Executor ioExecutor,
-			ConnectionRegistry connectionRegistry, Timer timer) {
-		return new PollerImpl(ioExecutor, connectionRegistry, timer);
+			ConnectionRegistry connectionRegistry, SecureRandom random,
+			Timer timer) {
+		return new PollerImpl(ioExecutor, connectionRegistry, random, timer);
 	}
 
 	@Provides
diff --git a/briar-core/src/org/briarproject/sync/SyncModule.java b/briar-core/src/org/briarproject/sync/SyncModule.java
index d52c9fa359522e1e513b0f8e5e14643cd0f938c0..654f029e6f2a0894d5fc622c9e962e5366cad3c5 100644
--- a/briar-core/src/org/briarproject/sync/SyncModule.java
+++ b/briar-core/src/org/briarproject/sync/SyncModule.java
@@ -9,12 +9,10 @@ import org.briarproject.api.event.EventBus;
 import org.briarproject.api.identity.Author;
 import org.briarproject.api.identity.AuthorFactory;
 import org.briarproject.api.lifecycle.LifecycleManager;
-import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupFactory;
 import org.briarproject.api.sync.MessageFactory;
 import org.briarproject.api.sync.PacketReaderFactory;
 import org.briarproject.api.sync.PacketWriterFactory;
-import org.briarproject.api.sync.PrivateGroupFactory;
 import org.briarproject.api.sync.SyncSessionFactory;
 import org.briarproject.api.sync.ValidationManager;
 import org.briarproject.api.system.Clock;
@@ -29,12 +27,6 @@ import dagger.Provides;
 @Module
 public class SyncModule {
 
-	@Provides
-	AuthorFactory provideAuthFactory(CryptoComponent crypto,
-			BdfWriterFactory bdfWriterFactory, Clock clock) {
-		return new AuthorFactoryImpl(crypto, bdfWriterFactory, clock);
-	}
-
 	@Provides
 	GroupFactory provideGroupFactory(CryptoComponent crypto) {
 		return new GroupFactoryImpl(crypto);
@@ -55,12 +47,6 @@ public class SyncModule {
 		return new PacketWriterFactoryImpl();
 	}
 
-	@Provides
-	PrivateGroupFactory providePrivateGroupFactory(GroupFactory groupFactory,
-			BdfWriterFactory bdfWriterFactory) {
-		return new PrivateGroupFactoryImpl(groupFactory, bdfWriterFactory);
-	}
-
 	@Provides
 	@Singleton
 	SyncSessionFactory provideSyncSessionFactory(DatabaseComponent db,
@@ -71,12 +57,6 @@ public class SyncModule {
 				packetReaderFactory, packetWriterFactory);
 	}
 
-
-	@Provides
-	ObjectReader<Author> getAuthorReader(AuthorFactory authorFactory) {
-		return new AuthorReader(authorFactory);
-	}
-
 	@Provides
 	@Singleton
 	ValidationManager getValidationManager(LifecycleManager lifecycleManager,