diff --git a/briar-api/src/net/sf/briar/api/messaging/VerificationExecutor.java b/briar-api/src/net/sf/briar/api/crypto/CryptoExecutor.java
similarity index 66%
rename from briar-api/src/net/sf/briar/api/messaging/VerificationExecutor.java
rename to briar-api/src/net/sf/briar/api/crypto/CryptoExecutor.java
index 18e7da9661fda51b47e9e4198dfbd99a732ac30b..346ed893873589647d31d04d1e78085016433883 100644
--- a/briar-api/src/net/sf/briar/api/messaging/VerificationExecutor.java
+++ b/briar-api/src/net/sf/briar/api/crypto/CryptoExecutor.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.messaging;
+package net.sf.briar.api.crypto;
 
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
@@ -8,8 +8,8 @@ import java.lang.annotation.Target;
 
 import com.google.inject.BindingAnnotation;
 
-/** Annotation for injecting the executor for message verification tasks. */
+/** Annotation for injecting the executor for long-running crypto tasks. */
 @BindingAnnotation
 @Target({ PARAMETER })
 @Retention(RUNTIME)
-public @interface VerificationExecutor {}
+public @interface CryptoExecutor {}
diff --git a/briar-core/src/net/sf/briar/crypto/CryptoModule.java b/briar-core/src/net/sf/briar/crypto/CryptoModule.java
index 517111b601dbc49bb54e725919f95df32950ca06..d006d07c8ca4627acd035eba6fa119c1b3f67500 100644
--- a/briar-core/src/net/sf/briar/crypto/CryptoModule.java
+++ b/briar-core/src/net/sf/briar/crypto/CryptoModule.java
@@ -1,15 +1,38 @@
 package net.sf.briar.crypto;
 
+import java.util.concurrent.Executor;
+
 import net.sf.briar.api.crypto.CryptoComponent;
+import net.sf.briar.api.crypto.CryptoExecutor;
+import net.sf.briar.util.BoundedExecutor;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Singleton;
 
 public class CryptoModule extends AbstractModule {
 
+	// FIXME: Determine suitable values for these constants empirically
+
+	/**
+	 * The maximum number of tasks that can be queued for execution before
+	 * submitting another task will block.
+	 */
+	private static final int MAX_QUEUED_EXECUTOR_TASKS = 10;
+
+	/** The minimum number of executor threads to keep in the pool. */
+	private static final int MIN_EXECUTOR_THREADS = 1;
+
+	/** The maximum number of executor threads. */
+	private static final int MAX_EXECUTOR_THREADS =
+			Runtime.getRuntime().availableProcessors();
+
 	@Override
 	protected void configure() {
 		bind(CryptoComponent.class).to(
 				CryptoComponentImpl.class).in(Singleton.class);
+		// The executor is bounded, so tasks must be independent and short-lived
+		bind(Executor.class).annotatedWith(CryptoExecutor.class).toInstance(
+				new BoundedExecutor(MAX_QUEUED_EXECUTOR_TASKS,
+						MIN_EXECUTOR_THREADS, MAX_EXECUTOR_THREADS));
 	}
 }
diff --git a/briar-core/src/net/sf/briar/messaging/MessagingModule.java b/briar-core/src/net/sf/briar/messaging/MessagingModule.java
index 573a3f32b39b548b7f791c74c266f4314732b7a7..c98dd04675ef925d8646987cf149d5646871ffc8 100644
--- a/briar-core/src/net/sf/briar/messaging/MessagingModule.java
+++ b/briar-core/src/net/sf/briar/messaging/MessagingModule.java
@@ -1,7 +1,5 @@
 package net.sf.briar.messaging;
 
-import java.util.concurrent.Executor;
-
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.messaging.Author;
 import net.sf.briar.api.messaging.AuthorFactory;
@@ -13,30 +11,13 @@ import net.sf.briar.api.messaging.PacketReaderFactory;
 import net.sf.briar.api.messaging.PacketWriterFactory;
 import net.sf.briar.api.messaging.SubscriptionUpdate;
 import net.sf.briar.api.messaging.UnverifiedMessage;
