diff --git a/libs/javax.inject-1.jar b/libs/javax.inject.jar
similarity index 62%
rename from libs/javax.inject-1.jar
rename to libs/javax.inject.jar
index b2a9d0bf7bd463a6361898b36f010edd05c0cf6e..a9dfb86d27a3b18b646dad07f15b0d28d729cef7 100644
Binary files a/libs/javax.inject-1.jar and b/libs/javax.inject.jar differ
diff --git a/libs/roboguice-2.0.jar b/libs/roboguice-2.0.jar
new file mode 100644
index 0000000000000000000000000000000000000000..bdb7d08b8d7db70b7a1cea4327ff9abe1902741d
Binary files /dev/null and b/libs/roboguice-2.0.jar differ
diff --git a/res/values/roboguice.xml b/res/values/roboguice.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c7d58a7a3ddf0e68b2e921fd4fa59790a83c9254
--- /dev/null
+++ b/res/values/roboguice.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources> 
+	<string-array name="roboguice_modules">
+		<item>net.sf.briar.HelloWorldModule</item>
+		<item>net.sf.briar.android.AndroidModule</item>
+		<item>net.sf.briar.android.invitation.AndroidInvitationModule</item>
+		<item>net.sf.briar.clock.ClockModule</item>
+		<item>net.sf.briar.crypto.CryptoModule</item>
+		<item>net.sf.briar.db.DatabaseModule</item>
+		<item>net.sf.briar.lifecycle.LifecycleModule</item>
+		<item>net.sf.briar.plugins.PluginsModule</item>
+		<item>net.sf.briar.protocol.ProtocolModule</item>
+		<item>net.sf.briar.protocol.duplex.DuplexProtocolModule</item>
+		<item>net.sf.briar.protocol.simplex.SimplexProtocolModule</item>
+		<item>net.sf.briar.serial.SerialModule</item>
+		<item>net.sf.briar.transport.TransportModule</item>
+	</string-array>
+</resources>
\ No newline at end of file
diff --git a/src/net/sf/briar/HelloWorldModule.java b/src/net/sf/briar/HelloWorldModule.java
index a0fa22c7f89a6b65cc1874c32ff2d50b61de3f39..5fe4fad758d86eaab80c6500223b50a2e1cdbdf7 100644
--- a/src/net/sf/briar/HelloWorldModule.java
+++ b/src/net/sf/briar/HelloWorldModule.java
@@ -1,56 +1,56 @@
 package net.sf.briar;
 
+import static android.content.Context.MODE_PRIVATE;
+
 import java.io.File;
 
 import net.sf.briar.api.crypto.Password;
 import net.sf.briar.api.db.DatabaseConfig;
 import net.sf.briar.api.ui.UiCallback;
