diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml
index 1df0b4897ad53800926576f5c861e6c86ecbc1f1..db7361d45181e3cee9ec8524448e7c0d4f92c232 100644
--- a/briar-android/res/values/strings.xml
+++ b/briar-android/res/values/strings.xml
@@ -111,6 +111,8 @@
     <string name="notify_sound_setting_disabled">None</string>
     <string name="choose_ringtone_title">Choose ringtone</string>
     <string name="step">Step %1$d/%2$d</string>
+    <string name="online">Online</string>
+    <string name="offline">Offline</string>
 
     <!-- Dialogs -->
     <string name="dialog_title_lost_password">Lost password</string>
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
index 828ef3b9fb882ce958bffee1c4973d77f4d0ab24..c4f0ca8ef90c008ce4e86b95ddfcb855018d8d4d 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
@@ -48,6 +48,8 @@ import org.briarproject.api.db.MessageHeader.State;
 import org.briarproject.api.db.NoSuchContactException;
 import org.briarproject.api.db.NoSuchMessageException;
 import org.briarproject.api.db.NoSuchSubscriptionException;
+import org.briarproject.api.event.ContactConnectedEvent;
+import org.briarproject.api.event.ContactDisconnectedEvent;
 import org.briarproject.api.event.ContactRemovedEvent;
 import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventBus;
@@ -61,12 +63,14 @@ import org.briarproject.api.messaging.GroupId;
 import org.briarproject.api.messaging.Message;
 import org.briarproject.api.messaging.MessageFactory;
 import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.plugins.ConnectionRegistry;
 import org.briarproject.util.StringUtils;
 
 import android.content.Intent;
 import android.content.res.Resources;
 import android.graphics.drawable.ColorDrawable;
 import android.os.Bundle;
+import android.support.v7.app.ActionBar;
 import android.text.InputType;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -86,6 +90,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
 			Logger.getLogger(ConversationActivity.class.getName());
 
 	@Inject private AndroidNotificationManager notificationManager;
+	@Inject private ConnectionRegistry connectionRegistry;
 	@Inject @CryptoExecutor private Executor cryptoExecutor;
 	private Map<MessageId, byte[]> bodyCache = new HashMap<MessageId, byte[]>();
 	private TextView empty = null;
@@ -104,6 +109,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
 	private volatile GroupId groupId = null;
 	private volatile Group group = null;
 	private volatile AuthorId localAuthorId = null;
+	private volatile boolean connected;
 
 	@Override
 	public void onCreate(Bundle state) {
@@ -205,12 +211,13 @@ implements EventListener, OnClickListener, OnItemClickListener {
 					localAuthorId = contact.getLocalAuthorId();
 					groupId = db.getInboxGroupId(contactId);
 					group = db.getGroup(groupId);
+					connected = connectionRegistry.isConnected(contactId);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO)) {
 						LOG.info("Loading contact and group took "
 								+ duration + " ms");
 					}
-					displayContactName();
+					displayContactDetails();
 				} catch (NoSuchContactException e) {
 					finishOnUiThread();
 				} catch (NoSuchSubscriptionException e) {
@@ -223,10 +230,18 @@ implements EventListener, OnClickListener, OnItemClickListener {
 		});
 	}
 
-	private void displayContactName() {
+	private void displayContactDetails() {
 		runOnUiThread(new Runnable() {
 			public void run() {
-				setTitle(contactName);
+				ActionBar actionBar = getSupportActionBar();
+				if (actionBar != null) {
+					actionBar.setTitle(contactName);
+					if (connected) {
+						actionBar.setSubtitle(getString(R.string.online));
+					} else {
+						actionBar.setSubtitle(getString(R.string.offline));
+					}
+				}
 			}
 		});
 	}
@@ -256,7 +271,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
 		runOnUiThread(new Runnable() {
 			public void run() {
 				loading.setVisibility(GONE);
-				setTitle(contactName);
+				displayContactDetails();
 				sendButton.setEnabled(true);
 				adapter.clear();
 				if (headers.isEmpty()) {
@@ -396,6 +411,20 @@ implements EventListener, OnClickListener, OnItemClickListener {
 				LOG.info("Messages acked");
 				markMessages(m.getMessageIds(), State.DELIVERED);
 			}
+		} else if (e instanceof ContactConnectedEvent) {
+			ContactConnectedEvent c = (ContactConnectedEvent) e;
+			if (c.getContactId().equals(contactId)) {
+				LOG.info("Contact connected");
+				connected = true;
+				displayContactDetails();
+			}
+		} else if (e instanceof ContactDisconnectedEvent) {
+			ContactDisconnectedEvent c = (ContactDisconnectedEvent) e;
+			if (c.getContactId().equals(contactId)) {
+				LOG.info("Contact disconnected");
+				connected = false;
+				displayContactDetails();
+			}
 		}
 	}