diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml
index 53ce958da8eaf502249f316bb3f27652913365d1..0e11dbd84edba8755df020b1673bcfa49151f61c 100644
--- a/briar-android/AndroidManifest.xml
+++ b/briar-android/AndroidManifest.xml
@@ -159,6 +159,15 @@
 				/>
 		</activity>
 
+		<activity
+			android:name=".android.blogs.BlogActivity"
+			android:parentActivityName=".android.NavDrawerActivity">
+			<meta-data
+				android:name="android.support.PARENT_ACTIVITY"
+				android:value=".android.NavDrawerActivity"
+				/>
+		</activity>
+
 		<activity
 			android:name=".android.identity.CreateIdentityActivity"
 			android:label="@string/new_identity_title"
diff --git a/briar-android/res/layout/activity_blog.xml b/briar-android/res/layout/activity_blog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c0ac19fbe0eac0b76817a2c7bc9bb8566f6aa840
--- /dev/null
+++ b/briar-android/res/layout/activity_blog.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<org.briarproject.android.util.BriarRecyclerView
+	android:id="@+id/postList"
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:app="http://schemas.android.com/apk/res-auto"
+	xmlns:tools="http://schemas.android.com/tools"
+	android:layout_width="match_parent"
+	android:layout_height="match_parent"
+	app:scrollToEnd="false"
+	tools:context=".android.blogs.BlogActivity"/>
diff --git a/briar-android/res/layout/list_item_blog_post.xml b/briar-android/res/layout/list_item_blog_post.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4243d5ebffff91002fc706dceeed7181214a4acf
--- /dev/null
+++ b/briar-android/res/layout/list_item_blog_post.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:tools="http://schemas.android.com/tools"
+	android:layout_width="match_parent"
+	android:layout_height="wrap_content"
+	android:layout_marginLeft="@dimen/listitem_horizontal_margin"
+	android:layout_marginStart="@dimen/listitem_horizontal_margin"
+	android:layout_marginTop="@dimen/margin_medium"
+	android:background="?attr/selectableItemBackground">
+
+	<TextView
+		android:id="@+id/titleView"
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:layout_alignParentTop="true"
+		android:layout_marginBottom="@dimen/margin_medium"
+		android:layout_marginEnd="@dimen/listitem_horizontal_margin"
+		android:layout_marginRight="@dimen/listitem_horizontal_margin"
+		android:ellipsize="end"
+		android:maxLines="3"
+		android:textColor="@color/briar_text_primary"
+		android:textSize="@dimen/text_size_large"
+		android:visibility="gone"
+		tools:text="This is a blog post title which can also be longer"/>
+
+	<TextView
+		android:id="@+id/bodyView"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_below="@id/titleView"
+		android:layout_marginEnd="@dimen/margin_medium"
+		android:layout_marginRight="@dimen/listitem_horizontal_margin"
+		android:textColor="@color/briar_text_secondary"
+		android:textSize="@dimen/text_size_medium"
+		tools:text="This is a body text that shows the content of a blog post. This one is not short, but it is also not too long."/>
+
+	<TextView
+		android:id="@+id/newView"
+		style="@style/BriarTag"
+		android:layout_alignBottom="@id/dateView"
+		android:layout_alignParentLeft="true"
+		android:text="@string/tag_new"
+		tools:visibility="visible"/>
+
+	<TextView
+		android:id="@+id/dateView"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_alignParentEnd="true"
+		android:layout_alignParentRight="true"
+		android:layout_below="@id/bodyView"
+		android:layout_marginEnd="@dimen/listitem_horizontal_margin"
+		android:layout_marginRight="@dimen/listitem_horizontal_margin"
+		android:layout_marginTop="@dimen/margin_small"
+		android:textColor="@color/briar_text_secondary"
+		android:textSize="@dimen/text_size_tiny"
+		tools:text="Dec 24"/>
+
+	<View
+		style="@style/Divider.ForumList"
+		android:layout_alignParentLeft="true"
+		android:layout_alignParentStart="true"
+		android:layout_below="@+id/dateView"
+		android:layout_marginTop="@dimen/margin_medium"/>
+
+</RelativeLayout>
+
diff --git a/briar-android/res/menu/blogs_my_blog_actions.xml b/briar-android/res/menu/blogs_my_blog_actions.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5c9052edb01da64626f8a04b6e59f8728a37bf1f
--- /dev/null
+++ b/briar-android/res/menu/blogs_my_blog_actions.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:app="http://schemas.android.com/apk/res-auto">
+
+	<item
+		android:id="@+id/action_write_blog_post"
+		android:icon="@drawable/forum_item_create_white"
+		android:title="@string/blogs_write_blog_post"
+		app:showAsAction="ifRoom"/>
+
+</menu>
\ No newline at end of file
diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml
index e3793a54638e9f83418dacf23af35e3f961b918b..6b2ca75b139451496ca00f000c8a147fc58c1d83 100644
--- a/briar-android/res/values/strings.xml
+++ b/briar-android/res/values/strings.xml
@@ -257,8 +257,13 @@
 	<string name="blogs_my_blogs_create_hint_desc">A short description of your new blog</string>
 	<string name="blogs_my_blogs_create_hint_desc_explanation">Potential readers may or may not subscribe to your blog based on the content of the description.</string>
 	<string name="blogs_my_blogs_empty_state">You don\'t have any blogs.\n\nWhy don\'t you create one now by clicking the plus in the top right screen corner?</string>
