diff --git a/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java b/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java
index 8c57c3cbf1e0d753cf0ed36c2aadce87a64ff65f..95e892a970fbd0c797ef52bf5cafef18348ca867 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java
@@ -2,7 +2,6 @@ package org.briarproject.android.contact;
 
 import android.content.Context;
 import android.support.v4.view.ViewCompat;
-import android.text.format.DateUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -10,6 +9,7 @@ import android.widget.ImageView;
 import android.widget.TextView;
 
 import org.briarproject.R;
+import org.briarproject.android.util.AndroidUtils;
 import org.briarproject.util.StringUtils;
 
 public class ContactListAdapter
@@ -46,10 +46,8 @@ public class ContactListAdapter
 		if (item.isEmpty()) {
 			ui.date.setText(R.string.no_private_messages);
 		} else {
-			// TODO show this as X units ago
 			long timestamp = item.getTimestamp();
-			ui.date.setText(
-					DateUtils.getRelativeTimeSpanString(ctx, timestamp));
+			ui.date.setText(AndroidUtils.formatDate(ctx, timestamp));
 		}
 
 		// online/offline
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
index 414feaca988b36b9933976e277df29e96ea9f964..cc67ec7772ff5571543607187d26594852759c45 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
@@ -4,7 +4,6 @@ import android.content.Context;
 import android.content.Intent;
 import android.support.v7.util.SortedList;
 import android.support.v7.widget.RecyclerView;
-import android.text.format.DateUtils;
 import android.util.SparseArray;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -15,6 +14,7 @@ import android.widget.TextView;
 
 import org.briarproject.R;
 import org.briarproject.android.forum.AvailableForumsActivity;
+import org.briarproject.android.util.AndroidUtils;
 import org.briarproject.api.clients.SessionId;
 import org.briarproject.api.forum.ForumInvitationMessage;
 import org.briarproject.api.introduction.IntroductionRequest;
@@ -170,7 +170,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
 		}
 
 		long timestamp = header.getTimestamp();
-		ui.date.setText(DateUtils.getRelativeTimeSpanString(ctx, timestamp));
+		ui.date.setText(AndroidUtils.formatDate(ctx, timestamp));
 	}
 
 	private void bindIntroduction(IntroductionHolder ui,
@@ -184,8 +184,8 @@ class ConversationAdapter extends RecyclerView.Adapter {
 		} else {
 			ui.messageLayout.setVisibility(View.VISIBLE);
 			ui.message.body.setText(StringUtils.trim(message));
-			ui.message.date.setText(
-					DateUtils.getRelativeTimeSpanString(ctx, item.getTime()));
+			ui.message.date
+					.setText(AndroidUtils.formatDate(ctx, item.getTime()));
 		}
 
 		// Outgoing Introduction Request
@@ -255,15 +255,13 @@ class ConversationAdapter extends RecyclerView.Adapter {
 				}
 			});
 		}
-		ui.date.setText(
-				DateUtils.getRelativeTimeSpanString(ctx, item.getTime()));
+		ui.date.setText(AndroidUtils.formatDate(ctx, item.getTime()));
 	}
 
 	private void bindNotice(NoticeHolder ui, ConversationNoticeItem item) {
 
 		ui.text.setText(item.getText());
-		ui.date.setText(
-				DateUtils.getRelativeTimeSpanString(ctx, item.getTime()));
+		ui.date.setText(AndroidUtils.formatDate(ctx, item.getTime()));
 
 		if (item instanceof ConversationNoticeOutItem) {
 			ConversationNoticeOutItem n = (ConversationNoticeOutItem) item;
@@ -288,8 +286,8 @@ class ConversationAdapter extends RecyclerView.Adapter {
 		} else {
 			ui.messageLayout.setVisibility(View.VISIBLE);
 			ui.message.body.setText(StringUtils.trim(message));
-			ui.message.date.setText(
-					DateUtils.getRelativeTimeSpanString(ctx, item.getTime()));
+			ui.message.date
+					.setText(AndroidUtils.formatDate(ctx, item.getTime()));
 		}
 
 		// Outgoing Invitation
@@ -332,8 +330,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
 				ui.showForumsButton.setVisibility(View.GONE);
 			}
 		}
-		ui.date.setText(
-				DateUtils.getRelativeTimeSpanString(ctx, item.getTime()));
+		ui.date.setText(AndroidUtils.formatDate(ctx, item.getTime()));
 	}
 
 	@Override
