diff --git a/briar-android/src/main/java/org/briarproject/briar/android/BriarApplication.java b/briar-android/src/main/java/org/briarproject/briar/android/BriarApplication.java
index bf78cecfa1b00eed4e17012cb187e123f50e2d63..9d9cd3a4a170186226fa37bdea9daaef44a0171d 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/BriarApplication.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/BriarApplication.java
@@ -6,5 +6,9 @@ package org.briarproject.briar.android;
  */
 public interface BriarApplication {
 
+	// This build expires on 1 October 2017
+	long EXPIRY_DATE = 1506812400 * 1000L;
+
 	AndroidComponent getApplicationComponent();
+
 }
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 c0927dc1206cd2cde7bed40d7953e30db67e932c..61ef5bfdc0b56859b0382b34bc607845b394a684 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
@@ -29,6 +29,7 @@ import org.briarproject.briar.android.activity.ActivityComponent;
 import org.briarproject.briar.android.activity.BriarActivity;
 import org.briarproject.briar.android.blog.FeedFragment;
 import org.briarproject.briar.android.contact.ContactListFragment;
+import org.briarproject.briar.android.controller.handler.UiResultHandler;
 import org.briarproject.briar.android.forum.ForumListFragment;
 import org.briarproject.briar.android.fragment.BaseFragment;
 import org.briarproject.briar.android.fragment.BaseFragment.BaseFragmentListener;
@@ -45,6 +46,9 @@ import javax.inject.Inject;
 import static android.support.v4.app.FragmentManager.POP_BACK_STACK_INCLUSIVE;
 import static android.support.v4.view.GravityCompat.START;
 import static android.support.v4.widget.DrawerLayout.LOCK_MODE_LOCKED_CLOSED;
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+import static org.briarproject.briar.android.util.UiUtils.getDaysUntilExpiry;
 
 public class NavDrawerActivity extends BriarActivity implements
 		BaseFragmentListener, TransportStateListener,
@@ -128,6 +132,12 @@ public class NavDrawerActivity extends BriarActivity implements
 	public void onStart() {
 		super.onStart();
 		updateTransports();
+		controller.showExpiryWarning(new UiResultHandler<Boolean>(this) {
+			@Override
+			public void onResultUi(Boolean showWarning) {
+				if (showWarning) showExpiryWarning();
+			}
+		});
 	}
 
 	private void exitIfStartupFailed(Intent intent) {
@@ -254,6 +264,34 @@ public class NavDrawerActivity extends BriarActivity implements
 		// Do nothing for now
 	}
 