+	<string name="blogs_my_blogs_blog_empty_state">This is the place for content of your blog.\n\nIt seems like you haven\'t written anything yet.\n\nPlease tap the pen icon to compose a new blog post.\n\nDon\'t forget to go public and share your blog.</string>
 	<string name="blogs_my_blogs_created">Blog created</string>
 	<string name="blogs_blog_is_empty">This blog is empty</string>
+	<string name="blogs_other_blog_empty_state">This blog is currently empty.\n\nEither the author hasn\'t written anything yet, or the person who shared this blog with you needs to come online, so posts can be synchronized.</string>
+	<string name="tag_new">NEW</string>
+	<string name="blogs_post_more">more</string>
+	<string name="blogs_write_blog_post">Write Blog Post</string>
 
 	<string name="blogs_blog_list">Blog List</string>
 	<string name="blogs_available_blogs">Available Blogs</string>
diff --git a/briar-android/res/values/styles.xml b/briar-android/res/values/styles.xml
index 1ecc1494c08b202af4dfd8b99301d5752a756a1e..729554b99cb0f4f152b95dfecb85be8ac2f69a36 100644
--- a/briar-android/res/values/styles.xml
+++ b/briar-android/res/values/styles.xml
@@ -57,6 +57,17 @@
 		<item name="android:textColor">@android:color/primary_text_light</item>
 	</style>
 
+	<style name="BriarTag">
+		<item name="android:layout_width">wrap_content</item>
+		<item name="android:layout_height">wrap_content</item>
+		<item name="android:layout_marginRight">@dimen/margin_medium</item>
+		<item name="android:paddingLeft">3dp</item>
+		<item name="android:paddingRight">3dp</item>
+		<item name="android:background">@color/briar_primary</item>
+		<item name="android:textSize">@dimen/text_size_tiny</item>
+		<item name="android:textColor">@color/briar_text_primary_inverse</item>
+	</style>
+
 	<style name="Divider">
 		<item name="android:background">@color/divider</item>
 	</style>
diff --git a/briar-android/src/org/briarproject/android/ActivityComponent.java b/briar-android/src/org/briarproject/android/ActivityComponent.java
index 50aa911d3dbc14efc568434504413c6ab1f7cbd8..64ecc4cdb5ceb4c4fb30cfae00327b799cfb48e6 100644
--- a/briar-android/src/org/briarproject/android/ActivityComponent.java
+++ b/briar-android/src/org/briarproject/android/ActivityComponent.java
@@ -2,6 +2,7 @@ package org.briarproject.android;
 
 import android.app.Activity;
 
