diff --git a/projects/todos/app/src/firebase/java/io/v/todos/persistence/firebase/FirebaseTodoList.java b/projects/todos/app/src/firebase/java/io/v/todos/persistence/firebase/FirebaseTodoList.java
index 936b064..ba3b3ca 100644
--- a/projects/todos/app/src/firebase/java/io/v/todos/persistence/firebase/FirebaseTodoList.java
+++ b/projects/todos/app/src/firebase/java/io/v/todos/persistence/firebase/FirebaseTodoList.java
@@ -24,6 +24,8 @@
     private final ValueEventListener mTodoListListener;
     private final ChildEventListener mTasksListener;
 
+    private TodoList mList;
+
     public FirebaseTodoList(Context context, String todoListKey, final TodoListListener listener) {
         super(context);
 
@@ -37,6 +39,7 @@
                 if (todoList == null) {
                     listener.onDelete();
                 } else {
+                    mList = todoList;
                     listener.onUpdate(todoList);
                 }
             }
@@ -64,16 +67,19 @@
     @Override
     public void addTask(Task task) {
         mTasks.push().setValue(task);
+        mTodoList.setValue(new TodoList(mList.getName()));
     }
 
     @Override
     public void updateTask(Task task) {
         mTasks.child(task.getKey()).setValue(task);
+        mTodoList.setValue(new TodoList(mList.getName()));
     }
 
     @Override
     public void deleteTask(String key) {
         mTasks.child(key).removeValue();
+        mTodoList.setValue(new TodoList(mList.getName()));
     }
 
     @Override
diff --git a/projects/todos/app/src/main/java/io/v/todos/TaskViewHolder.java b/projects/todos/app/src/main/java/io/v/todos/TaskViewHolder.java
index b4f4ace..05d56fc 100644
--- a/projects/todos/app/src/main/java/io/v/todos/TaskViewHolder.java
+++ b/projects/todos/app/src/main/java/io/v/todos/TaskViewHolder.java
@@ -37,7 +37,7 @@
     }
 
     private String computeCreated(Task task) {
-        return "" + task.getAddedAt();
+        return UIUtil.computeTimeAgo("Created", task.getAddedAt());
     }
 
     public void setShowDone(boolean showDone) {
diff --git a/projects/todos/app/src/main/java/io/v/todos/TodoListActivity.java b/projects/todos/app/src/main/java/io/v/todos/TodoListActivity.java
index 1791c87..0cc91f7 100644
--- a/projects/todos/app/src/main/java/io/v/todos/TodoListActivity.java
+++ b/projects/todos/app/src/main/java/io/v/todos/TodoListActivity.java
@@ -127,25 +127,21 @@
     }
 
     public void addTodoItem(String todo) {
-        // TODO(alexfandrianto): Turns out these are all batch changes that change the parents updatedAt
         mPersistence.addTask(new Task(todo));
     }
 
     public void updateTodoItem(String fbKey, String todo) {
-        // TODO(alexfandrianto): Turns out these are all batch changes that change the parents updatedAt
         Task task = snackoosList.findByKey(fbKey).copy();
         task.setText(todo);
         mPersistence.updateTask(task);
     }
     public void markAsDone(String fbKey) {
-        // TODO(alexfandrianto): Turns out these are all batch changes that change the parents updatedAt
         Task task = snackoosList.findByKey(fbKey).copy();
         task.setDone(!task.getDone());
         mPersistence.updateTask(task);
     }
 
     public void deleteTodoItem(String fbKey) {
-        // TODO(alexfandrianto): Turns out these are all batch changes that change the parents updatedAt
         mPersistence.deleteTask(fbKey);
     }
 
diff --git a/projects/todos/app/src/main/java/io/v/todos/TodoListViewHolder.java b/projects/todos/app/src/main/java/io/v/todos/TodoListViewHolder.java
index f99beb2..788fe95 100644
--- a/projects/todos/app/src/main/java/io/v/todos/TodoListViewHolder.java
+++ b/projects/todos/app/src/main/java/io/v/todos/TodoListViewHolder.java
@@ -32,7 +32,7 @@
     }
 
     private String computeTimeAgo(TodoList todoList) {
-        return "" + todoList.getUpdatedAt();
+        return UIUtil.computeTimeAgo("Last Updated", todoList.getUpdatedAt());
     }
 
     private String computeCompleted(TodoList todoList) {
diff --git a/projects/todos/app/src/main/java/io/v/todos/UIUtil.java b/projects/todos/app/src/main/java/io/v/todos/UIUtil.java
new file mode 100644
index 0000000..dd302d3
--- /dev/null
+++ b/projects/todos/app/src/main/java/io/v/todos/UIUtil.java
@@ -0,0 +1,16 @@
+// Copyright 2016 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.todos;
+
+import android.text.format.DateUtils;
+
+/**
+ * Created by alexfandrianto on 4/18/16.
+ */
+public class UIUtil {
+    public static String computeTimeAgo(String prefix, long startTime) {
+        return prefix + ": " + DateUtils.getRelativeTimeSpanString(startTime);
+    }
+}
