diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java
index 2d22e8f4e9706b43b0129aafd374c6cd44a68404..0714b8d478ed87e7e001681e6c51c9a9f91ad3f9 100644
--- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java
+++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java
@@ -10,7 +10,6 @@ import org.briarproject.bramble.api.plugin.BackoffFactory;
 import org.briarproject.bramble.api.plugin.PluginConfig;
 import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory;
 import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory;
-import org.briarproject.bramble.api.reporting.DevReporter;
 import org.briarproject.bramble.api.system.AndroidExecutor;
 import org.briarproject.bramble.api.system.LocationUtils;
 import org.briarproject.bramble.api.system.Scheduler;
@@ -38,15 +37,14 @@ public class AndroidPluginModule {
 			@Scheduler ScheduledExecutorService scheduler,
 			AndroidExecutor androidExecutor, SecureRandom random,
 			SocketFactory torSocketFactory, BackoffFactory backoffFactory,
-			Application app, LocationUtils locationUtils, DevReporter reporter,
-			EventBus eventBus) {
+			Application app, LocationUtils locationUtils, EventBus eventBus) {
 		Context appContext = app.getApplicationContext();
 		DuplexPluginFactory bluetooth =
 				new AndroidBluetoothPluginFactory(ioExecutor, androidExecutor,
 						appContext, random, eventBus, backoffFactory);
 		DuplexPluginFactory tor = new TorPluginFactory(ioExecutor, scheduler,
-				appContext, locationUtils, reporter, eventBus,
-				torSocketFactory, backoffFactory);
+				appContext, locationUtils, eventBus, torSocketFactory,
+				backoffFactory);
 		DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor,
 				scheduler, backoffFactory, appContext);
 		Collection<DuplexPluginFactory> duplex =
diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
index e68a0e1f9fd2545b6c7ea8f798f0fcb8676b162c..b0ccdab86f64b112fd95441562117dfdbcecef48 100644
--- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
+++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
@@ -32,11 +32,9 @@ import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
 import org.briarproject.bramble.api.plugin.duplex.DuplexPluginCallback;
 import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
 import org.briarproject.bramble.api.properties.TransportProperties;
-import org.briarproject.bramble.api.reporting.DevReporter;
 import org.briarproject.bramble.api.settings.Settings;
 import org.briarproject.bramble.api.settings.event.SettingsUpdatedEvent;
 import org.briarproject.bramble.api.system.LocationUtils;
-import org.briarproject.bramble.util.AndroidUtils;
 import org.briarproject.bramble.util.IoUtils;
 import org.briarproject.bramble.util.StringUtils;
 
@@ -114,7 +112,6 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
 	private final ScheduledExecutorService scheduler;
 	private final Context appContext;
 	private final LocationUtils locationUtils;
-	private final DevReporter reporter;
 	private final SocketFactory torSocketFactory;
 	private final Backoff backoff;
 	private final DuplexPluginCallback callback;
@@ -136,14 +133,13 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
 
 	TorPlugin(Executor ioExecutor, ScheduledExecutorService scheduler,
 			Context appContext, LocationUtils locationUtils,
-			DevReporter reporter, SocketFactory torSocketFactory,
-			Backoff backoff, DuplexPluginCallback callback,
-			String architecture, int maxLatency, int maxIdleTime) {
+			SocketFactory torSocketFactory, Backoff backoff,
+			DuplexPluginCallback callback, String architecture,
+			int maxLatency, int maxIdleTime) {
 		this.ioExecutor = ioExecutor;
 		this.scheduler = scheduler;
 		this.appContext = appContext;
 		this.locationUtils = locationUtils;
-		this.reporter = reporter;
 		this.torSocketFactory = torSocketFactory;
 		this.backoff = backoff;
 		this.callback = callback;
@@ -389,14 +385,6 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
 		}
 	}
 
-	private void sendDevReports() {
-		ioExecutor.execute(() -> {
-			// TODO: Trigger this with a TransportEnabledEvent
-			File reportDir = AndroidUtils.getReportDir(appContext);
-			reporter.sendReports(reportDir);
-		});
-	}
-
 	private void bind() {
 		ioExecutor.execute(() -> {
 			// If there's already a port number stored in config, reuse it
@@ -624,10 +612,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
 				connectionStatus.getAndSetCircuitBuilt()) {
 			LOG.info("First circuit built");
 			backoff.reset();
-			if (isRunning()) {
-				sendDevReports();
-				callback.transportEnabled();
-			}
+			if (isRunning()) callback.transportEnabled();
 		}
 	}
 
@@ -656,10 +641,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
 		if (severity.equals("NOTICE") && msg.startsWith("Bootstrapped 100%")) {
 			connectionStatus.setBootstrapped();
 			backoff.reset();
-			if (isRunning()) {
-				sendDevReports();
-				callback.transportEnabled();
-			}
+			if (isRunning()) callback.transportEnabled();
 		}
 	}
 
diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPluginFactory.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPluginFactory.java
index 4ad1e8f3ac6255b55ac8b7a357a93001b5b7d04d..1f24300b50c840bf4bd7df5342c4f68eed9d2cf0 100644
--- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPluginFactory.java
+++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPluginFactory.java
@@ -12,7 +12,6 @@ import org.briarproject.bramble.api.plugin.TransportId;
 import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
 import org.briarproject.bramble.api.plugin.duplex.DuplexPluginCallback;
 import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory;
-import org.briarproject.bramble.api.reporting.DevReporter;
 import org.briarproject.bramble.api.system.LocationUtils;
 import org.briarproject.bramble.util.AndroidUtils;
 
@@ -40,21 +39,18 @@ public class TorPluginFactory implements DuplexPluginFactory {
 	private final ScheduledExecutorService scheduler;
 	private final Context appContext;
 	private final LocationUtils locationUtils;
-	private final DevReporter reporter;
 	private final EventBus eventBus;
 	private final SocketFactory torSocketFactory;
 	private final BackoffFactory backoffFactory;
 
 	public TorPluginFactory(Executor ioExecutor,
 			ScheduledExecutorService scheduler, Context appContext,
-			LocationUtils locationUtils, DevReporter reporter,
-			EventBus eventBus, SocketFactory torSocketFactory,
-			BackoffFactory backoffFactory) {
+			LocationUtils locationUtils, EventBus eventBus,
+			SocketFactory torSocketFactory, BackoffFactory backoffFactory) {
 		this.ioExecutor = ioExecutor;
 		this.scheduler = scheduler;
 		this.appContext = appContext;
 		this.locationUtils = locationUtils;
-		this.reporter = reporter;
 		this.eventBus = eventBus;
 		this.torSocketFactory = torSocketFactory;
 		this.backoffFactory = backoffFactory;
@@ -94,7 +90,7 @@ public class TorPluginFactory implements DuplexPluginFactory {
 		Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
 				MAX_POLLING_INTERVAL, BACKOFF_BASE);
 		TorPlugin plugin = new TorPlugin(ioExecutor, scheduler, appContext,
-				locationUtils, reporter, torSocketFactory, backoff, callback,
+				locationUtils, torSocketFactory, backoff, callback,
 				architecture, MAX_LATENCY, MAX_IDLE_TIME);
 		eventBus.addListener(plugin);
 		return plugin;
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevConfig.java b/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevConfig.java
index 3418299af1321ed2a4ae4199e346f441ce1d73c3..a97cfc4fa1473741fdecade239633ae21a31bf00 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevConfig.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevConfig.java
@@ -3,10 +3,14 @@ package org.briarproject.bramble.api.reporting;
 import org.briarproject.bramble.api.crypto.PublicKey;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 
+import java.io.File;
+
 @NotNullByDefault
 public interface DevConfig {
 
 	PublicKey getDevPublicKey();
 
 	String getDevOnionAddress();
+
+	File getReportDir();
 }
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevReporter.java b/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevReporter.java
index 1d671525ff649c02d2acb827dd683157ebeda6fb..9ef25b5f5811e77b0095b066c1866c4270d495f0 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevReporter.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevReporter.java
@@ -23,8 +23,6 @@ public interface DevReporter {
 
 	/**
 	 * Sends any reports previously stored on disk.
-	 *
-	 * @param reportDir the directory where reports are stored.
 	 */
-	void sendReports(File reportDir);
+	void sendReports();
 }
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java
index 367e7785f06f264896d024a89b9798a5b9b6bd16..6ef1af577e1e0b6906f77a903bddb3acd741dccd 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java
@@ -7,6 +7,7 @@ import org.briarproject.bramble.identity.IdentityModule;
 import org.briarproject.bramble.lifecycle.LifecycleModule;
 import org.briarproject.bramble.plugin.PluginModule;
 import org.briarproject.bramble.properties.PropertiesModule;
+import org.briarproject.bramble.reporting.ReportingModule;
 import org.briarproject.bramble.sync.SyncModule;
 import org.briarproject.bramble.system.SystemModule;
 import org.briarproject.bramble.transport.TransportModule;
@@ -28,6 +29,8 @@ public interface BrambleCoreEagerSingletons {
 
 	void inject(PropertiesModule.EagerSingletons init);
 
+	void inject(ReportingModule.EagerSingletons init);
+
 	void inject(SyncModule.EagerSingletons init);
 
 	void inject(SystemModule.EagerSingletons init);
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java
index f4ece8bd4903288608ac5b8cf3594de90bfa5340..07bc14eea22b5f93e68734cacd3bf778a9912148 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java
@@ -59,6 +59,7 @@ public class BrambleCoreModule {
 		c.inject(new LifecycleModule.EagerSingletons());
 		c.inject(new PluginModule.EagerSingletons());
 		c.inject(new PropertiesModule.EagerSingletons());
+		c.inject(new ReportingModule.EagerSingletons());
 		c.inject(new SyncModule.EagerSingletons());
 		c.inject(new SystemModule.EagerSingletons());
 		c.inject(new TransportModule.EagerSingletons());
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReporterImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReporterImpl.java
index c4e2bad64c76adcd5eacedfd7e42324c2f144f51..aac2391e4c3ac6c35843cc1586436fef6a7bda08 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReporterImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReporterImpl.java
@@ -1,7 +1,12 @@
 package org.briarproject.bramble.reporting;
 
 import org.briarproject.bramble.api.crypto.CryptoComponent;
+import org.briarproject.bramble.api.event.Event;
+import org.briarproject.bramble.api.event.EventListener;
+import org.briarproject.bramble.api.lifecycle.IoExecutor;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
+import org.briarproject.bramble.api.plugin.TorConstants;
+import org.briarproject.bramble.api.plugin.event.TransportEnabledEvent;
 import org.briarproject.bramble.api.reporting.DevConfig;
 import org.briarproject.bramble.api.reporting.DevReporter;
 import org.briarproject.bramble.util.IoUtils;
@@ -18,17 +23,19 @@ import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.net.Socket;
+import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
+import javax.inject.Inject;
 import javax.net.SocketFactory;
 
 import static java.util.logging.Level.WARNING;
 
 @Immutable
 @NotNullByDefault
-class DevReporterImpl implements DevReporter {
+class DevReporterImpl implements DevReporter, EventListener {
 
 	private static final Logger LOG =
 			Logger.getLogger(DevReporterImpl.class.getName());
@@ -36,12 +43,15 @@ class DevReporterImpl implements DevReporter {
 	private static final int SOCKET_TIMEOUT = 30 * 1000; // 30 seconds
 	private static final int LINE_LENGTH = 70;
 
+	private final Executor ioExecutor;
 	private final CryptoComponent crypto;
 	private final DevConfig devConfig;
 	private final SocketFactory torSocketFactory;
 
-	DevReporterImpl(CryptoComponent crypto, DevConfig devConfig,
-			SocketFactory torSocketFactory) {
+	@Inject
+	DevReporterImpl(@IoExecutor Executor ioExecutor, CryptoComponent crypto,
+			DevConfig devConfig, SocketFactory torSocketFactory) {
+		this.ioExecutor = ioExecutor;
 		this.crypto = crypto;
 		this.devConfig = devConfig;
 		this.torSocketFactory = torSocketFactory;
@@ -63,6 +73,7 @@ class DevReporterImpl implements DevReporter {
 	@Override
 	public void encryptReportToFile(File reportDir, String filename,
 			String report) throws FileNotFoundException {
+		LOG.info("Encrypting report to file");
 		byte[] plaintext = StringUtils.toUtf8(report);
 		byte[] ciphertext = crypto.encryptToKey(devConfig.getDevPublicKey(),
 				plaintext);
@@ -82,7 +93,17 @@ class DevReporterImpl implements DevReporter {
 	}
 
 	@Override
-	public void sendReports(File reportDir) {
+	public void eventOccurred(Event e) {
+		if (e instanceof TransportEnabledEvent) {
+			TransportEnabledEvent t = (TransportEnabledEvent) e;
+			if (t.getTransportId().equals(TorConstants.ID))
+				ioExecutor.execute(this::sendReports);
+		}
+	}
+
+	@Override
+	public void sendReports() {
+		File reportDir = devConfig.getReportDir();
 		File[] reports = reportDir.listFiles();
 		if (reports == null || reports.length == 0)
 			return; // No reports to send
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/reporting/ReportingModule.java b/bramble-core/src/main/java/org/briarproject/bramble/reporting/ReportingModule.java
index 1996ea86b7371cead85901be4f2d215ec35fd296..cf3389402931f344a0f68b8013d9a457ff514a77 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/reporting/ReportingModule.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/reporting/ReportingModule.java
@@ -1,10 +1,10 @@
 package org.briarproject.bramble.reporting;
 
-import org.briarproject.bramble.api.crypto.CryptoComponent;
-import org.briarproject.bramble.api.reporting.DevConfig;
+import org.briarproject.bramble.api.event.EventBus;
 import org.briarproject.bramble.api.reporting.DevReporter;
 
-import javax.net.SocketFactory;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 
 import dagger.Module;
 import dagger.Provides;
@@ -12,9 +12,16 @@ import dagger.Provides;
 @Module
 public class ReportingModule {
 
+	public static class EagerSingletons {
+		@Inject
+		DevReporter devReporter;
+	}
+
 	@Provides
-	DevReporter provideDevReporter(CryptoComponent crypto,
-			DevConfig devConfig, SocketFactory torSocketFactory) {
-		return new DevReporterImpl(crypto, devConfig, torSocketFactory);
+	@Singleton
+	DevReporter provideDevReporter(DevReporterImpl devReporter,
+			EventBus eventBus) {
+		eventBus.addListener(devReporter);
+		return devReporter;
 	}
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
index 16c340e70f0998effa8475efd5b9e31ea338c40a..f8fdf0dfa23e4555c83985935dbaf1ecf1bace06 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
@@ -14,6 +14,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.bramble.api.reporting.DevConfig;
 import org.briarproject.bramble.api.ui.UiCallback;
+import org.briarproject.bramble.util.AndroidUtils;
 import org.briarproject.bramble.util.StringUtils;
 import org.briarproject.briar.api.android.AndroidNotificationManager;
 import org.briarproject.briar.api.android.DozeWatchdog;
@@ -96,7 +97,7 @@ public class AppModule {
 
 	@Provides
 	@Singleton
-	DevConfig provideDevConfig(CryptoComponent crypto) {
+	DevConfig provideDevConfig(Application app, CryptoComponent crypto) {
 		@NotNullByDefault
 		DevConfig devConfig = new DevConfig() {
 
@@ -114,6 +115,11 @@ public class AppModule {
 			public String getDevOnionAddress() {
 				return DEV_ONION_ADDRESS;
 			}
+
+			@Override
+			public File getReportDir() {
+				return AndroidUtils.getReportDir(app.getApplicationContext());
+			}
 		};
 		return devConfig;
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportSender.java b/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportSender.java
index 69654f983ea993bd87659546e759c532110881a1..e5d62cdd8a8fca3007396e9d3b187306a21995f5 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportSender.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportSender.java
@@ -6,7 +6,7 @@ import android.support.annotation.NonNull;
 import org.acra.collector.CrashReportData;
 import org.acra.sender.ReportSender;
 import org.acra.sender.ReportSenderException;
-import org.acra.util.JSONReportBuilder;
+import org.acra.util.JSONReportBuilder.JSONReportException;
 import org.briarproject.bramble.api.reporting.DevReporter;
 import org.briarproject.bramble.util.AndroidUtils;
 import org.briarproject.briar.android.AndroidComponent;
@@ -37,7 +37,7 @@ public class BriarReportSender implements ReportSender {
 		String crashReport;
 		try {
 			crashReport = errorContent.toJSON().toString();
-		} catch (JSONReportBuilder.JSONReportException e) {
+		} catch (JSONReportException e) {
 			throw new ReportSenderException("Couldn't create JSON", e);
 		}
 		try {
diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java
index 20a59f21a1f4cb0a0aea7a4f82c00025da6e869d..108f4884967f809278a1ebfd0d26ca0defbc4c39 100644
--- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java
+++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java
@@ -66,12 +66,17 @@ interface IntroductionIntegrationTestComponent
 	void inject(IntroductionIntegrationTest init);
 
 	void inject(MessageEncoderParserIntegrationTest init);
+
 	void inject(SessionEncoderParserIntegrationTest init);
+
 	void inject(IntroductionCryptoIntegrationTest init);
 
 	MessageEncoder getMessageEncoder();
+
 	MessageParser getMessageParser();
+
 	SessionParser getSessionParser();
+
 	IntroductionCrypto getIntroductionCrypto();
 
 }
diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java
index 9d86e58d97f841cf01cd1339f8749bc71eeb448f..a3b74d4c25ce56f3e83f69de5e79d95b39b51999 100644
--- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java
+++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java
@@ -39,10 +39,7 @@ import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager
 import org.briarproject.briar.blog.BlogModule;
 import org.briarproject.briar.client.BriarClientModule;
 import org.briarproject.briar.forum.ForumModule;
-import org.briarproject.briar.introduction.IntroductionCryptoIntegrationTest;
 import org.briarproject.briar.introduction.IntroductionModule;
-import org.briarproject.briar.introduction.MessageEncoderParserIntegrationTest;
-import org.briarproject.briar.introduction.SessionEncoderParserIntegrationTest;
 import org.briarproject.briar.messaging.MessagingModule;
 import org.briarproject.briar.privategroup.PrivateGroupModule;
 import org.briarproject.briar.privategroup.invitation.GroupInvitationModule;