diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java
index e42932e1946f2b4d059a1cc476d170ce2a506de3..11a7c84ebf437eccd8571d25f9b1474daa092ff6 100644
--- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java
@@ -48,9 +48,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
 import javax.annotation.Nullable;
 import javax.inject.Inject;
 
-import static org.briarproject.bramble.api.contact.ContactManager.AddContactHook;
 import static org.briarproject.bramble.api.contact.ContactManager.RemoveContactHook;
-import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
 import static org.briarproject.briar.api.blog.BlogConstants.KEY_AUTHOR;
 import static org.briarproject.briar.api.blog.BlogConstants.KEY_AUTHOR_ID;
 import static org.briarproject.briar.api.blog.BlogConstants.KEY_AUTHOR_NAME;
@@ -72,7 +70,7 @@ import static org.briarproject.briar.blog.BlogPostValidator.authorToBdfDictionar
 
 @NotNullByDefault
 class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager,
-		AddContactHook, RemoveContactHook, Client {
+		RemoveContactHook, Client {
 
 	private final IdentityManager identityManager;
 	private final BlogFactory blogFactory;
@@ -96,26 +94,13 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager,
 		// Create our personal blog if necessary
 		LocalAuthor a = identityManager.getLocalAuthor(txn);
 		Blog b = blogFactory.createBlog(a);
-		db.addGroup(txn, b.getGroup());
-		// Ensure that we have the personal blogs of all contacts
-		for (Contact c : db.getContacts(txn)) addingContact(txn, c);
-	}
-
-	@Override
-	public void addingContact(Transaction txn, Contact c) throws DbException {
-		// Add the personal blog of the contact and share it with the contact
-		Blog b = blogFactory.createBlog(c.getAuthor());
-		addBlog(txn, b);
-		db.setGroupVisibility(txn, c.getId(), b.getId(), SHARED);
-		// Share our personal blog with the contact
-		LocalAuthor a = identityManager.getLocalAuthor(txn);
-		Blog b2 = blogFactory.createBlog(a);
-		db.setGroupVisibility(txn, c.getId(), b2.getId(), SHARED);
+		db.addGroup(txn, b.getGroup());  // does nothing, if group exists
 	}
 
 	@Override
 	public void removingContact(Transaction txn, Contact c) throws DbException {
 		Blog b = blogFactory.createBlog(c.getAuthor());
+		// TODO we might want to reconsider removing b, if otherwise shared
 		if (db.containsGroup(txn, b.getId())) removeBlog(txn, b);
 	}
 
diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java
index 4a6fde080658dddcf11be60cb2fdae1a6eeeddb1..c6459cb57a730b8b59ad79c5f53fc482ef7d3f10 100644
--- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java
+++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java
@@ -38,7 +38,6 @@ public class BlogModule {
 			ValidationManager validationManager) {
 
 		lifecycleManager.registerClient(blogManager);
-		contactManager.registerAddContactHook(blogManager);
 		contactManager.registerRemoveContactHook(blogManager);
 		validationManager.registerIncomingMessageHook(CLIENT_ID, blogManager);
 		return blogManager;
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java
index 6664c67dcd64651494adace16accf196c5b62eb7..f095aba4664968cffa4150e7e969c7a868d6d676 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java
@@ -51,15 +51,23 @@ class BlogSharingManagerImpl extends SharingManagerImpl<Blog>
 		return CLIENT_ID;
 	}
 
+	/**
+	 * This is called during each startup for each existing Contact.
+	 */
 	@Override
 	public void addingContact(Transaction txn, Contact c) throws DbException {
+		// creates a group to share with the contact
 		super.addingContact(txn, c);
+
+		// get our blog and that of Contact c
 		LocalAuthor localAuthor = identityManager.getLocalAuthor(txn);
 		Blog ourBlog = blogManager.getPersonalBlog(localAuthor);
 		Blog theirBlog = blogManager.getPersonalBlog(c.getAuthor());
+
+		// pre-share both blogs, if they have not been shared already
 		try {
-			initializeSharedSession(txn, c, ourBlog);
-			initializeSharedSession(txn, c, theirBlog);
+			preShareShareable(txn, c, ourBlog);
+			preShareShareable(txn, c, theirBlog);
 		} catch (FormatException e) {
 			throw new DbException(e);
 		}
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java
index 461937caab338c38020b71014b590210248773f2..743fe4683603e1e5077c41795442a2817bf441d9 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java
@@ -139,9 +139,24 @@ abstract class SharingManagerImpl<S extends Shareable>
 		return false;
 	}
 
-	void initializeSharedSession(Transaction txn, Contact c, S shareable)
+	/**
+	 * Adds the given Shareable and initializes a session between us
+	 * and the Contact c in state SHARING.
+	 * If a session already exists, this does nothing.
+	 */
+	void preShareShareable(Transaction txn, Contact c, S shareable)
 			throws DbException, FormatException {
+		// return if a session already exists with that Contact
 		GroupId contactGroupId = getContactGroup(c).getId();
+		StoredSession existingSession = getSession(txn, contactGroupId,
+				getSessionId(shareable.getId()));
+		if (existingSession != null) return;
+
+		// add and shares the shareable with the Contact
+		db.addGroup(txn, shareable.getGroup());
+		db.setGroupVisibility(txn, c.getId(), shareable.getId(), SHARED);
+
+		// initialize session in sharing state
 		Session session = new Session(SHARING, contactGroupId,
 				shareable.getId(), null, null, 0, 0);
 		MessageId storageId = createStorageId(txn, contactGroupId);
diff --git a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java
index b3c8c7586282d96f934b32505a9c6d7fc7c6a36f..2077a0902fbcf2f87a1b3a1479c4b87187fcd577 100644
--- a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java
@@ -31,15 +31,11 @@ import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
 
-import java.util.Collection;
-import java.util.Collections;
-
 import static org.briarproject.bramble.api.identity.Author.Status.NONE;
 import static org.briarproject.bramble.api.identity.Author.Status.OURSELVES;
 import static org.briarproject.bramble.api.identity.Author.Status.VERIFIED;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
-import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
 import static org.briarproject.bramble.api.sync.SyncConstants.MAX_MESSAGE_LENGTH;
 import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
 import static org.briarproject.bramble.test.TestUtils.getRandomId;
@@ -117,29 +113,12 @@ public class BlogManagerImplTest extends BriarTestCase {
 	public void testCreateLocalState() throws DbException {
 		final Transaction txn = new Transaction(null, false);
 
-		final ContactId contactId = new ContactId(0);
-
-		Contact contact = new Contact(contactId, blog2.getAuthor(),
-				blog1.getAuthor().getId(), true, true);
-		final Collection<Contact> contacts = Collections.singletonList(contact);
-
 		context.checking(new Expectations() {{
 			oneOf(identityManager).getLocalAuthor(txn);
 			will(returnValue(blog1.getAuthor()));
 			oneOf(blogFactory).createBlog(blog1.getAuthor());
 			will(returnValue(blog1));
 			oneOf(db).addGroup(txn, blog1.getGroup());
-			oneOf(db).getContacts(txn);
-			will(returnValue(contacts));
-			oneOf(blogFactory).createBlog(blog2.getAuthor());
-			will(returnValue(blog2));
-			oneOf(db).addGroup(txn, blog2.getGroup());
-			oneOf(db).setGroupVisibility(txn, contactId, blog2.getId(), SHARED);
-			oneOf(identityManager).getLocalAuthor(txn);
-			will(returnValue(blog1.getAuthor()));
-			oneOf(blogFactory).createBlog(blog1.getAuthor());
-			will(returnValue(blog1));
-			oneOf(db).setGroupVisibility(txn, contactId, blog1.getId(), SHARED);
 		}});
 
 		blogManager.createLocalState(txn);
diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java
index b66b98124d5c99b42996344397e104b42420eb69..6a394f6d87a5575b29a9bffc802ad3fe236e49b9 100644
--- a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java
@@ -5,6 +5,7 @@ import net.jodah.concurrentunit.Waiter;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.db.NoSuchGroupException;
+import org.briarproject.bramble.api.db.Transaction;
 import org.briarproject.bramble.api.event.Event;
 import org.briarproject.bramble.api.event.EventListener;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@@ -492,6 +493,26 @@ public class BlogSharingIntegrationTest
 		// 1 can again share blog 1 with 0
 		assertTrue(
 				blogSharingManager1.canBeShared(blog1.getId(), contact0From1));
+
+		// re-create local state (simulates sign-out and sign-in)
+		Transaction txn0 = db0.startTransaction(false);
+		((BlogSharingManagerImpl) blogSharingManager0).createLocalState(txn0);
+		db0.commitTransaction(txn0);
+		db0.endTransaction(txn0);
+		Transaction txn1 = db1.startTransaction(false);
+		((BlogSharingManagerImpl) blogSharingManager1).createLocalState(txn1);
+		db1.commitTransaction(txn1);
+		db1.endTransaction(txn1);
+
+		// ensure there's no error with the sessions by checking shareability
+		assertFalse(
+				blogSharingManager0.canBeShared(blog1.getId(), contact1From0));
+		assertTrue(
+				blogSharingManager1.canBeShared(blog1.getId(), contact0From1));
+
+		// contacts should still be able to remove each other without errors
+		contactManager0.removeContact(contactId1From0);
+		contactManager1.removeContact(contactId0From1);
 	}
 
 	@Test