+	@SuppressWarnings("ConstantConditions")
+	private void showExpiryWarning() {
+		int daysUntilExpiry = getDaysUntilExpiry();
+		if (daysUntilExpiry < 0) signOut();
+
+		// show expiry warning text
+		final ViewGroup
+				expiryWarning = (ViewGroup) findViewById(R.id.expiryWarning);
+		TextView expiryWarningText =
+				(TextView) expiryWarning.findViewById(R.id.expiryWarningText);
+		expiryWarningText.setText(getResources()
+				.getQuantityString(R.plurals.expiry_warning, daysUntilExpiry,
+						daysUntilExpiry));
+
+		// make close button functional
+		ImageView expiryWarningClose =
+				(ImageView) expiryWarning.findViewById(R.id.expiryWarningClose);
+		expiryWarningClose.setOnClickListener(new View.OnClickListener() {
+			@Override
+			public void onClick(View v) {
+				controller.expiryWarningDismissed();
+				expiryWarning.setVisibility(GONE);
+			}
+		});
+
+		expiryWarning.setVisibility(VISIBLE);
+	}
+
 	private void initializeTransports(final LayoutInflater inflater) {
 		transports = new ArrayList<>(3);
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerController.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerController.java
index 424fdb1add6117f9636dcc826cc925a31a696ae5..19f08bcd8fcc1906cd91f4fb208ace522eb5c48b 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerController.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerController.java
@@ -3,10 +3,15 @@ package org.briarproject.briar.android.navdrawer;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.plugin.TransportId;
 import org.briarproject.briar.android.controller.ActivityLifecycleController;
+import org.briarproject.briar.android.controller.handler.ResultHandler;
 
 @NotNullByDefault
 public interface NavDrawerController extends ActivityLifecycleController {
 
 	boolean isTransportRunning(TransportId transportId);
 
+	void showExpiryWarning(final ResultHandler<Boolean> handler);
+
+	void expiryWarningDismissed();
+
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerControllerImpl.java
index 26d945baaefd17a7e8056e8bf2edf84aca486756..8c4e578b809604aa08ef875efaf14d8124fcc730 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerControllerImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerControllerImpl.java
@@ -3,6 +3,7 @@ package org.briarproject.briar.android.navdrawer;
 import android.app.Activity;
 
 import org.briarproject.bramble.api.db.DatabaseExecutor;
+import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.event.Event;
 import org.briarproject.bramble.api.event.EventBus;
 import org.briarproject.bramble.api.event.EventListener;
@@ -14,7 +15,10 @@ import org.briarproject.bramble.api.plugin.PluginManager;
 import org.briarproject.bramble.api.plugin.TransportId;
 import org.briarproject.bramble.api.plugin.event.TransportDisabledEvent;
 import org.briarproject.bramble.api.plugin.event.TransportEnabledEvent;
+import org.briarproject.bramble.api.settings.Settings;
+import org.briarproject.bramble.api.settings.SettingsManager;
 import org.briarproject.briar.android.controller.DbControllerImpl;
+import org.briarproject.briar.android.controller.handler.ResultHandler;
 
 import java.util.concurrent.Executor;
 import java.util.logging.Logger;
@@ -22,6 +26,9 @@ import java.util.logging.Logger;
 import javax.inject.Inject;
 
 import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
+import static org.briarproject.briar.android.BriarApplication.EXPIRY_DATE;
+import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE;
 
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
@@ -30,18 +37,21 @@ public class NavDrawerControllerImpl extends DbControllerImpl
 
 	private static final Logger LOG =
 			Logger.getLogger(NavDrawerControllerImpl.class.getName());
+	private static final String EXPIRY_DATE_WARNING = "expiryDateWarning";
 
 	private final PluginManager pluginManager;
+	private final SettingsManager settingsManager;
 	private final EventBus eventBus;
 
 	private volatile TransportStateListener listener;
 
 	@Inject
 	NavDrawerControllerImpl(@DatabaseExecutor Executor dbExecutor,
-			LifecycleManager lifecycleManager,
-			PluginManager pluginManager, EventBus eventBus) {
+			LifecycleManager lifecycleManager, PluginManager pluginManager,
+			SettingsManager settingsManager, EventBus eventBus) {
 		super(dbExecutor, lifecycleManager);
 		this.pluginManager = pluginManager;
+		this.settingsManager = settingsManager;
 		this.eventBus = eventBus;
 	}
 
@@ -92,6 +102,63 @@ public class NavDrawerControllerImpl extends DbControllerImpl
 		});
 	}
 
