diff --git a/gertty/db.py b/gertty/db.py
index 2cf23ae..381a59f 100644
--- a/gertty/db.py
+++ b/gertty/db.py
@@ -578,12 +578,15 @@ class DatabaseSession(object):
         except sqlalchemy.orm.exc.NoResultFound:
             return None
 
-    def getChanges(self, query, unreviewed=False):
+    def getChanges(self, query, unreviewed=False, sort_by='number'):
         self.database.log.debug("Search query: %s" % query)
         q = self.session().query(Change).filter(self.search.parse(query))
         if unreviewed:
             q = q.filter(change_table.c.hidden==False, change_table.c.reviewed==False)
-        q = q.order_by(change_table.c.number)
+        if sort_by == 'updated':
+            q = q.order_by(change_table.c.updated)
+        else:
+            q = q.order_by(change_table.c.number)
         self.database.log.debug("Search SQL: %s" % q)
         try:
             return q.all()
diff --git a/gertty/keymap.py b/gertty/keymap.py
index afb5189..17fb200 100644
--- a/gertty/keymap.py
+++ b/gertty/keymap.py
@@ -53,6 +53,9 @@ REFRESH = 'refresh'
 EDIT_TOPIC = 'edit topic'
 EDIT_COMMIT_MESSAGE = 'edit commit message'
 SUBMIT_CHANGE = 'submit change'
+SORT_BY_NUMBER = 'sort by number'
+SORT_BY_UPDATED = 'sort by updated'
+SORT_BY_REVERSE = 'reverse the sort'
 # Project list screen:
 TOGGLE_LIST_REVIEWED = 'toggle list reviewed'
 TOGGLE_LIST_SUBSCRIBED = 'toggle list subscribed'
@@ -97,6 +100,9 @@ DEFAULT_KEYMAP = {
     EDIT_TOPIC: 'ctrl t',
     EDIT_COMMIT_MESSAGE: 'ctrl d',
     SUBMIT_CHANGE: 'ctrl u',
+    SORT_BY_NUMBER: 'n',
+    SORT_BY_UPDATED: 'u',
+    SORT_BY_REVERSE: 'r',
 
     TOGGLE_LIST_REVIEWED: 'l',
     TOGGLE_LIST_SUBSCRIBED: 'L',
diff --git a/gertty/view/change_list.py b/gertty/view/change_list.py
index 58df858..fb39f74 100644
--- a/gertty/view/change_list.py
+++ b/gertty/view/change_list.py
@@ -106,7 +106,13 @@ class ChangeListView(urwid.WidgetWrap):
             (key(keymap.TOGGLE_REVIEWED),
              "Toggle the reviewed flag for the currently selected change"),
             (key(keymap.REFRESH),
-             "Sync all projects")
+             "Sync all projects"),
+            (key(keymap.SORT_BY_NUMBER),
+             "Sort changes by number"),
+            (key(keymap.SORT_BY_UPDATED),
+             "Sort changes by how recently the change was updated"),
+            (key(keymap.SORT_BY_REVERSE),
+             "Reverse the sort")
             ]
 
     def __init__(self, app, query, query_desc=None, unreviewed=False):
@@ -120,6 +126,8 @@ class ChangeListView(urwid.WidgetWrap):
         self.display_owner = self.display_project = self.display_updated = True
         if '_project_key' in query:
             self.display_project = False
+        self.sort_by = 'number'
+        self.reverse = False
         self.header = ChangeListHeader(self.display_project, self.display_owner,
                                        self.display_updated)
         self.categories = []
@@ -133,7 +141,8 @@ class ChangeListView(urwid.WidgetWrap):
     def refresh(self):
         unseen_keys = set(self.change_rows.keys())
         with self.app.db.getSession() as session:
-            lst = session.getChanges(self.query, self.unreviewed)
+            lst = session.getChanges(self.query, self.unreviewed,
+                                     sort_by=self.sort_by)
             if self.unreviewed:
                 self.title = u'Unreviewed changes in %s' % self.query_desc
             else:
@@ -144,7 +153,11 @@ class ChangeListView(urwid.WidgetWrap):
                 categories |= set(change.getCategories())
             self.categories = sorted(categories)
             i = 0
-            for change in lst:
+            if self.reverse:
+                change_list = reversed(lst)
+            else:
+                change_list = lst
+            for change in change_list:
                 row = self.change_rows.get(change.key)
                 if not row:
                     row = ChangeRow(change, self.categories, self.display_project,
@@ -163,6 +176,11 @@ class ChangeListView(urwid.WidgetWrap):
             self.listbox.body.remove(row)
             del self.change_rows[key]
 
+    def clearChangeList(self):
+        for key, value in self.change_rows.iteritems():
+            self.listbox.body.remove(value)
+        self.change_rows = {}
+
     def getNextChangeKey(self, change_key):
         row = self.change_rows.get(change_key)
         try:
@@ -225,6 +243,30 @@ class ChangeListView(urwid.WidgetWrap):
                 sync.SyncSubscribedProjectsTask(sync.HIGH_PRIORITY))
             self.app.status.update()
             return None
+        if keymap.SORT_BY_NUMBER in commands:
+            if not len(self.listbox.body):
+                return None
+            self.sort_by = 'number'
+            self.clearChangeList()
+            self.refresh()
+            return None
+        if keymap.SORT_BY_UPDATED in commands:
+            if not len(self.listbox.body):
+                return None
+            self.sort_by = 'updated'
+            self.clearChangeList()
+            self.refresh()
+            return None
+        if keymap.SORT_BY_REVERSE in commands:
+            if not len(self.listbox.body):
+                return None
+            if self.reverse:
+                self.reverse = False
+            else:
+                self.reverse = True
+            self.clearChangeList()
+            self.refresh()
+            return None
         return key
 
     def onSelect(self, button, change_key):