+import android.app.Application;
 
 import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
 
 public class HelloWorldModule extends AbstractModule {
 
-	private final DatabaseConfig config;
-	private final UiCallback callback;
+	@Override
+	protected void configure() {
+		bind(UiCallback.class).toInstance(new UiCallback() {
 
-	public HelloWorldModule(final File dir) {
-		final Password password = new Password() {
+			public int showChoice(String[] options, String... message) {
+				return -1;
+			}
 
-			public char[] getPassword() {
-				return "foo bar".toCharArray();
+			public boolean showConfirmationMessage(String... message) {
+				return false;
 			}
-		};
-		config = new DatabaseConfig() {
+
+			public void showMessage(String... message) {}			
+		});
+	}
+
+	@Provides @Singleton
+	DatabaseConfig getDatabaseConfig(final Application app) {
+		return new DatabaseConfig() {
 
 			public File getDataDirectory() {
-				return dir;
+				return app.getApplicationContext().getDir("db", MODE_PRIVATE);
 			}
 
 			public Password getPassword() {
-				return password;
+				return new Password() {
+
+					public char[] getPassword() {
+						return "foo bar".toCharArray();
+					}
+				};
 			}
 
 			public long getMaxSize() {
 				return Long.MAX_VALUE;
 			}
 		};
-		callback = new UiCallback() {
-
-			public int showChoice(String[] options, String... message) {
-				return -1;
-			}
-
-			public boolean showConfirmationMessage(String... message) {
-				return false;
-			}
-
-			public void showMessage(String... message) {}			
-		};
-	}
-
-	@Override
-	protected void configure() {
-		bind(DatabaseConfig.class).toInstance(config);
-		bind(UiCallback.class).toInstance(callback);
 	}
 }
diff --git a/src/net/sf/briar/HelloWorldService.java b/src/net/sf/briar/HelloWorldService.java
index 6dbbb30790aa9c003cd122fe9d814384ca4344b9..ef2dec27c8e8fb2391ea8cbba6698aa860cd0fad 100644
--- a/src/net/sf/briar/HelloWorldService.java
+++ b/src/net/sf/briar/HelloWorldService.java
@@ -3,40 +3,27 @@ package net.sf.briar;
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.logging.Logger;
 
-import net.sf.briar.android.AndroidModule;
 import net.sf.briar.api.crypto.KeyManager;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.plugins.PluginManager;
-import net.sf.briar.clock.ClockModule;
-import net.sf.briar.crypto.CryptoModule;
-import net.sf.briar.db.DatabaseModule;
-import net.sf.briar.lifecycle.LifecycleModule;
-import net.sf.briar.plugins.PluginsModule;
-import net.sf.briar.protocol.ProtocolModule;
-import net.sf.briar.protocol.duplex.DuplexProtocolModule;
-import net.sf.briar.protocol.simplex.SimplexProtocolModule;
-import net.sf.briar.serial.SerialModule;
-import net.sf.briar.transport.TransportModule;
 import android.app.Service;
 import android.content.Intent;
 import android.os.IBinder;
 
-import com.google.inject.Guice;
-import com.google.inject.Injector;
+import com.google.inject.Inject;
 
 public class HelloWorldService extends Service implements Runnable {
 
 	private static final Logger LOG =
 			Logger.getLogger(HelloWorldService.class.getName());
 
-	private DatabaseComponent db = null;
-	private KeyManager keyManager = null;
-	private PluginManager pluginManager = null;
+	@Inject private DatabaseComponent db;
+	@Inject private KeyManager keyManager;
+	@Inject private PluginManager pluginManager;
 
 	@Override
 	public void onCreate() {
@@ -56,16 +43,6 @@ public class HelloWorldService extends Service implements Runnable {
 	}
 
 	public void run() {
-		File dir = getApplicationContext().getDir("db", MODE_PRIVATE);
-		Injector i = Guice.createInjector(new HelloWorldModule(dir),
-				new AndroidModule(), new ClockModule(), new CryptoModule(),
-				new DatabaseModule(), new LifecycleModule(),
-				new PluginsModule(), new ProtocolModule(),
-				new DuplexProtocolModule(), new SimplexProtocolModule(),
-				new SerialModule(), new TransportModule());
-		db = i.getInstance(DatabaseComponent.class);
-		keyManager = i.getInstance(KeyManager.class);
-		pluginManager = i.getInstance(PluginManager.class);
 		try {
 			// Start...
 			if(LOG.isLoggable(INFO)) LOG.info("Starting");
diff --git a/src/net/sf/briar/android/invitation/AndroidInvitationModule.java b/src/net/sf/briar/android/invitation/AndroidInvitationModule.java
new file mode 100644
index 0000000000000000000000000000000000000000..c917e2256b53be9418b3a600dd3d5ffc63e835b0
--- /dev/null
+++ b/src/net/sf/briar/android/invitation/AndroidInvitationModule.java
@@ -0,0 +1,14 @@
+package net.sf.briar.android.invitation;
+
+import javax.inject.Singleton;
+
+import com.google.inject.AbstractModule;
+
+public class AndroidInvitationModule extends AbstractModule {
+
+	@Override
+	protected void configure() {
+		bind(InvitationManager.class).to(InvitationManagerImpl.class).in(
+				Singleton.class);
+	}
+}
diff --git a/src/net/sf/briar/android/invitation/ConfirmationCodeActivity.java b/src/net/sf/briar/android/invitation/ConfirmationCodeActivity.java
index 9b696762ab07089abb01f28594dc6a0881e385d8..220548b58019b071d9b503b7cd39ccad58c05603 100644
--- a/src/net/sf/briar/android/invitation/ConfirmationCodeActivity.java
+++ b/src/net/sf/briar/android/invitation/ConfirmationCodeActivity.java
@@ -6,7 +6,7 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.widget.LinearLayout.HORIZONTAL;
 import static android.widget.LinearLayout.VERTICAL;
 import net.sf.briar.R;
-import android.app.Activity;
+import roboguice.activity.RoboActivity;
 import android.content.Intent;
 import android.content.res.Resources;
 import android.os.Bundle;
@@ -15,9 +15,13 @@ import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
-public class ConfirmationCodeActivity extends Activity
+import com.google.inject.Inject;
+
+public class ConfirmationCodeActivity extends RoboActivity
 implements CodeEntryListener {
 
+	@Inject private InvitationManager manager;
+
 	@Override
 	public void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
@@ -49,8 +53,7 @@ implements CodeEntryListener {
 		TextView code = new TextView(this);
 		code.setGravity(CENTER_HORIZONTAL);
 		code.setTextSize(50);
-		InvitationManager im = InvitationManagerFactory.getInvitationManager();
-		code.setText(im.getLocalConfirmationCode());
+		code.setText(manager.getLocalConfirmationCode());
 		layout.addView(code);
 
 		CodeEntryWidget codeEntry = new CodeEntryWidget(this);
@@ -62,9 +65,7 @@ implements CodeEntryListener {
 	}
 
 	public void codeEntered(String code) {
-		InvitationManager im = InvitationManagerFactory.getInvitationManager();
-		String remoteConfirmationCode = im.getRemoteConfirmationCode();
-		if(code.equals(String.valueOf(remoteConfirmationCode))) {
+		if(code.equals(manager.getRemoteConfirmationCode())) {
 			Intent intent = new Intent(this, WaitForContactActivity.class);
 			intent.putExtras(getIntent().getExtras());
 			startActivity(intent);
diff --git a/src/net/sf/briar/android/invitation/ConnectionActivity.java b/src/net/sf/briar/android/invitation/ConnectionActivity.java
index 7049f856cbd6453976893ab454d9749e478a9802..5ed8b80d38141492394d2d0d1bb63ab60c205f87 100644
--- a/src/net/sf/briar/android/invitation/ConnectionActivity.java
+++ b/src/net/sf/briar/android/invitation/ConnectionActivity.java
@@ -6,7 +6,7 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.widget.LinearLayout.HORIZONTAL;
 import static android.widget.LinearLayout.VERTICAL;
 import net.sf.briar.R;
-import android.app.Activity;
+import roboguice.activity.RoboActivity;
 import android.content.Intent;
 import android.content.res.Resources;
 import android.os.Bundle;
@@ -15,10 +15,12 @@ import android.widget.LinearLayout;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
-public class ConnectionActivity extends Activity implements ConnectionListener {
+import com.google.inject.Inject;
 
-	private final InvitationManager manager =
-			InvitationManagerFactory.getInvitationManager();
+public class ConnectionActivity extends RoboActivity
+implements ConnectionListener {
+
+	@Inject private InvitationManager manager;
 
 	@Override
 	public void onCreate(Bundle savedInstanceState) {
diff --git a/src/net/sf/briar/android/invitation/InvitationCodeActivity.java b/src/net/sf/briar/android/invitation/InvitationCodeActivity.java
index 230771a163f55f60fa5c5d847b933b87c4c1a3fe..8f3bb1b41b5df7df5a286ade4970c13a86803db1 100644
--- a/src/net/sf/briar/android/invitation/InvitationCodeActivity.java
+++ b/src/net/sf/briar/android/invitation/InvitationCodeActivity.java
@@ -4,7 +4,7 @@ import static android.view.Gravity.CENTER_HORIZONTAL;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.widget.LinearLayout.VERTICAL;
 import net.sf.briar.R;
-import android.app.Activity;
+import roboguice.activity.RoboActivity;
 import android.content.Intent;
 import android.content.res.Resources;
 import android.os.Bundle;
@@ -12,11 +12,12 @@ import android.view.ViewGroup.LayoutParams;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
-public class InvitationCodeActivity extends Activity
+import com.google.inject.Inject;
+
+public class InvitationCodeActivity extends RoboActivity
 implements CodeEntryListener {
 
-	private final InvitationManager manager =
-			InvitationManagerFactory.getInvitationManager();
+	@Inject private InvitationManager manager;
 
 	@Override
 	public void onCreate(Bundle savedInstanceState) {
diff --git a/src/net/sf/briar/android/invitation/InvitationManagerFactory.java b/src/net/sf/briar/android/invitation/InvitationManagerFactory.java
deleted file mode 100644
index a38ac435ade195507a70316a2890c7da29afe586..0000000000000000000000000000000000000000
--- a/src/net/sf/briar/android/invitation/InvitationManagerFactory.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package net.sf.briar.android.invitation;
-
-class InvitationManagerFactory {
-
-	private static final Object LOCK = new Object();
-	private static InvitationManager instance = null; // Locking: lock
-
-	static InvitationManager getInvitationManager() {
-		synchronized(LOCK) {
-			if(instance == null) instance = new InvitationManagerImpl();
-			return instance;
-		}
-	}
-}
diff --git a/src/net/sf/briar/android/invitation/WaitForContactActivity.java b/src/net/sf/briar/android/invitation/WaitForContactActivity.java
index e6884c67ad452c8b05739c37e79968be49867636..7d93aea62d9bf78387d3e001c4294487ac42e821 100644
--- a/src/net/sf/briar/android/invitation/WaitForContactActivity.java
+++ b/src/net/sf/briar/android/invitation/WaitForContactActivity.java
@@ -6,7 +6,7 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.widget.LinearLayout.HORIZONTAL;
 import static android.widget.LinearLayout.VERTICAL;
 import net.sf.briar.R;
-import android.app.Activity;
+import roboguice.activity.RoboActivity;
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.ViewGroup.LayoutParams;
@@ -15,9 +15,13 @@ import android.widget.LinearLayout;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
-public class WaitForContactActivity extends Activity
+import com.google.inject.Inject;
+
+public class WaitForContactActivity extends RoboActivity
 implements ConfirmationListener {
 
+	@Inject private InvitationManager manager;
+
 	@Override
 	public void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
@@ -49,8 +53,7 @@ implements ConfirmationListener {
 		TextView code = new TextView(this);
 		code.setGravity(CENTER_HORIZONTAL);
 		code.setTextSize(50);
-		InvitationManager im = InvitationManagerFactory.getInvitationManager();
-		code.setText(im.getLocalConfirmationCode());
+		code.setText(manager.getLocalConfirmationCode());
 		layout.addView(code);
 
 		innerLayout = new LinearLayout(this);
@@ -69,7 +72,7 @@ implements ConfirmationListener {
 
 		setContentView(layout);
 
-		im.startConfirmationWorker(this);
+		manager.startConfirmationWorker(this);
 	}
 
 	public void confirmationReceived() {