-import net.sf.briar.api.messaging.VerificationExecutor;
 import net.sf.briar.api.serial.StructReader;
-import net.sf.briar.util.BoundedExecutor;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
 
 public class MessagingModule extends AbstractModule {
 
-	// FIXME: Determine suitable values for these constants empirically
-
-	/**
-	 * The maximum number of verification tasks that can be queued for
-	 * execution before submitting another task will block.
-	 */
-	private static final int MAX_QUEUED_VERIFIER_TASKS = 10;
-
-	/** The minimum number of verification threads to keep in the pool. */
-	private static final int MIN_VERIFIER_THREADS = 1;
-
-	/** The maximum number of verification threads. */
-	private static final int MAX_VERIFIER_THREADS =
-			Runtime.getRuntime().availableProcessors();
-
 	@Override
 	protected void configure() {
 		bind(AuthorFactory.class).to(AuthorFactoryImpl.class);
@@ -45,11 +26,6 @@ public class MessagingModule extends AbstractModule {
 		bind(MessageVerifier.class).to(MessageVerifierImpl.class);
 		bind(PacketReaderFactory.class).to(PacketReaderFactoryImpl.class);
 		bind(PacketWriterFactory.class).to(PacketWriterFactoryImpl.class);
-		// The executor is bounded, so tasks must be independent and short-lived
-		bind(Executor.class).annotatedWith(
-				VerificationExecutor.class).toInstance(
-						new BoundedExecutor(MAX_QUEUED_VERIFIER_TASKS,
-								MIN_VERIFIER_THREADS, MAX_VERIFIER_THREADS));
 	}
 
 	@Provides
diff --git a/briar-core/src/net/sf/briar/messaging/duplex/DuplexConnection.java b/briar-core/src/net/sf/briar/messaging/duplex/DuplexConnection.java
index 310c4d304c9d14ae9e42fc354f52bebf2827a252..9b56a720bff76a68937105d613f304699ed65431 100644
--- a/briar-core/src/net/sf/briar/messaging/duplex/DuplexConnection.java
+++ b/briar-core/src/net/sf/briar/messaging/duplex/DuplexConnection.java
@@ -23,16 +23,17 @@ import java.util.logging.Logger;
 
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.FormatException;
+import net.sf.briar.api.crypto.CryptoExecutor;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.db.event.ContactRemovedEvent;
 import net.sf.briar.api.db.event.DatabaseEvent;
 import net.sf.briar.api.db.event.DatabaseListener;
-import net.sf.briar.api.db.event.MessageExpiredEvent;
 import net.sf.briar.api.db.event.LocalSubscriptionsUpdatedEvent;
 import net.sf.briar.api.db.event.LocalTransportsUpdatedEvent;
 import net.sf.briar.api.db.event.MessageAddedEvent;
+import net.sf.briar.api.db.event.MessageExpiredEvent;
 import net.sf.briar.api.db.event.MessageReceivedEvent;
 import net.sf.briar.api.db.event.RatingChangedEvent;
 import net.sf.briar.api.db.event.RemoteRetentionTimeUpdatedEvent;
@@ -56,7 +57,6 @@ import net.sf.briar.api.messaging.TransportAck;
 import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.messaging.TransportUpdate;
 import net.sf.briar.api.messaging.UnverifiedMessage;
-import net.sf.briar.api.messaging.VerificationExecutor;
 import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReader;
@@ -97,7 +97,7 @@ abstract class DuplexConnection implements DatabaseListener {
 	private volatile PacketWriter writer = null;
 
 	DuplexConnection(@DatabaseExecutor Executor dbExecutor,
-			@VerificationExecutor Executor verificationExecutor,
+			@CryptoExecutor Executor verificationExecutor,
 			MessageVerifier messageVerifier, DatabaseComponent db,
 			ConnectionRegistry connRegistry,
 			ConnectionReaderFactory connReaderFactory,
diff --git a/briar-core/src/net/sf/briar/messaging/duplex/DuplexConnectionFactoryImpl.java b/briar-core/src/net/sf/briar/messaging/duplex/DuplexConnectionFactoryImpl.java
index b23476890a2f2b725092de44e766d776c738630a..2c98cbf690327c548a1629b04932aa8df3a6f020 100644
--- a/briar-core/src/net/sf/briar/messaging/duplex/DuplexConnectionFactoryImpl.java
+++ b/briar-core/src/net/sf/briar/messaging/duplex/DuplexConnectionFactoryImpl.java
@@ -6,6 +6,7 @@ import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
 import net.sf.briar.api.ContactId;
+import net.sf.briar.api.crypto.CryptoExecutor;
 import net.sf.briar.api.crypto.KeyManager;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
@@ -13,7 +14,6 @@ import net.sf.briar.api.messaging.MessageVerifier;
 import net.sf.briar.api.messaging.PacketReaderFactory;
 import net.sf.briar.api.messaging.PacketWriterFactory;
 import net.sf.briar.api.messaging.TransportId;
-import net.sf.briar.api.messaging.VerificationExecutor;
 import net.sf.briar.api.messaging.duplex.DuplexConnectionFactory;
 import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.api.transport.ConnectionContext;
@@ -40,7 +40,7 @@ class DuplexConnectionFactoryImpl implements DuplexConnectionFactory {
 
 	@Inject
 	DuplexConnectionFactoryImpl(@DatabaseExecutor Executor dbExecutor,
-			@VerificationExecutor Executor verificationExecutor,
+			@CryptoExecutor Executor verificationExecutor,
 			MessageVerifier messageVerifier, DatabaseComponent db,
 			KeyManager keyManager, ConnectionRegistry connRegistry,
 			ConnectionReaderFactory connReaderFactory,
diff --git a/briar-core/src/net/sf/briar/messaging/duplex/IncomingDuplexConnection.java b/briar-core/src/net/sf/briar/messaging/duplex/IncomingDuplexConnection.java
index 64314943b395e0b1ba21d64b9f82c3d26874b2e4..08e955af9b4f4e9111ab1a4d3dbc10aef70043c4 100644
--- a/briar-core/src/net/sf/briar/messaging/duplex/IncomingDuplexConnection.java
+++ b/briar-core/src/net/sf/briar/messaging/duplex/IncomingDuplexConnection.java
@@ -3,12 +3,12 @@ package net.sf.briar.messaging.duplex;
 import java.io.IOException;
 import java.util.concurrent.Executor;
 
+import net.sf.briar.api.crypto.CryptoExecutor;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
 import net.sf.briar.api.messaging.MessageVerifier;
 import net.sf.briar.api.messaging.PacketReaderFactory;
 import net.sf.briar.api.messaging.PacketWriterFactory;
-import net.sf.briar.api.messaging.VerificationExecutor;
 import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReader;
@@ -20,7 +20,7 @@ import net.sf.briar.api.transport.ConnectionWriterFactory;
 class IncomingDuplexConnection extends DuplexConnection {
 
 	IncomingDuplexConnection(@DatabaseExecutor Executor dbExecutor,
-			@VerificationExecutor Executor verificationExecutor,
+			@CryptoExecutor Executor verificationExecutor,
 			MessageVerifier messageVerifier, DatabaseComponent db,
 			ConnectionRegistry connRegistry,
 			ConnectionReaderFactory connReaderFactory,
diff --git a/briar-core/src/net/sf/briar/messaging/duplex/OutgoingDuplexConnection.java b/briar-core/src/net/sf/briar/messaging/duplex/OutgoingDuplexConnection.java
index dd24410e6f55d0b5c028c7b2e3d2befa25a57772..2a852a45c14ce4b78a6daf361c0e8b7684d9988a 100644
--- a/briar-core/src/net/sf/briar/messaging/duplex/OutgoingDuplexConnection.java
+++ b/briar-core/src/net/sf/briar/messaging/duplex/OutgoingDuplexConnection.java
@@ -3,12 +3,12 @@ package net.sf.briar.messaging.duplex;
 import java.io.IOException;
 import java.util.concurrent.Executor;
 
+import net.sf.briar.api.crypto.CryptoExecutor;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
 import net.sf.briar.api.messaging.MessageVerifier;
 import net.sf.briar.api.messaging.PacketReaderFactory;
 import net.sf.briar.api.messaging.PacketWriterFactory;
-import net.sf.briar.api.messaging.VerificationExecutor;
 import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReader;
@@ -20,7 +20,7 @@ import net.sf.briar.api.transport.ConnectionWriterFactory;
 class OutgoingDuplexConnection extends DuplexConnection {
 
 	OutgoingDuplexConnection(@DatabaseExecutor Executor dbExecutor,
-			@VerificationExecutor Executor verificationExecutor,
+			@CryptoExecutor Executor verificationExecutor,
 			MessageVerifier messageVerifier, DatabaseComponent db,
 			ConnectionRegistry connRegistry,
 			ConnectionReaderFactory connReaderFactory,
diff --git a/briar-core/src/net/sf/briar/messaging/simplex/IncomingSimplexConnection.java b/briar-core/src/net/sf/briar/messaging/simplex/IncomingSimplexConnection.java
index 9339616c36dd0c0738e67e6d487c9f6e71ea5a6c..bac3930cabc0cfca536f688a8b7f40e23e38c766 100644
--- a/briar-core/src/net/sf/briar/messaging/simplex/IncomingSimplexConnection.java
+++ b/briar-core/src/net/sf/briar/messaging/simplex/IncomingSimplexConnection.java
@@ -10,6 +10,7 @@ import java.util.logging.Logger;
 
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.FormatException;
+import net.sf.briar.api.crypto.CryptoExecutor;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
 import net.sf.briar.api.db.DbException;
@@ -26,7 +27,6 @@ import net.sf.briar.api.messaging.TransportAck;
 import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.messaging.TransportUpdate;
 import net.sf.briar.api.messaging.UnverifiedMessage;
-import net.sf.briar.api.messaging.VerificationExecutor;
 import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReader;
@@ -51,7 +51,7 @@ class IncomingSimplexConnection {
 	private final TransportId transportId;
 
 	IncomingSimplexConnection(@DatabaseExecutor Executor dbExecutor,
-			@VerificationExecutor Executor verificationExecutor,
+			@CryptoExecutor Executor verificationExecutor,
 			MessageVerifier messageVerifier, DatabaseComponent db,
 			ConnectionRegistry connRegistry,
 			ConnectionReaderFactory connReaderFactory,
diff --git a/briar-core/src/net/sf/briar/messaging/simplex/SimplexConnectionFactoryImpl.java b/briar-core/src/net/sf/briar/messaging/simplex/SimplexConnectionFactoryImpl.java
index 7a3f1c33722cf150680618279f450234dbd299c6..5764c512b3a47610988bcf12fc4d5d80d872e633 100644
--- a/briar-core/src/net/sf/briar/messaging/simplex/SimplexConnectionFactoryImpl.java
+++ b/briar-core/src/net/sf/briar/messaging/simplex/SimplexConnectionFactoryImpl.java
@@ -6,6 +6,7 @@ import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
 import net.sf.briar.api.ContactId;
+import net.sf.briar.api.crypto.CryptoExecutor;
 import net.sf.briar.api.crypto.KeyManager;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
@@ -13,7 +14,6 @@ import net.sf.briar.api.messaging.MessageVerifier;
 import net.sf.briar.api.messaging.PacketReaderFactory;
 import net.sf.briar.api.messaging.PacketWriterFactory;
 import net.sf.briar.api.messaging.TransportId;
-import net.sf.briar.api.messaging.VerificationExecutor;
 import net.sf.briar.api.messaging.simplex.SimplexConnectionFactory;
 import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
 import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
@@ -41,7 +41,7 @@ class SimplexConnectionFactoryImpl implements SimplexConnectionFactory {
 
 	@Inject
 	SimplexConnectionFactoryImpl(@DatabaseExecutor Executor dbExecutor,
-			@VerificationExecutor Executor verificationExecutor,
+			@CryptoExecutor Executor verificationExecutor,
 			MessageVerifier messageVerifier, DatabaseComponent db,
 			KeyManager keyManager, ConnectionRegistry connRegistry,
 			ConnectionReaderFactory connReaderFactory,