diff --git a/briar-android/res/layout/list_item_msg_in.xml b/briar-android/res/layout/list_item_msg_in.xml
index d93d269e7796bbbc767bc020dd647888b9b1927c..614484e51fbd1af5de4681319c5132df67d98831 100644
--- a/briar-android/res/layout/list_item_msg_in.xml
+++ b/briar-android/res/layout/list_item_msg_in.xml
@@ -4,12 +4,20 @@
 	xmlns:tools="http://schemas.android.com/tools"
 	android:layout_width="match_parent"
 	android:layout_height="wrap_content"
-	android:orientation="vertical"
+	android:orientation="horizontal"
 	android:paddingRight="@dimen/margin_medium"
 	android:paddingEnd="@dimen/margin_medium"
 	android:paddingTop="@dimen/margin_small"
 	android:paddingBottom="@dimen/margin_small">
 
+	<im.delight.android.identicons.SymmetricIdenticon
+		android:id="@+id/msgIdenticon"
+		android:layout_width="@dimen/listitem_picture_size"
+		android:layout_height="@dimen/listitem_picture_size"
+		android:layout_marginLeft="@dimen/listitem_horizontal_margin"
+		android:layout_marginStart="@dimen/listitem_horizontal_margin"
+		/>
+
 	<RelativeLayout
 		android:id="@+id/msgLayout"
 		android:layout_width="wrap_content"
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
index 6b96389c8c8fbac2f62353b5c6c219fa5d618a4e..732d646532de80974385d46b800720521771c1ad 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
@@ -88,6 +88,7 @@ public class ConversationActivity extends BriarActivity
 	private volatile GroupId groupId = null;
 	private volatile ContactId contactId = null;
 	private volatile String contactName = null;
+	private volatile byte[] contactIdenticonKey = null;
 	private volatile boolean connected = false;
 
 	@Override
@@ -165,6 +166,7 @@ public class ConversationActivity extends BriarActivity
 					contactId = messagingManager.getContactId(groupId);
 					Contact contact = contactManager.getContact(contactId);
 					contactName = contact.getAuthor().getName();
+					contactIdenticonKey = contact.getAuthor().getId().getBytes();
 					connected = connectionRegistry.isConnected(contactId);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
@@ -192,6 +194,7 @@ public class ConversationActivity extends BriarActivity
 						actionBar.setSubtitle(getString(R.string.offline));
 					}
 				}
+				adapter.setIdenticonKey(contactIdenticonKey);
 			}
 		});
 	}
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
index 09509c0ee4cfd411672bea00da246de2a3598d4c..a1cf4d013d0ac88884e360223f7338d3b64b5919 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
@@ -14,6 +14,8 @@ import org.briarproject.R;
 import org.briarproject.api.messaging.PrivateMessageHeader;
 import org.briarproject.util.StringUtils;
 
+import im.delight.android.identicons.IdenticonView;
+
 import static android.support.v7.util.SortedList.INVALID_POSITION;
 
 class ConversationAdapter extends
@@ -70,11 +72,17 @@ class ConversationAdapter extends
 						}
 					});
 	private Context ctx;
+	private byte[] identiconKey;
 
 	public ConversationAdapter(Context context) {
 		ctx = context;
 	}
 
+	public void setIdenticonKey(byte[] key) {
+		this.identiconKey = key;
+		notifyDataSetChanged();
+	}
+
 	@Override
 	public int getItemViewType(int position) {
 		// return different type for incoming and outgoing (local) messages
@@ -119,18 +127,22 @@ class ConversationAdapter extends
 			} else {
 				ui.status.setImageResource(R.drawable.message_stored);
 			}
-		} else if (!header.isRead()) {
-			int left = ui.layout.getPaddingLeft();
-			int top = ui.layout.getPaddingTop();
-			int right = ui.layout.getPaddingRight();
-			int bottom = ui.layout.getPaddingBottom();
-
-			// show unread messages in different color to not miss them
-			ui.layout.setBackgroundResource(R.drawable.msg_in_unread);
-
-			// re-apply the previous padding due to bug in some Android versions
-			// see: https://code.google.com/p/android/issues/detail?id=17885
-			ui.layout.setPadding(left, top, right, bottom);
+		} else {
+			if (identiconKey != null)
+				ui.identicon.show(identiconKey);
+			if (!header.isRead()) {
+				int left = ui.layout.getPaddingLeft();
+				int top = ui.layout.getPaddingTop();
+				int right = ui.layout.getPaddingRight();
+				int bottom = ui.layout.getPaddingBottom();
+
+				// show unread messages in different color to not miss them
+				ui.layout.setBackgroundResource(R.drawable.msg_in_unread);
+
+				// re-apply the previous padding due to bug in some Android versions
+				// see: https://code.google.com/p/android/issues/detail?id=17885
+				ui.layout.setPadding(left, top, right, bottom);
+			}
 		}
 
 		if (item.getBody() == null) {
@@ -186,6 +198,7 @@ class ConversationAdapter extends
 		public TextView body;
 		public TextView date;
 		public ImageView status;
+		public IdenticonView identicon;
 
 		public MessageHolder(View v, int type) {
 			super(v);
@@ -197,6 +210,8 @@ class ConversationAdapter extends
 			// outgoing message (local)
 			if (type == MSG_OUT) {
 				status = (ImageView) v.findViewById(R.id.msgStatus);
+			} else {
+				identicon = (IdenticonView) v.findViewById(R.id.msgIdenticon);
 			}
 		}
 	}