diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml
index 003bfac9431e47cc5b7e8937ea24514f467f8459..b57845c6b6a82241654d6d9dc0d71ae5588f03e6 100644
--- a/briar-android/res/values/strings.xml
+++ b/briar-android/res/values/strings.xml
@@ -54,12 +54,14 @@
 	<string name="group_visible_to_all">Share this group with all contacts</string>
 	<string name="group_visible_to_some">Share this group with chosen contacts</string>
 	<string name="compose_group_title">New Post</string>
+	<string name="new_group_item">New group\u2026</string>
 	<string name="blogs_title">Blogs</string>
 	<string name="create_blog_title">New Blog</string>
 	<string name="choose_blog_name">Choose a name for your blog:</string>
 	<string name="blog_visible_to_all">Share this blog with all contacts</string>
 	<string name="blog_visible_to_some">Share this blog with chosen contacts</string>
 	<string name="compose_blog_title">New Post</string>
+	<string name="new_blog_item">New blog\u2026</string>
 	<string name="create_nickname_item">New nickname\u2026</string>
 	<string name="create_identity_title">Create an Identity</string>
 	<string name="choose_nickname">Choose your nickname:</string>
diff --git a/briar-android/src/net/sf/briar/android/GroupNameComparator.java b/briar-android/src/net/sf/briar/android/GroupNameComparator.java
deleted file mode 100644
index 8e397be1b11430d429e837f26c5343c2044216e7..0000000000000000000000000000000000000000
--- a/briar-android/src/net/sf/briar/android/GroupNameComparator.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package net.sf.briar.android;
-
-import java.util.Comparator;
-
-import net.sf.briar.api.messaging.Group;
-
-public class GroupNameComparator implements Comparator<Group> {
-
-	public static final GroupNameComparator INSTANCE =
-			new GroupNameComparator();
-
-	public int compare(Group a, Group b) {
-		return String.CASE_INSENSITIVE_ORDER.compare(a.getName(), b.getName());
-	}
-}
diff --git a/briar-android/src/net/sf/briar/android/blogs/LocalGroupItem.java b/briar-android/src/net/sf/briar/android/blogs/LocalGroupItem.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd7f893556bbf80276adf621537a1522a003d517
--- /dev/null
+++ b/briar-android/src/net/sf/briar/android/blogs/LocalGroupItem.java
@@ -0,0 +1,18 @@
+package net.sf.briar.android.blogs;
+
+import net.sf.briar.api.messaging.LocalGroup;
+
+class LocalGroupItem {
+
+	static final LocalGroupItem NEW = new LocalGroupItem(null);
+
+	private final LocalGroup localGroup;
+
+	LocalGroupItem(LocalGroup localGroup) {
+		this.localGroup = localGroup;
+	}
+
+	LocalGroup getLocalGroup() {
+		return localGroup;
+	}
+}
diff --git a/briar-android/src/net/sf/briar/android/blogs/LocalGroupItemComparator.java b/briar-android/src/net/sf/briar/android/blogs/LocalGroupItemComparator.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6943000cefa54cf75743c3f15af55c55cef6136
--- /dev/null
+++ b/briar-android/src/net/sf/briar/android/blogs/LocalGroupItemComparator.java
@@ -0,0 +1,20 @@
+package net.sf.briar.android.blogs;
+
+import static net.sf.briar.android.blogs.LocalGroupItem.NEW;
+
+import java.util.Comparator;
+
+class LocalGroupItemComparator implements Comparator<LocalGroupItem> {
+
+	static final LocalGroupItemComparator INSTANCE =
+			new LocalGroupItemComparator();
+
+	public int compare(LocalGroupItem a, LocalGroupItem b) {
+		if(a == b) return 0;
+		if(a == NEW) return 1;
+		if(b == NEW) return -1;
+		String aName = a.getLocalGroup().getName();
+		String bName = b.getLocalGroup().getName();
+		return String.CASE_INSENSITIVE_ORDER.compare(aName, bName);
+	}
+}
diff --git a/briar-android/src/net/sf/briar/android/blogs/LocalGroupSpinnerAdapter.java b/briar-android/src/net/sf/briar/android/blogs/LocalGroupSpinnerAdapter.java
index 8dc22083a4bfb2b9e8625730bf5591cc515a6c94..c4cf025cb874cdf8218b31ac76008c3a2ea124b7 100644
--- a/briar-android/src/net/sf/briar/android/blogs/LocalGroupSpinnerAdapter.java
+++ b/briar-android/src/net/sf/briar/android/blogs/LocalGroupSpinnerAdapter.java
@@ -1,40 +1,76 @@
 package net.sf.briar.android.blogs;
 
