diff --git a/briar-core/src/org/briarproject/messaging/ReactiveOutgoingSession.java b/briar-core/src/org/briarproject/messaging/ReactiveOutgoingSession.java
index 3dc7d38c8988b0d22e8b1bd8ccd4e62f2ed77443..caf87129ffb080eac63086a8a86d2af1e44b7907 100644
--- a/briar-core/src/org/briarproject/messaging/ReactiveOutgoingSession.java
+++ b/briar-core/src/org/briarproject/messaging/ReactiveOutgoingSession.java
@@ -165,12 +165,22 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 			if(((MessageToRequestEvent) e).getContactId().equals(contactId))
 				dbExecutor.execute(new GenerateRequest());
 		} else if(e instanceof RemoteRetentionTimeUpdatedEvent) {
-			dbExecutor.execute(new GenerateRetentionAck());
+			RemoteRetentionTimeUpdatedEvent r =
+					(RemoteRetentionTimeUpdatedEvent) e;
+			if(r.getContactId().equals(contactId))
+				dbExecutor.execute(new GenerateRetentionAck());
 		} else if(e instanceof RemoteSubscriptionsUpdatedEvent) {
-			dbExecutor.execute(new GenerateSubscriptionAck());
-			dbExecutor.execute(new GenerateOffer());
+			RemoteSubscriptionsUpdatedEvent r =
+					(RemoteSubscriptionsUpdatedEvent) e;
+			if(r.getContactId().equals(contactId)) {
+				dbExecutor.execute(new GenerateSubscriptionAck());
+				dbExecutor.execute(new GenerateOffer());
+			}
 		} else if(e instanceof RemoteTransportsUpdatedEvent) {
-			dbExecutor.execute(new GenerateTransportAcks());
+			RemoteTransportsUpdatedEvent r =
+					(RemoteTransportsUpdatedEvent) e;
+			if(r.getContactId().equals(contactId))
+				dbExecutor.execute(new GenerateTransportAcks());
 		} else if(e instanceof TransportRemovedEvent) {
 			TransportRemovedEvent t = (TransportRemovedEvent) e;
 			if(ctx.getTransportId().equals(t.getTransportId())) {
@@ -184,6 +194,7 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 	private class GenerateAck implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			int maxMessages = packetWriter.getMaxMessagesForAck(Long.MAX_VALUE);
 			try {
 				Ack a = db.generateAck(contactId, maxMessages);
@@ -217,6 +228,7 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 	private class GenerateBatch implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				Collection<byte[]> b = db.generateRequestedBatch(contactId,
 						MAX_PACKET_LENGTH, maxLatency);
@@ -250,6 +262,7 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 	private class GenerateOffer implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			int maxMessages = packetWriter.getMaxMessagesForOffer(
 					Long.MAX_VALUE);
 			try {
@@ -284,6 +297,7 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 	private class GenerateRequest implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			int maxMessages = packetWriter.getMaxMessagesForRequest(
 					Long.MAX_VALUE);
 			try {
@@ -318,6 +332,7 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 	private class GenerateRetentionAck implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				RetentionAck a = db.generateRetentionAck(contactId);
 				if(LOG.isLoggable(INFO))
@@ -351,6 +366,7 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 	private class GenerateRetentionUpdate implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				RetentionUpdate u =
 						db.generateRetentionUpdate(contactId, maxLatency);
@@ -385,6 +401,7 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 	private class GenerateSubscriptionAck implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				SubscriptionAck a = db.generateSubscriptionAck(contactId);
 				if(LOG.isLoggable(INFO))
@@ -418,6 +435,7 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 	private class GenerateSubscriptionUpdate implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				SubscriptionUpdate u =
 						db.generateSubscriptionUpdate(contactId, maxLatency);
@@ -452,6 +470,7 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 	private class GenerateTransportAcks implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				Collection<TransportAck> acks =
 						db.generateTransportAcks(contactId);
@@ -485,6 +504,7 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 	private class GenerateTransportUpdates implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				Collection<TransportUpdate> t =
 						db.generateTransportUpdates(contactId, maxLatency);
diff --git a/briar-core/src/org/briarproject/messaging/SinglePassOutgoingSession.java b/briar-core/src/org/briarproject/messaging/SinglePassOutgoingSession.java
index 75f991317cf8b94e6f8b483b567902e1699190d3..f4c3195ae93145f4ca8b79193805aed0c52e7eda 100644
--- a/briar-core/src/org/briarproject/messaging/SinglePassOutgoingSession.java
+++ b/briar-core/src/org/briarproject/messaging/SinglePassOutgoingSession.java
@@ -121,6 +121,7 @@ class SinglePassOutgoingSession implements MessagingSession {
 	private class GenerateAck implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			int maxMessages = packetWriter.getMaxMessagesForAck(Long.MAX_VALUE);
 			try {
 				Ack a = db.generateAck(contactId, maxMessages);
@@ -155,6 +156,7 @@ class SinglePassOutgoingSession implements MessagingSession {
 	private class GenerateBatch implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				Collection<byte[]> b = db.generateBatch(contactId,
 						MAX_PACKET_LENGTH, maxLatency);
@@ -189,6 +191,7 @@ class SinglePassOutgoingSession implements MessagingSession {
 	private class GenerateRetentionAck implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				RetentionAck a = db.generateRetentionAck(contactId);
 				if(LOG.isLoggable(INFO))
@@ -223,6 +226,7 @@ class SinglePassOutgoingSession implements MessagingSession {
 	private class GenerateRetentionUpdate implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				RetentionUpdate u =
 						db.generateRetentionUpdate(contactId, maxLatency);
@@ -258,6 +262,7 @@ class SinglePassOutgoingSession implements MessagingSession {
 	private class GenerateSubscriptionAck implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				SubscriptionAck a = db.generateSubscriptionAck(contactId);
 				if(LOG.isLoggable(INFO))
@@ -292,6 +297,7 @@ class SinglePassOutgoingSession implements MessagingSession {
 	private class GenerateSubscriptionUpdate implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				SubscriptionUpdate u =
 						db.generateSubscriptionUpdate(contactId, maxLatency);
@@ -327,6 +333,7 @@ class SinglePassOutgoingSession implements MessagingSession {
 	private class GenerateTransportAcks implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				Collection<TransportAck> acks =
 						db.generateTransportAcks(contactId);
@@ -361,6 +368,7 @@ class SinglePassOutgoingSession implements MessagingSession {
 	private class GenerateTransportUpdates implements Runnable {
 
 		public void run() {
+			if(interrupted) return;
 			try {
 				Collection<TransportUpdate> t =
 						db.generateTransportUpdates(contactId, maxLatency);