diff --git a/src/net/sf/briar/android/AndroidExecutorImpl.java b/src/net/sf/briar/android/AndroidExecutorImpl.java
index fd3ac27c2bdba6fd4bd4915ed50e2072fb1ee1ec..7928e059df60f1d7ed7047f8d7938bd62cf34b7c 100644
--- a/src/net/sf/briar/android/AndroidExecutorImpl.java
+++ b/src/net/sf/briar/android/AndroidExecutorImpl.java
@@ -2,6 +2,7 @@ package net.sf.briar.android;
 
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.FutureTask;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -15,7 +16,7 @@ import com.google.inject.Inject;
 
 class AndroidExecutorImpl implements AndroidExecutor {
 
-	private static final int SHUTDOWN = 0, RUNNABLE = 1, CALLABLE = 2;
+	private static final int SHUTDOWN = 0, RUN = 1;
 
 	private final Runnable loop;
 	private final AtomicBoolean started = new AtomicBoolean(false);
@@ -45,20 +46,13 @@ class AndroidExecutorImpl implements AndroidExecutor {
 		}
 	}
 
-	public Future<Void> submit(Runnable r) {
-		startIfNecessary();
-		Future<Void> f = new FutureTask<Void>(r, null);
-		Message m = Message.obtain(handler, RUNNABLE, f);
-		handler.sendMessage(m);
-		return f;
-	}
-
-	public <V> Future<V> submit(Callable<V> c) {
+	public <V> V run(Callable<V> c) throws InterruptedException,
+	ExecutionException {
 		startIfNecessary();
 		Future<V> f = new FutureTask<V>(c);
-		Message m = Message.obtain(handler, RUNNABLE, f);
+		Message m = Message.obtain(handler, RUN, f);
 		handler.sendMessage(m);
-		return f;
+		return f.get();
 	}
 
 	public void shutdown() {
@@ -76,8 +70,7 @@ class AndroidExecutorImpl implements AndroidExecutor {
 			case SHUTDOWN:
 				Looper.myLooper().quit();
 				break;
-			case RUNNABLE:
-			case CALLABLE:
+			case RUN:
 				((FutureTask<?>) m.obj).run();
 				break;
 			default:
diff --git a/src/net/sf/briar/api/android/AndroidExecutor.java b/src/net/sf/briar/api/android/AndroidExecutor.java
index 3066a7b24c456a31d86fb726a5451346a3448d32..b950806aae6923c92260898928220ca7cff795f3 100644
--- a/src/net/sf/briar/api/android/AndroidExecutor.java
+++ b/src/net/sf/briar/api/android/AndroidExecutor.java
@@ -1,7 +1,7 @@
 package net.sf.briar.api.android;
 
 import java.util.concurrent.Callable;
-import java.util.concurrent.Future;
+import java.util.concurrent.ExecutionException;
 
 /**
  * Enables background threads to make Android API calls that must be made from
@@ -9,9 +9,8 @@ import java.util.concurrent.Future;
  */
 public interface AndroidExecutor {
 
-	Future<Void> submit(Runnable r);
-
-	<V> Future<V> submit(Callable<V> c);
+	/** Runs the given task on a thread with a message queue. */
+	<V> V run(Callable<V> c) throws InterruptedException, ExecutionException;
 
 	void shutdown();
 }
diff --git a/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java b/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java
index f93708e21c0297f2925b2343235fa1fd6ab23945..3d53d5595d574a7e223f526c7a7330e679802888 100644
--- a/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java
+++ b/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java
@@ -23,7 +23,6 @@ import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
-import java.util.concurrent.Future;
 import java.util.logging.Logger;
 
 import net.sf.briar.api.ContactId;
@@ -89,14 +88,12 @@ class DroidtoothPlugin implements DuplexPlugin {
 	public void start() throws IOException {
 		// BluetoothAdapter.getDefaultAdapter() must be called on a thread
 		// with a message queue, so submit it to the AndroidExecutor
-		Callable<BluetoothAdapter> c = new Callable<BluetoothAdapter>() {
-			public BluetoothAdapter call() throws Exception {
-				return BluetoothAdapter.getDefaultAdapter();
-			}			
-		};
-		Future<BluetoothAdapter> f = androidExecutor.submit(c);
 		try {
-			adapter = f.get();
+			adapter = androidExecutor.run(new Callable<BluetoothAdapter>() {
+				public BluetoothAdapter call() throws Exception {
+					return BluetoothAdapter.getDefaultAdapter();
+				}
+			});
 		} catch(InterruptedException e) {
 			throw new IOException(e.toString());
 		} catch(ExecutionException e) {