+import static net.sf.briar.android.blogs.LocalGroupItem.NEW;
+
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
 
 import net.sf.briar.R;
-import net.sf.briar.api.messaging.LocalGroup;
 import android.content.Context;
 import android.content.res.Resources;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
+import android.widget.BaseAdapter;
 import android.widget.SpinnerAdapter;
 import android.widget.TextView;
 
-class LocalGroupSpinnerAdapter extends ArrayAdapter<LocalGroup>
-implements SpinnerAdapter {
+class LocalGroupSpinnerAdapter extends BaseAdapter implements SpinnerAdapter {
+
+	private final Context ctx;
+	private final List<LocalGroupItem> list = new ArrayList<LocalGroupItem>();
+
+	LocalGroupSpinnerAdapter(Context ctx) {
+		this.ctx = ctx;
+	}
+
+	public void add(LocalGroupItem item) {
+		list.add(item);
+	}
 
-	LocalGroupSpinnerAdapter(Context context) {
-		super(context, android.R.layout.simple_spinner_item,
-				new ArrayList<LocalGroup>());
+	public void clear() {
+		list.clear();
+	}
+
+	public int getCount() {
+		return list.size() + 1;
 	}
 
 	@Override
+	public View getDropDownView(int position, View convertView,
+			ViewGroup parent) {
+		return getView(position, convertView, parent);
+	}
+
+	public LocalGroupItem getItem(int position) {
+		if(position == list.size()) return NEW;
+		return list.get(position);
+	}
+
+	public long getItemId(int position) {
+		return android.R.layout.simple_spinner_item;
+	}
+
 	public View getView(int position, View convertView, ViewGroup parent) {
-		TextView name = new TextView(getContext());
+		TextView name = new TextView(ctx);
 		name.setTextSize(18);
 		name.setMaxLines(1);
-		Resources res = getContext().getResources();
+		Resources res = ctx.getResources();
 		int pad = res.getInteger(R.integer.spinner_padding);
 		name.setPadding(pad, pad, pad, pad);
-		name.setText(getItem(position).getName());
+		LocalGroupItem item = getItem(position);
+		if(item == NEW) name.setText(R.string.new_blog_item);
+		else name.setText(item.getLocalGroup().getName());
 		return name;
 	}
 
 	@Override
-	public View getDropDownView(int position, View convertView,
-			ViewGroup parent) {
-		return getView(position, convertView, parent);
+	public boolean isEmpty() {
+		return getCount() == 0;
+	}
+
+	public void sort(Comparator<LocalGroupItem> comparator) {
+		Collections.sort(list, comparator);
 	}
 }
diff --git a/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java b/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java
index 15a807ab437f79ce42abb809c95304e8e2cdcbd5..57dfded067bcfc6221bab347e0c563e4505aa700 100644
--- a/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java
+++ b/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java
@@ -7,8 +7,6 @@ import static android.widget.LinearLayout.HORIZONTAL;
 import static android.widget.LinearLayout.VERTICAL;
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
-import static net.sf.briar.android.identity.LocalAuthorItem.ANONYMOUS;
-import static net.sf.briar.android.identity.LocalAuthorItem.NEW;
 import static net.sf.briar.android.widgets.CommonLayoutParams.MATCH_WRAP;
 
 import java.io.IOException;
@@ -22,7 +20,6 @@ import net.sf.briar.R;
 import net.sf.briar.android.BriarActivity;
 import net.sf.briar.android.BriarService;
 import net.sf.briar.android.BriarService.BriarServiceConnection;
-import net.sf.briar.android.GroupNameComparator;
 import net.sf.briar.android.identity.CreateIdentityActivity;
 import net.sf.briar.android.identity.LocalAuthorItem;
 import net.sf.briar.android.identity.LocalAuthorItemComparator;
@@ -190,6 +187,7 @@ implements OnItemSelectedListener, OnClickListener {
 			final Collection<LocalAuthor> localAuthors) {
 		runOnUiThread(new Runnable() {
 			public void run() {
+				if(localAuthors.isEmpty()) throw new IllegalStateException();
 				fromAdapter.clear();
 				for(LocalAuthor a : localAuthors)
 					fromAdapter.add(new LocalAuthorItem(a));
@@ -226,11 +224,14 @@ implements OnItemSelectedListener, OnClickListener {
 			public void run() {
 				if(groups.isEmpty()) finish();
 				toAdapter.clear();
-				for(LocalGroup g : groups) toAdapter.add(g);
-				toAdapter.sort(GroupNameComparator.INSTANCE);
+				for(LocalGroup g : groups) toAdapter.add(new LocalGroupItem(g));
+				toAdapter.sort(LocalGroupItemComparator.INSTANCE);
+				toAdapter.notifyDataSetChanged();
 				int count = toAdapter.getCount();
 				for(int i = 0; i < count; i++) {
-					if(toAdapter.getItem(i).getId().equals(localGroupId)) {
+					LocalGroupItem item = toAdapter.getItem(i);
+					if(item == LocalGroupItem.NEW) continue;
+					if(item.getLocalGroup().getId().equals(localGroupId)) {
 						toSpinner.setSelection(i);
 						break;
 					}
@@ -256,18 +257,23 @@ implements OnItemSelectedListener, OnClickListener {
 			long id) {
 		if(parent == fromSpinner) {
 			LocalAuthorItem item = fromAdapter.getItem(position);
-			if(item == ANONYMOUS) {
+			if(item == LocalAuthorItem.ANONYMOUS) {
 				localAuthor = null;
-			} else if(item == NEW) {
+			} else if(item == LocalAuthorItem.NEW) {
 				localAuthor = null;
 				startActivity(new Intent(this, CreateIdentityActivity.class));
 			} else {
 				localAuthor = item.getLocalAuthor();
 			}
 		} else if(parent == toSpinner) {
-			localGroup = toAdapter.getItem(position);
-			localGroupId = localGroup.getId();
-			sendButton.setEnabled(true);
+			LocalGroupItem item = toAdapter.getItem(position);
+			if(item == LocalGroupItem.NEW) {
+				startActivity(new Intent(this, CreateBlogActivity.class));
+			} else {
+				localGroup = item.getLocalGroup();
+				localGroupId = localGroup.getId();
+				sendButton.setEnabled(true);
+			}
 		}
 	}
 
diff --git a/briar-android/src/net/sf/briar/android/groups/GroupItem.java b/briar-android/src/net/sf/briar/android/groups/GroupItem.java
new file mode 100644
index 0000000000000000000000000000000000000000..ff45e226bdc37106ec1392be0d28b8cbb5e5f8c7
--- /dev/null
+++ b/briar-android/src/net/sf/briar/android/groups/GroupItem.java
@@ -0,0 +1,18 @@
+package net.sf.briar.android.groups;
+
+import net.sf.briar.api.messaging.Group;
+
+class GroupItem {
+
+	static final GroupItem NEW = new GroupItem(null);
+
+	private final Group group;
+
+	GroupItem(Group group) {
+		this.group = group;
+	}
+
+	Group getGroup() {
+		return group;
+	}
+}
diff --git a/briar-android/src/net/sf/briar/android/groups/GroupItemComparator.java b/briar-android/src/net/sf/briar/android/groups/GroupItemComparator.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9f377ebd2b56f9fb204db45bc5a95f4d8aead4c
--- /dev/null
+++ b/briar-android/src/net/sf/briar/android/groups/GroupItemComparator.java
@@ -0,0 +1,18 @@
+package net.sf.briar.android.groups;
+
+import static net.sf.briar.android.groups.GroupItem.NEW;
+
+import java.util.Comparator;
+
+class GroupItemComparator implements Comparator<GroupItem> {
+
+	static final GroupItemComparator INSTANCE = new GroupItemComparator();
+
+	public int compare(GroupItem a, GroupItem b) {
+		if(a == b) return 0;
+		if(a == NEW) return 1;
+		if(b == NEW) return -1;
+		String aName = a.getGroup().getName(), bName = b.getGroup().getName();
+		return String.CASE_INSENSITIVE_ORDER.compare(aName, bName);
+	}
+}
diff --git a/briar-android/src/net/sf/briar/android/groups/GroupSpinnerAdapter.java b/briar-android/src/net/sf/briar/android/groups/GroupSpinnerAdapter.java
index 821c5ae16ee12a084dd1eed60ff1507fe426e574..c4180324b9c977e5d5229b8219c8cfb5414e1d7f 100644
--- a/briar-android/src/net/sf/briar/android/groups/GroupSpinnerAdapter.java
+++ b/briar-android/src/net/sf/briar/android/groups/GroupSpinnerAdapter.java
@@ -1,40 +1,76 @@
 package net.sf.briar.android.groups;
 
+import static net.sf.briar.android.groups.GroupItem.NEW;
+
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
 
 import net.sf.briar.R;
-import net.sf.briar.api.messaging.Group;
 import android.content.Context;
 import android.content.res.Resources;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
+import android.widget.BaseAdapter;
 import android.widget.SpinnerAdapter;
 import android.widget.TextView;
 
-class GroupSpinnerAdapter extends ArrayAdapter<Group>
-implements SpinnerAdapter {
+class GroupSpinnerAdapter extends BaseAdapter implements SpinnerAdapter {
+
+	private final Context ctx;
+	private final List<GroupItem> list = new ArrayList<GroupItem>();
+
+	GroupSpinnerAdapter(Context ctx) {
+		this.ctx = ctx;
+	}
+
+	public void add(GroupItem item) {
+		list.add(item);
+	}
 
-	GroupSpinnerAdapter(Context context) {
-		super(context, android.R.layout.simple_spinner_item,
-				new ArrayList<Group>());
+	public void clear() {
+		list.clear();
+	}
+
+	public int getCount() {
+		return list.size() + 1;
 	}
 
 	@Override
+	public View getDropDownView(int position, View convertView,
+			ViewGroup parent) {
+		return getView(position, convertView, parent);
+	}
+
+	public GroupItem getItem(int position) {
+		if(position == list.size()) return NEW;
+		return list.get(position);
+	}
+
+	public long getItemId(int position) {
+		return android.R.layout.simple_spinner_item;
+	}
+
 	public View getView(int position, View convertView, ViewGroup parent) {
-		TextView name = new TextView(getContext());
+		TextView name = new TextView(ctx);
 		name.setTextSize(18);
 		name.setMaxLines(1);
-		Resources res = getContext().getResources();
+		Resources res = ctx.getResources();
 		int pad = res.getInteger(R.integer.spinner_padding);
 		name.setPadding(pad, pad, pad, pad);
-		name.setText(getItem(position).getName());
+		GroupItem item = getItem(position);
+		if(item == NEW) name.setText(R.string.new_group_item);
+		else name.setText(item.getGroup().getName());
 		return name;
 	}
 
 	@Override
-	public View getDropDownView(int position, View convertView,
-			ViewGroup parent) {
-		return getView(position, convertView, parent);
+	public boolean isEmpty() {
+		return getCount() == 0;
+	}
+
+	public void sort(Comparator<GroupItem> comparator) {
+		Collections.sort(list, comparator);
 	}
 }
diff --git a/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java b/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java
index 9b4621c7ea60983580d1da8f8aedf561ae3ebfcb..7fb542d741d8cfc19de3c23387f2b916993a7d38 100644
--- a/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java
+++ b/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java
@@ -7,8 +7,6 @@ import static android.widget.LinearLayout.HORIZONTAL;
 import static android.widget.LinearLayout.VERTICAL;
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
-import static net.sf.briar.android.identity.LocalAuthorItem.ANONYMOUS;
-import static net.sf.briar.android.identity.LocalAuthorItem.NEW;
 import static net.sf.briar.android.widgets.CommonLayoutParams.MATCH_WRAP;
 
 import java.io.IOException;
@@ -24,7 +22,6 @@ import java.util.logging.Logger;
 import net.sf.briar.R;
 import net.sf.briar.android.BriarActivity;
 import net.sf.briar.android.BriarService;
-import net.sf.briar.android.GroupNameComparator;
 import net.sf.briar.android.BriarService.BriarServiceConnection;
 import net.sf.briar.android.identity.CreateIdentityActivity;
 import net.sf.briar.android.identity.LocalAuthorItem;
@@ -193,6 +190,7 @@ implements OnItemSelectedListener, OnClickListener {
 			final Collection<LocalAuthor> localAuthors) {
 		runOnUiThread(new Runnable() {
 			public void run() {
+				if(localAuthors.isEmpty()) throw new IllegalStateException();
 				fromAdapter.clear();
 				for(LocalAuthor a : localAuthors)
 					fromAdapter.add(new LocalAuthorItem(a));
@@ -231,11 +229,14 @@ implements OnItemSelectedListener, OnClickListener {
 			public void run() {
 				if(groups.isEmpty()) finish();
 				toAdapter.clear();
-				for(Group g : groups) toAdapter.add(g);
-				toAdapter.sort(GroupNameComparator.INSTANCE);
+				for(Group g : groups) toAdapter.add(new GroupItem(g));
+				toAdapter.sort(GroupItemComparator.INSTANCE);
+				toAdapter.notifyDataSetChanged();
 				int count = toAdapter.getCount();
 				for(int i = 0; i < count; i++) {
-					if(toAdapter.getItem(i).getId().equals(groupId)) {
+					GroupItem g = toAdapter.getItem(i);
+					if(g == GroupItem.NEW) continue;
+					if(g.getGroup().getId().equals(groupId)) {
 						toSpinner.setSelection(i);
 						break;
 					}
@@ -261,18 +262,23 @@ implements OnItemSelectedListener, OnClickListener {
 			long id) {
 		if(parent == fromSpinner) {
 			LocalAuthorItem item = fromAdapter.getItem(position);
-			if(item == ANONYMOUS) {
+			if(item == LocalAuthorItem.ANONYMOUS) {
 				localAuthor = null;
-			} else if(item == NEW) {
+			} else if(item == LocalAuthorItem.NEW) {
 				localAuthor = null;
 				startActivity(new Intent(this, CreateIdentityActivity.class));
 			} else {
 				localAuthor = item.getLocalAuthor();
 			}
 		} else if(parent == toSpinner) {
-			group = toAdapter.getItem(position);
-			groupId = group.getId();
-			sendButton.setEnabled(true);
+			GroupItem item = toAdapter.getItem(position);
+			if(item == GroupItem.NEW) {
+				startActivity(new Intent(this, CreateGroupActivity.class));
+			} else {
+				group = item.getGroup();
+				groupId = group.getId();
+				sendButton.setEnabled(true);
+			}
 		}
 	}