diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java
index 971c42df65bf421a6b7364abceea719d62cde703..4cc51ecb264fadb4b101ed41e243cbbdd5a478e1 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java
@@ -41,7 +41,6 @@ import static org.briarproject.briar.sharing.State.LOCAL_INVITED;
 import static org.briarproject.briar.sharing.State.LOCAL_LEFT;
 import static org.briarproject.briar.sharing.State.REMOTE_HANGING;
 import static org.briarproject.briar.sharing.State.REMOTE_INVITED;
-import static org.briarproject.briar.sharing.State.REMOTE_LEFT;
 import static org.briarproject.briar.sharing.State.SHARING;
 import static org.briarproject.briar.sharing.State.START;
 
@@ -74,7 +73,6 @@ abstract class ProtocolEngineImpl<S extends Shareable>
 			@Nullable String message, long timestamp) throws DbException {
 		switch (s.getState()) {
 			case START:
-			case REMOTE_LEFT:
 				return onLocalInvite(txn, s, message, timestamp);
 			case LOCAL_INVITED:
 			case REMOTE_INVITED:
@@ -133,7 +131,6 @@ abstract class ProtocolEngineImpl<S extends Shareable>
 			case REMOTE_INVITED:
 			case SHARING:
 			case LOCAL_LEFT:
-			case REMOTE_LEFT:
 			case REMOTE_HANGING:
 			case ERROR:
 				throw new ProtocolStateException(); // Invalid in these states
@@ -190,7 +187,6 @@ abstract class ProtocolEngineImpl<S extends Shareable>
 			case REMOTE_INVITED:
 			case SHARING:
 			case LOCAL_LEFT:
-			case REMOTE_LEFT:
 			case REMOTE_HANGING:
 			case ERROR:
 				throw new ProtocolStateException(); // Invalid in these states
@@ -232,8 +228,6 @@ abstract class ProtocolEngineImpl<S extends Shareable>
 				return onLocalLeave(txn, s, REMOTE_HANGING);
 			case SHARING:
 				return onLocalLeave(txn, s, LOCAL_LEFT);
-			case REMOTE_LEFT:
-				return onLocalLeave(txn, s, START);
 			case START:
 			case LOCAL_INVITED:
 			case LOCAL_LEFT:
@@ -283,7 +277,6 @@ abstract class ProtocolEngineImpl<S extends Shareable>
 				return onRemoteInvite(txn, s, m, false, LOCAL_LEFT);
 			case LOCAL_INVITED:
 			case SHARING:
-			case REMOTE_LEFT:
 				return abort(txn, s); // Invalid in these states
 			case ERROR:
 				return s; // Ignored in this state
@@ -356,7 +349,6 @@ abstract class ProtocolEngineImpl<S extends Shareable>
 			case LOCAL_INVITED:
 			case SHARING:
 			case LOCAL_LEFT:
-			case REMOTE_LEFT:
 				return abort(txn, s); // Invalid in these states
 			case ERROR:
 				return s; // Ignored in this state
@@ -410,7 +402,6 @@ abstract class ProtocolEngineImpl<S extends Shareable>
 			case LOCAL_INVITED:
 			case SHARING:
 			case LOCAL_LEFT:
-			case REMOTE_LEFT:
 				return abort(txn, s); // Invalid in these states
 			case ERROR:
 				return s; // Ignored in this state
@@ -454,14 +445,13 @@ abstract class ProtocolEngineImpl<S extends Shareable>
 			LeaveMessage m) throws DbException, FormatException {
 		switch (s.getState()) {
 			case LOCAL_INVITED:
-				return onRemoteLeaveWhenInvited(txn, s, m, START);
+				return onRemoteLeaveWhenInvited(txn, s, m);
 			case LOCAL_LEFT:
-				return onRemoteLeave(txn, s, m, START);
+				return onRemoteLeave(txn, s, m);
 			case SHARING:
 				return onRemoteLeaveWhenSharing(txn, s, m);
 			case START:
 			case REMOTE_INVITED:
-			case REMOTE_LEFT:
 			case REMOTE_HANGING:
 				return abort(txn, s); // Invalid in these states
 			case ERROR:
@@ -472,10 +462,9 @@ abstract class ProtocolEngineImpl<S extends Shareable>
 	}
 
 	private Session onRemoteLeaveWhenInvited(Transaction txn, Session s,
-			LeaveMessage m, State nextState)
-			throws DbException, FormatException {
+			LeaveMessage m) throws DbException, FormatException {
 		// Carry out normal leave validation and operation
-		Session session = onRemoteLeave(txn, s, m, nextState);
+		Session session = onRemoteLeave(txn, s, m);
 		// Mark any invite messages in the session unavailable to answer
 		if (session.getState() != ERROR)
 			markInvitesUnavailableToAnswer(txn, s);
@@ -483,8 +472,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
 		return session;
 	}
 
-	private Session onRemoteLeave(Transaction txn, Session s,
-			LeaveMessage m, State nextState)
+	private Session onRemoteLeave(Transaction txn, Session s, LeaveMessage m)
 			throws DbException, FormatException {
 		// The dependency, if any, must be the last remote message
 		if (!isValidDependency(s, m.getPreviousMessageId()))
@@ -498,7 +486,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
 			txn.attach(e);
 		}
 		// Move to the next state
-		return new Session(nextState, s.getContactGroupId(), s.getShareableId(),
+		return new Session(START, s.getContactGroupId(), s.getShareableId(),
 				s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(),
 				s.getInviteTimestamp());
 	}
@@ -506,7 +494,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
 	private Session onRemoteLeaveWhenSharing(Transaction txn, Session s,
 			LeaveMessage m) throws DbException, FormatException {
 		// Carry out normal leave validation and operation
-		Session session = onRemoteLeave(txn, s, m, REMOTE_LEFT);
+		Session session = onRemoteLeave(txn, s, m);
 		// Stop sharing the shareable with the contact
 		if (session.getState() != ERROR)
 			setShareableVisibility(txn, s, INVISIBLE);
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/State.java b/briar-core/src/main/java/org/briarproject/briar/sharing/State.java
index e4ba53501f7da275fb51c67b0a53418f7f718429..21c26c52978d4ace5b6b1d2bba9a18a9e87124a5 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/State.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/State.java
@@ -10,7 +10,7 @@ import javax.annotation.concurrent.Immutable;
 enum State {
 
 	START(0), LOCAL_INVITED(1), REMOTE_INVITED(2), SHARING(3), LOCAL_LEFT(4),
-	REMOTE_LEFT(5),	REMOTE_HANGING(6), ERROR(7);
+	REMOTE_HANGING(5), ERROR(6);
 
 	private final int value;
 
@@ -23,7 +23,7 @@ enum State {
 	}
 
 	public boolean canInvite() {
-		return this == START || this == REMOTE_LEFT;
+		return this == START;
 	}
 
 	static State fromValue(int value) throws FormatException {