From 68b216d5802cdbeac49224730386dc4dbf0afa94 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Wed, 30 Nov 2016 17:02:48 -0200
Subject: [PATCH] Make animations more consistent

---
 .../briar/android/activity/BriarActivity.java | 44 ++++++++++-
 .../activity/BriarFragmentActivity.java       | 32 ++------
 .../briar/android/blog/BlogActivity.java      | 10 +--
 .../briar/android/blog/BlogFragment.java      | 11 +--
 .../android/blog/BlogPostViewHolder.java      |  8 +-
 .../briar/android/blog/FeedFragment.java      | 17 +---
 .../briar/android/blog/ReblogActivity.java    | 23 +-----
 .../android/blog/RssFeedManageActivity.java   | 11 +--
 .../android/contact/ContactListFragment.java  |  4 +-
 .../android/contact/ConversationActivity.java | 35 +++-----
 .../BaseContactSelectorFragment.java          |  6 --
 .../ContactSelectorActivity.java              |  6 --
 .../android/forum/CreateForumActivity.java    |  2 +-
 .../briar/android/forum/ForumActivity.java    | 10 +--
 .../briar/android/fragment/BaseFragment.java  |  8 ++
 .../android/fragment/SignOutFragment.java     | 33 ++++++++
 .../introduction/ContactChooserFragment.java  | 27 ++++---
 .../introduction/IntroductionActivity.java    | 72 +----------------
 .../IntroductionMessageFragment.java          | 15 +++-
 .../invitation/AddContactActivity.java        |  2 +-
 .../keyagreement/KeyAgreementActivity.java    | 37 +++------
 .../android/login/ChangePasswordActivity.java |  2 +-
 .../briar/android/login/PasswordActivity.java |  7 +-
 .../briar/android/login/SetupActivity.java    |  4 +-
 .../android/navdrawer/NavDrawerActivity.java  | 55 +++++--------
 .../panic/PanicPreferencesFragment.java       |  2 +-
 .../conversation/GroupActivity.java           | 13 +--
 .../creation/BaseGroupInviteActivity.java     | 11 +--
 .../creation/CreateGroupActivity.java         | 28 +------
 .../creation/GroupInviteActivity.java         |  7 +-
 .../privategroup/list/GroupListFragment.java  | 14 +---
 .../privategroup/list/GroupViewHolder.java    |  8 +-
 .../reveal/RevealContactsActivity.java        |  6 +-
 .../briar/android/sharing/ShareActivity.java  | 13 +--
 .../android/sharing/ShareBlogActivity.java    |  5 +-
 .../android/sharing/ShareForumActivity.java   |  6 +-
 .../android/splash/SplashScreenActivity.java  |  8 +-
 .../briar/android/util/UiUtils.java           |  4 +-
 .../briar/android/view/AuthorView.java        | 24 +++---
 briar-android/src/main/res/anim/dialog_in.xml |  7 ++
 .../src/main/res/anim/dialog_out.xml          |  7 ++
 .../src/main/res/anim/screen_new_in.xml       | 12 +++
 .../src/main/res/anim/screen_new_out.xml      | 12 +++
 .../src/main/res/anim/screen_old_in.xml       |  7 ++
 .../src/main/res/anim/screen_old_out.xml      |  7 ++
 .../src/main/res/anim/step_next_in.xml        | 12 +++
 .../src/main/res/anim/step_next_out.xml       | 12 +++
 .../src/main/res/anim/step_previous_in.xml    |  7 ++
 .../src/main/res/anim/step_previous_out.xml   |  7 ++
 .../main/res/layout/activity_nav_drawer.xml   | 28 ++++++-
 .../src/main/res/layout/activity_plain.xml    |  2 +-
 .../main/res/layout/activity_with_loading.xml | 61 --------------
 .../res/layout/fragment_blog_post_pager.xml   | 20 -----
 .../src/main/res/layout/fragment_reblog.xml   |  5 +-
 .../src/main/res/layout/fragment_sign_out.xml | 23 ++++++
 .../main/res/layout/introduction_message.xml  |  1 -
 .../src/main/res/layout/list_item_blog.xml    | 79 -------------------
 .../layout/list_item_revealable_contact.xml   |  1 -
 .../layout/list_item_selectable_contact.xml   |  1 -
 .../src/main/res/values-de/strings.xml        |  7 --
 .../src/main/res/values-es/strings.xml        |  7 --
 .../src/main/res/values-fr/strings.xml        |  7 --
 .../src/main/res/values-it/strings.xml        |  5 --
 .../src/main/res/values-pt-rBR/strings.xml    |  7 --
 .../src/main/res/values-sq/strings.xml        |  7 --
 briar-android/src/main/res/values/strings.xml |  7 --
 briar-android/src/main/res/values/themes.xml  | 13 ++-
 67 files changed, 383 insertions(+), 618 deletions(-)
 create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/fragment/SignOutFragment.java
 create mode 100644 briar-android/src/main/res/anim/dialog_in.xml
 create mode 100644 briar-android/src/main/res/anim/dialog_out.xml
 create mode 100644 briar-android/src/main/res/anim/screen_new_in.xml
 create mode 100644 briar-android/src/main/res/anim/screen_new_out.xml
 create mode 100644 briar-android/src/main/res/anim/screen_old_in.xml
 create mode 100644 briar-android/src/main/res/anim/screen_old_out.xml
 create mode 100644 briar-android/src/main/res/anim/step_next_in.xml
 create mode 100644 briar-android/src/main/res/anim/step_next_out.xml
 create mode 100644 briar-android/src/main/res/anim/step_previous_in.xml
 create mode 100644 briar-android/src/main/res/anim/step_previous_out.xml
 delete mode 100644 briar-android/src/main/res/layout/activity_with_loading.xml
 delete mode 100644 briar-android/src/main/res/layout/fragment_blog_post_pager.xml
 create mode 100644 briar-android/src/main/res/layout/fragment_sign_out.xml
 delete mode 100644 briar-android/src/main/res/layout/list_item_blog.xml

diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java
index c590eaddb4..c2e4f113c1 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java
@@ -3,10 +3,16 @@ package org.briarproject.briar.android.activity;
 import android.annotation.SuppressLint;
 import android.content.Intent;
 import android.os.Build;
+import android.transition.Slide;
+import android.transition.Transition;
+import android.view.Gravity;
+import android.view.Window;
 
+import org.briarproject.briar.R;
 import org.briarproject.briar.android.controller.BriarController;
 import org.briarproject.briar.android.controller.DbController;
 import org.briarproject.briar.android.controller.handler.UiResultHandler;
+import org.briarproject.briar.android.fragment.BaseFragment;
 import org.briarproject.briar.android.login.PasswordActivity;
 import org.briarproject.briar.android.panic.ExitActivity;
 
@@ -44,7 +50,7 @@ public abstract class BriarActivity extends BaseActivity {
 		super.onActivityResult(request, result, data);
 		if (request == REQUEST_PASSWORD) {
 			if (result == RESULT_OK) briarController.startAndBindService();
-			else finish();
+			else supportFinishAfterTransition();
 		}
 	}
 
@@ -53,11 +59,41 @@ public abstract class BriarActivity extends BaseActivity {
 		super.onStart();
 		if (!briarController.hasEncryptionKey() && !isFinishing()) {
 			Intent i = new Intent(this, PasswordActivity.class);
-			i.setFlags(FLAG_ACTIVITY_NO_ANIMATION | FLAG_ACTIVITY_SINGLE_TOP);
+			i.setFlags(FLAG_ACTIVITY_SINGLE_TOP);
 			startActivityForResult(i, REQUEST_PASSWORD);
 		}
 	}
 
