diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
index 9a271f7ab3e4136fd0b4859a61ea43b958e5e5d3..8ed1ece7857cbe02be91db7df2a8b13818d5dbcf 100644
--- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
+++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
@@ -245,25 +245,22 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 
 	public Ack generateAck(Transaction transaction, ContactId c,
 			int maxMessages) throws DbException {
-		Collection<MessageId> ids;
 		T txn = unbox(transaction);
 		if (!db.containsContact(txn, c))
 			throw new NoSuchContactException();
-		ids = db.getMessagesToAck(txn, c, maxMessages);
-		if (!ids.isEmpty()) db.lowerAckFlag(txn, c, ids);
+		Collection<MessageId> ids = db.getMessagesToAck(txn, c, maxMessages);
 		if (ids.isEmpty()) return null;
+		db.lowerAckFlag(txn, c, ids);
 		return new Ack(ids);
 	}
 
 	public Collection<byte[]> generateBatch(Transaction transaction,
 			ContactId c, int maxLength, int maxLatency) throws DbException {
-		Collection<MessageId> ids;
-		List<byte[]> messages;
 		T txn = unbox(transaction);
 		if (!db.containsContact(txn, c))
 			throw new NoSuchContactException();
-		ids = db.getMessagesToSend(txn, c, maxLength);
-		messages = new ArrayList<byte[]>(ids.size());
+		Collection<MessageId> ids = db.getMessagesToSend(txn, c, maxLength);
+		List<byte[]> messages = new ArrayList<byte[]>(ids.size());
 		for (MessageId m : ids) {
 			messages.add(db.getRawMessage(txn, m));
 			db.updateExpiryTime(txn, c, m, maxLatency);
@@ -276,37 +273,35 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 
 	public Offer generateOffer(Transaction transaction, ContactId c,
 			int maxMessages, int maxLatency) throws DbException {
-		Collection<MessageId> ids;
 		T txn = unbox(transaction);
 		if (!db.containsContact(txn, c))
 			throw new NoSuchContactException();
-		ids = db.getMessagesToOffer(txn, c, maxMessages);
-		for (MessageId m : ids) db.updateExpiryTime(txn, c, m, maxLatency);
+		Collection<MessageId> ids = db.getMessagesToOffer(txn, c, maxMessages);
 		if (ids.isEmpty()) return null;
+		for (MessageId m : ids) db.updateExpiryTime(txn, c, m, maxLatency);
 		return new Offer(ids);
 	}
 
 	public Request generateRequest(Transaction transaction, ContactId c,
 			int maxMessages) throws DbException {
-		Collection<MessageId> ids;
 		T txn = unbox(transaction);
 		if (!db.containsContact(txn, c))
 			throw new NoSuchContactException();
-		ids = db.getMessagesToRequest(txn, c, maxMessages);
-		if (!ids.isEmpty()) db.removeOfferedMessages(txn, c, ids);
+		Collection<MessageId> ids = db.getMessagesToRequest(txn, c,
+				maxMessages);
 		if (ids.isEmpty()) return null;
+		db.removeOfferedMessages(txn, c, ids);
 		return new Request(ids);
 	}
 
 	public Collection<byte[]> generateRequestedBatch(Transaction transaction,
 			ContactId c, int maxLength, int maxLatency) throws DbException {
-		Collection<MessageId> ids;
-		List<byte[]> messages;
 		T txn = unbox(transaction);
 		if (!db.containsContact(txn, c))
 			throw new NoSuchContactException();
-		ids = db.getRequestedMessagesToSend(txn, c, maxLength);
-		messages = new ArrayList<byte[]>(ids.size());
+		Collection<MessageId> ids = db.getRequestedMessagesToSend(txn, c,
+				maxLength);
+		List<byte[]> messages = new ArrayList<byte[]>(ids.size());
 		for (MessageId m : ids) {
 			messages.add(db.getRawMessage(txn, m));
 			db.updateExpiryTime(txn, c, m, maxLatency);
@@ -501,10 +496,10 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 
 	public void receiveAck(Transaction transaction, ContactId c, Ack a)
 			throws DbException {
-		Collection<MessageId> acked = new ArrayList<MessageId>();
 		T txn = unbox(transaction);
 		if (!db.containsContact(txn, c))
 			throw new NoSuchContactException();
+		Collection<MessageId> acked = new ArrayList<MessageId>();
 		for (MessageId m : a.getMessageIds()) {
 			if (db.containsVisibleMessage(txn, c, m)) {
 				db.raiseSeenFlag(txn, c, m);
@@ -531,11 +526,11 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 
 	public void receiveOffer(Transaction transaction, ContactId c, Offer o)
 			throws DbException {
-		boolean ack = false, request = false;
 		T txn = unbox(transaction);
 		if (!db.containsContact(txn, c))
 			throw new NoSuchContactException();
 		int count = db.countOfferedMessages(txn, c);
+		boolean ack = false, request = false;
 		for (MessageId m : o.getMessageIds()) {
 			if (db.containsVisibleMessage(txn, c, m)) {
 				db.raiseSeenFlag(txn, c, m);
@@ -553,10 +548,10 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 
 	public void receiveRequest(Transaction transaction, ContactId c, Request r)
 			throws DbException {
-		boolean requested = false;
 		T txn = unbox(transaction);
 		if (!db.containsContact(txn, c))
 			throw new NoSuchContactException();
+		boolean requested = false;
 		for (MessageId m : r.getMessageIds()) {
 			if (db.containsVisibleMessage(txn, c, m)) {
 				db.raiseRequestedFlag(txn, c, m);
@@ -578,12 +573,11 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 
 	public void removeGroup(Transaction transaction, Group g)
 			throws DbException {
-		Collection<ContactId> affected;
 		T txn = unbox(transaction);
 		GroupId id = g.getId();
 		if (!db.containsGroup(txn, id))
 			throw new NoSuchGroupException();
-		affected = db.getVisibility(txn, id);
+		Collection<ContactId> affected = db.getVisibility(txn, id);
 		db.removeGroup(txn, id);
 		transaction.attach(new GroupRemovedEvent(g));
 		transaction.attach(new GroupVisibilityUpdatedEvent(affected));
@@ -638,13 +632,12 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 
 	public void setVisibleToContact(Transaction transaction, ContactId c,
 			GroupId g, boolean visible) throws DbException {
-		boolean wasVisible;
 		T txn = unbox(transaction);
 		if (!db.containsContact(txn, c))
 			throw new NoSuchContactException();
 		if (!db.containsGroup(txn, g))
 			throw new NoSuchGroupException();
-		wasVisible = db.containsVisibleGroup(txn, c, g);
+		boolean wasVisible = db.containsVisibleGroup(txn, c, g);
 		if (visible && !wasVisible) db.addVisibility(txn, c, g);
 		else if (!visible && wasVisible) db.removeVisibility(txn, c, g);
 		if (visible != wasVisible) {
@@ -655,9 +648,9 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 
 	public void updateTransportKeys(Transaction transaction,
 			Map<ContactId, TransportKeys> keys) throws DbException {
+		T txn = unbox(transaction);
 		Map<ContactId, TransportKeys> filtered =
 				new HashMap<ContactId, TransportKeys>();
-		T txn = unbox(transaction);
 		for (Entry<ContactId, TransportKeys> e : keys.entrySet()) {
 			ContactId c = e.getKey();
 			TransportKeys k = e.getValue();
diff --git a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java
index 6f8554ce8febc2c884215346d4119ac54592e4ee..c3ab558dec041169d246ba3a485322438317b856 100644
--- a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java
+++ b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java
@@ -45,7 +45,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.logging.Logger;
 
 import static org.briarproject.api.forum.ForumConstants.FORUM_SALT_LENGTH;
 import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_NAME_LENGTH;
@@ -376,8 +375,8 @@ class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook,
 			BdfDictionary d = new BdfDictionary();
 			d.put("version", version);
 			d.put("local", true);
-			db.addLocalMessage(txn, m, CLIENT_ID, metadataEncoder.encode(d),
-					true);
+			Metadata meta = metadataEncoder.encode(d);
+			db.addLocalMessage(txn, m, CLIENT_ID, meta, true);
 		} catch (FormatException e) {
 			throw new RuntimeException(e);
 		}
diff --git a/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java b/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java
index 0441d27ce29533486735a94fab4b89b3e85da12f..ef566f2b16e6c48d831d9166f8cbe282e21d7f88 100644
--- a/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java
+++ b/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java
@@ -154,11 +154,11 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook,
 	@Override
 	public Collection<PrivateMessageHeader> getMessageHeaders(ContactId c)
 			throws DbException {
-		GroupId g = getConversationId(c);
 		Map<MessageId, Metadata> metadata;
 		Collection<MessageStatus> statuses;
 		Transaction txn = db.startTransaction();
 		try {
+			GroupId g = getContactGroup(db.getContact(txn, c)).getId();
 			metadata = db.getMessageMetadata(txn, g);
 			statuses = db.getMessageStatus(txn, c, g);
 			txn.setComplete();
diff --git a/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java b/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java
index 1032717f56425f05c1e38fc6e4dab714cbef8299..b3db2611c4189027de88153134e6766256451d84 100644
--- a/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java
+++ b/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java
@@ -91,7 +91,7 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
 		db.setVisibleToContact(txn, c.getId(), g.getId(), true);
 		// Copy the latest local properties into the group
 		DeviceId dev = db.getDeviceId(txn);
-		Map<TransportId, TransportProperties> local = getLocalProperties();
+		Map<TransportId, TransportProperties> local = getLocalProperties(txn);
 		for (Entry<TransportId, TransportProperties> e : local.entrySet()) {
 			storeMessage(txn, g.getId(), dev, e.getKey(), e.getValue(), 1,
 					true, true);
@@ -122,30 +122,15 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
 	@Override
 	public Map<TransportId, TransportProperties> getLocalProperties()
 			throws DbException {
+		Map<TransportId, TransportProperties> local;
+		Transaction txn = db.startTransaction();
 		try {
-			Map<TransportId, TransportProperties> local =
-					new HashMap<TransportId, TransportProperties>();
-			Transaction txn = db.startTransaction();
-			try {
-				// Find the latest local update for each transport
-				Map<TransportId, LatestUpdate> latest = findLatest(txn,
-						localGroup.getId(), true);
-				// Retrieve and parse the latest local properties
-				for (Entry<TransportId, LatestUpdate> e : latest.entrySet()) {
-					byte[] raw = db.getRawMessage(txn, e.getValue().messageId);
-					local.put(e.getKey(), parseProperties(raw));
-				}
-				txn.setComplete();
-			} finally {
-				db.endTransaction(txn);
-			}
-			return Collections.unmodifiableMap(local);
-		} catch (NoSuchGroupException e) {
-			// Local group doesn't exist - there are no local properties
-			return Collections.emptyMap();
-		} catch (FormatException e) {
-			throw new DbException(e);
+			local = getLocalProperties(txn);
+			txn.setComplete();
+		} finally {
+			db.endTransaction(txn);
 		}
+		return Collections.unmodifiableMap(local);
 	}
 
 	@Override
@@ -255,6 +240,28 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
 		return privateGroupFactory.createPrivateGroup(CLIENT_ID, c);
 	}
 
+	private Map<TransportId, TransportProperties> getLocalProperties(
+			Transaction txn) throws DbException {
+		try {
+			Map<TransportId, TransportProperties> local =
+					new HashMap<TransportId, TransportProperties>();
+			// Find the latest local update for each transport
+			Map<TransportId, LatestUpdate> latest = findLatest(txn,
+					localGroup.getId(), true);
+			// Retrieve and parse the latest local properties
+			for (Entry<TransportId, LatestUpdate> e : latest.entrySet()) {
+				byte[] raw = db.getRawMessage(txn, e.getValue().messageId);
+				local.put(e.getKey(), parseProperties(raw));
+			}
+			return local;
+		} catch (NoSuchGroupException e) {
+			// Local group doesn't exist - there are no local properties
+			return Collections.emptyMap();
+		} catch (FormatException e) {
+			throw new DbException(e);
+		}
+	}
+
 	private void storeMessage(Transaction txn, GroupId g, DeviceId dev,
 			TransportId t, TransportProperties p, long version, boolean local,
 			boolean shared) throws DbException {
diff --git a/briar-core/src/org/briarproject/settings/SettingsManagerImpl.java b/briar-core/src/org/briarproject/settings/SettingsManagerImpl.java
index 639d822bbc0c57c0eed488a6f509e9fa493f58af..eb929aa0991f76006c49e1be5ff19d5c7c66f532 100644
--- a/briar-core/src/org/briarproject/settings/SettingsManagerImpl.java
+++ b/briar-core/src/org/briarproject/settings/SettingsManagerImpl.java
@@ -19,14 +19,15 @@ class SettingsManagerImpl implements SettingsManager {
 
 	@Override
 	public Settings getSettings(String namespace) throws DbException {
+		Settings s;
 		Transaction txn = db.startTransaction();
 		try {
-			Settings s = db.getSettings(txn, namespace);
+			s = db.getSettings(txn, namespace);
 			txn.setComplete();
-			return s;
 		} finally {
 			db.endTransaction(txn);
 		}
+		return s;
 	}
 
 	@Override
diff --git a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java
index b981550757b103508ea9efee6f26e6db8210cf6b..3488bb2d1a106e49b9f4cccdcb5ba3a6d3e40f1b 100644
--- a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java
+++ b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java
@@ -190,20 +190,23 @@ public class DatabaseComponentImplTest extends BriarTestCase {
 
 		assertFalse(db.open());
 		Transaction transaction = db.startTransaction();
-		db.addLocalAuthor(transaction, localAuthor);
-		assertEquals(contactId,
-				db.addContact(transaction, author, localAuthorId));
-		assertEquals(Collections.singletonList(contact),
-				db.getContacts(transaction));
-		db.addGroup(transaction, group); // First time - listeners called
-		db.addGroup(transaction, group); // Second time - not called
-		assertEquals(Collections.singletonList(group),
-				db.getGroups(transaction, clientId));
-		db.removeGroup(transaction, group);
-		db.removeContact(transaction, contactId);
-		db.removeLocalAuthor(transaction, localAuthorId);
-		transaction.setComplete();
-		db.endTransaction(transaction);
+		try {
+			db.addLocalAuthor(transaction, localAuthor);
+			assertEquals(contactId,
+					db.addContact(transaction, author, localAuthorId));
+			assertEquals(Collections.singletonList(contact),
+					db.getContacts(transaction));
+			db.addGroup(transaction, group); // First time - listeners called
+			db.addGroup(transaction, group); // Second time - not called
+			assertEquals(Collections.singletonList(group),
+					db.getGroups(transaction, clientId));
+			db.removeGroup(transaction, group);
+			db.removeContact(transaction, contactId);
+			db.removeLocalAuthor(transaction, localAuthorId);
+			transaction.setComplete();
+		} finally {
+			db.endTransaction(transaction);
+		}
 		db.close();
 
 		context.assertIsSatisfied();