+	@Override
+	public void showExpiryWarning(final ResultHandler<Boolean> handler) {
+		runOnDbThread(new Runnable() {
+			@Override
+			public void run() {
+				try {
+					Settings settings =
+							settingsManager.getSettings(SETTINGS_NAMESPACE);
+					int warningInt = settings.getInt(EXPIRY_DATE_WARNING, 0);
+
+					if (warningInt == 0) {
+						// we have not warned before
+						handler.onResult(true);
+					} else {
+						long warningLong = warningInt * 1000L;
+						long now = System.currentTimeMillis();
+						long daysSinceLastWarning =
+								(now - warningLong) / 1000 / 60 / 60 / 24;
+						long daysBeforeExpiry =
+								(EXPIRY_DATE - now) / 1000 / 60 / 60 / 24;
+
+						if (daysSinceLastWarning >= 30) {
+							handler.onResult(true);
+							return;
+						}
+						if (daysBeforeExpiry <= 3 && daysSinceLastWarning > 0) {
+							handler.onResult(true);
+							return;
+						}
+						handler.onResult(false);
+					}
+				} catch (DbException e) {
+					if (LOG.isLoggable(WARNING))
+						LOG.log(WARNING, e.toString(), e);
+				}
+			}
+		});
+	}
+
+	@Override
+	public void expiryWarningDismissed() {
+		runOnDbThread(new Runnable() {
+			@Override
+			public void run() {
+				try {
+					Settings settings = new Settings();
+					int date = (int) (System.currentTimeMillis() / 1000L);
+					settings.putInt(EXPIRY_DATE_WARNING, date);
+					settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE);
+				} catch (DbException e) {
+					if (LOG.isLoggable(WARNING))
+						LOG.log(WARNING, e.toString(), e);
+				}
+			}
+		});
+	}
+
 	@Override
 	public boolean isTransportRunning(TransportId transportId) {
 		Plugin plugin = pluginManager.getPlugin(transportId);
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 885ba7f47ce691c0fcdcfc2a093d56706dd92f8d..1856c3d4ec9a017690f0ee066336d541ccff9588 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
@@ -22,6 +22,7 @@ import java.util.logging.Logger;
 
 import javax.inject.Inject;
 
+import static org.briarproject.briar.android.BriarApplication.EXPIRY_DATE;
 import static org.briarproject.briar.android.TestingConstants.DEFAULT_LOG_LEVEL;
 import static org.briarproject.briar.android.TestingConstants.TESTING;
 
@@ -30,9 +31,6 @@ public class SplashScreenActivity extends BaseActivity {
 	private static final Logger LOG =
 			Logger.getLogger(SplashScreenActivity.class.getName());
 
-	// This build expires on 1 September 2017
-	private static final long EXPIRY_DATE = 1504220400 * 1000L;
-
 	@Inject
 	protected ConfigController configController;
 	@Inject
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 6dc2920ed0a2cec28cb72411b7ba32dce2bbfb25..4543867fa94c69dcee899a6714a18d52d3dd5377 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
@@ -31,6 +31,7 @@ import static android.text.format.DateUtils.FORMAT_ABBREV_TIME;
 import static android.text.format.DateUtils.FORMAT_SHOW_DATE;
 import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
 import static android.text.format.DateUtils.WEEK_IN_MILLIS;
+import static org.briarproject.briar.android.BriarApplication.EXPIRY_DATE;
 
 public class UiUtils {
 
@@ -64,6 +65,12 @@ public class UiUtils {
 				MIN_DATE_RESOLUTION, flags).toString();
 	}
 
+	public static int getDaysUntilExpiry() {
+		long now = System.currentTimeMillis();
+		long daysBeforeExpiry = (EXPIRY_DATE - now) / 1000 / 60 / 60 / 24;
+		return (int) daysBeforeExpiry;
+	}
+
 	public static SpannableStringBuilder getTeaser(Context ctx, Spanned body) {
 		if (body.length() < TEASER_LENGTH)
 			throw new IllegalArgumentException(
diff --git a/briar-android/src/main/res/drawable/ic_close.xml b/briar-android/src/main/res/drawable/ic_close.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bcc722dc42a76809f8d47b85eeb852b14a7cbc29
--- /dev/null
+++ b/briar-android/src/main/res/drawable/ic_close.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="18dp"
+        android:height="18dp"
+        android:viewportHeight="24.0"
+        android:viewportWidth="24.0">
+	<path
+		android:fillColor="#FFFFFFFF"
+		android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
+</vector>
diff --git a/briar-android/src/main/res/layout/activity_expired.xml b/briar-android/src/main/res/layout/activity_expired.xml
index d287f5742ec8f7d9355ea50ed2fcbfa41fbf7a76..d70e278a211f44c4c9c188c45719e3d4946e9cad 100644
--- a/briar-android/src/main/res/layout/activity_expired.xml
+++ b/briar-android/src/main/res/layout/activity_expired.xml
@@ -5,5 +5,5 @@
 	android:layout_height="match_parent"
 	android:layout_gravity="center"
 	android:gravity="center"
-	android:text="@string/expiry_warning"
+	android:text="@string/expiry_date_reached"
 	android:textSize="@dimen/text_size_large"/>
\ No newline at end of file
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 aceb673742bf6f7294536f05486af9bb480a0562..192ceb4baeb855bc4e4cfd064fbea2ea8c125b47 100644
--- a/briar-android/src/main/res/layout/activity_nav_drawer.xml
+++ b/briar-android/src/main/res/layout/activity_nav_drawer.xml
@@ -15,6 +15,38 @@
 
 		<include layout="@layout/toolbar"/>
 
+		<RelativeLayout
+			android:id="@+id/expiryWarning"
+			android:layout_width="match_parent"
+			android:layout_height="wrap_content"
+			android:background="@color/briar_warning_background"
+			android:orientation="horizontal"
+			android:padding="@dimen/margin_medium"
+			android:visibility="gone"
+			tools:visibility="visible">
+
+			<TextView
+				android:id="@+id/expiryWarningText"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:layout_toLeftOf="@+id/expiryWarningClose"
+				android:text="@string/expiry_warning"
+				android:textColor="@color/briar_text_primary_inverse"
+				android:textSize="@dimen/text_size_small"/>
+
+			<ImageView
+				android:id="@+id/expiryWarningClose"
+				android:layout_width="24dp"
+				android:layout_height="24dp"
+				android:layout_alignParentRight="true"
+				android:layout_centerInParent="true"
+				android:contentDescription="@string/close"
+				android:scaleType="center"
+				android:src="@drawable/ic_close"
+				android:tint="@color/briar_text_tertiary_inverse"/>
+
+		</RelativeLayout>
+
 		<FrameLayout
 			android:id="@+id/fragmentContainer"
 			android:layout_width="match_parent"
diff --git a/briar-android/src/main/res/values-ms/strings.xml b/briar-android/src/main/res/values-ms/strings.xml
index c31311605a23be167859537c758ceace8a65bb10..305294f28d34ac111e53a7c0fc93c85ed6c3d346 100644
--- a/briar-android/src/main/res/values-ms/strings.xml
+++ b/briar-android/src/main/res/values-ms/strings.xml
@@ -12,7 +12,7 @@
   <string name="enter_password">Masukkan kata laluan anda:</string>
   <string name="startup_failed_notification_title">Briar gagal dimulakan</string>
   <string name="startup_failed_notification_text">Anda perlu pasang ulang Briar.</string>
-  <string name="expiry_warning">Aplikasi ini telah tamat tempoh.\nSila pasang ulang versi baru.</string>
+  <string name="expiry_date_reached">Aplikasi ini telah tamat tempoh.\nSila pasang ulang versi baru.</string>
   <!--Navigation Drawer-->
   <string name="contact_list_button">Kenalan</string>
   <string name="forums_button">Forum</string>
diff --git a/briar-android/src/main/res/values/color.xml b/briar-android/src/main/res/values/color.xml
index b9c28ffd2c0a8394a17d6487650889e3c80a55d2..3110965f780933f698619f9739f2b89d0e9c54f6 100644
--- a/briar-android/src/main/res/values/color.xml
+++ b/briar-android/src/main/res/values/color.xml
@@ -27,6 +27,7 @@
 	<color name="briar_text_tertiary_inverse">#80ffffff</color>
 	<color name="briar_button_positive">#06b9ff</color>
 	<color name="briar_button_negative">#ff0000</color>
+	<color name="briar_warning_background">#ff0000</color>
 	<color name="emoji_text_color">#ff000000</color>
 
 	<color name="emoji_pager_background">@color/window_background</color>
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index bb1288d6f187477b9c4637c45b8a124e552e7137..22c21a1ee2937ebafe92361bbc344c63edfc5e4b 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -25,7 +25,11 @@
 	<string name="startup_failed_activity_title">Briar Startup Failure</string>
 	<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>
+	<plurals name="expiry_warning">
+		<item quantity="one">This is a beta version of Briar. Your account will expire in %d day and cannot be renewed.</item>
+		<item quantity="other">This is a beta version of Briar. Your account will expire in %d days and cannot be renewed.</item>
+	</plurals>
+	<string name="expiry_date_reached">This software has expired.\nThank you for testing!</string>
 
 	<!-- Navigation Drawer -->
 	<string name="nav_drawer_open_description">Open the navigation drawer</string>