+import org.briarproject.android.blogs.BlogActivity;
 import org.briarproject.android.blogs.CreateBlogActivity;
 import org.briarproject.android.blogs.MyBlogsFragment;
 import org.briarproject.android.contact.ContactListFragment;
@@ -67,6 +68,8 @@ public interface ActivityComponent {
 
 	void inject(CreateBlogActivity activity);
 
+	void inject(BlogActivity activity);
+
 	void inject(SettingsActivity activity);
 
 	void inject(ChangePasswordActivity activity);
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogActivity.java b/briar-android/src/org/briarproject/android/blogs/BlogActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..097f6b092d9958c26c6aedca1d1c4e0d3822529a
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/blogs/BlogActivity.java
@@ -0,0 +1,174 @@
+package org.briarproject.android.blogs;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.design.widget.Snackbar;
+import android.support.v7.widget.LinearLayoutManager;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+
+import org.briarproject.R;
+import org.briarproject.android.ActivityComponent;
+import org.briarproject.android.BriarActivity;
+import org.briarproject.android.util.BriarRecyclerView;
+import org.briarproject.api.blogs.BlogManager;
+import org.briarproject.api.blogs.BlogPostHeader;
+import org.briarproject.api.db.DbException;
+import org.briarproject.api.db.NoSuchGroupException;
+import org.briarproject.api.sync.GroupId;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.logging.Logger;
+
+import javax.inject.Inject;
+
+import static android.support.design.widget.Snackbar.LENGTH_LONG;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
+
+public class BlogActivity extends BriarActivity {
+
+	static final String BLOG_NAME = "briar.BLOG_NAME";
+	static final String IS_MY_BLOG = "briar.IS_MY_BLOG";
+	static final String IS_NEW_BLOG = "briar.IS_NEW_BLOG";
+	private static final int WRITE_POST = 1;
+
+	private static final Logger LOG =
+			Logger.getLogger(BlogActivity.class.getName());
+
+	private BlogPostAdapter adapter;
+	private BriarRecyclerView list;
+	private String blogName;
+	private boolean myBlog;
+
+	// Fields that are accessed from background threads must be volatile
+	private volatile GroupId groupId = null;
+	private volatile boolean scrollToTop = false;
+	@Inject
+	volatile BlogManager blogManager;
+
+	@Override
+	public void onCreate(Bundle state) {
+		super.onCreate(state);
+
+		setContentView(R.layout.activity_blog);
+
+		Intent i = getIntent();
+		byte[] b = i.getByteArrayExtra(GROUP_ID);
+		if (b == null) throw new IllegalStateException("No Group in intent.");
+		groupId = new GroupId(b);
+		blogName = i.getStringExtra(BLOG_NAME);
+		if (blogName != null) setTitle(blogName);
+		myBlog = i.getBooleanExtra(IS_MY_BLOG, false);
+
+		adapter = new BlogPostAdapter(this, blogName);
+		list = (BriarRecyclerView) this.findViewById(R.id.postList);
+		list.setLayoutManager(new LinearLayoutManager(this));
+		list.setAdapter(adapter);
+		if (myBlog) {
+			list.setEmptyText(
+					getString(R.string.blogs_my_blogs_blog_empty_state));
+		} else {
+			list.setEmptyText(getString(R.string.blogs_other_blog_empty_state));
+		}
+
+		// show snackbar if this blog was just created
+		boolean isNew = i.getBooleanExtra(IS_NEW_BLOG, false);
+		if (isNew) {
+			Snackbar s = Snackbar.make(list, R.string.blogs_my_blogs_created,
+					LENGTH_LONG);
+			s.getView().setBackgroundResource(R.color.briar_primary);
+			s.show();
+		}
+	}
+
+	@Override
+	public void onResume() {
+		super.onResume();
+		loadBlogPosts();
+	}
+
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu) {
+		if (myBlog) {
+			MenuInflater inflater = getMenuInflater();
+			inflater.inflate(R.menu.blogs_my_blog_actions, menu);
+		}
+		return super.onCreateOptionsMenu(menu);
+	}
+
+	@Override
+	public boolean onOptionsItemSelected(final MenuItem item) {
+		switch (item.getItemId()) {
+			case R.id.action_write_blog_post:
+/*				Intent i = new Intent(this, WriteBlogPostActivity.class);
+				i.putExtra(GROUP_ID, groupId.getBytes());
+				i.putExtra(BLOG_NAME, blogName);
+				startActivityForResult(i, WRITE_POST);
+*/				return true;
+			default:
+				return super.onOptionsItemSelected(item);
+		}
+	}
+
+	@Override
+	public void onActivityResult(int requestCode, int resultCode, Intent data) {
+		if (requestCode == WRITE_POST && resultCode == RESULT_OK) {
+			scrollToTop = true;
+		}
+	}
+
+	@Override
+	public void injectActivity(ActivityComponent component) {
+		component.inject(this);
+	}
+
+	private void loadBlogPosts() {
+		runOnDbThread(new Runnable() {
+			@Override
+			public void run() {
+				try {
+					// load blog posts
+					long now = System.currentTimeMillis();
+					Collection<BlogPostItem> posts = new ArrayList<>();
+					try {
+						Collection<BlogPostHeader> header =
+								blogManager.getPostHeaders(groupId);
+						for (BlogPostHeader h : header) {
+							posts.add(new BlogPostItem(h));
+						}
+					} catch (NoSuchGroupException e) {
+						// Continue
+					}
+					displayBlogPosts(posts);
+					long duration = System.currentTimeMillis() - now;
+					if (LOG.isLoggable(INFO))
+						LOG.info("Post header load took " + duration + " ms");
+				} catch (DbException e) {
+					if (LOG.isLoggable(WARNING))
+						LOG.log(WARNING, e.toString(), e);
+				}
+			}
+		});
+	}
+
+	private void displayBlogPosts(final Collection<BlogPostItem> items) {
+		runOnUiThread(new Runnable() {
+			@Override
+			public void run() {
+				if (items.size() == 0) {
+					list.showData();
+				} else {
+					adapter.addAll(items);
+					if (scrollToTop) list.scrollToPosition(0);
+				}
+				scrollToTop = false;
+			}
+		});
+	}
+
+	// TODO listen to events and add new blog posts as they come in
+
+}
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogListAdapter.java b/briar-android/src/org/briarproject/android/blogs/BlogListAdapter.java
index be0ff5e12ffc478be447035692ac00687486e397..f4573a99fa808f2e742ef56ce7435e03ace689b9 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogListAdapter.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogListAdapter.java
@@ -1,7 +1,11 @@
 package org.briarproject.android.blogs;
 
