diff --git a/src/net/sf/briar/android/AndroidExecutorImpl.java b/src/net/sf/briar/android/AndroidExecutorImpl.java
index 7928e059df60f1d7ed7047f8d7938bd62cf34b7c..3cc4e2e206a73e1c181d4410911279761bbc38a6 100644
--- a/src/net/sf/briar/android/AndroidExecutorImpl.java
+++ b/src/net/sf/briar/android/AndroidExecutorImpl.java
@@ -38,7 +38,7 @@ class AndroidExecutorImpl implements AndroidExecutor {
 
 	private void startIfNecessary() {
 		if(started.getAndSet(true)) return;
-		new Thread(loop).start();
+		new Thread(loop, "AndroidExecutor").start();
 		try {
 			startLatch.await();
 		} catch(InterruptedException e) {
diff --git a/src/net/sf/briar/invitation/Connector.java b/src/net/sf/briar/invitation/Connector.java
index 1aed16e97e4bc83f2aed9a6f0e5cbff901a965a8..e1adf6b2f6e7cf624ad16b1d79a457a0e6c1c691 100644
--- a/src/net/sf/briar/invitation/Connector.java
+++ b/src/net/sf/briar/invitation/Connector.java
@@ -44,6 +44,7 @@ abstract class Connector extends Thread {
 	Connector(CryptoComponent crypto, ReaderFactory readerFactory,
 			WriterFactory writerFactory, ConnectorGroup group,
 			DuplexPlugin plugin, PseudoRandom random) {
+		super("Connector");
 		this.crypto = crypto;
 		this.readerFactory = readerFactory;
 		this.writerFactory = writerFactory;
diff --git a/src/net/sf/briar/invitation/ConnectorGroup.java b/src/net/sf/briar/invitation/ConnectorGroup.java
index 5c800411c7b85dd18336b1afc24ca91085eb3752..86352ec86491978eefdfda47b5f0026c40cb8844 100644
--- a/src/net/sf/briar/invitation/ConnectorGroup.java
+++ b/src/net/sf/briar/invitation/ConnectorGroup.java
@@ -52,6 +52,7 @@ class ConnectorGroup extends Thread implements InvitationTask {
 			ReaderFactory readerFactory, WriterFactory writerFactory,
 			PluginManager pluginManager, int handle, int localInvitationCode,
 			int remoteInvitationCode) {
+		super("ConnectorGroup");
 		this.invitationManager = invitationManager;
 		this.crypto = crypto;
 		this.readerFactory = readerFactory;
diff --git a/src/net/sf/briar/lifecycle/ShutdownManagerImpl.java b/src/net/sf/briar/lifecycle/ShutdownManagerImpl.java
index fa6eb7833fdb04f31be15f71bcc75be30ad7275c..bc8bd052851f2cf6957db3b70ee5e7bed476e862 100644
--- a/src/net/sf/briar/lifecycle/ShutdownManagerImpl.java
+++ b/src/net/sf/briar/lifecycle/ShutdownManagerImpl.java
@@ -24,7 +24,7 @@ class ShutdownManagerImpl implements ShutdownManager {
 	}
 
 	protected Thread createThread(Runnable r) {
-		return new Thread(r);
+		return new Thread(r, "ShutdownManager");
 	}
 
 	public synchronized boolean removeShutdownHook(int handle) {
diff --git a/src/net/sf/briar/lifecycle/WindowsShutdownManagerImpl.java b/src/net/sf/briar/lifecycle/WindowsShutdownManagerImpl.java
index 677744832eac3dab3a0dba817e6bc6aee35f892f..7c011e13aed42b79366509a87add967659198cfe 100644
--- a/src/net/sf/briar/lifecycle/WindowsShutdownManagerImpl.java
+++ b/src/net/sf/briar/lifecycle/WindowsShutdownManagerImpl.java
@@ -90,6 +90,10 @@ class WindowsShutdownManagerImpl extends ShutdownManagerImpl {
 
 	private class EventLoop extends Thread {
 
+		private EventLoop() {
+			super("EventLoop");
+		}
+
 		@Override
 		public void run() {			
 			try {
@@ -140,7 +144,7 @@ class WindowsShutdownManagerImpl extends ShutdownManagerImpl {
 		private final AtomicBoolean called = new AtomicBoolean(false);
 
 		private StartOnce(Runnable r) {
-			super(r);
+			super(r, "ShutdownManager");
 		}
 
 		@Override
diff --git a/src/net/sf/briar/plugins/PollerImpl.java b/src/net/sf/briar/plugins/PollerImpl.java
index 138421f57bfaee14d710f8f69bfc1d5e92abc42f..3448070de90124e9826814965519ec7c28a5e8c7 100644
--- a/src/net/sf/briar/plugins/PollerImpl.java
+++ b/src/net/sf/briar/plugins/PollerImpl.java
@@ -34,7 +34,7 @@ class PollerImpl implements Poller, Runnable {
 
 	public synchronized void start(Collection<Plugin> plugins) {
 		for(Plugin plugin : plugins) schedule(plugin);
-		new Thread(this).start();
+		new Thread(this, "Poller").start();
 	}
 
 	private synchronized void schedule(Plugin plugin) {
diff --git a/src/net/sf/briar/protocol/duplex/DuplexConnectionFactoryImpl.java b/src/net/sf/briar/protocol/duplex/DuplexConnectionFactoryImpl.java
index 3c3c5c49907d4952c62fd1ce9c4f584b6e24a32a..c005162d39c4351a0bf2236e2eb5dbeef0f686ee 100644
--- a/src/net/sf/briar/protocol/duplex/DuplexConnectionFactoryImpl.java
+++ b/src/net/sf/briar/protocol/duplex/DuplexConnectionFactoryImpl.java
@@ -66,13 +66,13 @@ class DuplexConnectionFactoryImpl implements DuplexConnectionFactory {
 				conn.write();
 			}
 		};
-		new Thread(write).start();
+		new Thread(write, "DuplexConnectionWriter").start();
 		Runnable read = new Runnable() {
 			public void run() {
 				conn.read();
 			}
 		};
-		new Thread(read).start();
+		new Thread(read, "DuplexConnectionReader").start();
 	}
 
 	public void createOutgoingConnection(ContactId c, TransportId t,
@@ -92,12 +92,12 @@ class DuplexConnectionFactoryImpl implements DuplexConnectionFactory {
 				conn.write();
 			}
 		};
-		new Thread(write).start();
+		new Thread(write, "DuplexConnectionWriter").start();
 		Runnable read = new Runnable() {
 			public void run() {
 				conn.read();
 			}
 		};
-		new Thread(read).start();
+		new Thread(read, "DuplexConnectionReader").start();
 	}
 }
diff --git a/src/net/sf/briar/protocol/simplex/SimplexConnectionFactoryImpl.java b/src/net/sf/briar/protocol/simplex/SimplexConnectionFactoryImpl.java
index 02b3497911baf43d796c59f5fc101e53ca34751c..e8cb98768dec51804e7827b06bacd1372c4b2e48 100644
--- a/src/net/sf/briar/protocol/simplex/SimplexConnectionFactoryImpl.java
+++ b/src/net/sf/briar/protocol/simplex/SimplexConnectionFactoryImpl.java
@@ -66,7 +66,7 @@ class SimplexConnectionFactoryImpl implements SimplexConnectionFactory {
 				conn.read();
 			}
 		};
-		new Thread(read).start();
+		new Thread(read, "SimplexConnectionReader").start();
 	}
 
 	public void createOutgoingConnection(ContactId c, TransportId t,
@@ -84,6 +84,6 @@ class SimplexConnectionFactoryImpl implements SimplexConnectionFactory {
 				conn.write();
 			}
 		};
-		new Thread(write).start();
+		new Thread(write, "SimplexConnectionWriter").start();
 	}
 }