diff --git a/briar-android/src/org/briarproject/android/AndroidComponent.java b/briar-android/src/org/briarproject/android/AndroidComponent.java
index 5be1919a35e652132ec666ee2d90860cfc17ee75..27f156e9156d49da3c5d903f3be995669bd05588 100644
--- a/briar-android/src/org/briarproject/android/AndroidComponent.java
+++ b/briar-android/src/org/briarproject/android/AndroidComponent.java
@@ -1,5 +1,6 @@
 package org.briarproject.android;
 
+import org.briarproject.CoreComponent;
 import org.briarproject.android.contact.ContactListFragment;
 import org.briarproject.android.contact.ConversationActivity;
 import org.briarproject.android.forum.AvailableForumsActivity;
@@ -14,38 +15,12 @@ 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;
-import org.briarproject.db.DatabaseModule;
-import org.briarproject.event.EventModule;
-import org.briarproject.forum.ForumModule;
-import org.briarproject.identity.IdentityModule;
-import org.briarproject.invitation.InvitationModule;
-import org.briarproject.lifecycle.LifecycleModule;
-import org.briarproject.messaging.MessagingModule;
-import org.briarproject.plugins.AndroidPluginsModule;
-import org.briarproject.properties.PropertiesModule;
-import org.briarproject.reliability.ReliabilityModule;
-import org.briarproject.settings.SettingsModule;
-import org.briarproject.sync.SyncModule;
-import org.briarproject.system.AndroidSystemModule;
-import org.briarproject.transport.TransportModule;
 
-
-import javax.inject.Singleton;
 import dagger.Component;