+	protected void showInitialFragment(BaseFragment f) {
+		getSupportFragmentManager().beginTransaction()
+				.replace(R.id.fragmentContainer, f, f.getUniqueTag())
+				.commit();
+	}
+
+	public void showNextFragment(BaseFragment f) {
+		getSupportFragmentManager().beginTransaction()
+				.setCustomAnimations(R.anim.step_next_in,
+						R.anim.step_previous_out, R.anim.step_previous_in,
+						R.anim.step_next_out)
+				.replace(R.id.fragmentContainer, f, f.getUniqueTag())
+				.addToBackStack(f.getUniqueTag())
+				.commit();
+	}
+
+	public void setSceneTransitionAnimation() {
+		if (Build.VERSION.SDK_INT < 21) return;
+		Transition slide = new Slide(Gravity.RIGHT);
+		slide.excludeTarget(android.R.id.statusBarBackground, true);
+		slide.excludeTarget(android.R.id.navigationBarBackground, true);
+		Window window = getWindow();
+		window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
+		window.setExitTransition(slide);
+		window.setEnterTransition(slide);
+		window.setTransitionBackgroundFadeDuration(getResources()
+				.getInteger(android.R.integer.config_longAnimTime));
+		window.setBackgroundDrawableResource(android.R.color.transparent);
+	}
+
 	protected void signOut(final boolean removeFromRecentApps) {
 		briarController.signOut(new UiResultHandler<Void>(this) {
 			@Override
@@ -83,7 +119,7 @@ public abstract class BriarActivity extends BaseActivity {
 
 	private void finishAndExit() {
 		if (Build.VERSION.SDK_INT >= 21) finishAndRemoveTask();
-		else finish();
+		else supportFinishAfterTransition();
 		LOG.info("Exiting");
 		System.exit(0);
 	}
@@ -98,7 +134,7 @@ public abstract class BriarActivity extends BaseActivity {
 		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
-				finish();
+				supportFinishAfterTransition();
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarFragmentActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarFragmentActivity.java
index 5b18421dfd..fa211156d8 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarFragmentActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarFragmentActivity.java
@@ -1,8 +1,6 @@
 package org.briarproject.briar.android.activity;
 
-import android.support.annotation.AnimRes;
 import android.support.v4.app.FragmentTransaction;
-import android.support.v7.app.AlertDialog;
 
 import org.briarproject.briar.R;
 import org.briarproject.briar.android.contact.ContactListFragment;
@@ -49,31 +47,15 @@ public abstract class BriarFragmentActivity extends BriarActivity {
 		else startFragment(fragment, true);
 	}
 
-	protected void showMessageDialog(int titleStringId, int msgStringId) {
-		// TODO replace with custom dialog fragment ?
-		AlertDialog.Builder builder = new AlertDialog.Builder(this,
-				R.style.BriarDialogTheme);
-		builder.setTitle(titleStringId);
-		builder.setMessage(msgStringId);
-		builder.setPositiveButton(R.string.ok, null);
-		AlertDialog dialog = builder.create();
-		dialog.show();
-	}
-
-	public void startFragment(BaseFragment fragment,
-			boolean isAddedToBackStack) {
-		startFragment(fragment, 0, 0, isAddedToBackStack);
-	}
-
-	private void startFragment(BaseFragment fragment,
-			@AnimRes int inAnimation, @AnimRes int outAnimation,
+	protected void startFragment(BaseFragment fragment,
 			boolean isAddedToBackStack) {
 		FragmentTransaction trans =
-				getSupportFragmentManager().beginTransaction();
-		if (inAnimation != 0 && outAnimation != 0) {
-			trans.setCustomAnimations(inAnimation, 0, 0, outAnimation);
-		}
-		trans.replace(R.id.content_fragment, fragment, fragment.getUniqueTag());
+				getSupportFragmentManager().beginTransaction()
+						.setCustomAnimations(R.anim.dialog_in,
+								R.anim.dialog_out, R.anim.dialog_in,
+								R.anim.dialog_out)
+						.replace(R.id.fragmentContainer, fragment,
+								fragment.getUniqueTag());
 		if (isAddedToBackStack) {
 			trans.addToBackStack(fragment.getUniqueTag());
 		}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogActivity.java
index ab6c7cc0c6..d6234db3c6 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogActivity.java
@@ -57,10 +57,7 @@ public class BlogActivity extends BriarActivity implements
 		}
 
 		if (state == null) {
-			BlogFragment f = BlogFragment.newInstance(groupId);
-			getSupportFragmentManager().beginTransaction()
-					.replace(R.id.fragmentContainer, f, f.getUniqueTag())
-					.commit();
+			showInitialFragment(BlogFragment.newInstance(groupId));
 		}
 	}
 
@@ -72,10 +69,7 @@ public class BlogActivity extends BriarActivity implements
 	@Override
 	public void onBlogPostClick(BlogPostItem post) {
 		BlogPostFragment f = BlogPostFragment.newInstance(post.getId());
-		getSupportFragmentManager().beginTransaction()
-				.replace(R.id.fragmentContainer, f, f.getUniqueTag())
-				.addToBackStack(f.getUniqueTag())
-				.commit();
+		showNextFragment(f);
 	}
 
 	@Override
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java
index 587a46ba0c..d00b7e0aca 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java
@@ -142,30 +142,25 @@ public class BlogFragment extends BaseFragment
 
 	@Override
 	public boolean onOptionsItemSelected(final MenuItem item) {
-		ActivityOptionsCompat options =
-				makeCustomAnimation(getActivity(),
-						android.R.anim.slide_in_left,
-						android.R.anim.slide_out_right);
 		switch (item.getItemId()) {
 			case R.id.action_write_blog_post:
 				Intent i = new Intent(getActivity(),
 						WriteBlogPostActivity.class);
 				i.putExtra(GROUP_ID, groupId.getBytes());
-				startActivityForResult(i, REQUEST_WRITE_POST,
-						options.toBundle());
+				startActivityForResult(i, REQUEST_WRITE_POST);
 				return true;
 			case R.id.action_blog_share:
 				Intent i2 = new Intent(getActivity(), ShareBlogActivity.class);
 				i2.setFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP);
 				i2.putExtra(GROUP_ID, groupId.getBytes());
-				startActivityForResult(i2, REQUEST_SHARE, options.toBundle());
+				startActivityForResult(i2, REQUEST_SHARE);
 				return true;
 			case R.id.action_blog_sharing_status:
 				Intent i3 = new Intent(getActivity(),
 						BlogSharingStatusActivity.class);
 				i3.setFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP);
 				i3.putExtra(GROUP_ID, groupId.getBytes());
-				startActivity(i3, options.toBundle());
+				startActivity(i3);
 				return true;
 			case R.id.action_blog_delete:
 				showDeleteDialog();
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java
index 5187537d9e..ba1d11e683 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java
@@ -137,15 +137,14 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
 				i.putExtra(GROUP_ID, item.getGroupId().getBytes());
 				i.putExtra(POST_ID, item.getId().getBytes());
 
-				// work-around for android bug #224270
 				if (Build.VERSION.SDK_INT >= 23) {
 					ActivityOptionsCompat options =
 							makeSceneTransitionAnimation((Activity) ctx, layout,
 									getTransitionName(item.getId()));
-					ActivityCompat
-							.startActivity((Activity) ctx, i,
-									options.toBundle());
+					ActivityCompat.startActivity((Activity) ctx, i,
+							options.toBundle());
 				} else {
+					// work-around for android bug #224270
 					ctx.startActivity(i);
 				}
 			}
@@ -167,6 +166,7 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
 		reblogger.setDate(item.getTimestamp());
 		reblogger.setBlogLink(item.getGroupId());
 		reblogger.setVisibility(VISIBLE);
+		reblogger.setPersona(AuthorView.REBLOGGER);
 
 		author.setPersona(AuthorView.COMMENTER);
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java
index 0eee3cd8bc..42eadebbde 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java
@@ -4,7 +4,6 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.UiThread;
 import android.support.design.widget.Snackbar;
-import android.support.v4.app.ActivityOptionsCompat;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.widget.LinearLayoutManager;
 import android.view.LayoutInflater;
@@ -36,7 +35,6 @@ import javax.inject.Inject;
 
 import static android.app.Activity.RESULT_OK;
 import static android.support.design.widget.Snackbar.LENGTH_LONG;
-import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation;
 import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
 import static org.briarproject.briar.android.blog.BlogActivity.REQUEST_WRITE_POST;
 
@@ -169,28 +167,24 @@ public class FeedFragment extends BaseFragment implements
 	@Override
 	public boolean onOptionsItemSelected(final MenuItem item) {
 		if (personalBlog == null) return false;
-		ActivityOptionsCompat options =
-				makeCustomAnimation(getActivity(), android.R.anim.slide_in_left,
-						android.R.anim.slide_out_right);
 		switch (item.getItemId()) {
 			case R.id.action_write_blog_post:
 				Intent i1 =
 						new Intent(getActivity(), WriteBlogPostActivity.class);
 				i1.putExtra(GROUP_ID, personalBlog.getId().getBytes());
-				startActivityForResult(i1, REQUEST_WRITE_POST,
-						options.toBundle());
+				startActivityForResult(i1, REQUEST_WRITE_POST);
 				return true;
 			case R.id.action_rss_feeds_import:
 				Intent i2 =
 						new Intent(getActivity(), RssFeedImportActivity.class);
 				i2.putExtra(GROUP_ID, personalBlog.getId().getBytes());
-				startActivity(i2, options.toBundle());
+				startActivity(i2);
 				return true;
 			case R.id.action_rss_feeds_manage:
 				Intent i3 =
 						new Intent(getActivity(), RssFeedManageActivity.class);
 				i3.putExtra(GROUP_ID, personalBlog.getId().getBytes());
-				startActivity(i3, options.toBundle());
+				startActivity(i3);
 				return true;
 			default:
 				return super.onOptionsItemSelected(item);
@@ -225,10 +219,7 @@ public class FeedFragment extends BaseFragment implements
 	public void onBlogPostClick(BlogPostItem post) {
 		FeedPostFragment f =
 				FeedPostFragment.newInstance(post.getGroupId(), post.getId());
-		getActivity().getSupportFragmentManager().beginTransaction()
-				.replace(R.id.content_fragment, f, f.getUniqueTag())
-				.addToBackStack(f.getUniqueTag())
-				.commit();
+		showNextFragment(f);
 	}
 
 	@Override
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/ReblogActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/ReblogActivity.java
index 94194d682d..27e8f19ad6 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/ReblogActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/ReblogActivity.java
@@ -1,11 +1,7 @@
 package org.briarproject.briar.android.blog;
 
-import android.annotation.TargetApi;
 import android.content.Intent;
-import android.os.Build;
 import android.os.Bundle;
-import android.transition.Fade;
-import android.transition.Transition;
 import android.view.MenuItem;
 
 import org.briarproject.bramble.api.sync.GroupId;
@@ -23,10 +19,7 @@ public class ReblogActivity extends BriarActivity implements
 	@Override
 	public void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
-
-		if (Build.VERSION.SDK_INT >= 21) {
-			setTransition();
-		}
+		setSceneTransitionAnimation();
 
 		Intent intent = getIntent();
 		byte[] groupId = intent.getByteArrayExtra(GROUP_ID);
@@ -41,10 +34,7 @@ public class ReblogActivity extends BriarActivity implements
 		if (savedInstanceState == null) {
 			ReblogFragment f = ReblogFragment
 					.newInstance(new GroupId(groupId), new MessageId(postId));
-			getSupportFragmentManager()
-					.beginTransaction()
-					.add(R.id.fragmentContainer, f)
-					.commit();
+			showInitialFragment(f);
 		}
 	}
 
@@ -69,13 +59,4 @@ public class ReblogActivity extends BriarActivity implements
 
 	}
 
-	@TargetApi(21)
-	private void setTransition() {
-		Transition fade = new Fade();
-		fade.excludeTarget(android.R.id.statusBarBackground, true);
-		fade.excludeTarget(R.id.action_bar_container, true);
-		fade.excludeTarget(android.R.id.navigationBarBackground, true);
-		getWindow().setExitTransition(fade);
-		getWindow().setEnterTransition(fade);
-	}
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedManageActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedManageActivity.java
index 5229018572..10e37d6f27 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedManageActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedManageActivity.java
@@ -3,8 +3,6 @@ package org.briarproject.briar.android.blog;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.design.widget.Snackbar;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.app.ActivityOptionsCompat;
 import android.support.v7.widget.LinearLayoutManager;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -26,7 +24,6 @@ import java.util.logging.Logger;
 import javax.inject.Inject;
 
 import static android.support.design.widget.Snackbar.LENGTH_LONG;
-import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation;
 import static java.util.logging.Level.WARNING;
 
 public class RssFeedManageActivity extends BriarActivity
@@ -89,13 +86,9 @@ public class RssFeedManageActivity extends BriarActivity
 				onBackPressed();
 				return true;
 			case R.id.action_rss_feeds_import:
-				Intent i =
-						new Intent(this, RssFeedImportActivity.class);
+				Intent i = new Intent(this, RssFeedImportActivity.class);
 				i.putExtra(GROUP_ID, groupId.getBytes());
-				ActivityOptionsCompat options =
-						makeCustomAnimation(this, android.R.anim.slide_in_left,
-								android.R.anim.slide_out_right);
-				ActivityCompat.startActivity(this, i, options.toBundle());
+				startActivity(i);
 				return true;
 			default:
 				return super.onOptionsItemSelected(item);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java
index af242e9454..a8e7dd1f08 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java
@@ -120,7 +120,6 @@ public class ContactListFragment extends BaseFragment implements EventListener {
 						ContactId contactId = item.getContact().getId();
 						i.putExtra(CONTACT_ID, contactId.getInt());
 
-						// work-around for android bug #224270
 						if (Build.VERSION.SDK_INT >= 23) {
 							ContactListItemViewHolder holder =
 									(ContactListItemViewHolder) list
@@ -140,7 +139,8 @@ public class ContactListFragment extends BaseFragment implements EventListener {
 							ActivityCompat.startActivity(getActivity(), i,
 									options.toBundle());
 						} else {
-							getActivity().startActivity(i);
+							// work-around for android bug #224270
+							startActivity(i);
 						}
 					}
 				};
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationActivity.java
index 7d832eff82..11780653a2 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationActivity.java
@@ -5,10 +5,7 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.UiThread;
 import android.support.design.widget.Snackbar;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.app.ActivityOptionsCompat;
 import android.support.v4.content.ContextCompat;
-import android.support.v4.view.ViewCompat;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.ActionMenuView;
@@ -55,7 +52,6 @@ import org.briarproject.briar.android.activity.ActivityComponent;
 import org.briarproject.briar.android.activity.BriarActivity;
 import org.briarproject.briar.android.contact.ConversationAdapter.ConversationListener;
 import org.briarproject.briar.android.introduction.IntroductionActivity;
-import org.briarproject.briar.android.util.UiUtils;
 import org.briarproject.briar.android.view.BriarRecyclerView;
 import org.briarproject.briar.android.view.TextInputView;
 import org.briarproject.briar.android.view.TextInputView.TextInputListener;
@@ -100,12 +96,14 @@ import im.delight.android.identicons.IdenticonDrawable;
 import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt;
 import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt.OnHidePromptListener;
 
-import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation;
+import static android.support.v4.view.ViewCompat.setTransitionName;
 import static android.support.v7.util.SortedList.INVALID_POSITION;
 import static android.widget.Toast.LENGTH_SHORT;
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
 import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE;
+import static org.briarproject.briar.android.util.UiUtils.getAvatarTransitionName;
+import static org.briarproject.briar.android.util.UiUtils.getBulbTransitionName;
 import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_BODY_LENGTH;
 
 @MethodsNotNullByDefault
@@ -117,7 +115,7 @@ public class ConversationActivity extends BriarActivity
 
 	private static final Logger LOG =
 			Logger.getLogger(ConversationActivity.class.getName());
-	private static final int REQUEST_CODE_INTRODUCTION = 1;
+	private static final int REQUEST_CODE_INTRODUCTION = 2;
 	private static final String SHOW_ONBOARDING_INTRODUCTION =
 			"showOnboardingIntroduction";
 
@@ -168,6 +166,7 @@ public class ConversationActivity extends BriarActivity
 	@Override
 	public void onCreate(@Nullable Bundle state) {
 		super.onCreate(state);
+		setSceneTransitionAnimation();
 
 		Intent i = getIntent();
 		int id = i.getIntExtra(CONTACT_ID, -1);
@@ -194,10 +193,8 @@ public class ConversationActivity extends BriarActivity
 			ab.setDisplayShowTitleEnabled(false);
 		}
 
-		ViewCompat.setTransitionName(toolbarAvatar,
-				UiUtils.getAvatarTransitionName(contactId));
-		ViewCompat.setTransitionName(toolbarStatus,
-				UiUtils.getBulbTransitionName(contactId));
+		setTransitionName(toolbarAvatar, getAvatarTransitionName(contactId));
+		setTransitionName(toolbarStatus, getBulbTransitionName(contactId));
 
 		adapter = new ConversationAdapter(this, this);
 		list = (BriarRecyclerView) findViewById(R.id.conversationView);
@@ -267,13 +264,8 @@ public class ConversationActivity extends BriarActivity
 			case R.id.action_introduction:
 				if (contactId == null) return false;
 				Intent intent = new Intent(this, IntroductionActivity.class);
-				intent.putExtra(IntroductionActivity.CONTACT_ID,
-						contactId.getInt());
-				ActivityOptionsCompat options =
-						makeCustomAnimation(this, android.R.anim.slide_in_left,
-								android.R.anim.slide_out_right);
-				ActivityCompat.startActivityForResult(this, intent,
-						REQUEST_CODE_INTRODUCTION, options.toBundle());
+				intent.putExtra(CONTACT_ID, contactId.getInt());
+				startActivityForResult(intent, REQUEST_CODE_INTRODUCTION);
 				return true;
 			case R.id.action_social_remove_person:
 				askToRemoveContact();
@@ -283,13 +275,6 @@ public class ConversationActivity extends BriarActivity
 		}
 	}
 
-	@Override
-	public void onBackPressed() {
-		// FIXME disabled exit transition, because it doesn't work for some reason #318
-		//supportFinishAfterTransition();
-		finish();
-	}
-
 	private void loadContactDetails() {
 		runOnDbThread(new Runnable() {
 			@Override
@@ -714,7 +699,7 @@ public class ConversationActivity extends BriarActivity
 				String deleted = getString(R.string.contact_deleted_toast);
 				Toast.makeText(ConversationActivity.this, deleted, LENGTH_SHORT)
 						.show();
-				finish();
+				supportFinishAfterTransition();
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contactselection/BaseContactSelectorFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contactselection/BaseContactSelectorFragment.java
index 1c9294fe29..ec318ebe36 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contactselection/BaseContactSelectorFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contactselection/BaseContactSelectorFragment.java
@@ -1,11 +1,9 @@
 package org.briarproject.briar.android.contactselection;
 
 import android.content.Context;
-import android.os.Build;
 import android.os.Bundle;
 import android.support.annotation.CallSuper;
 import android.support.v7.widget.LinearLayoutManager;
-import android.transition.Fade;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -69,10 +67,6 @@ public abstract class BaseContactSelectorFragment<I extends SelectableContactIte
 
 		View contentView = inflater.inflate(R.layout.list, container, false);
 
-		if (Build.VERSION.SDK_INT >= 21) {
-			setExitTransition(new Fade());
-		}
-
 		list = (BriarRecyclerView) contentView.findViewById(R.id.list);
 		list.setLayoutManager(new LinearLayoutManager(getActivity()));
 		list.setEmptyText(getString(R.string.no_contacts_selector));
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contactselection/ContactSelectorActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contactselection/ContactSelectorActivity.java
index 2eaaecbafe..809e8f66f8 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contactselection/ContactSelectorActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contactselection/ContactSelectorActivity.java
@@ -1,11 +1,9 @@
 package org.briarproject.briar.android.contactselection;
 
-import android.os.Build;
 import android.os.Bundle;
 import android.support.annotation.CallSuper;
 import android.support.annotation.LayoutRes;
 import android.support.annotation.UiThread;
-import android.transition.Fade;
 
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
@@ -39,10 +37,6 @@ public abstract class ContactSelectorActivity
 
 		setContentView(getLayout());
 
-		if (Build.VERSION.SDK_INT >= 21) {
-			getWindow().setExitTransition(new Fade());
-		}
-
 		if (bundle != null) {
 			// restore group ID if it was saved
 			byte[] groupBytes = bundle.getByteArray(GROUP_ID);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/CreateForumActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/CreateForumActivity.java
index 86822c7a2a..396746b212 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/forum/CreateForumActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/CreateForumActivity.java
@@ -158,7 +158,7 @@ public class CreateForumActivity extends BriarActivity
 				startActivity(i);
 				Toast.makeText(CreateForumActivity.this,
 						R.string.forum_created_toast, LENGTH_LONG).show();
-				finish();
+				supportFinishAfterTransition();
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumActivity.java
index bf079bbf08..95c80e49c6 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumActivity.java
@@ -6,8 +6,6 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.LayoutRes;
 import android.support.annotation.StringRes;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.app.ActivityOptionsCompat;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.LinearLayoutManager;
 import android.view.Menu;
@@ -37,7 +35,6 @@ import javax.inject.Inject;
 
 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
 import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;
-import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation;
 import static android.widget.Toast.LENGTH_SHORT;
 import static org.briarproject.briar.api.forum.ForumConstants.MAX_FORUM_POST_BODY_LENGTH;
 
@@ -124,8 +121,6 @@ public class ForumActivity extends
 
 	@Override
 	public boolean onOptionsItemSelected(final MenuItem item) {
-		ActivityOptionsCompat options = makeCustomAnimation(this,
-				android.R.anim.slide_in_left, android.R.anim.slide_out_right);
 		// Handle presses on the action bar items
 		switch (item.getItemId()) {
 			case R.id.action_forum_compose_post:
@@ -135,14 +130,13 @@ public class ForumActivity extends
 				Intent i2 = new Intent(this, ShareForumActivity.class);
 				i2.setFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP);
 				i2.putExtra(GROUP_ID, groupId.getBytes());
-				ActivityCompat.startActivityForResult(this, i2,
-						REQUEST_FORUM_SHARED, options.toBundle());
+				startActivityForResult(i2, REQUEST_FORUM_SHARED);
 				return true;
 			case R.id.action_forum_sharing_status:
 				Intent i3 = new Intent(this, ForumSharingStatusActivity.class);
 				i3.setFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP);
 				i3.putExtra(GROUP_ID, groupId.getBytes());
-				ActivityCompat.startActivity(this, i3, options.toBundle());
+				startActivity(i3);
 				return true;
 			case R.id.action_forum_delete:
 				showUnsubscribeDialog();
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/fragment/BaseFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/fragment/BaseFragment.java
index 8a5923119a..4a3821aa11 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/fragment/BaseFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/fragment/BaseFragment.java
@@ -71,6 +71,9 @@ public abstract class BaseFragment extends Fragment
 		@UiThread
 		ActivityComponent getActivityComponent();
 
+		@UiThread
+		void showNextFragment(BaseFragment f);
+
 		@UiThread
 		void onFragmentCreated(String tag);
 	}
@@ -92,4 +95,9 @@ public abstract class BaseFragment extends Fragment
 			});
 		}
 	}
+
+	protected void showNextFragment(BaseFragment f) {
+		listener.showNextFragment(f);
+	}
+
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/fragment/SignOutFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/fragment/SignOutFragment.java
new file mode 100644
index 0000000000..7999679ae1
--- /dev/null
+++ b/briar-android/src/main/java/org/briarproject/briar/android/fragment/SignOutFragment.java
@@ -0,0 +1,33 @@
+package org.briarproject.briar.android.fragment;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import org.briarproject.briar.R;
+import org.briarproject.briar.android.activity.ActivityComponent;
+
+public class SignOutFragment extends BaseFragment {
+
+	private static final String TAG = SignOutFragment.class.getName();
+
+	@Override
+	public View onCreateView(LayoutInflater inflater,
+			@Nullable ViewGroup container,
+			@Nullable Bundle savedInstanceState) {
+		return inflater.inflate(R.layout.fragment_sign_out, container, false);
+	}
+
+	@Override
+	public String getUniqueTag() {
+		return TAG;
+	}
+
+	@Override
+	public void injectFragment(ActivityComponent component) {
+		// no need to inject
+	}
+
+}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/introduction/ContactChooserFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/introduction/ContactChooserFragment.java
index 79f78b7cb9..7bfa80f969 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/introduction/ContactChooserFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/introduction/ContactChooserFragment.java
@@ -1,10 +1,8 @@
 package org.briarproject.briar.android.introduction;
 
 import android.content.Context;
-import android.os.Build;
 import android.os.Bundle;
 import android.support.v7.widget.LinearLayoutManager;
-import android.transition.Fade;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -31,13 +29,13 @@ import java.util.logging.Logger;
 import javax.inject.Inject;
 
 import static java.util.logging.Level.WARNING;
+import static org.briarproject.briar.android.contact.ConversationActivity.CONTACT_ID;
 
 public class ContactChooserFragment extends BaseFragment {
 
 	public static final String TAG = ContactChooserFragment.class.getName();
 	private static final Logger LOG = Logger.getLogger(TAG);
 
-	private IntroductionActivity introductionActivity;
 	private BriarRecyclerView list;
 	private ContactListAdapter adapter;
 	private ContactId contactId;
@@ -51,11 +49,12 @@ public class ContactChooserFragment extends BaseFragment {
 	@Inject
 	volatile ConnectionRegistry connectionRegistry;
 
-	public static ContactChooserFragment newInstance() {
+	public static ContactChooserFragment newInstance(ContactId id) {
 
 		Bundle args = new Bundle();
 
 		ContactChooserFragment fragment = new ContactChooserFragment();
+		args.putInt(CONTACT_ID, id.getInt());
 		fragment.setArguments(args);
 		return fragment;
 	}
@@ -63,7 +62,6 @@ public class ContactChooserFragment extends BaseFragment {
 	@Override
 	public void onAttach(Context context) {
 		super.onAttach(context);
-		introductionActivity = (IntroductionActivity) context;
 	}
 
 	@Override
@@ -72,17 +70,13 @@ public class ContactChooserFragment extends BaseFragment {
 
 		View contentView = inflater.inflate(R.layout.list, container, false);
 
-		if (Build.VERSION.SDK_INT >= 21) {
-			setExitTransition(new Fade());
-		}
-
 		OnContactClickListener<ContactListItem> onContactClickListener =
 				new OnContactClickListener<ContactListItem>() {
 					@Override
 					public void onItemClick(View view, ContactListItem item) {
 						if (c1 == null) throw new IllegalStateException();
 						Contact c2 = item.getContact();
-						introductionActivity.showMessageScreen(view, c1, c2);
+						showMessageScreen(c1, c2);
 					}
 				};
 		adapter = new ContactListAdapter(getActivity(), onContactClickListener);
@@ -92,7 +86,7 @@ public class ContactChooserFragment extends BaseFragment {
 		list.setAdapter(adapter);
 		list.setEmptyText(getString(R.string.no_contacts));
 
-		contactId = introductionActivity.getContactId();
+		contactId = new ContactId(getArguments().getInt(CONTACT_ID));
 
 		return contentView;
 	}
@@ -121,7 +115,7 @@ public class ContactChooserFragment extends BaseFragment {
 	}
 
 	private void loadContacts() {
-		introductionActivity.runOnDbThread(new Runnable() {
+		listener.runOnDbThread(new Runnable() {
 			@Override
 			public void run() {
 				try {
@@ -149,7 +143,7 @@ public class ContactChooserFragment extends BaseFragment {
 	}
 
 	private void displayContacts(final List<ContactListItem> contacts) {
-		introductionActivity.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				if (contacts.isEmpty()) list.showData();
@@ -158,4 +152,11 @@ public class ContactChooserFragment extends BaseFragment {
 		});
 	}
 
+	private void showMessageScreen(Contact c1, Contact c2) {
+		IntroductionMessageFragment messageFragment =
+				IntroductionMessageFragment
+						.newInstance(c1.getId().getInt(), c2.getId().getInt());
+		showNextFragment(messageFragment);
+	}
+
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/introduction/IntroductionActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/introduction/IntroductionActivity.java
index 2b66f8e2ec..05c07d4b18 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/introduction/IntroductionActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/introduction/IntroductionActivity.java
@@ -1,28 +1,19 @@
 package org.briarproject.briar.android.introduction;
 
 import android.content.Intent;
-import android.os.Build;
 import android.os.Bundle;
-import android.support.v4.app.FragmentManager;
-import android.transition.ChangeBounds;
-import android.transition.Fade;
-import android.view.MenuItem;
-import android.view.View;
 
-import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.briar.R;
 import org.briarproject.briar.android.activity.ActivityComponent;
 import org.briarproject.briar.android.activity.BriarActivity;
 import org.briarproject.briar.android.fragment.BaseFragment.BaseFragmentListener;
 
+import static org.briarproject.briar.android.contact.ConversationActivity.CONTACT_ID;
+
 public class IntroductionActivity extends BriarActivity
 		implements BaseFragmentListener {
 
-	public static final String CONTACT_ID = "briar.CONTACT_ID";
-
-	private ContactId contactId;
-
 	@Override
 	public void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
@@ -30,16 +21,12 @@ public class IntroductionActivity extends BriarActivity
 		Intent intent = getIntent();
 		int id = intent.getIntExtra(CONTACT_ID, -1);
 		if (id == -1) throw new IllegalStateException("No ContactId");
-		contactId = new ContactId(id);
+		ContactId contactId = new ContactId(id);
 
 		setContentView(R.layout.activity_fragment_container);
 
 		if (savedInstanceState == null) {
-			getSupportFragmentManager()
-					.beginTransaction()
-					.add(R.id.fragmentContainer,
-							ContactChooserFragment.newInstance())
-					.commit();
+			showInitialFragment(ContactChooserFragment.newInstance(contactId));
 		}
 	}
 
@@ -53,55 +40,4 @@ public class IntroductionActivity extends BriarActivity
 
 	}
 
-	@Override
-	public boolean onOptionsItemSelected(final MenuItem item) {
-		// Handle presses on the action bar items
-		switch (item.getItemId()) {
-			case android.R.id.home:
-				onBackPressed();
-				return true;
-			default:
-				return super.onOptionsItemSelected(item);
-		}
-	}
-
-	@Override
-	public void onBackPressed() {
-		FragmentManager fm = getSupportFragmentManager();
-		if (fm.getBackStackEntryCount() == 1) {
-			fm.popBackStack();
-		} else {
-			super.onBackPressed();
-		}
-	}
-
-	ContactId getContactId() {
-		return contactId;
-	}
-
-	void showMessageScreen(View view, Contact c1, Contact c2) {
-
-		IntroductionMessageFragment messageFragment =
-				IntroductionMessageFragment
-						.newInstance(c1.getId().getInt(), c2.getId().getInt());
-
-		if (Build.VERSION.SDK_INT >= 21) {
-			messageFragment.setSharedElementEnterTransition(new ChangeBounds());
-			messageFragment.setEnterTransition(new Fade());
-			messageFragment.setSharedElementReturnTransition(
-					new ChangeBounds());
-		}
-
-		getSupportFragmentManager()
-				.beginTransaction()
-				.setCustomAnimations(android.R.anim.fade_in,
-						android.R.anim.fade_out,
-						android.R.anim.slide_in_left,
-						android.R.anim.slide_out_right)
-				.addSharedElement(view, "avatar")
-				.replace(R.id.fragmentContainer, messageFragment,
-						ContactChooserFragment.TAG)
-				.addToBackStack(null)
-				.commit();
-	}
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/introduction/IntroductionMessageFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/introduction/IntroductionMessageFragment.java
index c50db5a157..e5a624cb0a 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/introduction/IntroductionMessageFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/introduction/IntroductionMessageFragment.java
@@ -4,6 +4,7 @@ import android.content.Context;
 import android.os.Bundle;
 import android.support.v7.app.ActionBar;
 import android.view.LayoutInflater;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ProgressBar;
@@ -92,8 +93,6 @@ public class IntroductionMessageFragment extends BaseFragment
 		// inflate view
 		View v = inflater.inflate(R.layout.introduction_message, container,
 				false);
-
-		// show progress bar until contacts have been loaded
 		ui = new ViewHolder(v);
 		ui.text.setVisibility(GONE);
 		ui.message.setSendButtonEnabled(false);
@@ -174,6 +173,18 @@ public class IntroductionMessageFragment extends BaseFragment
 		});
 	}
 
+	@Override
+	public boolean onOptionsItemSelected(final MenuItem item) {
+		switch (item.getItemId()) {
+			case android.R.id.home:
+				introductionActivity.hideSoftKeyboard(ui.message);
+				introductionActivity.onBackPressed();
+				return true;
+			default:
+				return super.onOptionsItemSelected(item);
+		}
+	}
+
 	@Override
 	public void onSendClick(String text) {
 		// disable button to prevent accidental double invitations
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/invitation/AddContactActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/invitation/AddContactActivity.java
index b3e42e085f..fbb2c9d3b2 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/invitation/AddContactActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/invitation/AddContactActivity.java
@@ -151,7 +151,7 @@ public class AddContactActivity extends BriarActivity
 		String format = getString(R.string.contact_added_toast);
 		String text = String.format(format, contactName);
 		Toast.makeText(this, text, LENGTH_LONG).show();
-		finish();
+		supportFinishAfterTransition();
 	}
 
 	@Override
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/KeyAgreementActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/KeyAgreementActivity.java
index 7d786bf2ca..9637668a07 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/KeyAgreementActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/KeyAgreementActivity.java
@@ -21,6 +21,7 @@ import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.briar.R;
 import org.briarproject.briar.android.activity.ActivityComponent;
 import org.briarproject.briar.android.activity.BriarFragmentActivity;
+import org.briarproject.briar.android.fragment.BaseFragment;
 import org.briarproject.briar.android.fragment.BaseFragment.BaseFragmentListener;
 import org.briarproject.briar.android.keyagreement.IntroFragment.IntroScreenSeenListener;
 
@@ -41,9 +42,6 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements
 	private static final Logger LOG =
 			Logger.getLogger(KeyAgreementActivity.class.getName());
 
-	private static final int STEP_INTRO = 1;
-	private static final int STEP_QR = 2;
-
 	@Inject
 	EventBus eventBus;
 
@@ -70,18 +68,8 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements
 		getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 
 		getSupportActionBar().setTitle(R.string.add_contact_title);
-		if (state == null) showStep(STEP_INTRO);
-	}
-
-	private void showStep(int step) {
-		switch (step) {
-			case STEP_QR:
-				startFragment(ShowQrCodeFragment.newInstance(), true);
-				break;
-			case STEP_INTRO:
-			default:
-				startFragment(IntroFragment.newInstance(), true);
-				break;
+		if (state == null) {
+			showInitialFragment(IntroFragment.newInstance());
 		}
 	}
 
@@ -108,18 +96,15 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements
 		}
 	}
 
-	@Override
-	public void onBackPressed() {
-		if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
-			supportFinishAfterTransition();
-		} else {
-			super.onBackPressed();
-		}
-	}
-
 	@Override
 	public void showNextScreen() {
-		showStep(STEP_QR);
+		// FIXME with #288
+//		showNextFragment(ShowQrCodeFragment.newInstance());
+		BaseFragment f = ShowQrCodeFragment.newInstance();
+		getSupportFragmentManager().beginTransaction()
+				.replace(R.id.fragmentContainer, f, f.getUniqueTag())
+				.addToBackStack(f.getUniqueTag())
+				.commit();
 	}
 
 	@Override
@@ -173,7 +158,7 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements
 				String text = String.format(format, contactName);
 				Toast.makeText(KeyAgreementActivity.this, text, LENGTH_LONG)
 						.show();
-				finish();
+				supportFinishAfterTransition();
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/login/ChangePasswordActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/login/ChangePasswordActivity.java
index 6b6c717feb..6bd309d5c4 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/login/ChangePasswordActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/login/ChangePasswordActivity.java
@@ -139,7 +139,7 @@ public class ChangePasswordActivity extends BaseActivity
 									R.string.password_changed,
 									Toast.LENGTH_LONG).show();
 							setResult(RESULT_OK);
-							finish();
+							supportFinishAfterTransition();
 						} else {
 							tryAgain();
 						}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/login/PasswordActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/login/PasswordActivity.java
index 3606f077f1..a67ac56dee 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/login/PasswordActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/login/PasswordActivity.java
@@ -42,6 +42,7 @@ public class PasswordActivity extends BaseActivity {
 	@Override
 	public void onCreate(Bundle state) {
 		super.onCreate(state);
+		overridePendingTransition(R.anim.dialog_in, R.anim.dialog_out);
 
 		if (!passwordController.accountExists()) {
 			deleteAccount();
@@ -97,7 +98,7 @@ public class PasswordActivity extends BaseActivity {
 		passwordController.deleteAccount(this);
 		setResult(RESULT_CANCELED);
 		startActivity(new Intent(this, SetupActivity.class));
-		finish();
+		supportFinishAfterTransition();
 	}
 
 	public void onSignInClick(View v) {
@@ -132,7 +133,9 @@ public class PasswordActivity extends BaseActivity {
 					public void onResultUi(@NonNull Boolean result) {
 						if (result) {
 							setResult(RESULT_OK);
-							finish();
+							supportFinishAfterTransition();
+							overridePendingTransition(R.anim.screen_new_in,
+									R.anim.screen_old_out);
 						} else {
 							tryAgain();
 						}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/login/SetupActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/login/SetupActivity.java
index be3627dc8f..1c2ad3c17b 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/login/SetupActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/login/SetupActivity.java
@@ -50,6 +50,7 @@ public class SetupActivity extends BaseActivity implements OnClickListener,
 	@Override
 	public void onCreate(Bundle state) {
 		super.onCreate(state);
+		overridePendingTransition(R.anim.dialog_in, R.anim.dialog_out);
 		setContentView(R.layout.activity_setup);
 
 		nicknameEntryWrapper =
@@ -149,6 +150,7 @@ public class SetupActivity extends BaseActivity implements OnClickListener,
 		Intent i = new Intent(this, NavDrawerActivity.class);
 		i.setFlags(FLAG_ACTIVITY_NEW_TASK);
 		startActivity(i);
-		finish();
+		supportFinishAfterTransition();
+		overridePendingTransition(R.anim.screen_new_in, R.anim.screen_old_out);
 	}
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java
index e2edf7c98d..25a02e6e5a 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java
@@ -1,13 +1,11 @@
 package org.briarproject.briar.android.navdrawer;
 
-import android.content.Context;
 import android.content.Intent;
-import android.content.SharedPreferences;
 import android.content.res.Configuration;
-import android.content.res.Resources;
 import android.os.Bundle;
 import android.support.design.widget.NavigationView;
 import android.support.design.widget.NavigationView.OnNavigationItemSelectedListener;
+import android.support.v4.content.ContextCompat;
 import android.support.v4.widget.DrawerLayout;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.ActionBarDrawerToggle;
@@ -32,6 +30,7 @@ import org.briarproject.briar.android.blog.FeedFragment;
 import org.briarproject.briar.android.contact.ContactListFragment;
 import org.briarproject.briar.android.forum.ForumListFragment;
 import org.briarproject.briar.android.fragment.BaseFragment.BaseFragmentListener;
+import org.briarproject.briar.android.fragment.SignOutFragment;
 import org.briarproject.briar.android.privategroup.list.GroupListFragment;
 import org.briarproject.briar.android.settings.SettingsActivity;
 
@@ -56,16 +55,13 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 	private static final Logger LOG =
 			Logger.getLogger(NavDrawerActivity.class.getName());
 
-	private final static String PREF_SEEN_WELCOME_MESSAGE = "welcome_message";
-
 	private ActionBarDrawerToggle drawerToggle;
 
 	@Inject
 	NavDrawerController controller;
 
 	private DrawerLayout drawerLayout;
-	private TextView progressTitle;
-	private ViewGroup progressViewGroup;
+	private NavigationView navigation;
 
 	private List<Transport> transports;
 	private BaseAdapter transportsAdapter;
@@ -101,11 +97,8 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 
 		Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
 		drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
-		NavigationView navigation =
-				(NavigationView) findViewById(R.id.navigation);
+		navigation = (NavigationView) findViewById(R.id.navigation);
 		GridView transportsView = (GridView) findViewById(R.id.transportsView);
-		progressTitle = (TextView) findViewById(R.id.title_progress_bar);
-		progressViewGroup = (ViewGroup) findViewById(R.id.container_progress);
 
 		setSupportActionBar(toolbar);
 		getSupportActionBar().setDisplayHomeAsUpEnabled(true);
@@ -120,8 +113,6 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 		initializeTransports(getLayoutInflater());
 		transportsView.setAdapter(transportsAdapter);
 
-		welcomeMessageCheck();
-
 		if (state == null) {
 			navigation.setCheckedItem(R.id.nav_btn_contacts);
 			startFragment(ContactListFragment.newInstance());
@@ -131,15 +122,6 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 		}
 	}
 
-	private void welcomeMessageCheck() {
-		SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
-		if (!prefs.getBoolean(PREF_SEEN_WELCOME_MESSAGE, false)) {
-			showMessageDialog(R.string.dialog_title_welcome,
-					R.string.dialog_welcome_message);
-			prefs.edit().putBoolean(PREF_SEEN_WELCOME_MESSAGE, true).apply();
-		}
-	}
-
 	@Override
 	public void onStart() {
 		super.onStart();
@@ -155,7 +137,7 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 	}
 
 	private void loadFragment(int fragmentId) {
-		// TODO re-use fragments from the manager when possible
+		// TODO re-use fragments from the manager when possible (#606)
 		switch (fragmentId) {
 			case R.id.nav_btn_contacts:
 				startFragment(ContactListFragment.newInstance());
@@ -202,7 +184,7 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 		clearBackStack();
 		loadFragment(item.getItemId());
 		//Don't display the Settings Item as checked
-		if(item.getItemId() == R.id.nav_btn_settings){
+		if (item.getItemId() == R.id.nav_btn_settings){
 			return false;
 		}
 		return true;
@@ -216,8 +198,7 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 			return;
 		}
 		// Check the Contacts item because we always return to Contacts here
-		NavigationView navigation =	(NavigationView) findViewById(R.id.navigation);
-		navigation.getMenu().findItem(R.id.nav_btn_contacts).setChecked(true);
+		navigation.setCheckedItem(R.id.nav_btn_contacts);
 		super.onBackPressed();
 	}
 
@@ -235,10 +216,8 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 
 	@Override
 	protected void signOut() {
-		// Disable navigation drawer slide to open
 		drawerLayout.setDrawerLockMode(LOCK_MODE_LOCKED_CLOSED);
-		progressTitle.setText(R.string.progress_title_logout);
-		progressViewGroup.setVisibility(View.VISIBLE);
+		startFragment(new SignOutFragment());
 		super.signOut();
 	}
 
@@ -285,21 +264,25 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 			@Override
 			public View getView(int position, View convertView,
 					ViewGroup parent) {
-				ViewGroup view = (ViewGroup) inflater.inflate(
-						R.layout.list_item_transport, parent, false);
+				View view;
+				if (convertView != null) view = convertView;
+				else view =
+						inflater.inflate(R.layout.list_item_transport, parent,
+								false);
 
 				Transport t = getItem(position);
-				Resources r = getResources();
-
 				int c;
 				if (t.enabled) {
-					c = r.getColor(R.color.briar_green_light);
+					c = ContextCompat.getColor(NavDrawerActivity.this,
+							R.color.briar_green_light);
 				} else {
-					c = r.getColor(android.R.color.tertiary_text_light);
+					c = ContextCompat.getColor(NavDrawerActivity.this,
+							android.R.color.tertiary_text_light);
 				}
 
 				ImageView icon = (ImageView) view.findViewById(R.id.imageView);
-				icon.setImageDrawable(r.getDrawable(t.iconId));
+				icon.setImageDrawable(ContextCompat
+						.getDrawable(NavDrawerActivity.this, t.iconId));
 				icon.setColorFilter(c);
 
 				TextView text = (TextView) view.findViewById(R.id.textView);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/panic/PanicPreferencesFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/panic/PanicPreferencesFragment.java
index 9251b85b30..b08e48d174 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/panic/PanicPreferencesFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/panic/PanicPreferencesFragment.java
@@ -126,7 +126,7 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat
 							Intent intent = new Intent(Intent.ACTION_VIEW);
 							intent.setData(Uri.parse(
 									"market://details?id=info.guardianproject.ripple"));
-							getActivity().startActivity(intent);
+							startActivity(intent);
 							return true;
 						}
 					});
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java
index e0502432ff..fb4d4dfede 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java
@@ -6,8 +6,6 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.LayoutRes;
 import android.support.annotation.StringRes;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.app.ActivityOptionsCompat;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.LinearLayoutManager;
@@ -37,7 +35,6 @@ import org.briarproject.briar.api.privategroup.Visibility;
 import javax.annotation.Nullable;
 import javax.inject.Inject;
 
-import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation;
 import static android.view.View.GONE;
 import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_POST_BODY_LENGTH;
 
@@ -152,9 +149,6 @@ public class GroupActivity extends
 
 	@Override
 	public boolean onOptionsItemSelected(final MenuItem item) {
-		ActivityOptionsCompat options =
-				makeCustomAnimation(this, android.R.anim.slide_in_left,
-						android.R.anim.slide_out_right);
 		switch (item.getItemId()) {
 			case R.id.action_group_compose_message:
 				showTextInput(null);
@@ -162,18 +156,17 @@ public class GroupActivity extends
 			case R.id.action_group_member_list:
 				Intent i1 = new Intent(this, GroupMemberListActivity.class);
 				i1.putExtra(GROUP_ID, groupId.getBytes());
-				ActivityCompat.startActivity(this, i1, options.toBundle());
+				startActivity(i1);
 				return true;
 			case R.id.action_group_reveal:
 				Intent i2 = new Intent(this, RevealContactsActivity.class);
 				i2.putExtra(GROUP_ID, groupId.getBytes());
-				ActivityCompat.startActivity(this, i2, options.toBundle());
+				startActivity(i2);
 				return true;
 			case R.id.action_group_invite:
 				Intent i3 = new Intent(this, GroupInviteActivity.class);
 				i3.putExtra(GROUP_ID, groupId.getBytes());
-				ActivityCompat.startActivityForResult(this, i3, REQUEST_INVITE,
-						options.toBundle());
+				startActivityForResult(i3, REQUEST_INVITE);
 				return true;
 			case R.id.action_group_leave:
 				showLeaveGroupDialog();
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/BaseGroupInviteActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/BaseGroupInviteActivity.java
index d115020db9..30d64e95a1 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/BaseGroupInviteActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/BaseGroupInviteActivity.java
@@ -4,7 +4,6 @@ import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
 import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
-import org.briarproject.briar.R;
 import org.briarproject.briar.android.contactselection.ContactSelectorActivity;
 import org.briarproject.briar.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.briar.android.sharing.BaseMessageFragment.MessageFragmentListener;
@@ -27,15 +26,7 @@ public abstract class BaseGroupInviteActivity
 	public void contactsSelected(Collection<ContactId> contacts) {
 		super.contactsSelected(contacts);
 
-		CreateGroupMessageFragment fragment = new CreateGroupMessageFragment();
-		getSupportFragmentManager().beginTransaction()
-				.setCustomAnimations(android.R.anim.fade_in,
-						android.R.anim.fade_out,
-						android.R.anim.slide_in_left,
-						android.R.anim.slide_out_right)
-				.replace(R.id.fragmentContainer, fragment)
-				.addToBackStack(fragment.getUniqueTag())
-				.commit();
+		showNextFragment(new CreateGroupMessageFragment());
 	}
 
 	@Override
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupActivity.java
index df6c245395..e65875892d 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupActivity.java
@@ -2,8 +2,7 @@ package org.briarproject.briar.android.privategroup.creation;
 
 import android.content.Intent;
 import android.os.Bundle;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.app.ActivityOptionsCompat;
+import android.support.annotation.Nullable;
 
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
@@ -15,10 +14,6 @@ import org.briarproject.briar.android.controller.handler.UiResultExceptionHandle
 import org.briarproject.briar.android.privategroup.conversation.GroupActivity;
 import org.briarproject.briar.android.sharing.BaseMessageFragment.MessageFragmentListener;
 
-import javax.annotation.Nullable;
-
-import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation;
-
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
 public class CreateGroupActivity extends BaseGroupInviteActivity implements
@@ -34,10 +29,7 @@ public class CreateGroupActivity extends BaseGroupInviteActivity implements
 		super.onCreate(bundle);
 
 		if (bundle == null) {
-			CreateGroupFragment fragment = new CreateGroupFragment();
-			getSupportFragmentManager().beginTransaction()
-					.add(R.id.fragmentContainer, fragment)
-					.commit();
+			showInitialFragment(new CreateGroupFragment());
 		}
 	}
 
@@ -72,25 +64,13 @@ public class CreateGroupActivity extends BaseGroupInviteActivity implements
 
 	private void switchToContactSelectorFragment(GroupId g) {
 		setTitle(R.string.groups_invite_members);
-		GroupInviteFragment fragment =
-				GroupInviteFragment.newInstance(g);
-		getSupportFragmentManager().beginTransaction()
-				.setCustomAnimations(android.R.anim.fade_in,
-						android.R.anim.fade_out,
-						android.R.anim.slide_in_left,
-						android.R.anim.slide_out_right)
-				.replace(R.id.fragmentContainer, fragment)
-				.addToBackStack(fragment.getUniqueTag())
-				.commit();
+		showNextFragment(GroupInviteFragment.newInstance(g));
 	}
 
 	private void openNewGroup() {
 		Intent i = new Intent(this, GroupActivity.class);
 		i.putExtra(GROUP_ID, groupId.getBytes());
-		ActivityOptionsCompat options =
-				makeCustomAnimation(this, android.R.anim.fade_in,
-						android.R.anim.fade_out);
-		ActivityCompat.startActivity(this, i, options.toBundle());
+		startActivity(i);
 		// finish this activity, so we can't come back to it
 		finish();
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/GroupInviteActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/GroupInviteActivity.java
index 794a12069f..9f6a092f51 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/GroupInviteActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/GroupInviteActivity.java
@@ -4,7 +4,6 @@ import android.content.Intent;
 import android.os.Bundle;
 
 import org.briarproject.bramble.api.sync.GroupId;
-import org.briarproject.briar.R;
 import org.briarproject.briar.android.activity.ActivityComponent;
 import org.briarproject.briar.android.sharing.BaseMessageFragment.MessageFragmentListener;
 
@@ -26,11 +25,7 @@ public class GroupInviteActivity extends BaseGroupInviteActivity
 		groupId = new GroupId(g);
 
 		if (bundle == null) {
-			GroupInviteFragment fragment =
-					GroupInviteFragment.newInstance(groupId);
-			getSupportFragmentManager().beginTransaction()
-					.replace(R.id.fragmentContainer, fragment)
-					.commit();
+			showInitialFragment(GroupInviteFragment.newInstance(groupId));
 		}
 	}
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListFragment.java
index 2c7e29b5a3..ccb0c5acf2 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListFragment.java
@@ -4,7 +4,6 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.UiThread;
 import android.support.design.widget.Snackbar;
-import android.support.v4.app.ActivityOptionsCompat;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.widget.LinearLayoutManager;
 import android.view.LayoutInflater;
@@ -38,7 +37,6 @@ import javax.annotation.Nullable;
 import javax.inject.Inject;
 
 import static android.support.design.widget.Snackbar.LENGTH_INDEFINITE;
-import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation;
 
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
@@ -117,11 +115,7 @@ public class GroupListFragment extends BaseFragment implements
 		switch (item.getItemId()) {
 			case R.id.action_add_group:
 				Intent i = new Intent(getContext(), CreateGroupActivity.class);
-				ActivityOptionsCompat options =
-						makeCustomAnimation(getActivity(),
-								android.R.anim.slide_in_left,
-								android.R.anim.slide_out_right);
-				startActivity(i, options.toBundle());
+				startActivity(i);
 				return true;
 			default:
 				return super.onOptionsItemSelected(item);
@@ -240,11 +234,7 @@ public class GroupListFragment extends BaseFragment implements
 	@Override
 	public void onClick(View v) {
 		Intent i = new Intent(getContext(), GroupInvitationActivity.class);
-		ActivityOptionsCompat options =
-				makeCustomAnimation(getActivity(),
-						android.R.anim.slide_in_left,
-						android.R.anim.slide_out_right);
-		startActivity(i, options.toBundle());
+		startActivity(i);
 	}
 
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupViewHolder.java
index af676fc019..c137ad072d 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupViewHolder.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupViewHolder.java
@@ -2,7 +2,6 @@ package org.briarproject.briar.android.privategroup.list;
 
 import android.content.Context;
 import android.content.Intent;
-import android.support.v4.app.ActivityOptionsCompat;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -19,7 +18,6 @@ import org.briarproject.briar.android.util.UiUtils;
 import org.briarproject.briar.android.view.TextAvatarView;
 
 import static android.support.v4.content.ContextCompat.getColor;
-import static android.support.v4.content.ContextCompat.startActivities;
 import static android.view.View.GONE;
 import static android.view.View.VISIBLE;
 import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
@@ -126,11 +124,7 @@ class GroupViewHolder extends RecyclerView.ViewHolder {
 				GroupId id = group.getId();
 				i.putExtra(GROUP_ID, id.getBytes());
 				i.putExtra(GROUP_NAME, group.getName());
-				ActivityOptionsCompat options = ActivityOptionsCompat
-						.makeCustomAnimation(ctx, android.R.anim.fade_in,
-								android.R.anim.fade_out);
-				Intent[] intents = {i};
-				startActivities(ctx, intents, options.toBundle());
+				ctx.startActivity(i);
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/reveal/RevealContactsActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/reveal/RevealContactsActivity.java
index db6236a1d9..450b6e4ff1 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/reveal/RevealContactsActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/reveal/RevealContactsActivity.java
@@ -58,11 +58,7 @@ public class RevealContactsActivity extends ContactSelectorActivity
 		button.setEnabled(false);
 
 		if (bundle == null) {
-			RevealContactsFragment fragment =
-					RevealContactsFragment.newInstance(groupId);
-			getSupportFragmentManager().beginTransaction()
-					.replace(R.id.fragmentContainer, fragment)
-					.commit();
+			showInitialFragment(RevealContactsFragment.newInstance(groupId));
 		}
 	}
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareActivity.java
index 6db3a0694d..2d0c4f0af8 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareActivity.java
@@ -10,7 +10,6 @@ import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.briar.R;
 import org.briarproject.briar.android.contactselection.ContactSelectorActivity;
-import org.briarproject.briar.android.contactselection.ContactSelectorFragment;
 import org.briarproject.briar.android.sharing.BaseMessageFragment.MessageFragmentListener;
 
 import java.util.Collection;
@@ -36,17 +35,7 @@ public abstract class ShareActivity extends ContactSelectorActivity
 	@Override
 	public void contactsSelected(Collection<ContactId> contacts) {
 		super.contactsSelected(contacts);
-
-		BaseMessageFragment messageFragment = getMessageFragment();
-		getSupportFragmentManager().beginTransaction()
-				.setCustomAnimations(android.R.anim.fade_in,
-						android.R.anim.fade_out,
-						android.R.anim.slide_in_left,
-						android.R.anim.slide_out_right)
-				.replace(R.id.fragmentContainer, messageFragment,
-						ContactSelectorFragment.TAG)
-				.addToBackStack(null)
-				.commit();
+		showNextFragment(getMessageFragment());
 	}
 
 	abstract BaseMessageFragment getMessageFragment();
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareBlogActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareBlogActivity.java
index f395eda7be..1d6581e6b1 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareBlogActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareBlogActivity.java
@@ -41,10 +41,7 @@ public class ShareBlogActivity extends ShareActivity {
 		super.onCreate(bundle);
 
 		if (bundle == null) {
-			ShareBlogFragment fragment = ShareBlogFragment.newInstance(groupId);
-			getSupportFragmentManager().beginTransaction()
-					.add(R.id.fragmentContainer, fragment)
-					.commit();
+			showInitialFragment(ShareBlogFragment.newInstance(groupId));
 		}
 	}
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareForumActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareForumActivity.java
index f32a49cc8b..dc16a239fb 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareForumActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareForumActivity.java
@@ -41,11 +41,7 @@ public class ShareForumActivity extends ShareActivity {
 		super.onCreate(bundle);
 
 		if (bundle == null) {
-			ShareForumFragment fragment =
-					ShareForumFragment.newInstance(groupId);
-			getSupportFragmentManager().beginTransaction()
-					.add(R.id.fragmentContainer, fragment)
-					.commit();
+			showInitialFragment(ShareForumFragment.newInstance(groupId));
 		}
 	}
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java
index 6b40803d0c..7bae16458f 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java
@@ -1,12 +1,14 @@
 package org.briarproject.briar.android.splash;
 
 import android.content.Intent;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.StrictMode;
 import android.os.StrictMode.ThreadPolicy;
 import android.os.StrictMode.VmPolicy;
 import android.support.v7.preference.PreferenceManager;
+import android.transition.Fade;
 
 import org.briarproject.bramble.api.system.AndroidExecutor;
 import org.briarproject.briar.R;
@@ -45,6 +47,10 @@ public class SplashScreenActivity extends BaseActivity {
 	public void onCreate(Bundle state) {
 		super.onCreate(state);
 
+		if (Build.VERSION.SDK_INT >= 21) {
+			getWindow().setExitTransition(new Fade());
+		}
+
 		setPreferencesDefaults();
 
 		setContentView(R.layout.splash);
@@ -53,7 +59,7 @@ public class SplashScreenActivity extends BaseActivity {
 			@Override
 			public void run() {
 				startNextActivity();
-				finish();
+				supportFinishAfterTransition();
 			}
 		}, 500);
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java
index 3e65fc6421..24c25b4919 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java
@@ -1,6 +1,7 @@
 package org.briarproject.briar.android.util;
 
 import android.content.Context;
+import android.support.annotation.Nullable;
 import android.support.design.widget.TextInputLayout;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.content.ContextCompat;
@@ -36,7 +37,7 @@ public class UiUtils {
 	public static final int TEASER_LENGTH = 320;
 	public static final float GREY_OUT = 0.5f;
 
-	public static void setError(TextInputLayout til, String error,
+	public static void setError(TextInputLayout til, @Nullable String error,
 			boolean set) {
 		if (set) {
 			if (til.getError() == null) til.setError(error);
@@ -116,4 +117,5 @@ public class UiUtils {
 	public static String getBulbTransitionName(ContactId c) {
 		return "bulb" + c.getInt();
 	}
+
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/AuthorView.java b/briar-android/src/main/java/org/briarproject/briar/android/view/AuthorView.java
index 4c3ee59442..82442185e6 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/view/AuthorView.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/view/AuthorView.java
@@ -6,8 +6,6 @@ import android.content.res.TypedArray;
 import android.graphics.Typeface;
 import android.support.annotation.DimenRes;
 import android.support.annotation.UiThread;
-import android.support.v4.app.ActivityOptionsCompat;
-import android.support.v4.content.ContextCompat;
 import android.util.AttributeSet;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
@@ -31,7 +29,6 @@ import im.delight.android.identicons.IdenticonDrawable;
 import static android.content.Context.LAYOUT_INFLATER_SERVICE;
 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
 import static android.graphics.Typeface.BOLD;
-import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation;
 import static android.util.TypedValue.COMPLEX_UNIT_PX;
 import static org.briarproject.bramble.api.identity.Author.Status.OURSELVES;
 import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
@@ -116,13 +113,7 @@ public class AuthorView extends RelativeLayout {
 				Intent i = new Intent(getContext(), BlogActivity.class);
 				i.putExtra(GROUP_ID, groupId.getBytes());
 				i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
-				ActivityOptionsCompat options =
-						makeCustomAnimation(getContext(),
-								android.R.anim.slide_in_left,
-								android.R.anim.slide_out_right);
-				Intent[] intents = {i};
-				ContextCompat.startActivities(getContext(), intents,
-								options.toBundle());
+				getContext().startActivity(i);
 			}
 		});
 	}
@@ -135,9 +126,19 @@ public class AuthorView extends RelativeLayout {
 
 	public void setPersona(int persona) {
 		switch (persona) {
+			case NORMAL:
+				avatarIcon.setVisibility(VISIBLE);
+				date.setVisibility(VISIBLE);
+				setAvatarSize(R.dimen.blogs_avatar_normal_size);
+				setTextSize(authorName, R.dimen.text_size_small);
+				setCenterVertical(authorName, false);
+				setCenterVertical(trustIndicator, false);
+				break;
 			case REBLOGGER:
 				avatarIcon.setVisibility(VISIBLE);
 				date.setVisibility(VISIBLE);
+				setAvatarSize(R.dimen.blogs_avatar_normal_size);
+				setTextSize(authorName, R.dimen.text_size_small);
 				setCenterVertical(authorName, false);
 				setCenterVertical(trustIndicator, false);
 				break;
@@ -162,8 +163,7 @@ public class AuthorView extends RelativeLayout {
 
 	private void setAvatarSize(@DimenRes int res) {
 		LayoutParams params = (LayoutParams) avatar.getLayoutParams();
-		int size = getResources().getDimensionPixelSize(
-				res);
+		int size = getResources().getDimensionPixelSize(res);
 		params.height = size;
 		params.width = size;
 		avatar.setLayoutParams(params);
diff --git a/briar-android/src/main/res/anim/dialog_in.xml b/briar-android/src/main/res/anim/dialog_in.xml
new file mode 100644
index 0000000000..4d3bef4a38
--- /dev/null
+++ b/briar-android/src/main/res/anim/dialog_in.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<alpha
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	android:duration="@android:integer/config_longAnimTime"
+	android:fromAlpha="0.0"
+	android:interpolator="@android:interpolator/decelerate_quad"
+	android:toAlpha="1.0"/>
diff --git a/briar-android/src/main/res/anim/dialog_out.xml b/briar-android/src/main/res/anim/dialog_out.xml
new file mode 100644
index 0000000000..84bad946f7
--- /dev/null
+++ b/briar-android/src/main/res/anim/dialog_out.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<alpha
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	android:duration="@android:integer/config_mediumAnimTime"
+	android:fromAlpha="1.0"
+	android:interpolator="@android:interpolator/accelerate_quad"
+	android:toAlpha="0.0"/>
diff --git a/briar-android/src/main/res/anim/screen_new_in.xml b/briar-android/src/main/res/anim/screen_new_in.xml
new file mode 100644
index 0000000000..6bdf53b16d
--- /dev/null
+++ b/briar-android/src/main/res/anim/screen_new_in.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set
+	xmlns:android="http://schemas.android.com/apk/res/android">
+
+	<!-- slide in from right -->
+	<translate
+		android:duration="@android:integer/config_mediumAnimTime"
+		android:fromXDelta="100%p"
+		android:interpolator="@android:interpolator/decelerate_quad"
+		android:toXDelta="0"/>
+
+</set>
diff --git a/briar-android/src/main/res/anim/screen_new_out.xml b/briar-android/src/main/res/anim/screen_new_out.xml
new file mode 100644
index 0000000000..5411fa11ba
--- /dev/null
+++ b/briar-android/src/main/res/anim/screen_new_out.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set
+	xmlns:android="http://schemas.android.com/apk/res/android">
+
+	<!-- slide out to right -->
+	<translate
+		android:duration="@android:integer/config_mediumAnimTime"
+		android:fromXDelta="0"
+		android:interpolator="@android:interpolator/accelerate_quad"
+		android:toXDelta="100%p"/>
+
+</set>
diff --git a/briar-android/src/main/res/anim/screen_old_in.xml b/briar-android/src/main/res/anim/screen_old_in.xml
new file mode 100644
index 0000000000..2360d85b58
--- /dev/null
+++ b/briar-android/src/main/res/anim/screen_old_in.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<alpha
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	android:duration="@android:integer/config_mediumAnimTime"
+	android:fromAlpha="0.0"
+	android:interpolator="@android:interpolator/decelerate_quad"
+	android:toAlpha="1.0"/>
diff --git a/briar-android/src/main/res/anim/screen_old_out.xml b/briar-android/src/main/res/anim/screen_old_out.xml
new file mode 100644
index 0000000000..84bad946f7
--- /dev/null
+++ b/briar-android/src/main/res/anim/screen_old_out.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<alpha
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	android:duration="@android:integer/config_mediumAnimTime"
+	android:fromAlpha="1.0"
+	android:interpolator="@android:interpolator/accelerate_quad"
+	android:toAlpha="0.0"/>
diff --git a/briar-android/src/main/res/anim/step_next_in.xml b/briar-android/src/main/res/anim/step_next_in.xml
new file mode 100644
index 0000000000..6bdf53b16d
--- /dev/null
+++ b/briar-android/src/main/res/anim/step_next_in.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set
+	xmlns:android="http://schemas.android.com/apk/res/android">
+
+	<!-- slide in from right -->
+	<translate
+		android:duration="@android:integer/config_mediumAnimTime"
+		android:fromXDelta="100%p"
+		android:interpolator="@android:interpolator/decelerate_quad"
+		android:toXDelta="0"/>
+
+</set>
diff --git a/briar-android/src/main/res/anim/step_next_out.xml b/briar-android/src/main/res/anim/step_next_out.xml
new file mode 100644
index 0000000000..5411fa11ba
--- /dev/null
+++ b/briar-android/src/main/res/anim/step_next_out.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set
+	xmlns:android="http://schemas.android.com/apk/res/android">
+
+	<!-- slide out to right -->
+	<translate
+		android:duration="@android:integer/config_mediumAnimTime"
+		android:fromXDelta="0"
+		android:interpolator="@android:interpolator/accelerate_quad"
+		android:toXDelta="100%p"/>
+
+</set>
diff --git a/briar-android/src/main/res/anim/step_previous_in.xml b/briar-android/src/main/res/anim/step_previous_in.xml
new file mode 100644
index 0000000000..2360d85b58
--- /dev/null
+++ b/briar-android/src/main/res/anim/step_previous_in.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<alpha
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	android:duration="@android:integer/config_mediumAnimTime"
+	android:fromAlpha="0.0"
+	android:interpolator="@android:interpolator/decelerate_quad"
+	android:toAlpha="1.0"/>
diff --git a/briar-android/src/main/res/anim/step_previous_out.xml b/briar-android/src/main/res/anim/step_previous_out.xml
new file mode 100644
index 0000000000..84bad946f7
--- /dev/null
+++ b/briar-android/src/main/res/anim/step_previous_out.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<alpha
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	android:duration="@android:integer/config_mediumAnimTime"
+	android:fromAlpha="1.0"
+	android:interpolator="@android:interpolator/accelerate_quad"
+	android:toAlpha="0.0"/>
diff --git a/briar-android/src/main/res/layout/activity_nav_drawer.xml b/briar-android/src/main/res/layout/activity_nav_drawer.xml
index ad4465680b..2c2ea04023 100644
--- a/briar-android/src/main/res/layout/activity_nav_drawer.xml
+++ b/briar-android/src/main/res/layout/activity_nav_drawer.xml
@@ -6,8 +6,30 @@
 	android:layout_height="match_parent">
 
 	<!-- The first child(root) is the content view -->
-	<include
-		layout="@layout/activity_with_loading"/>
+	<LinearLayout
+		android:layout_width="match_parent"
+		android:layout_height="match_parent"
+		android:orientation="vertical">
+
+		<android.support.design.widget.AppBarLayout
+			android:layout_width="match_parent"
+			android:layout_height="wrap_content">
+
+			<android.support.v7.widget.Toolbar
+				android:id="@+id/toolbar"
+				style="@style/BriarToolbar"
+				android:layout_width="match_parent"
+				android:layout_height="wrap_content"/>
+
+		</android.support.design.widget.AppBarLayout>
+
+		<FrameLayout
+			android:id="@+id/fragmentContainer"
+			android:layout_width="match_parent"
+			android:layout_height="match_parent"
+			android:background="@color/window_background"/>
+
+	</LinearLayout>
 
 	<!-- The second child is the menu -->
 	<include
@@ -16,4 +38,4 @@
 		android:layout_height="match_parent"
 		android:layout_gravity="start"/>
 
-</android.support.v4.widget.DrawerLayout>
\ No newline at end of file
+</android.support.v4.widget.DrawerLayout>
diff --git a/briar-android/src/main/res/layout/activity_plain.xml b/briar-android/src/main/res/layout/activity_plain.xml
index 4c7bae06e0..887c14a610 100644
--- a/briar-android/src/main/res/layout/activity_plain.xml
+++ b/briar-android/src/main/res/layout/activity_plain.xml
@@ -18,7 +18,7 @@
 	</android.support.design.widget.AppBarLayout>
 
 	<FrameLayout
-		android:id="@+id/content_fragment"
+		android:id="@+id/fragmentContainer"
 		android:layout_width="match_parent"
 		android:layout_height="match_parent"
 		android:background="@color/window_background"/>
diff --git a/briar-android/src/main/res/layout/activity_with_loading.xml b/briar-android/src/main/res/layout/activity_with_loading.xml
deleted file mode 100644
index 2c797c36c4..0000000000
--- a/briar-android/src/main/res/layout/activity_with_loading.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-	xmlns:android="http://schemas.android.com/apk/res/android"
-	xmlns:tools="http://schemas.android.com/tools"
-	android:layout_width="match_parent"
-	android:layout_height="match_parent"
-	android:orientation="vertical">
-
-	<android.support.design.widget.AppBarLayout
-		android:layout_width="match_parent"
-		android:layout_height="wrap_content">
-
-		<android.support.v7.widget.Toolbar
-			android:id="@+id/toolbar"
-			style="@style/BriarToolbar"
-			android:layout_width="match_parent"
-			android:layout_height="wrap_content"/>
-
-	</android.support.design.widget.AppBarLayout>
-
-	<FrameLayout
-		android:layout_width="match_parent"
-		android:layout_height="match_parent">
-
-		<FrameLayout
-			android:id="@+id/content_fragment"
-			android:layout_width="match_parent"
-			android:layout_height="match_parent"
-			android:background="@color/window_background"/>
-
-		<RelativeLayout
-			android:id="@+id/container_progress"
-			android:layout_width="match_parent"
-			android:layout_height="match_parent"
-			android:background="@color/window_background"
-			android:layout_gravity="center"
-			android:visibility="invisible"
-			tools:visibility="visible">
-
-			<ProgressBar
-				android:id="@+id/progress_bar"
-				style="?android:attr/progressBarStyleLarge"
-				android:layout_width="wrap_content"
-				android:layout_height="wrap_content"
-				android:layout_centerInParent="true"/>
-
-			<TextView
-				android:id="@+id/title_progress_bar"
-				android:layout_width="match_parent"
-				android:layout_height="wrap_content"
-				android:layout_below="@id/progress_bar"
-				android:gravity="center"
-				android:paddingTop="@dimen/margin_large"
-				tools:text="progress bar title"
-				/>
-
-		</RelativeLayout>
-
-	</FrameLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/briar-android/src/main/res/layout/fragment_blog_post_pager.xml b/briar-android/src/main/res/layout/fragment_blog_post_pager.xml
deleted file mode 100644
index 626dcaf26e..0000000000
--- a/briar-android/src/main/res/layout/fragment_blog_post_pager.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout
-	xmlns:android="http://schemas.android.com/apk/res/android"
-	android:layout_width="match_parent"
-	android:layout_height="match_parent">
-
-	<android.support.v4.view.ViewPager
-		android:id="@+id/pager"
-		xmlns:android="http://schemas.android.com/apk/res/android"
-		android:layout_width="match_parent"
-		android:layout_height="match_parent"/>
-
-	<ProgressBar
-		android:id="@+id/progressBar"
-		style="?android:attr/progressBarStyleLarge"
-		android:layout_width="wrap_content"
-		android:layout_height="wrap_content"
-		android:layout_gravity="center"/>
-
-</FrameLayout>
\ No newline at end of file
diff --git a/briar-android/src/main/res/layout/fragment_reblog.xml b/briar-android/src/main/res/layout/fragment_reblog.xml
index c0305e2503..1d5f553e20 100644
--- a/briar-android/src/main/res/layout/fragment_reblog.xml
+++ b/briar-android/src/main/res/layout/fragment_reblog.xml
@@ -4,6 +4,7 @@
 	xmlns:app="http://schemas.android.com/apk/res-auto"
 	android:layout_width="match_parent"
 	android:layout_height="match_parent"
+	android:background="@color/window_background"
 	android:orientation="vertical">
 
 	<ScrollView
@@ -41,7 +42,7 @@
 		android:layout_height="wrap_content"
 		android:gravity="bottom"
 		app:buttonText="@string/blogs_reblog_button"
-		app:maxLines="5"
-		app:hint="@string/blogs_reblog_comment_hint"/>
+		app:hint="@string/blogs_reblog_comment_hint"
+		app:maxLines="5"/>
 
 </LinearLayout>
diff --git a/briar-android/src/main/res/layout/fragment_sign_out.xml b/briar-android/src/main/res/layout/fragment_sign_out.xml
new file mode 100644
index 0000000000..aafc7be541
--- /dev/null
+++ b/briar-android/src/main/res/layout/fragment_sign_out.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	android:layout_width="match_parent"
+	android:layout_height="match_parent">
+
+	<ProgressBar
+		android:id="@+id/progressBar"
+		style="?android:attr/progressBarStyleLarge"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_centerInParent="true"/>
+
+	<TextView
+		android:id="@+id/title_progress_bar"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_below="@+id/progressBar"
+		android:layout_centerHorizontal="true"
+		android:paddingTop="@dimen/margin_large"
+		android:text="@string/progress_title_logout"/>
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/briar-android/src/main/res/layout/introduction_message.xml b/briar-android/src/main/res/layout/introduction_message.xml
index 61531fd227..3ca9cfa519 100644
--- a/briar-android/src/main/res/layout/introduction_message.xml
+++ b/briar-android/src/main/res/layout/introduction_message.xml
@@ -77,7 +77,6 @@
 						android:layout_marginLeft="@dimen/listitem_horizontal_margin"
 						android:layout_marginRight="@dimen/listitem_horizontal_margin"
 						android:layout_marginStart="@dimen/listitem_horizontal_margin"
-						android:transitionName="avatar"
 						tools:src="@drawable/ic_launcher"/>
 
 					<org.thoughtcrime.securesms.components.emoji.EmojiTextView
diff --git a/briar-android/src/main/res/layout/list_item_blog.xml b/briar-android/src/main/res/layout/list_item_blog.xml
deleted file mode 100644
index 214056cf4d..0000000000
--- a/briar-android/src/main/res/layout/list_item_blog.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?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:background="?attr/selectableItemBackground">
-
-	<org.briarproject.briar.android.view.TextAvatarView
-		android:id="@+id/avatarView"
-		android:layout_width="@dimen/listitem_picture_frame_size"
-		android:layout_height="@dimen/listitem_picture_frame_size"
-		android:layout_alignParentLeft="true"
-		android:layout_alignParentStart="true"
-		android:layout_marginEnd="@dimen/listitem_horizontal_margin"
-		android:layout_marginRight="@dimen/listitem_horizontal_margin"
-		android:layout_marginTop="@dimen/margin_medium"/>
-
-	<org.thoughtcrime.securesms.components.emoji.EmojiTextView
-		android:id="@+id/nameView"
-		android:layout_width="wrap_content"
-		android:layout_height="wrap_content"
-		android:layout_alignParentTop="true"
-		android:layout_marginTop="@dimen/listitem_horizontal_margin"
-		android:layout_toEndOf="@+id/avatarView"
-		android:layout_toRightOf="@+id/avatarView"
-		android:maxLines="2"
-		android:textColor="@color/briar_text_primary"
-		android:textSize="@dimen/text_size_medium"
-		tools:text="This is a name of a blog"/>
-
-	<TextView
-		android:id="@+id/postCountView"
-		android:layout_width="wrap_content"
-		android:layout_height="wrap_content"
-		android:layout_below="@+id/nameView"
-		android:layout_marginBottom="@dimen/margin_small"
-		android:layout_toEndOf="@+id/avatarView"
-		android:layout_toRightOf="@+id/avatarView"
-		android:paddingTop="@dimen/margin_small"
-		android:textColor="@color/briar_text_secondary"
-		android:textSize="@dimen/text_size_small"
-		tools:text="1337 posts"/>
-
-	<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/nameView"
-		android:layout_marginEnd="@dimen/listitem_horizontal_margin"
-		android:layout_marginRight="@dimen/listitem_horizontal_margin"
-		android:paddingTop="@dimen/margin_small"
-		android:textColor="@color/briar_text_secondary"
-		android:textSize="@dimen/text_size_small"
-		tools:text="Dec 24"/>
-
-	<TextView
-		android:id="@+id/statusView"
-		android:layout_width="wrap_content"
-		android:layout_height="wrap_content"
-		android:layout_below="@+id/postCountView"
-		android:layout_toEndOf="@+id/avatarView"
-		android:layout_toRightOf="@+id/avatarView"
-		android:textColor="@color/briar_text_tertiary"
-		tools:text="@string/blogs_blog_is_empty"/>
-
-	<View
-		style="@style/Divider.ForumList"
-		android:layout_alignParentLeft="true"
-		android:layout_alignParentStart="true"
-		android:layout_below="@+id/statusView"
-		android:layout_marginTop="@dimen/listitem_horizontal_margin"/>
-
-</RelativeLayout>
-
diff --git a/briar-android/src/main/res/layout/list_item_revealable_contact.xml b/briar-android/src/main/res/layout/list_item_revealable_contact.xml
index c9606b5ecb..040410f702 100644
--- a/briar-android/src/main/res/layout/list_item_revealable_contact.xml
+++ b/briar-android/src/main/res/layout/list_item_revealable_contact.xml
@@ -25,7 +25,6 @@
 			android:layout_alignParentStart="true"
 			android:layout_marginEnd="@dimen/listitem_horizontal_margin"
 			android:layout_marginRight="@dimen/listitem_horizontal_margin"
-			android:transitionName="avatar"
 			tools:src="@drawable/ic_launcher"/>
 
 		<org.thoughtcrime.securesms.components.emoji.EmojiTextView
diff --git a/briar-android/src/main/res/layout/list_item_selectable_contact.xml b/briar-android/src/main/res/layout/list_item_selectable_contact.xml
index e04315aded..09fd1aaa80 100644
--- a/briar-android/src/main/res/layout/list_item_selectable_contact.xml
+++ b/briar-android/src/main/res/layout/list_item_selectable_contact.xml
@@ -20,7 +20,6 @@
 			android:layout_alignParentLeft="true"
 			android:layout_alignParentStart="true"
 			android:layout_centerVertical="true"
-			android:transitionName="avatar"
 			tools:src="@drawable/ic_launcher"/>
 
 		<LinearLayout
diff --git a/briar-android/src/main/res/values-de/strings.xml b/briar-android/src/main/res/values-de/strings.xml
index 343c5f53c7..984e706143 100644
--- a/briar-android/src/main/res/values-de/strings.xml
+++ b/briar-android/src/main/res/values-de/strings.xml
@@ -10,7 +10,6 @@
   <string name="password_too_weak">Passwort zu schwach</string>
   <string name="passwords_do_not_match">Passwörter stimmen nicht überein</string>
   <string name="create_account_button">Konto anlegen</string>
-  <string name="progress_title_please_wait">Bitte warten ...</string>
   <!--Login-->
   <string name="enter_password">Passwort eingeben:</string>
   <string name="try_again">Passwort falsch, bitte erneut versuchen</string>
@@ -24,8 +23,6 @@
   <string name="startup_failed_db_error">Deine Briar-Datenbank ist korrupt. Briar-Konto, Daten und alle Verbindungen zu Kontakten können nicht mehr wiederhergestellt werden. Deinstalliere Briar und erstelle nach Installation der aktuellen Briar-Version ein neues Konto.</string>
   <string name="startup_failed_service_error">Briar konnte ein benötigtes Plugin nicht starten. Normalerweise kann das Problem durch eine Neuinstallation von Briar gelöst werden. Eine Neuinstallation führt jedoch zum Verlust des Kontos und aller dazugehörigen Daten, da Briar deine Daten nicht auf zentralen Servern speichert</string>
   <string name="expiry_warning">Diese Version von Briar ist nicht mehr aktuell.\nBitte installiere eine neuere Version.</string>
-  <string name="dialog_title_welcome">Willkommen bei Briar</string>
-  <string name="dialog_welcome_message">Füge einen Kontakt hinzu, um mit verschlüsselter Kommunikation zu beginnen oder wähle das Icon in der oberen linken Ecke für mehr Optionen.</string>
   <!--Navigation Drawer-->
   <string name="nav_drawer_open_description">Navigationsleiste öffnen</string>
   <string name="nav_drawer_close_description">Navigationsleiste schliessen</string>
@@ -87,7 +84,6 @@
   <string name="searching_format">Suche nach Kontakt mit Einladungs-Code %06d\u2026</string>
   <string name="connection_failed">Verbindung fehlgeschlagen</string>
   <string name="could_not_find_contact">Briar kann Deinen Kontakt nicht innerhalb der Reichweite finden</string>
-  <string name="could_not_open_camera">Es konnte nicht auf die Kamera zugegriffen werden. Bitte versuche es erneut.</string>
   <string name="try_again_button">Noch einmal versuchen</string>
   <string name="connected_to_contact">Mit Kontakt verbunden</string>
   <string name="calculating_confirmation_code">Bestätigungscode wird berechnet\u2026</string>
@@ -116,7 +112,6 @@
   <string name="introduction_sent">Deine Kontaktempfehlung wurde verschickt</string>
   <string name="introduction_error">Es gab einen Fehler beim Versuch, die Kontaktempfehlung zu verschicken</string>
   <string name="introduction_response_error">Fehler bei Antwort auf Kontaktempfehlung</string>
-  <string name="dialog_button_introduce">Als Kontakt empfehlen</string>
   <string name="introduction_request_sent">Du wolltest %1$s an %2$s als Kontakt empfehlen</string>
   <string name="introduction_request_received">%1$s schlägt vor, dich als Kontakt an %2$s zu empfehlen. Möchtest Du %2$s zu deiner Kontaktliste hinzufügen?</string>
   <string name="introduction_request_exists_received">%1$s schlägt vor, dich als Kontakt an %2$s zu empfehlen. %2$s ist allerdings bereits in deiner Kontaktliste. Da %1$s das vielleicht nicht weiss, kannst du trotzdem antworten:</string>
@@ -140,7 +135,6 @@
   <string name="groups_group_is_empty">Diese Gruppe ist leer.</string>
   <string name="groups_remove">Entfernen</string>
   <string name="groups_create_group_title">Private Gruppe erstellen</string>
-  <string name="groups_no_messages">Diese Gruppe hat keine Teilnehmer.\n\nErstelle die erste Nachricht über das Stift-Symbol am oberen Rand.</string>
   <string name="groups_create_group_button">Gruppe erstellen</string>
   <string name="groups_create_group_invitation_button">Einladung schicken</string>
   <string name="groups_create_group_hint">Gebe Deiner privaten Gruppe einen Namen</string>
@@ -240,7 +234,6 @@
   <string name="blogs_sharing_invitation_received">%1$s hat das persönliche Blog von %2$s mit dir geteilt.</string>
   <string name="blogs_sharing_invitation_sent">Du hast das persönliche Blog von %1$s mit %2$s geteilt.</string>
   <string name="blogs_sharing_invitations_title">Blogeinladungen</string>
-  <string name="blogs_sharing_exists">Du hast dieses Blog bereits abonniert. Ein neues Abo anzunehmen kann dazu führen, dass neue Einträge schneller verfügbar werden.</string>
   <string name="blogs_sharing_joined_toast">Blog abonniert</string>
   <string name="blogs_sharing_declined_toast">Blogeinladung abgelehnt</string>
   <!--RSS Feeds-->
diff --git a/briar-android/src/main/res/values-es/strings.xml b/briar-android/src/main/res/values-es/strings.xml
index 6eb9c8e5fd..26ff73a989 100644
--- a/briar-android/src/main/res/values-es/strings.xml
+++ b/briar-android/src/main/res/values-es/strings.xml
@@ -10,7 +10,6 @@
   <string name="password_too_weak">La contraseña es demasiado débil</string>
   <string name="passwords_do_not_match">Las contraseñas no coinciden</string>
   <string name="create_account_button">Registrar una nueva cuenta</string>
-  <string name="progress_title_please_wait">Espera, por favor</string>
   <!--Login-->
   <string name="enter_password">Introduce tu contraseña:</string>
   <string name="try_again">Contraseña incorrecta, inténtalo de nuevo</string>
@@ -24,8 +23,6 @@
   <string name="startup_failed_db_error">Por alguna razón, la base de datos de Briar ha sufrido daños irreparables. Tu cuenta, tus datos y todos tus contactos se han perdido. Desafortunadamente, tendrás que reinstalar Briar y registrar una nueva cuenta.</string>
   <string name="startup_failed_service_error">Briar no pudo iniciar un complemento necesario. Reinstalar Briar suele solucionar el problema. Sin embargo, ten en cuenta que perderás tu cuenta y todos los datos asociados ya que Briar no almacena esta información en ningún servidor centrar.</string>
   <string name="expiry_warning">Esta versión ha caducado.\nInstala una más reciente, por favor.</string>
-  <string name="dialog_title_welcome">Bienvenido a Briar</string>
-  <string name="dialog_welcome_message">Añade un contacto para empezar a comunicarte de forma segura o pulsa el icono de la esquina superior izquierda de la pantalla para otras opciones.</string>
   <!--Navigation Drawer-->
   <string name="nav_drawer_open_description">Abrir el panel de navegación</string>
   <string name="nav_drawer_close_description">Cierra el panel de navegación</string>
@@ -94,7 +91,6 @@
   <string name="searching_format">Buscando el contacto con el código de invitación %06d\u2026</string>
   <string name="connection_failed">La conexión falló</string>
   <string name="could_not_find_contact">Briar no pudo encontrar a tu contacto cerca</string>
-  <string name="could_not_open_camera">No se pudo acceder a la cámara. ¡Prueba de nuevo, por favor!</string>
   <string name="try_again_button">Prueba de nuevo</string>
   <string name="connected_to_contact">Conectado con el contacto</string>
   <string name="calculating_confirmation_code">Calculando código de confirmación\u2026</string>
@@ -124,7 +120,6 @@
   <string name="introduction_sent">Tu presentación se ha mandado.</string>
   <string name="introduction_error">Ocurrió un error realizando la presentación.</string>
   <string name="introduction_response_error">Error al responder a la presentación</string>
-  <string name="dialog_button_introduce">Presentar</string>
   <string name="introduction_request_sent">Has pedido presentar a %1$s a %2$s.</string>
   <string name="introduction_request_received">%1$s ha pedido presentarte a %2$s. ¿Quieres añadir a %2$s a tu lista de contactos?</string>
   <string name="introduction_request_exists_received">%1$s ha pedido presentarte a %2$s, pero %2$s ya está en tu lista de contactos. %1$s puede no saberlo, así que puedes responderle de todas maneras:</string>
@@ -149,7 +144,6 @@
   <string name="groups_group_is_dissolved">Este grupo ha sido disuelto</string>
   <string name="groups_remove">Eliminar</string>
   <string name="groups_create_group_title">Crear grupo privado</string>
-  <string name="groups_no_messages">Este grupo está vacío.\n\nPuedes usar el icono del lápiz arriba para escribir el primer mensaje.</string>
   <string name="groups_create_group_button">Crear grupo</string>
   <string name="groups_create_group_invitation_button">Enviar invitación</string>
   <string name="groups_create_group_hint">Dar nombre al grupo privado</string>
@@ -277,7 +271,6 @@
   <string name="blogs_sharing_invitation_received">%1$s ha compartido el blog personal de %2$s contigo.</string>
   <string name="blogs_sharing_invitation_sent">Has compartido el blog personal de %1$s con %2$s.</string>
   <string name="blogs_sharing_invitations_title">Invitaciones a blogs</string>
-  <string name="blogs_sharing_exists">Ya estás suscrito a este blog. Aceptar la invitación de nuevo conllevará una mejora de la velocidad en la recepción de los artículos.</string>
   <string name="blogs_sharing_joined_toast">Suscrito al blog</string>
   <string name="blogs_sharing_declined_toast">Rechazada invitación al blog</string>
   <!--RSS Feeds-->
diff --git a/briar-android/src/main/res/values-fr/strings.xml b/briar-android/src/main/res/values-fr/strings.xml
index 9b29a4b0e2..7682fd6649 100644
--- a/briar-android/src/main/res/values-fr/strings.xml
+++ b/briar-android/src/main/res/values-fr/strings.xml
@@ -10,7 +10,6 @@
   <string name="password_too_weak">Le mot de passe est trop faible</string>
   <string name="passwords_do_not_match">Les mots de passes ne correspondent pas</string>
   <string name="create_account_button">Créer un compte</string>
-  <string name="progress_title_please_wait">Veuillez patienter ...</string>
   <!--Login-->
   <string name="enter_password">Tapez votre mot de passe :</string>
   <string name="try_again">Mot de passe incorrecte, essayer à nouveau</string>
@@ -24,8 +23,6 @@
   <string name="startup_failed_db_error">Pour une raison indéterminée, votre base de donnée Briar est corrompue et irrécupérable. Vos comptes, données et contacts sont perdus. Vous devez malheureusement réinstaller Briar et configurer un nouveau compte.</string>
   <string name="startup_failed_service_error">Briar n\'a pas pu démarrer un module nécessaire. Réinstaller Briar résout généralement ce problème. Veuillez noter que vous perdrez votre compte et toutes les données associées puisque Briar n\'utilise pas de serveurs centralisés pour enregistrer les données.</string>
   <string name="expiry_warning">Ce logiciel est arrivé à expiration.\n Veuillez installer une version plus récente.</string>
-  <string name="dialog_title_welcome">Bienvenue sur Briar</string>
-  <string name="dialog_welcome_message">Ajouter un contact pour communiquer de manière sécurisée ou toucher l\'icône en haut à gauche pour plus d\'options.</string>
   <!--Navigation Drawer-->
   <string name="nav_drawer_open_description">Ouvrir le panneau de navigation</string>
   <string name="nav_drawer_close_description">Fermer le panneau de navigation</string>
@@ -95,7 +92,6 @@
   <string name="searching_format">Recherche de contacts avec le code d\'invitation %06d\u2026</string>
   <string name="connection_failed">Échec de connexion</string>
   <string name="could_not_find_contact">Briar n\'a pas trouvé de contacts à proximité</string>
-  <string name="could_not_open_camera">Appareil photo inaccessible. Essayez à nouveau !</string>
   <string name="try_again_button">Essayer à nouveau</string>
   <string name="connected_to_contact">Connecté au contact</string>
   <string name="calculating_confirmation_code">Calcul du code de confirmation\u2026</string>
@@ -125,7 +121,6 @@
   <string name="introduction_sent">Votre admission a été envoyée.</string>
   <string name="introduction_error">Une erreur s\'est produite lors de l\'admission.</string>
   <string name="introduction_response_error">Erreur lors de la réponse à l\'admission</string>
-  <string name="dialog_button_introduce">Introduire</string>
   <string name="introduction_request_sent">Vous avez demandé à %2$s d\'admettre %1$s.</string>
   <string name="introduction_request_received">%1$s vous a demandé l\'admission de %2$s. Souhaitez-vous ajouter %2$s à votre liste de contacts ?</string>
   <string name="introduction_request_exists_received">%1$s vous a demandé l\'admission de %2$s mais %2$s est déjà dans votre liste de contacts. Puisque %1$s ne le sait pas, vous pouvez tout de même répondre : </string>
@@ -150,7 +145,6 @@
   <string name="groups_group_is_dissolved">Ce groupe a été supprimé</string>
   <string name="groups_remove">Supprimer</string>
   <string name="groups_create_group_title">Créer un groupe privé</string>
-  <string name="groups_no_messages">Ce groupe est vide. \n\nUtilisez l\'icône crayon, en haut, pour composer le premier message.</string>
   <string name="groups_create_group_button">Créer un groupe</string>
   <string name="groups_create_group_invitation_button">Envoyer invitation</string>
   <string name="groups_create_group_hint">Ajouter un nom au groupe privé</string>
@@ -278,7 +272,6 @@
   <string name="blogs_sharing_invitation_received">%1$s a partagé le blog personnel de %2$s avec vous.</string>
   <string name="blogs_sharing_invitation_sent">Vous avez partagé le blog personnel de %1$s avec %2$s.</string>
   <string name="blogs_sharing_invitations_title">Invitations au blog</string>
-  <string name="blogs_sharing_exists">Vous êtes déjà inscrit à ce blog. Accepter à nouveau peut conduire à une de post de blog.</string>
   <string name="blogs_sharing_joined_toast">Abonné au Blog</string>
   <string name="blogs_sharing_declined_toast">Invitation au blog refusée</string>
   <!--RSS Feeds-->
diff --git a/briar-android/src/main/res/values-it/strings.xml b/briar-android/src/main/res/values-it/strings.xml
index b06253170b..832c0f850c 100644
--- a/briar-android/src/main/res/values-it/strings.xml
+++ b/briar-android/src/main/res/values-it/strings.xml
@@ -10,7 +10,6 @@
   <string name="password_too_weak">La password è troppo debole</string>
   <string name="passwords_do_not_match">La password non corrisponde</string>
   <string name="create_account_button">Creare Account</string>
-  <string name="progress_title_please_wait">Attendi per favore...</string>
   <!--Login-->
   <string name="enter_password">Inserisci la tua password:</string>
   <string name="try_again">Password sbagliata, riprova</string>
@@ -23,8 +22,6 @@
   <string name="startup_failed_activity_title">Fallimento Avvio Briar</string>
   <string name="startup_failed_db_error">Per alcune reagioni, il tuo database Briar si è corrotto in modo irreparabile. Il tuo account, i tuoi dati e tutte le connessioni ai tuoi contatti sono andati persi. Sfortunatamente, devi reinstallare Briar per creare un nuovo account.</string>
   <string name="expiry_warning">Questo software è scaduto.\nSi prega di installare una nuova versione.</string>
-  <string name="dialog_title_welcome">Benvenuti su Briar</string>
-  <string name="dialog_welcome_message">Aggiungi un contatto per iniziare a comunicare in modo sicuro oppure premi l\'icona in alto a sinistra dello schermo per vedere le altre opzioni.</string>
   <!--Navigation Drawer-->
   <string name="contact_list_button">Contatti</string>
   <string name="groups_button">Gruppi privati</string>
@@ -81,7 +78,6 @@
   <string name="searching_format">Sto cercando i contatti con codice di invito %06d\u2026</string>
   <string name="connection_failed">Connessione fallita</string>
   <string name="could_not_find_contact">Briar non è stato in grado di trovare il vostro contatto vicino</string>
-  <string name="could_not_open_camera">Impossibile accedere alla tua fotocamera. Si prega di ritentare!</string>
   <string name="try_again_button">Riprova</string>
   <string name="connected_to_contact">Connesso al contatto</string>
   <string name="calculating_confirmation_code">Calcolazione codice di conferma\u2026</string>
@@ -103,7 +99,6 @@
   <string name="introduction_button">Crea l\'introduzione</string>
   <string name="introduction_sent">La tua introduzione è stata inviata.</string>
   <string name="introduction_error">C\'è stato un errore nella creazione dell\'introduzione</string>
-  <string name="dialog_button_introduce">Introduci</string>
   <string name="introduction_request_sent">Hai richiesto di introdurre %1$s a %2$s.</string>
   <string name="introduction_request_answered_received">%1$s ha richiesto di introdurti a %2$s.</string>
   <string name="introduction_response_accepted_sent">Hai accettato l\'introduzione a %1$s.</string>
diff --git a/briar-android/src/main/res/values-pt-rBR/strings.xml b/briar-android/src/main/res/values-pt-rBR/strings.xml
index 6c90202bf3..5971391bc1 100644
--- a/briar-android/src/main/res/values-pt-rBR/strings.xml
+++ b/briar-android/src/main/res/values-pt-rBR/strings.xml
@@ -10,7 +10,6 @@
   <string name="password_too_weak">A senha está muito fraca</string>
   <string name="passwords_do_not_match">As senhas não conferem</string>
   <string name="create_account_button">Criar conta</string>
-  <string name="progress_title_please_wait">Por favor, aguarde</string>
   <!--Login-->
   <string name="enter_password">Insira sua senha:</string>
   <string name="try_again">Senha Incorreta, tente novamente</string>
@@ -24,8 +23,6 @@
   <string name="startup_failed_db_error">Por alguma razão, seus dados do Briar estão corrompidos e não podem ser reparados. Sua conta, seus dados e todas suas conexões com contatos estão perdidas. Infelizmente você terá que resintalar o Briar e criar uma nova conta.</string>
   <string name="startup_failed_service_error">O Briar não pode iniciar devido a um plugin. Reinstalar o Briar geralmente resolve esse problema. Porém, note que ao fazer isso você perderá sua conta e todos os dados associados a ela,  já que o Briar não usa um servidor central para armazenar seus dados.</string>
   <string name="expiry_warning">Esse programa expirou.\nPor favor instale uma versão mais recente.</string>
-  <string name="dialog_title_welcome">Bem-vindo ao Briar</string>
-  <string name="dialog_welcome_message">Adicione um contato para começar uma comunicação segura ou pressione o ícone na parte superior direita da tela para mais opções.</string>
   <!--Navigation Drawer-->
   <string name="nav_drawer_open_description">Abrir aba de navegação</string>
   <string name="nav_drawer_close_description">Fechar aba de navegação</string>
@@ -95,7 +92,6 @@
   <string name="searching_format">Procurando por contato com código de convite %06d\u2026</string>
   <string name="connection_failed">Conexão incompleta</string>
   <string name="could_not_find_contact">Briar não conseguiu achar nenhum contato por perto</string>
-  <string name="could_not_open_camera">Não foi possível acessar sua câmera. Por favor tente novamente!</string>
   <string name="try_again_button">Tente novamente</string>
   <string name="connected_to_contact">Conectado ao contato</string>
   <string name="calculating_confirmation_code">Calculando código de confirmação\u2026</string>
@@ -125,7 +121,6 @@
   <string name="introduction_sent">Sua Introdução foi enviada.</string>
   <string name="introduction_error">Houve um erro ao fazer a apresentação</string>
   <string name="introduction_response_error">Erro ao responder à apresentação</string>
-  <string name="dialog_button_introduce">Apresentar</string>
   <string name="introduction_request_sent">Você recebeu um pedido para apresentar %1$s a %2$s.</string>
   <string name="introduction_request_received">%1$s pediu para apresentar você a %2$s. Você quer adicionar %2$s a sua lista de contatos?</string>
   <string name="introduction_request_exists_received">%1$s pediu para apresentar você a %2$s, mas %2$s já está na sua lista de contatos. Já que %1$s não sabe disso, você ainda pode responder:</string>
@@ -150,7 +145,6 @@
   <string name="groups_group_is_dissolved">Esse grupo foi dissolvido</string>
   <string name="groups_remove">Remover</string>
   <string name="groups_create_group_title">Criar Grupo Privado</string>
-  <string name="groups_no_messages">Esse grupo está vazio.\n\nVocê pode usar o ícone da caneta no topo para escrever a primeira mensagem.</string>
   <string name="groups_create_group_button">Criar Grupo</string>
   <string name="groups_create_group_invitation_button">Enviar Convite</string>
   <string name="groups_create_group_hint">Adicionar um nome para seu grupo privado</string>
@@ -278,7 +272,6 @@
   <string name="blogs_sharing_invitation_received">%1$s compartilhou o blog %2$s com você.</string>
   <string name="blogs_sharing_invitation_sent">Você compartilhou o blog de %1$s com %2$s.</string>
   <string name="blogs_sharing_invitations_title">Convites para Fóruns</string>
-  <string name="blogs_sharing_exists">Você já está inscrito neste blog. Aceitando novamente pode tornar mais rápida a entrega dos posts.</string>
   <string name="blogs_sharing_joined_toast">Inscrito neste Blog</string>
   <string name="blogs_sharing_declined_toast">Convite do Blog recusado</string>
   <!--RSS Feeds-->
diff --git a/briar-android/src/main/res/values-sq/strings.xml b/briar-android/src/main/res/values-sq/strings.xml
index 38c463fbbd..60266f10d1 100644
--- a/briar-android/src/main/res/values-sq/strings.xml
+++ b/briar-android/src/main/res/values-sq/strings.xml
@@ -10,7 +10,6 @@
   <string name="password_too_weak">Fjalëkalimi është shumë i dobët</string>
   <string name="passwords_do_not_match">Fjalëkalimet nuk përputhen</string>
   <string name="create_account_button">Krijoje Llogarinë</string>
-  <string name="progress_title_please_wait">Ju lutemi, prisni…</string>
   <!--Login-->
   <string name="enter_password">Jepni fjalëkalimin tuaj:</string>
   <string name="try_again">Fjalëkalim i gabuar, riprovoni</string>
@@ -24,8 +23,6 @@
   <string name="startup_failed_db_error">Për ndonjë arsye, baza e të dhënave e Briar-it tuaj është aq e dëmtuar, sa s’mund të ndreqet. Llogaria juaj, të dhënat tuaja dhe krejt lidhjet tuaja me kontaktet kanë humbur. Mjerisht lypset të ri-instaloni Briar-in dhe të rregulloni një llogari të re.</string>
   <string name="startup_failed_service_error">Briar-i s’arriti të nisë një shtojcë të domosdoshme. Ri-instalimi i Briar-it zakonisht e zgjidh këtë problem. Por, ju lutemi, kini parasysh se me të do të humbni llogarinë tuaj dhe krejt të dhënat e lidhura me të, ngaqë Briar nuk përdor shërbyes qendrorë për të depozituar në ta të dhënat tuaja.</string>
   <string name="expiry_warning">Ky software ka skaduar.\nJu lutemi, instaloni një version më të ri.</string>
-  <string name="dialog_title_welcome">Mirë se vini në Briar</string>
-  <string name="dialog_welcome_message">Shtoni një kontakt që të filloni të komunikoni në mënyrë të sigurt, ose shtypni ikonën në cepin e sipërm majtas të ekranit për më tepër mundësi.</string>
   <!--Navigation Drawer-->
   <string name="nav_drawer_open_description">Hap sirtarin e lëvizjeve</string>
   <string name="nav_drawer_close_description">Mbylle sirtarin e lëvizjeve</string>
@@ -95,7 +92,6 @@
   <string name="searching_format">Po kërkohet për kontakt me kod ftese %06d\u2026</string>
   <string name="connection_failed">Lidhja dështoi</string>
   <string name="could_not_find_contact">Briar-i s’e gjeti dot kontaktin tuaj këtej pari</string>
-  <string name="could_not_open_camera">S’u hy dot te kamera juaj. Ju lutemi, riprovoni!</string>
   <string name="try_again_button">Riprovoni</string>
   <string name="connected_to_contact">U lidh me kontaktin</string>
   <string name="calculating_confirmation_code">Po përllogaritet kodi i ripohimit\u2026</string>
@@ -125,7 +121,6 @@
   <string name="introduction_sent">Prezantimi juaj u dërgua.</string>
   <string name="introduction_error">Pati një gabim me bërjen e prezantimit.</string>
   <string name="introduction_response_error">Gabim në përgjigjen ndaj prezantimit</string>
-  <string name="dialog_button_introduce">Prezantoje</string>
   <string name="introduction_request_sent">Keni kërkuar të prezantoni %1$s te %2$s.</string>
   <string name="introduction_request_received">%1$s ka kërkuar t’ju prezantojë te %2$s. Doni të shtohet %2$s te lista juaj e kontakteve?</string>
   <string name="introduction_request_exists_received">%1$s ka kërkuar t’ju prezantojë te %2$s, por %2$s gjendet tashmë te lista juaj e kontakteve. Meqë %1$s mund të mos ta dijë këtë gjë, mundeni prapëseprapë t’i përgjigjeni:</string>
@@ -150,7 +145,6 @@
   <string name="groups_group_is_dissolved">Ky grup është shkrirë</string>
   <string name="groups_remove">Hiqe</string>
   <string name="groups_create_group_title">Krijoni Grup Privat</string>
-  <string name="groups_no_messages">Ky grup është i zbrazët.\n\nMund të përdorni ikonën penë në krye që të hartoni mesazhin e parë.</string>
   <string name="groups_create_group_button">Krijoje Grupin</string>
   <string name="groups_create_group_invitation_button">Dërgoje Ftesën</string>
   <string name="groups_create_group_hint">Shtoni një emër për grupin tuaj privat</string>
@@ -278,7 +272,6 @@
   <string name="blogs_sharing_invitation_received">%1$s ka ndarë me ju blogun personal të %2$s.</string>
   <string name="blogs_sharing_invitation_sent">Keni ndarë me %2$s blogun personal të %1$s.</string>
   <string name="blogs_sharing_invitations_title">Ftesa Blogu</string>
-  <string name="blogs_sharing_exists">Jeni i pajtuar te ky blog një herë. Pranimi sërish mund të shpjerë te shpërndarje më e shpejtë postimesh blogu.</string>
   <string name="blogs_sharing_joined_toast">U pajtuat te Blogu</string>
   <string name="blogs_sharing_declined_toast">Ftesa e Blogut u Hodh Poshtë</string>
   <!--RSS Feeds-->
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index 4fde00b0fd..f9fad4a278 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -12,7 +12,6 @@
 	<string name="password_too_weak">Password is too weak</string>
 	<string name="passwords_do_not_match">Passwords do not match</string>
 	<string name="create_account_button">Create Account</string>
-	<string name="progress_title_please_wait">Please wait..</string>
 
 	<!-- Login -->
 	<string name="enter_password">Enter your password:</string>
@@ -27,8 +26,6 @@
 	<string name="startup_failed_db_error">For some reason, your Briar database is corrupted beyond repair. Your account, your data and all your contact connections are lost. Unfortunately, you need to reinstall Briar und set up a new account.</string>
 	<string name="startup_failed_service_error">Briar was unable to start a required plugin. Reinstalling Briar usually solves this problem. However, please note that you will then lose your account and all data associated with it since Briar is not using central servers to store your data on.</string>
 	<string name="expiry_warning">This software has expired.\nPlease install a newer version.</string>
-	<string name="dialog_title_welcome">Welcome to Briar</string>
-	<string name="dialog_welcome_message">Add a contact to start communicating securely or press the icon in the upper left corner of the screen for more options.</string>
 
 	<!-- Navigation Drawer -->
 	<string name="nav_drawer_open_description">Open the navigation drawer</string>
@@ -105,7 +102,6 @@
 	<string name="searching_format">Searching for contact with invitation code %06d\u2026</string>
 	<string name="connection_failed">Connection failed</string>
 	<string name="could_not_find_contact">Briar could not find your contact nearby</string>
-	<string name="could_not_open_camera">Could not access your camera. Please try again!</string>
 	<string name="try_again_button">Try Again</string>
 	<string name="connected_to_contact">Connected to contact</string>
 	<string name="calculating_confirmation_code">Calculating confirmation code\u2026</string>
@@ -136,7 +132,6 @@
 	<string name="introduction_sent">Your introduction has been sent.</string>
 	<string name="introduction_error">There was an error making the introduction.</string>
 	<string name="introduction_response_error">Error when responding to introduction</string>
-	<string name="dialog_button_introduce">Introduce</string>
 	<string name="introduction_request_sent">You have asked to introduce %1$s to %2$s.</string>
 	<string name="introduction_request_received">%1$s has asked to introduce you to %2$s. Do you want to add %2$s to your contact list?</string>
 	<string name="introduction_request_exists_received">%1$s has asked to introduce you to %2$s, but %2$s is already in your contact list. Since %1$s might not know that, you can still respond:</string>
@@ -162,7 +157,6 @@
 	<string name="groups_group_is_dissolved">This group has been dissolved</string>
 	<string name="groups_remove">Remove</string>
 	<string name="groups_create_group_title">Create Private Group</string>
-	<string name="groups_no_messages">This group is empty.\n\nYou can use the pen icon at the top to compose the first message.</string>
 	<string name="groups_create_group_button">Create Group</string>
 	<string name="groups_create_group_invitation_button">Send Invitation</string>
 	<string name="groups_create_group_hint">Add a name for your private group</string>
@@ -296,7 +290,6 @@
 	<string name="blogs_sharing_invitation_received">%1$s has shared the personal blog of %2$s with you.</string>
 	<string name="blogs_sharing_invitation_sent">You have shared the personal blog of %1$s with %2$s.</string>
 	<string name="blogs_sharing_invitations_title">Blog Invitations</string>
-	<string name="blogs_sharing_exists">You are subscribed to this blog already. Accepting again can lead to faster blog post delivery.</string>
 	<string name="blogs_sharing_joined_toast">Subscribed to Blog</string>
 	<string name="blogs_sharing_declined_toast">Blog Invitation Declined</string>
 
diff --git a/briar-android/src/main/res/values/themes.xml b/briar-android/src/main/res/values/themes.xml
index 71bd3c9d5e..6f6c98aa8b 100644
--- a/briar-android/src/main/res/values/themes.xml
+++ b/briar-android/src/main/res/values/themes.xml
@@ -13,6 +13,7 @@
 		<item name="android:textColorTertiary">@color/briar_text_tertiary</item>
 		<item name="android:textColorTertiaryInverse">@color/briar_text_tertiary_inverse</item>
 		<item name="android:textColorLink">@color/briar_text_link</item>
+		<item name="android:windowAnimationStyle">@style/ActivityAnimation</item>
 	</style>
 
 	<style name="BriarThemeNoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
@@ -28,6 +29,14 @@
 		<item name="android:textColorTertiary">@color/briar_text_tertiary</item>
 		<item name="android:textColorTertiaryInverse">@color/briar_text_tertiary_inverse</item>
 		<item name="android:textColorLink">@color/briar_text_link</item>
+		<item name="android:windowAnimationStyle">@style/ActivityAnimation</item>
+	</style>
+
+	<style name="ActivityAnimation" parent="@android:style/Animation.Activity">
+		<item name="android:activityOpenEnterAnimation">@anim/screen_new_in</item>
+		<item name="android:activityOpenExitAnimation">@anim/screen_old_out</item>
+		<item name="android:activityCloseEnterAnimation">@anim/screen_old_in</item>
+		<item name="android:activityCloseExitAnimation">@anim/screen_new_out</item>
 	</style>
 
 	<style name="BriarThemeNoActionBar.Default"/>
@@ -54,8 +63,8 @@
 	</style>
 
 	<style name="DialogAnimation" parent="@android:style/Animation.Dialog">
-		<item name="android:windowEnterAnimation">@android:anim/fade_in</item>
-		<item name="android:windowExitAnimation">@android:anim/fade_out</item>
+		<item name="android:windowEnterAnimation">@anim/dialog_in</item>
+		<item name="android:windowExitAnimation">@anim/dialog_out</item>
 	</style>
 
 	<style name="OnboardingDialogTheme" parent="BriarDialogTheme">
-- 
GitLab