+import android.app.Activity;
 import android.content.Context;
+import android.content.Intent;
 import android.support.annotation.Nullable;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.ActivityOptionsCompat;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.util.SortedList;
 import android.support.v7.widget.RecyclerView;
@@ -13,12 +17,17 @@ import android.widget.TextView;
 
 import org.briarproject.R;
 import org.briarproject.android.util.TextAvatarView;
+import org.briarproject.api.blogs.Blog;
 import org.briarproject.api.sync.GroupId;
 
 import java.util.Collection;
 
+import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation;
 import static android.view.View.GONE;
 import static android.view.View.VISIBLE;
+import static org.briarproject.android.BriarActivity.GROUP_ID;
+import static org.briarproject.android.blogs.BlogActivity.BLOG_NAME;
+import static org.briarproject.android.blogs.BlogActivity.IS_MY_BLOG;
 
 class BlogListAdapter extends
 		RecyclerView.Adapter<BlogListAdapter.BlogViewHolder> {
@@ -72,9 +81,9 @@ class BlogListAdapter extends
 		}
 	});
 
-	private final Context ctx;
+	private final Activity ctx;
 
-	BlogListAdapter(Context ctx) {
+	BlogListAdapter(Activity ctx) {
 		this.ctx = ctx;
 	}
 
@@ -122,13 +131,16 @@ class BlogListAdapter extends
 		ui.layout.setOnClickListener(new View.OnClickListener() {
 			@Override
 			public void onClick(View v) {
-				// TODO #415
-/*				Intent i = new Intent(ctx, BlogActivity.class);
+				Intent i = new Intent(ctx, BlogActivity.class);
 				Blog b = item.getBlog();
 				i.putExtra(GROUP_ID, b.getId().getBytes());
 				i.putExtra(BLOG_NAME, b.getName());
-				ctx.startActivity(i);
-*/			}
+				i.putExtra(IS_MY_BLOG, item.isOurs());
+				ActivityOptionsCompat options = ActivityOptionsCompat
+						.makeCustomAnimation(ctx, android.R.anim.fade_in,
+								android.R.anim.fade_out);
+				ActivityCompat.startActivity(ctx, i, options.toBundle());
+			}
 		});
 	}
 
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogListItem.java b/briar-android/src/org/briarproject/android/blogs/BlogListItem.java
index 681dac42f5859f5af9f55d712ec407a770dedaf2..e3556467949bd3b043e1f19e59aa91e25b107e2d 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogListItem.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogListItem.java
@@ -11,8 +11,9 @@ class BlogListItem {
 	private final int postCount;
 	private final long timestamp;
 	private final int unread;
+	private final boolean ours;
 
-	BlogListItem(Blog blog, Collection<BlogPostHeader> headers) {
+	BlogListItem(Blog blog, Collection<BlogPostHeader> headers, boolean ours) {
 		this.blog = blog;
 		if (headers.isEmpty()) {
 			postCount = 0;
@@ -33,6 +34,7 @@ class BlogListItem {
 			this.timestamp = newest.getTimestamp();
 			this.unread = unread;
 		}
+		this.ours = ours;
 	}
 
 	Blog getBlog() {
@@ -58,4 +60,8 @@ class BlogListItem {
 	int getUnreadCount() {
 		return unread;
 	}
+
+	public boolean isOurs() {
+		return ours;
+	}
 }
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostAdapter.java b/briar-android/src/org/briarproject/android/blogs/BlogPostAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..8aea31ee3c043bacb6e7889965ece56ba8e5a0e3
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/blogs/BlogPostAdapter.java
@@ -0,0 +1,153 @@
+package org.briarproject.android.blogs;
+
+import android.content.Context;
+import android.support.v7.util.SortedList;
+import android.support.v7.widget.RecyclerView;
+import android.text.format.DateUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.briarproject.R;
+import org.briarproject.util.StringUtils;
+
+import java.util.Collection;
+
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+class BlogPostAdapter extends
+		RecyclerView.Adapter<BlogPostAdapter.BlogPostHolder> {
+
+	private SortedList<BlogPostItem> posts = new SortedList<>(
+			BlogPostItem.class, new SortedList.Callback<BlogPostItem>() {
+
+		@Override
+		public int compare(BlogPostItem a, BlogPostItem b) {
+			if (a == b) return 0;
+			// The blog with the newest message comes first
+			long aTime = a.getTimestamp(), bTime = b.getTimestamp();
+			if (aTime > bTime) return -1;
+			if (aTime < bTime) return 1;
+			// Break ties by post title
+			if (a.getTitle() != null && b.getTitle() != null) {
+				return String.CASE_INSENSITIVE_ORDER
+						.compare(a.getTitle(), b.getTitle());
+			}
+			return 0;
+		}
+
+		@Override
+		public void onInserted(int position, int count) {
+			notifyItemRangeInserted(position, count);
+		}
+
+		@Override
+		public void onRemoved(int position, int count) {
+			notifyItemRangeRemoved(position, count);
+		}
+
+		@Override
+		public void onMoved(int fromPosition, int toPosition) {
+			notifyItemMoved(fromPosition, toPosition);
+		}
+
+		@Override
+		public void onChanged(int position, int count) {
+			notifyItemRangeChanged(position, count);
+		}
+
+		@Override
+		public boolean areContentsTheSame(BlogPostItem a, BlogPostItem b) {
+			return a.isRead() == b.isRead();
+		}
+
+		@Override
+		public boolean areItemsTheSame(BlogPostItem a, BlogPostItem b) {
+			return a.getId().equals(b.getId());
+		}
+	});
+
+	private final Context ctx;
+	private final String blogTitle;
+
+	BlogPostAdapter(Context ctx, String blogTitle) {
+		this.ctx = ctx;
+		this.blogTitle = blogTitle;
+	}
+
+	@Override
+	public BlogPostHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+		View v = LayoutInflater.from(ctx).inflate(
+				R.layout.list_item_blog_post, parent, false);
+		return new BlogPostHolder(v);
+	}
+
+	@Override
+	public void onBindViewHolder(BlogPostHolder ui, int position) {
+		final BlogPostItem item = getItem(position);
+
+		// title
+		if (item.getTitle() != null) {
+			ui.title.setText(item.getTitle());
+			ui.title.setVisibility(VISIBLE);
+		} else {
+			ui.title.setVisibility(GONE);
+		}
+
+		// post body
+		ui.body.setText(StringUtils.fromUtf8(item.getBody()));
+
+		// date
+		ui.date.setText(
+				DateUtils.getRelativeTimeSpanString(ctx, item.getTimestamp()));
+
+		// new tag
+		if (item.isRead()) ui.unread.setVisibility(GONE);
+		else ui.unread.setVisibility(VISIBLE);
+	}
+
+	@Override
+	public int getItemCount() {
+		return posts.size();
+	}
+
+	public BlogPostItem getItem(int position) {
+		return posts.get(position);
+	}
+
+	public void addAll(Collection<BlogPostItem> items) {
+		posts.addAll(items);
+	}
+
+	public void remove(BlogPostItem item) {
+		posts.remove(item);
+	}
+
+	public void clear() {
+		posts.clear();
+	}
+
+	public boolean isEmpty() {
+		return posts.size() == 0;
+	}
+
+	static class BlogPostHolder extends RecyclerView.ViewHolder {
+		private final ViewGroup layout;
+		private final TextView title;
+		private final TextView unread;
+		private final TextView date;
+		private final TextView body;
+
+		BlogPostHolder(View v) {
+			super(v);
+
+			layout = (ViewGroup) v;
+			title = (TextView) v.findViewById(R.id.titleView);
+			unread = (TextView) v.findViewById(R.id.newView);
+			date = (TextView) v.findViewById(R.id.dateView);
+			body = (TextView) v.findViewById(R.id.bodyView);
+		}
+	}
+}
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostItem.java b/briar-android/src/org/briarproject/android/blogs/BlogPostItem.java
new file mode 100644
index 0000000000000000000000000000000000000000..3efdea6c73741bac51f99e9c377d177952db7941
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/blogs/BlogPostItem.java
@@ -0,0 +1,52 @@
+package org.briarproject.android.blogs;
+
+import org.briarproject.api.blogs.BlogPostHeader;
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.identity.Author.Status;
+import org.briarproject.api.sync.MessageId;
+
+// This class is not thread-safe
+class BlogPostItem {
+
+	private final BlogPostHeader header;
+	private final byte[] body;
+	private boolean read;
+
+	BlogPostItem(BlogPostHeader header, byte[] body) {
+		this.header = header;
+		this.body = body;
+		read = header.isRead();
+	}
+
+	public MessageId getId() {
+		return header.getId();
+	}
+
+	public String getTitle() {
+		return header.getTitle();
+	}
+
+	public byte[] getBody() {
+		return body;
+	}
+
+	public long getTimestamp() {
+		return header.getTimestamp();
+	}
+
+	public Author getAuthor() {
+		return header.getAuthor();
+	}
+
+	Status getAuthorStatus() {
+		return header.getAuthorStatus();
+	}
+
+	public void setRead(boolean read) {
+		this.read = read;
+	}
+
+	public boolean isRead() {
+		return read;
+	}
+}
diff --git a/briar-android/src/org/briarproject/android/blogs/CreateBlogActivity.java b/briar-android/src/org/briarproject/android/blogs/CreateBlogActivity.java
index 97934a65f923dfe6cdba01db9aa6ee34d98df160..980d67d1da8c96f84882d3b94b6e1dda6a82d34b 100644
--- a/briar-android/src/org/briarproject/android/blogs/CreateBlogActivity.java
+++ b/briar-android/src/org/briarproject/android/blogs/CreateBlogActivity.java
@@ -1,8 +1,11 @@
 package org.briarproject.android.blogs;
 
+import android.content.Intent;
 import android.os.Bundle;
 import android.support.design.widget.TextInputEditText;
 import android.support.design.widget.TextInputLayout;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.ActivityOptionsCompat;
 import android.text.Editable;
 import android.text.TextWatcher;
 import android.view.KeyEvent;
@@ -29,11 +32,15 @@ import java.util.logging.Logger;
 
 import javax.inject.Inject;
 
+import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation;
 import static android.view.View.GONE;
 import static android.view.View.VISIBLE;
 import static android.widget.Toast.LENGTH_LONG;
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
+import static org.briarproject.android.blogs.BlogActivity.BLOG_NAME;
+import static org.briarproject.android.blogs.BlogActivity.IS_MY_BLOG;
+import static org.briarproject.android.blogs.BlogActivity.IS_NEW_BLOG;
 import static org.briarproject.api.blogs.BlogConstants.MAX_BLOG_DESC_LENGTH;
 import static org.briarproject.api.blogs.BlogConstants.MAX_BLOG_TITLE_LENGTH;
 
@@ -169,14 +176,18 @@ public class CreateBlogActivity extends BriarActivity
 		runOnUiThread(new Runnable() {
 			@Override
 			public void run() {
-				// TODO
-/*				Intent i = new Intent(CreateBlogActivity.this,
-						BlogActivity.class);
+				Intent i =
+						new Intent(CreateBlogActivity.this, BlogActivity.class);
 				i.putExtra(GROUP_ID, b.getId().getBytes());
 				i.putExtra(BLOG_NAME, b.getName());
-				startActivity(i);
-*/				Toast.makeText(CreateBlogActivity.this,
-						R.string.blogs_my_blogs_created, LENGTH_LONG).show();
+				i.putExtra(IS_MY_BLOG, true);
+				i.putExtra(IS_NEW_BLOG, true);
+				ActivityOptionsCompat options =
+						makeCustomAnimation(CreateBlogActivity.this,
+								android.R.anim.fade_in,
+								android.R.anim.fade_out);
+				ActivityCompat.startActivity(CreateBlogActivity.this, i,
+						options.toBundle());
 				supportFinishAfterTransition();
 			}
 		});
diff --git a/briar-android/src/org/briarproject/android/blogs/MyBlogsFragment.java b/briar-android/src/org/briarproject/android/blogs/MyBlogsFragment.java
index d6ef76ae31e889a13001800da7dd8bf34fe13cca..1cc4ee8aceec054f5ca25ff4bbe934ceb9d021c1 100644
--- a/briar-android/src/org/briarproject/android/blogs/MyBlogsFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/MyBlogsFragment.java
@@ -135,7 +135,7 @@ public class MyBlogsFragment extends BaseFragment {
 						try {
 							Collection<BlogPostHeader> headers =
 									blogManager.getPostHeaders(b.getId());
-							blogs.add(new BlogListItem(b, headers));
+							blogs.add(new BlogListItem(b, headers, true));
 						} catch (NoSuchGroupException e) {
 							// Continue
 						}