diff --git a/briar-android/src/org/briarproject/android/forum/ForumActivity.java b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
index 8133edef3ac914fba40926f26ff04dd1a6e38386..2657715b2d036169a1ba4b1b3c2ae1dda97f6247 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
@@ -18,7 +18,6 @@ import android.support.v4.content.ContextCompat;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
-import android.text.format.DateUtils;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -35,6 +34,7 @@ import org.briarproject.android.ActivityComponent;
 import org.briarproject.android.BriarActivity;
 import org.briarproject.android.api.AndroidNotificationManager;
 import org.briarproject.android.controller.handler.UiResultHandler;
+import org.briarproject.android.util.AndroidUtils;
 import org.briarproject.android.util.BriarRecyclerView;
 import org.briarproject.android.util.TrustIndicatorView;
 import org.briarproject.api.sync.GroupId;
@@ -633,9 +633,8 @@ public class ForumActivity extends BriarActivity implements
 				ui.lvlText.setVisibility(GONE);
 			}
 			ui.authorText.setText(data.getAuthor());
-			ui.dateText.setText(DateUtils
-					.getRelativeTimeSpanString(ForumActivity.this,
-							data.getTimestamp()));
+			ui.dateText.setText(AndroidUtils
+					.formatDate(ForumActivity.this, data.getTimestamp()));
 			ui.trust.setTrustLevel(data.getStatus());
 
 			int replies = getReplyCount(data);
diff --git a/briar-android/src/org/briarproject/android/forum/ForumListAdapter.java b/briar-android/src/org/briarproject/android/forum/ForumListAdapter.java
index 34f27ebcf8b8d9bdffc12273bf008abdb7a94340..17fd01346b17fbedbcf58567a430987c9c77d209 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumListAdapter.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumListAdapter.java
@@ -6,13 +6,13 @@ import android.support.annotation.Nullable;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.util.SortedList;
 import android.support.v7.widget.RecyclerView;
-import android.text.format.DateUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;
 
 import org.briarproject.R;
+import org.briarproject.android.util.AndroidUtils;
 import org.briarproject.android.util.TextAvatarView;
 import org.briarproject.api.forum.Forum;
 import org.briarproject.api.sync.GroupId;
@@ -123,8 +123,7 @@ class ForumListAdapter extends
 			ui.date.setVisibility(GONE);
 		} else {
 			long timestamp = item.getTimestamp();
-			ui.date.setText(
-					DateUtils.getRelativeTimeSpanString(ctx, timestamp));
+			ui.date.setText(AndroidUtils.formatDate(ctx, timestamp));
 			ui.date.setVisibility(VISIBLE);
 		}
 
diff --git a/briar-android/src/org/briarproject/android/util/AndroidUtils.java b/briar-android/src/org/briarproject/android/util/AndroidUtils.java
index f3b33196cb7a9c5bbabf456472dcc37be9c34184..af9cc2ae05019165d74a0df10f6fe17d4039a8d4 100644
--- a/briar-android/src/org/briarproject/android/util/AndroidUtils.java
+++ b/briar-android/src/org/briarproject/android/util/AndroidUtils.java
@@ -6,6 +6,7 @@ import android.content.Context;
 import android.os.Build;
 import android.provider.Settings;
 import android.support.design.widget.TextInputLayout;
+import android.text.format.DateUtils;
 
 import org.briarproject.util.FileUtils;
 import org.briarproject.util.StringUtils;
@@ -18,6 +19,13 @@ import java.util.Collections;
 import java.util.List;
 
 import static android.content.Context.MODE_PRIVATE;
+import static android.text.format.DateUtils.DAY_IN_MILLIS;
+import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
+import static android.text.format.DateUtils.FORMAT_ABBREV_RELATIVE;
+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;
 
 public class AndroidUtils {
 
@@ -81,4 +89,22 @@ public class AndroidUtils {
 	public static File getReportDir(Context ctx) {
 		return ctx.getDir(STORED_REPORTS, MODE_PRIVATE);
 	}
+
+	public static String formatDate(Context ctx, long time) {
+		long minResolution = MINUTE_IN_MILLIS;
+		int flags = FORMAT_ABBREV_RELATIVE |
+				FORMAT_SHOW_DATE | FORMAT_ABBREV_TIME | FORMAT_ABBREV_MONTH;
+
+		// also show time when older than a day, but newer than a week
+		long diff = System.currentTimeMillis() - time;
+		if (diff >= DAY_IN_MILLIS && diff < WEEK_IN_MILLIS) {
+			return DateUtils.getRelativeDateTimeString(ctx, time, minResolution,
+					WEEK_IN_MILLIS, flags).toString();
+		}
+		// otherwise just show "...ago" or date string
+		return DateUtils
+				.getRelativeTimeSpanString(time, System.currentTimeMillis(),
+						minResolution, flags).toString();
+	}
+
 }