-@Singleton
+@ApplicationScope
 @Component(
-		modules = {AppModule.class, AndroidModule.class, DatabaseModule.class,
-				CryptoModule.class, LifecycleModule.class,
-				ReliabilityModule.class, MessagingModule.class,
-				InvitationModule.class, ForumModule.class, IdentityModule.class,
-				EventModule.class, DataModule.class, ContactModule.class,
-				AndroidSystemModule.class, AndroidPluginsModule.class,
-				PropertiesModule.class, TransportModule.class, SyncModule.class,
-				SettingsModule.class, ClientsModule.class})
+		dependencies = {CoreComponent.class},
+		modules = {AppModule.class, AndroidModule.class})
 public interface AndroidComponent {
 	void inject(SplashScreenActivity activity);
 	void inject(SetupActivity activity);
diff --git a/briar-android/src/org/briarproject/android/AndroidEagerSingletons.java b/briar-android/src/org/briarproject/android/AndroidEagerSingletons.java
new file mode 100644
index 0000000000000000000000000000000000000000..b14a785933480e26bb38de7cc3940a595b358249
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/AndroidEagerSingletons.java
@@ -0,0 +1,8 @@
+package org.briarproject.android;
+
+public class AndroidEagerSingletons {
+
+	public static void initEagerSingletons(AndroidComponent c) {
+		c.inject(new AndroidModule.EagerSingletons());
+	}
+}
diff --git a/briar-android/src/org/briarproject/android/AndroidModule.java b/briar-android/src/org/briarproject/android/AndroidModule.java
index 9343a31e82017fa39a9b3f2a32774ce119645a63..53ea73f15ba22322e31391eef9ea3f3366aa5ad4 100644
--- a/briar-android/src/org/briarproject/android/AndroidModule.java
+++ b/briar-android/src/org/briarproject/android/AndroidModule.java
@@ -1,138 +1,37 @@
 package org.briarproject.android;
 
-import android.app.Application;
-
-import org.briarproject.api.android.AndroidExecutor;
 import org.briarproject.api.android.AndroidNotificationManager;
 import org.briarproject.api.android.ReferenceManager;
-import org.briarproject.api.contact.ContactManager;
-import org.briarproject.api.crypto.SecretKey;
-import org.briarproject.api.db.DatabaseConfig;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.lifecycle.LifecycleManager;
-import org.briarproject.api.messaging.MessagingManager;
-import org.briarproject.api.plugins.PluginManager;
-import org.briarproject.api.properties.TransportPropertyManager;
-import org.briarproject.api.sync.ValidationManager;
-import org.briarproject.api.transport.KeyManager;
-import org.briarproject.api.ui.UiCallback;
-import org.briarproject.messaging.PrivateMessageValidator;
-import org.briarproject.properties.TransportPropertyValidator;
-
-import java.io.File;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import dagger.Module;
 import dagger.Provides;
 
-import static android.content.Context.MODE_PRIVATE;
-
 @Module
 public class AndroidModule {
 
 	static class EagerSingletons {
-		// Load all relevant eager singletons and their references
-		@Inject
-		KeyManager keyManager;
-		@Inject
-		ValidationManager validationManager;
-		@Inject
-		PluginManager pluginManager;
 		@Inject
 		AndroidNotificationManager androidNotificationManager;
-		@Inject
-		TransportPropertyManager transportPropertyManager;
-		@Inject
-		MessagingManager messagingManager;
-		@Inject
-		PrivateMessageValidator privateMessageValidator;
-		@Inject
-		TransportPropertyValidator transportPropertyValidator;
-
-
-	}
-
-	static void injectEager(AndroidComponent c) {
-		c.inject(new EagerSingletons());
-	}
-
-	private final UiCallback uiCallback;
-
-	public AndroidModule() {
-		// Use a dummy UI callback
-		uiCallback = new UiCallback() {
-
-			public int showChoice(String[] options, String... message) {
-				throw new UnsupportedOperationException();
-			}
-
-			public boolean showConfirmationMessage(String... message) {
-				throw new UnsupportedOperationException();
-			}
-
-			public void showMessage(String... message) {
-				throw new UnsupportedOperationException();
-			}
-		};
-	}
-
-	@Provides
-	UiCallback provideUICallback() {
-		return uiCallback;
 	}
 
 	@Provides
-	@Singleton
+	@ApplicationScope
 	ReferenceManager provideReferenceManager() {
 		return new ReferenceManagerImpl();
 	}
 
 	@Provides
-	@Singleton
-	AndroidExecutor provideAndroidExecutor(
-			AndroidExecutorImpl androidExecutor) {
-		return androidExecutor;
-	}
-
-	@Provides
-	@Singleton
-	DatabaseConfig provideDatabaseConfig(final Application app) {
-		final File dir = app.getApplicationContext().getDir("db", MODE_PRIVATE);
-		return new DatabaseConfig() {
-
-			private volatile SecretKey key = null;
-
-			public boolean databaseExists() {
-				return dir.isDirectory() && dir.listFiles().length > 0;
-			}
-
-			public File getDatabaseDirectory() {
-				return dir;
-			}
-
-			public void setEncryptionKey(SecretKey key) {
-				this.key = key;
-			}
-
-			public SecretKey getEncryptionKey() {
-				return key;
-			}
-
-			public long getMaxSize() {
-				return Long.MAX_VALUE;
-			}
-		};
-	}
-
-	@Provides
-	@Singleton
+	@ApplicationScope
 	AndroidNotificationManager provideAndroidNotificationManager(
 			LifecycleManager lifecycleManager, EventBus eventBus,
 			AndroidNotificationManagerImpl notificationManager) {
 		lifecycleManager.register(notificationManager);
 		eventBus.addListener(notificationManager);
+
 		return notificationManager;
 	}
 
diff --git a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
index 8a0561f4d2bf1ec5bab72c997e9d5828c2b717a7..64ae4e90e3fad024ff2c4dcfda1a011879b2aa64 100644
--- a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
+++ b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
@@ -12,7 +12,7 @@ import android.support.v4.app.TaskStackBuilder;
 import org.briarproject.R;
 import org.briarproject.android.contact.ConversationActivity;
 import org.briarproject.android.forum.ForumActivity;
-import org.briarproject.api.android.AndroidExecutor;
+import org.briarproject.api.android.PlatformExecutor;
 import org.briarproject.api.android.AndroidNotificationManager;
 import org.briarproject.api.db.DatabaseExecutor;
 import org.briarproject.api.db.DbException;
@@ -65,7 +65,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 	private final SettingsManager settingsManager;
 	private final MessagingManager messagingManager;
 	private final ForumManager forumManager;
-	private final AndroidExecutor androidExecutor;
+	private final PlatformExecutor platformExecutor;
 	private final Context appContext;
 
 	// The following must only be accessed on the main UI thread
@@ -82,13 +82,13 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 	@Inject
 	public AndroidNotificationManagerImpl(@DatabaseExecutor Executor dbExecutor,
 			SettingsManager settingsManager, MessagingManager messagingManager,
-			ForumManager forumManager, AndroidExecutor androidExecutor,
+			ForumManager forumManager, PlatformExecutor platformExecutor,
 			Application app) {
 		this.dbExecutor = dbExecutor;
 		this.settingsManager = settingsManager;
 		this.messagingManager = messagingManager;
 		this.forumManager = forumManager;
-		this.androidExecutor = androidExecutor;
+		this.platformExecutor = platformExecutor;
 		appContext = app.getApplicationContext();
 	}
 
@@ -118,7 +118,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 	}
 
 	private void clearNotifications() {
-		androidExecutor.execute(new Runnable() {
+		platformExecutor.execute(new Runnable() {
 			public void run() {
 				clearPrivateMessageNotification();
 				clearForumPostNotification();
@@ -155,7 +155,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 	}
 
 	public void showPrivateMessageNotification(final GroupId g) {
-		androidExecutor.execute(new Runnable() {
+		platformExecutor.execute(new Runnable() {
 			public void run() {
 				Integer count = contactCounts.get(g);
 				if (count == null) contactCounts.put(g, 1);
@@ -168,7 +168,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 	}
 
 	public void clearPrivateMessageNotification(final GroupId g) {
-		androidExecutor.execute(new Runnable() {
+		platformExecutor.execute(new Runnable() {
 			public void run() {
 				Integer count = contactCounts.remove(g);
 				if (count == null) return; // Already cleared
@@ -239,7 +239,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 	}
 
 	public void showForumPostNotification(final GroupId g) {
-		androidExecutor.execute(new Runnable() {
+		platformExecutor.execute(new Runnable() {
 			public void run() {
 				Integer count = forumCounts.get(g);
 				if (count == null) forumCounts.put(g, 1);
@@ -252,7 +252,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 	}
 
 	public void clearForumPostNotification(final GroupId g) {
-		androidExecutor.execute(new Runnable() {
+		platformExecutor.execute(new Runnable() {
 			public void run() {
 				Integer count = forumCounts.remove(g);
 				if (count == null) return; // Already cleared
@@ -311,7 +311,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 	}
 
 	public void blockNotification(final GroupId g) {
-		androidExecutor.execute(new Runnable() {
+		platformExecutor.execute(new Runnable() {
 			public void run() {
 				visibleGroup = g;
 			}
@@ -319,7 +319,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 	}
 
 	public void unblockNotification(final GroupId g) {
-		androidExecutor.execute(new Runnable() {
+		platformExecutor.execute(new Runnable() {
 			public void run() {
 				if (g.equals(visibleGroup)) visibleGroup = null;
 			}
diff --git a/briar-android/src/org/briarproject/android/AppModule.java b/briar-android/src/org/briarproject/android/AppModule.java
index d3779d1a1a7a71dd73e5383bcfec451366746089..b48d752e3497c589f802a091c0980e50de4fd02b 100644
--- a/briar-android/src/org/briarproject/android/AppModule.java
+++ b/briar-android/src/org/briarproject/android/AppModule.java
@@ -1,9 +1,6 @@
 package org.briarproject.android;
 
 import android.app.Application;
-import android.content.Context;
-
-import javax.inject.Singleton;
 
 import dagger.Module;
 import dagger.Provides;
@@ -18,7 +15,7 @@ public class AppModule {
 	}
 
 	@Provides
-	@Singleton
+	@ApplicationScope
 	Application providesApplication() {
 		return application;
 	}
diff --git a/briar-android/src/org/briarproject/android/ApplicationScope.java b/briar-android/src/org/briarproject/android/ApplicationScope.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad1fb2a4aa65911e19087fcf2550bd52b468d187
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/ApplicationScope.java
@@ -0,0 +1,11 @@
+package org.briarproject.android;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.inject.Scope;
+
+@Scope
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ApplicationScope {
+}
diff --git a/briar-android/src/org/briarproject/android/BriarApplication.java b/briar-android/src/org/briarproject/android/BriarApplication.java
index ac670b9efabc03b0aee52b32b9d265449d22a4b7..6a01e57fb8bffb31ebabb4f71f2cf0eaa50c26a7 100644
--- a/briar-android/src/org/briarproject/android/BriarApplication.java
+++ b/briar-android/src/org/briarproject/android/BriarApplication.java
@@ -6,6 +6,13 @@ import java.util.logging.Logger;
 import android.app.Application;
 import android.content.Context;
 
+import org.briarproject.CoreComponent;
+import org.briarproject.CoreEagerSingletons;
+import org.briarproject.DaggerCoreComponent;
+import org.briarproject.plugins.PluginsModuleExtension;
+import org.briarproject.system.PlatformModuleExtension;
+import org.briarproject.system.SystemModuleExtension;
+
 public class BriarApplication extends Application {
 
 	private static final Logger LOG =
@@ -23,14 +30,21 @@ public class BriarApplication extends Application {
 		CrashHandler newHandler = new CrashHandler(ctx, oldHandler);
 		Thread.setDefaultUncaughtExceptionHandler(newHandler);
 
+		CoreComponent coreComponent = DaggerCoreComponent.builder()
+				.systemModule(new SystemModuleExtension(this))
+				.platformModule(new PlatformModuleExtension(this))
+				.pluginsModule(new PluginsModuleExtension(this))
+				.build();
+
 		applicationComponent = DaggerAndroidComponent.builder()
 				.appModule(new AppModule(this))
-				.androidModule(new AndroidModule())
+				.coreComponent(coreComponent)
 				.build();
-		// We need to load the eager singletons directly after making the
-		// dependency graph
-		AndroidModule.injectEager(applicationComponent);
 
+		// We need to load the eager singletons directly after making the
+		// dependency graphs
+		CoreEagerSingletons.initEagerSingletons(coreComponent);
+		AndroidEagerSingletons.initEagerSingletons(applicationComponent);
 	}
 
 	public AndroidComponent getApplicationComponent() {
diff --git a/briar-android/src/org/briarproject/android/BriarService.java b/briar-android/src/org/briarproject/android/BriarService.java
index 3d88616f3fa17b92d98cc19e057d4fa6c69e2f07..2a2bd6522fda283a4d2d230c599c656a0d53eab9 100644
--- a/briar-android/src/org/briarproject/android/BriarService.java
+++ b/briar-android/src/org/briarproject/android/BriarService.java
@@ -12,7 +12,7 @@ import android.os.IBinder;
 import android.support.v4.app.NotificationCompat;
 
 import org.briarproject.R;
-import org.briarproject.api.android.AndroidExecutor;
+import org.briarproject.api.android.PlatformExecutor;
 import org.briarproject.api.db.DatabaseConfig;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.lifecycle.LifecycleManager.StartResult;
@@ -48,7 +48,7 @@ public class BriarService extends Service {
 
 	// Fields that are accessed from background threads must be volatile
 	@Inject protected volatile LifecycleManager lifecycleManager;
-	@Inject protected volatile AndroidExecutor androidExecutor;
+	@Inject protected volatile PlatformExecutor platformExecutor;
 	private volatile boolean started = false;
 
 	@Override
@@ -106,7 +106,7 @@ public class BriarService extends Service {
 	}
 
 	private void showStartupFailureNotification(final StartResult result) {
-		androidExecutor.execute(new Runnable() {
+		platformExecutor.execute(new Runnable() {
 			public void run() {
 				NotificationCompat.Builder b =
 						new NotificationCompat.Builder(BriarService.this);
diff --git a/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java
index 678725df869cfcd4ac8abd20abced9b6b3e43524..9b6f5319f930a75e72f49ff3c045a8edfa2e1a98 100644
--- a/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java
+++ b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java
@@ -4,14 +4,12 @@ import android.app.Application;
 import android.content.Context;
 
 
-import org.briarproject.api.android.AndroidExecutor;
+import org.briarproject.api.android.PlatformExecutor;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.lifecycle.IoExecutor;
 import org.briarproject.api.plugins.BackoffFactory;
 import org.briarproject.api.plugins.duplex.DuplexPluginConfig;
 import org.briarproject.api.plugins.duplex.DuplexPluginFactory;
-import org.briarproject.api.plugins.simplex.SimplexPluginConfig;
-import org.briarproject.api.plugins.simplex.SimplexPluginFactory;
 import org.briarproject.api.system.LocationUtils;
 import org.briarproject.plugins.droidtooth.DroidtoothPluginFactory;
 import org.briarproject.plugins.tcp.AndroidLanTcpPluginFactory;
@@ -20,32 +18,22 @@ import org.briarproject.plugins.tor.TorPluginFactory;
 import java.security.SecureRandom;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.concurrent.Executor;
 
 import dagger.Module;
 import dagger.Provides;
 
 @Module
-public class AndroidPluginsModule extends PluginsModule {
+public class AndroidPluginsModule {
 
 	@Provides
-	SimplexPluginConfig getSimplexPluginConfig() {
-		return new SimplexPluginConfig() {
-			public Collection<SimplexPluginFactory> getFactories() {
-				return Collections.emptyList();
-			}
-		};
-	}
-
-	@Provides
-	DuplexPluginConfig getDuplexPluginConfig(@IoExecutor Executor ioExecutor,
-			AndroidExecutor androidExecutor, Application app,
+	DuplexPluginConfig provideDuplexPluginConfig(@IoExecutor Executor ioExecutor,
+			PlatformExecutor platformExecutor, Application app,
 			SecureRandom random, BackoffFactory backoffFactory,
 			LocationUtils locationUtils, EventBus eventBus) {
 		Context appContext = app.getApplicationContext();
 		DuplexPluginFactory bluetooth = new DroidtoothPluginFactory(ioExecutor,
-				androidExecutor, appContext, random, backoffFactory);
+				platformExecutor, appContext, random, backoffFactory);
 		DuplexPluginFactory tor = new TorPluginFactory(ioExecutor, appContext,
 				locationUtils, eventBus);
 		DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor,
diff --git a/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java b/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java
new file mode 100644
index 0000000000000000000000000000000000000000..b2b408f8d6f44c1f0c43200511b8e3f872051280
--- /dev/null
+++ b/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java
@@ -0,0 +1,50 @@
+package org.briarproject.plugins;
+
+import android.app.Application;
+import android.content.Context;
+
+import org.briarproject.api.android.PlatformExecutor;
+import org.briarproject.api.event.EventBus;
+import org.briarproject.api.lifecycle.IoExecutor;
+import org.briarproject.api.plugins.BackoffFactory;
+import org.briarproject.api.plugins.duplex.DuplexPluginConfig;
+import org.briarproject.api.plugins.duplex.DuplexPluginFactory;
+import org.briarproject.api.system.LocationUtils;
+import org.briarproject.plugins.droidtooth.DroidtoothPluginFactory;
+import org.briarproject.plugins.tcp.AndroidLanTcpPluginFactory;
+import org.briarproject.plugins.tor.TorPluginFactory;
+
+import java.security.SecureRandom;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.concurrent.Executor;
+
+public class PluginsModuleExtension extends PluginsModule {
+
+	private final Application app;
+
+	public PluginsModuleExtension(Application app) {
+		this.app = app;
+	}
+
+	@Override
+	public DuplexPluginConfig provideDuplexPluginConfig(
+			@IoExecutor Executor ioExecutor, PlatformExecutor platformExecutor,
+			SecureRandom random, BackoffFactory backoffFactory,
+			LocationUtils locationUtils, EventBus eventBus) {
+		Context appContext = app.getApplicationContext();
+		DuplexPluginFactory bluetooth = new DroidtoothPluginFactory(ioExecutor,
+				platformExecutor, appContext, random, backoffFactory);
+		DuplexPluginFactory tor = new TorPluginFactory(ioExecutor, appContext,
+				locationUtils, eventBus);
+		DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor,
+				backoffFactory, appContext);
+		final Collection<DuplexPluginFactory> factories =
+				Arrays.asList(bluetooth, tor, lan);
+		return new DuplexPluginConfig() {
+			public Collection<DuplexPluginFactory> getFactories() {
+				return factories;
+			}
+		};
+	}
+}
diff --git a/briar-android/src/org/briarproject/android/AndroidExecutorImpl.java b/briar-android/src/org/briarproject/system/AndroidExecutorImpl.java
similarity index 85%
rename from briar-android/src/org/briarproject/android/AndroidExecutorImpl.java
rename to briar-android/src/org/briarproject/system/AndroidExecutorImpl.java
index e46e7193bad9dfc7fc0ab75d7d3af109ed109897..b119fb8c7babd63ab09f258517486b7988836775 100644
--- a/briar-android/src/org/briarproject/android/AndroidExecutorImpl.java
+++ b/briar-android/src/org/briarproject/system/AndroidExecutorImpl.java
@@ -1,4 +1,4 @@
-package org.briarproject.android;
+package org.briarproject.system;
 
 import android.app.Application;
 import android.content.Context;
@@ -6,7 +6,7 @@ import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
 
-import org.briarproject.api.android.AndroidExecutor;
+import org.briarproject.api.android.PlatformExecutor;
 
 import java.util.concurrent.Callable;
 import java.util.concurrent.Future;
@@ -14,11 +14,10 @@ import java.util.concurrent.FutureTask;
 
 import javax.inject.Inject;
 
-class AndroidExecutorImpl implements AndroidExecutor {
+class AndroidExecutorImpl implements PlatformExecutor {
 
 	private final Handler handler;
 
-	@Inject
 	AndroidExecutorImpl(Application app) {
 		Context ctx = app.getApplicationContext();
 		handler = new FutureTaskHandler(ctx.getMainLooper());
diff --git a/briar-android/src/org/briarproject/system/PlatformModuleExtension.java b/briar-android/src/org/briarproject/system/PlatformModuleExtension.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc2ae6a4ac61fc66c24ba56af98e1daed614865c
--- /dev/null
+++ b/briar-android/src/org/briarproject/system/PlatformModuleExtension.java
@@ -0,0 +1,78 @@
+package org.briarproject.system;
+
+import android.app.Application;
+import android.content.Context;
+
+import org.briarproject.PlatformModule;
+import org.briarproject.android.ApplicationScope;
+import org.briarproject.api.android.PlatformExecutor;
+import org.briarproject.api.crypto.SecretKey;
+import org.briarproject.api.db.DatabaseConfig;
+import org.briarproject.api.ui.UiCallback;
+
+import java.io.File;
+
+public class PlatformModuleExtension extends PlatformModule {
+
+	private final UiCallback uiCallback;
+	private final Application app;
+
+	public PlatformModuleExtension(Application app) {
+		this.app = app;
+		// Use a dummy UI callback
+		uiCallback = new UiCallback() {
+
+			public int showChoice(String[] options, String... message) {
+				throw new UnsupportedOperationException();
+			}
+
+			public boolean showConfirmationMessage(String... message) {
+				throw new UnsupportedOperationException();
+			}
+
+			public void showMessage(String... message) {
+				throw new UnsupportedOperationException();
+			}
+		};
+	}
+
+	@Override
+	public UiCallback provideUICallback() {
+		return uiCallback;
+	}
+
+	@Override
+	@ApplicationScope
+	public DatabaseConfig provideDatabaseConfig() {
+		final File dir = app.getApplicationContext().getDir("db", Context.MODE_PRIVATE);
+		return new DatabaseConfig() {
+
+			private volatile SecretKey key = null;
+
+			public boolean databaseExists() {
+				return dir.isDirectory() && dir.listFiles().length > 0;
+			}
+
+			public File getDatabaseDirectory() {
+				return dir;
+			}
+
+			public void setEncryptionKey(SecretKey key) {
+				this.key = key;
+			}
+
+			public SecretKey getEncryptionKey() {
+				return key;
+			}
+
+			public long getMaxSize() {
+				return Long.MAX_VALUE;
+			}
+		};
+	}
+
+	@Override
+	public PlatformExecutor providePlatformExecutor() {
+		return new AndroidExecutorImpl(app);
+	}
+}
diff --git a/briar-android/src/org/briarproject/system/SystemModuleExtension.java b/briar-android/src/org/briarproject/system/SystemModuleExtension.java
new file mode 100644
index 0000000000000000000000000000000000000000..72ea338b4442a44f0327bc1e943aaa6e42c6e39e
--- /dev/null
+++ b/briar-android/src/org/briarproject/system/SystemModuleExtension.java
@@ -0,0 +1,32 @@
+package org.briarproject.system;
+
+
+import android.app.Application;
+
+import org.briarproject.api.system.Clock;
+import org.briarproject.api.system.LocationUtils;
+import org.briarproject.api.system.SeedProvider;
+import org.briarproject.api.system.Timer;
+
+import dagger.Module;
+import dagger.Provides;
+
+public class SystemModuleExtension extends SystemModule {
+
+	private final Application app;
+
+	public SystemModuleExtension(final Application app) {
+		this.app = app;
+	}
+
+	@Override
+	public SeedProvider provideSeedProvider() {
+		return new AndroidSeedProvider(app);
+	}
+
+	@Override
+	public LocationUtils provideLocationUtils() {
+		return new AndroidLocationUtils(app);
+	}
+
+}
diff --git a/briar-api/src/org/briarproject/api/android/AndroidExecutor.java b/briar-api/src/org/briarproject/api/android/PlatformExecutor.java
similarity index 92%
rename from briar-api/src/org/briarproject/api/android/AndroidExecutor.java
rename to briar-api/src/org/briarproject/api/android/PlatformExecutor.java
index 635702d0154d9a1ffe85ee8644c85dbd47071dba..4cd309374f6dbe3724c05eb939cde7044ea246fb 100644
--- a/briar-api/src/org/briarproject/api/android/AndroidExecutor.java
+++ b/briar-api/src/org/briarproject/api/android/PlatformExecutor.java
@@ -7,7 +7,7 @@ import java.util.concurrent.Future;
  * Enables background threads to make Android API calls that must be made from
  * a thread with a message queue.
  */
-public interface AndroidExecutor {
+public interface PlatformExecutor {
 
 	/**
 	 * Runs the given task on the main UI thread and returns a Future for
diff --git a/briar-core/src/org/briarproject/CoreComponent.java b/briar-core/src/org/briarproject/CoreComponent.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f7c41df040b7f9a0303f469f4c9262e7c072dac
--- /dev/null
+++ b/briar-core/src/org/briarproject/CoreComponent.java
@@ -0,0 +1,103 @@
+package org.briarproject;
+
+import org.briarproject.api.android.PlatformExecutor;
+import org.briarproject.api.android.ReferenceManager;
+import org.briarproject.api.contact.ContactManager;
+import org.briarproject.api.crypto.CryptoComponent;
+import org.briarproject.api.crypto.CryptoExecutor;
+import org.briarproject.api.crypto.PasswordStrengthEstimator;
+import org.briarproject.api.db.DatabaseConfig;
+import org.briarproject.api.db.DatabaseExecutor;
+import org.briarproject.api.event.EventBus;
+import org.briarproject.api.forum.ForumManager;
+import org.briarproject.api.forum.ForumPostFactory;
+import org.briarproject.api.forum.ForumSharingManager;
+import org.briarproject.api.identity.AuthorFactory;
+import org.briarproject.api.identity.IdentityManager;
+import org.briarproject.api.invitation.InvitationTaskFactory;
+import org.briarproject.api.lifecycle.IoExecutor;
+import org.briarproject.api.lifecycle.LifecycleManager;
+import org.briarproject.api.messaging.MessagingManager;
+import org.briarproject.api.messaging.PrivateMessageFactory;
+import org.briarproject.api.plugins.ConnectionRegistry;
+import org.briarproject.api.plugins.PluginManager;
+import org.briarproject.api.properties.TransportPropertyManager;
+import org.briarproject.api.settings.SettingsManager;
+import org.briarproject.api.sync.ValidationManager;
+import org.briarproject.api.transport.KeyManager;
+import org.briarproject.clients.ClientsModule;
+import org.briarproject.contact.ContactModule;
+import org.briarproject.crypto.CryptoModule;
+import org.briarproject.data.DataModule;
+import org.briarproject.db.DatabaseModule;
+import org.briarproject.event.EventModule;
+import org.briarproject.forum.ForumModule;
+import org.briarproject.identity.IdentityModule;
+import org.briarproject.invitation.InvitationModule;
+import org.briarproject.lifecycle.LifecycleModule;
+import org.briarproject.messaging.MessagingModule;
+import org.briarproject.messaging.PrivateMessageValidator;
+import org.briarproject.plugins.PluginsModule;
+import org.briarproject.properties.PropertiesModule;
+import org.briarproject.properties.TransportPropertyValidator;
+import org.briarproject.reliability.ReliabilityModule;
+import org.briarproject.settings.SettingsModule;
+import org.briarproject.sync.SyncModule;
+import org.briarproject.system.SystemModule;
+import org.briarproject.transport.TransportModule;
+
+import java.util.concurrent.Executor;
+
+import javax.inject.Singleton;
+
+import dagger.Component;
+
+@Singleton
+@Component(modules = {DatabaseModule.class,
+		CryptoModule.class, LifecycleModule.class, PlatformModule.class,
+		ReliabilityModule.class, MessagingModule.class,
+		InvitationModule.class, ForumModule.class, IdentityModule.class,
+		EventModule.class, DataModule.class, ContactModule.class,
+		PropertiesModule.class, TransportModule.class, SyncModule.class,
+		SettingsModule.class, ClientsModule.class, SystemModule.class,
+		PluginsModule.class})
+public interface CoreComponent {
+	@IoExecutor
+	Executor ioExecutor();
+	ContactManager contactManager();
+	@CryptoExecutor Executor cryptoExecutor();
+	DatabaseConfig databaseConfig();
+	PasswordStrengthEstimator passwordStrengthEstimator();
+	CryptoComponent cryptoComponent();
+	@DatabaseExecutor Executor dbExecutor();
+	LifecycleManager lifecycleManager();
+	AuthorFactory authFactory();
+	EventBus eventBus();
+	KeyManager keyManager();
+	ValidationManager validationManager();
+	ForumManager forumManager();
+	IdentityManager identityManager();
+	PluginManager pluginManager();
+	SettingsManager settingsManater();
+	InvitationTaskFactory invitationTaskFactory();
+	MessagingManager messagingManager();
+	TransportPropertyManager transportPropertyManager();
+	ConnectionRegistry connectionRegistry();
+	ForumSharingManager forumSharingManager();
+	PrivateMessageFactory privateMessageFactory();
+	ForumPostFactory forumPostFactory();
+	PrivateMessageValidator privateMessageValidator();
+	TransportPropertyValidator transportPropertyValidator();
+	PlatformExecutor platformExecutor();
+	// Eager singletons
+	void inject(ContactModule.EagerSingletons init);
+	void inject(CryptoModule.EagerSingletons init);
+	void inject(DatabaseModule.EagerSingletons init);
+	void inject(ForumModule.EagerSingletons init);
+	void inject(LifecycleModule.EagerSingletons init);
+	void inject(MessagingModule.EagerSingletons init);
+	void inject(PluginsModule.EagerSingletons init);
+	void inject(PropertiesModule.EagerSingletons init);
+	void inject(SyncModule.EagerSingletons init);
+	void inject(TransportModule.EagerSingletons init);
+}
diff --git a/briar-core/src/org/briarproject/CoreEagerSingletons.java b/briar-core/src/org/briarproject/CoreEagerSingletons.java
new file mode 100644
index 0000000000000000000000000000000000000000..8637f710651054d6abb9dd1683d06f7fd8da584a
--- /dev/null
+++ b/briar-core/src/org/briarproject/CoreEagerSingletons.java
@@ -0,0 +1,28 @@
+package org.briarproject;
+
+import org.briarproject.contact.ContactModule;
+import org.briarproject.crypto.CryptoModule;
+import org.briarproject.db.DatabaseModule;
+import org.briarproject.forum.ForumModule;
+import org.briarproject.lifecycle.LifecycleModule;
+import org.briarproject.messaging.MessagingModule;
+import org.briarproject.plugins.PluginsModule;
+import org.briarproject.properties.PropertiesModule;
+import org.briarproject.sync.SyncModule;
+import org.briarproject.transport.TransportModule;
+
+public class CoreEagerSingletons {
+
+	public static void initEagerSingletons(CoreComponent c) {
+		c.inject(new ContactModule.EagerSingletons());
+		c.inject(new CryptoModule.EagerSingletons());
+		c.inject(new DatabaseModule.EagerSingletons());
+		c.inject(new ForumModule.EagerSingletons());
+		c.inject(new LifecycleModule.EagerSingletons());
+		c.inject(new MessagingModule.EagerSingletons());
+		c.inject(new PluginsModule.EagerSingletons());
+		c.inject(new PropertiesModule.EagerSingletons());
+		c.inject(new SyncModule.EagerSingletons());
+		c.inject(new TransportModule.EagerSingletons());
+	}
+}
diff --git a/briar-core/src/org/briarproject/PlatformModule.java b/briar-core/src/org/briarproject/PlatformModule.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4242048a57a09ad477b3f0fc628e2e7d1419e58
--- /dev/null
+++ b/briar-core/src/org/briarproject/PlatformModule.java
@@ -0,0 +1,36 @@
+package org.briarproject;
+
+import org.briarproject.api.android.PlatformExecutor;
+import org.briarproject.api.db.DatabaseConfig;
+import org.briarproject.api.ui.UiCallback;
+
+import javax.inject.Singleton;
+
+import dagger.Module;
+import dagger.Provides;
+
+/**
+ * This class contains methods that MUST(!) be overridden in platform specific
+ * modules that use the core.
+ */
+@Module
+public class PlatformModule {
+
+	@Provides
+	@Singleton
+	public DatabaseConfig provideDatabaseConfig() {
+		return null;
+	}
+
+	@Provides
+	public UiCallback provideUICallback() {
+		return null;
+	}
+
+
+	@Provides
+	public PlatformExecutor providePlatformExecutor() {
+		return null;
+	}
+
+}
diff --git a/briar-core/src/org/briarproject/contact/ContactModule.java b/briar-core/src/org/briarproject/contact/ContactModule.java
index e4927a74f27a5010418914d586ee75a2839829c3..bd8e2d3afa05b27aedc9cf3117468995f9fbcf01 100644
--- a/briar-core/src/org/briarproject/contact/ContactModule.java
+++ b/briar-core/src/org/briarproject/contact/ContactModule.java
@@ -3,9 +3,8 @@ package org.briarproject.contact;
 import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.lifecycle.LifecycleManager;
-import org.briarproject.identity.IdentityModule;
-import org.briarproject.lifecycle.LifecycleModule;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import dagger.Module;
@@ -14,6 +13,10 @@ import dagger.Provides;
 @Module
 public class ContactModule {
 
+	public static class EagerSingletons {
+		@Inject ContactManager contactManager;
+	}
+
 	@Provides
 	@Singleton
 	ContactManager getContactManager(LifecycleManager lifecycleManager,
diff --git a/briar-core/src/org/briarproject/crypto/CryptoModule.java b/briar-core/src/org/briarproject/crypto/CryptoModule.java
index c8b1d4845fc2602b277c918fd27b3a48d7aed238..aa9744483778fe0a5a7cefdad78bb9cfb1a6f76e 100644
--- a/briar-core/src/org/briarproject/crypto/CryptoModule.java
+++ b/briar-core/src/org/briarproject/crypto/CryptoModule.java
@@ -7,7 +7,6 @@ import org.briarproject.api.crypto.StreamDecrypterFactory;
 import org.briarproject.api.crypto.StreamEncrypterFactory;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.system.SeedProvider;
-import org.briarproject.lifecycle.LifecycleModule;
 
 import java.security.SecureRandom;
 import java.util.concurrent.BlockingQueue;
@@ -17,6 +16,7 @@ import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.RejectedExecutionHandler;
 import java.util.concurrent.ThreadPoolExecutor;
 
+import javax.inject.Inject;
 import javax.inject.Provider;
 import javax.inject.Singleton;
 
@@ -28,6 +28,11 @@ import static java.util.concurrent.TimeUnit.SECONDS;
 @Module
 public class CryptoModule {
 
+	public static class EagerSingletons {
+		@Inject
+		@CryptoExecutor Executor cryptoExecutor;
+	}
+
 	/**
 	 * The maximum number of executor threads.
 	 */
diff --git a/briar-core/src/org/briarproject/db/DatabaseModule.java b/briar-core/src/org/briarproject/db/DatabaseModule.java
index c177c9ae4b528774de226da471da8b92a7d4ac84..7f590ddd521821f759fff466804e2e6bb6b0e691 100644
--- a/briar-core/src/org/briarproject/db/DatabaseModule.java
+++ b/briar-core/src/org/briarproject/db/DatabaseModule.java
@@ -7,9 +7,6 @@ import org.briarproject.api.event.EventBus;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.lifecycle.ShutdownManager;
 import org.briarproject.api.system.Clock;
-import org.briarproject.data.DataModule;
-import org.briarproject.event.EventModule;
-import org.briarproject.lifecycle.LifecycleModule;
 
 import java.security.SecureRandom;
 import java.sql.Connection;
@@ -21,7 +18,6 @@ import java.util.concurrent.RejectedExecutionHandler;
 import java.util.concurrent.ThreadPoolExecutor;
 
 import javax.inject.Inject;
-import javax.inject.Named;
 import javax.inject.Singleton;
 
 import dagger.Module;
@@ -32,6 +28,11 @@ import static java.util.concurrent.TimeUnit.SECONDS;
 @Module
 public class DatabaseModule {
 
+	public static class EagerSingletons {
+		@Inject
+		@DatabaseExecutor ExecutorService executorService;
+	}
+
 	private final ExecutorService databaseExecutor;
 
 	public DatabaseModule() {
diff --git a/briar-core/src/org/briarproject/forum/ForumModule.java b/briar-core/src/org/briarproject/forum/ForumModule.java
index cbe2c7f19c39d50e018ffdbd73c58833c9d0339a..8442edeb7d7e6ba5615e1a05b887592a1c3e37fe 100644
--- a/briar-core/src/org/briarproject/forum/ForumModule.java
+++ b/briar-core/src/org/briarproject/forum/ForumModule.java
@@ -4,25 +4,17 @@ import org.briarproject.api.clients.ClientHelper;
 import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.crypto.CryptoComponent;
 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.data.ObjectReader;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.forum.ForumManager;
 import org.briarproject.api.forum.ForumPostFactory;
 import org.briarproject.api.forum.ForumSharingManager;
-import org.briarproject.api.identity.Author;
 import org.briarproject.api.identity.AuthorFactory;
-import org.briarproject.api.sync.MessageFactory;
 import org.briarproject.api.sync.ValidationManager;
 import org.briarproject.api.system.Clock;
-import org.briarproject.contact.ContactModule;
-import org.briarproject.crypto.CryptoModule;
-import org.briarproject.data.DataModule;
-import org.briarproject.db.DatabaseModule;
-import org.briarproject.sync.SyncModule;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import dagger.Module;
@@ -31,6 +23,15 @@ import dagger.Provides;
 @Module
 public class ForumModule {
 
+	public static class EagerSingletons {
+		@Inject
+		ForumListValidator forumListValidator;
+		@Inject
+		ForumPostValidator forumPostValidator;
+		@Inject
+		ForumSharingManager forumSharingManager;
+	}
+
 	@Provides
 	@Singleton
 	ForumManager provideForumManager(DatabaseComponent db,
diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java
index c6218f273035d0ed36d4120f7ac7ece38671a9de..7b98244eb405d4e30dc32a4fe1de56e01251d8a6 100644
--- a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java
+++ b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java
@@ -9,6 +9,7 @@ import java.util.concurrent.RejectedExecutionHandler;
 import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import org.briarproject.api.db.DatabaseComponent;
@@ -17,7 +18,6 @@ import org.briarproject.api.lifecycle.IoExecutor;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.lifecycle.ShutdownManager;
 import org.briarproject.api.system.Clock;
-import org.briarproject.event.EventModule;
 
 import dagger.Module;
 import dagger.Provides;
@@ -25,6 +25,11 @@ import dagger.Provides;
 @Module
 public class LifecycleModule {
 
+	public static class EagerSingletons {
+		@Inject
+		@IoExecutor Executor executor;
+	}
+
 	private final ExecutorService ioExecutor;
 
 	public LifecycleModule() {
diff --git a/briar-core/src/org/briarproject/messaging/MessagingModule.java b/briar-core/src/org/briarproject/messaging/MessagingModule.java
index 6f0921d828da38b35b5036384ab709a19f08b8f7..b943a6921d87c689ed83ac44dbf36424e9338207 100644
--- a/briar-core/src/org/briarproject/messaging/MessagingModule.java
+++ b/briar-core/src/org/briarproject/messaging/MessagingModule.java
@@ -2,18 +2,13 @@ package org.briarproject.messaging;
 
 import org.briarproject.api.clients.ClientHelper;
 import org.briarproject.api.contact.ContactManager;
-import org.briarproject.api.data.BdfReaderFactory;
-import org.briarproject.api.data.BdfWriterFactory;
 import org.briarproject.api.data.MetadataEncoder;
 import org.briarproject.api.messaging.MessagingManager;
 import org.briarproject.api.messaging.PrivateMessageFactory;
-import org.briarproject.api.sync.MessageFactory;
 import org.briarproject.api.sync.ValidationManager;
 import org.briarproject.api.system.Clock;
-import org.briarproject.contact.ContactModule;
-import org.briarproject.data.DataModule;
-import org.briarproject.sync.SyncModule;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import dagger.Module;
@@ -24,13 +19,17 @@ import static org.briarproject.messaging.MessagingManagerImpl.CLIENT_ID;
 @Module
 public class MessagingModule {
 
+	public static class EagerSingletons {
+		@Inject MessagingManager messagingManager;
+		@Inject PrivateMessageValidator privateMessageValidator;
+	}
+
 	@Provides
 	PrivateMessageFactory providePrivateMessageFactory(
 			ClientHelper clientHelper) {
 		return new PrivateMessageFactoryImpl(clientHelper);
 	}
 
-
 	@Provides
 	@Singleton
 	PrivateMessageValidator getValidator(ValidationManager validationManager,
diff --git a/briar-core/src/org/briarproject/plugins/PluginsModule.java b/briar-core/src/org/briarproject/plugins/PluginsModule.java
index 6b750c2149846f20d5aa577c56942bf687b064b5..0d523c34895ec2ccc1a08cfd8561fb9fea0f8fc3 100644
--- a/briar-core/src/org/briarproject/plugins/PluginsModule.java
+++ b/briar-core/src/org/briarproject/plugins/PluginsModule.java
@@ -1,7 +1,9 @@
 package org.briarproject.plugins;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.briarproject.api.android.PlatformExecutor;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.lifecycle.IoExecutor;
 import org.briarproject.api.lifecycle.LifecycleManager;
@@ -9,13 +11,19 @@ import org.briarproject.api.plugins.BackoffFactory;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.ConnectionRegistry;
 import org.briarproject.api.plugins.PluginManager;
+import org.briarproject.api.plugins.duplex.DuplexPluginConfig;
+import org.briarproject.api.plugins.simplex.SimplexPluginConfig;
+import org.briarproject.api.plugins.simplex.SimplexPluginFactory;
 import org.briarproject.api.sync.SyncSessionFactory;
+import org.briarproject.api.system.LocationUtils;
 import org.briarproject.api.system.Timer;
 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.Collection;
+import java.util.Collections;
 import java.util.concurrent.Executor;
 
 import dagger.Module;
@@ -25,6 +33,11 @@ import dagger.Provides;
 @Module
 public class PluginsModule {
 
+	public static class EagerSingletons {
+		@Inject
+		PluginManager pluginManager;
+	}
+
 	@Provides
 	BackoffFactory provideBackoffFactory() {
 		return new BackoffFactoryImpl();
@@ -62,4 +75,21 @@ public class PluginsModule {
 		lifecycleManager.register(pluginManager);
 		return pluginManager;
 	}
+
+	@Provides
+	SimplexPluginConfig provideSimplexPluginConfig() {
+		return new SimplexPluginConfig() {
+			public Collection<SimplexPluginFactory> getFactories() {
+				return Collections.emptyList();
+			}
+		};
+	}
+
+	@Provides
+	public DuplexPluginConfig provideDuplexPluginConfig(@IoExecutor Executor ioExecutor,
+			PlatformExecutor platformExecutor, /*Application app,*/
+			SecureRandom random, BackoffFactory backoffFactory,
+			LocationUtils locationUtils, EventBus eventBus) {
+		return null;
+	}
 }
diff --git a/briar-core/src/org/briarproject/properties/PropertiesModule.java b/briar-core/src/org/briarproject/properties/PropertiesModule.java
index e008146d23ba9ee1ea5365487cc4c5e241458ce5..e9f2fcf5801726e72acd6ea8c815be42c68cf738 100644
--- a/briar-core/src/org/briarproject/properties/PropertiesModule.java
+++ b/briar-core/src/org/briarproject/properties/PropertiesModule.java
@@ -2,15 +2,12 @@ package org.briarproject.properties;
 
 import org.briarproject.api.clients.ClientHelper;
 import org.briarproject.api.contact.ContactManager;
-import org.briarproject.api.data.BdfReaderFactory;
 import org.briarproject.api.data.MetadataEncoder;
 import org.briarproject.api.properties.TransportPropertyManager;
 import org.briarproject.api.sync.ValidationManager;
 import org.briarproject.api.system.Clock;
-import org.briarproject.contact.ContactModule;
-import org.briarproject.data.DataModule;
-import org.briarproject.sync.SyncModule;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import dagger.Module;
@@ -21,6 +18,11 @@ import static org.briarproject.properties.TransportPropertyManagerImpl.CLIENT_ID
 @Module
 public class PropertiesModule {
 
+	public static class EagerSingletons {
+		@Inject TransportPropertyValidator transportPropertyValidator;
+		@Inject TransportPropertyManager transportPropertyManager;
+	}
+
 	@Provides
 	@Singleton
 	TransportPropertyValidator getValidator(ValidationManager validationManager,
diff --git a/briar-core/src/org/briarproject/sync/SyncModule.java b/briar-core/src/org/briarproject/sync/SyncModule.java
index 6c286f8af4cb6a449de48b93122491b468a1d152..15d13ce66fc0174e188bc0bcd7ce2386cb90ef11 100644
--- a/briar-core/src/org/briarproject/sync/SyncModule.java
+++ b/briar-core/src/org/briarproject/sync/SyncModule.java
@@ -1,13 +1,9 @@
 package org.briarproject.sync;
 
 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.db.DatabaseExecutor;
 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.GroupFactory;
 import org.briarproject.api.sync.MessageFactory;
@@ -16,10 +12,6 @@ import org.briarproject.api.sync.PacketWriterFactory;
 import org.briarproject.api.sync.SyncSessionFactory;
 import org.briarproject.api.sync.ValidationManager;
 import org.briarproject.api.system.Clock;
-import org.briarproject.crypto.CryptoModule;
-import org.briarproject.db.DatabaseModule;
-import org.briarproject.event.EventModule;
-import org.briarproject.lifecycle.LifecycleModule;
 
 import java.util.concurrent.Executor;
 
@@ -32,6 +24,10 @@ import dagger.Provides;
 @Module
 public class SyncModule {
 
+	public static class EagerSingletons {
+		@Inject ValidationManager validationManager;
+	}
+
 	@Provides
 	GroupFactory provideGroupFactory(CryptoComponent crypto) {
 		return new GroupFactoryImpl(crypto);
diff --git a/briar-android/src/org/briarproject/system/AndroidSystemModule.java b/briar-core/src/org/briarproject/system/SystemModule.java
similarity index 61%
rename from briar-android/src/org/briarproject/system/AndroidSystemModule.java
rename to briar-core/src/org/briarproject/system/SystemModule.java
index 2cd79468cc1b923c799dc02cfdaa0e29690ba488..8a2304e2eacada63cb616384a89caab3f43c5c88 100644
--- a/briar-android/src/org/briarproject/system/AndroidSystemModule.java
+++ b/briar-core/src/org/briarproject/system/SystemModule.java
@@ -1,8 +1,5 @@
 package org.briarproject.system;
 
-
-import android.app.Application;
-
 import org.briarproject.api.system.Clock;
 import org.briarproject.api.system.LocationUtils;
 import org.briarproject.api.system.SeedProvider;
@@ -12,8 +9,7 @@ import dagger.Module;
 import dagger.Provides;
 
 @Module
-public class AndroidSystemModule {
-
+public class SystemModule {
 	@Provides
 	Clock provideClock() {
 		return new SystemClock();
@@ -25,13 +21,12 @@ public class AndroidSystemModule {
 	}
 
 	@Provides
-	SeedProvider provideSeedProvider(final Application app) {
-		return new AndroidSeedProvider(app);
+	public SeedProvider provideSeedProvider() {
+		return null;
 	}
 
 	@Provides
-	LocationUtils provideLocationUtils(final Application app) {
-		return new AndroidLocationUtils(app);
+	public LocationUtils provideLocationUtils() {
+		return null;
 	}
-
 }
diff --git a/briar-core/src/org/briarproject/transport/TransportModule.java b/briar-core/src/org/briarproject/transport/TransportModule.java
index 5a4ae89367449a46a113d2fcad02b344dc24cc06..d5819fbfcbe19f94b376f51dbac8db4fb4fd3d2b 100644
--- a/briar-core/src/org/briarproject/transport/TransportModule.java
+++ b/briar-core/src/org/briarproject/transport/TransportModule.java
@@ -7,9 +7,8 @@ import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamReaderFactory;
 import org.briarproject.api.transport.StreamWriterFactory;
-import org.briarproject.event.EventModule;
-import org.briarproject.lifecycle.LifecycleModule;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import dagger.Module;
@@ -18,6 +17,10 @@ import dagger.Provides;
 @Module
 public class TransportModule {
 
+	public static class EagerSingletons {
+		@Inject KeyManager keyManager;
+	}
+
 	@Provides
 	StreamReaderFactory provideStreamReaderFactory(
 			StreamDecrypterFactory streamDecrypterFactory) {