diff --git a/src/client/geary-config.vala b/src/client/geary-config.vala
index 5b8fa84..32bec70 100644
--- a/src/client/geary-config.vala
+++ b/src/client/geary-config.vala
@@ -5,7 +5,7 @@
  */
 
 // Wrapper class for GSettings.
-public class Configuration {
+public class Configuration : Object {
     private Settings settings;
     
     private const string WINDOW_WIDTH_NAME = "window-width";
@@ -44,6 +44,13 @@ public class Configuration {
         set { settings.set_boolean(AUTOSELECT_NAME, value); }
     }
     
+    private const string MESSAGE_LIST_ASCENDING_NAME = "message-list-ascending";
+    public const string MESSAGE_LIST_ASCENDING_PROPERTY_NAME = "message-list-ascending";
+    public bool message_list_ascending {
+        get { return settings.get_boolean(MESSAGE_LIST_ASCENDING_NAME); }
+        set { settings.set_boolean(MESSAGE_LIST_ASCENDING_NAME, value); }
+    }
+    
     // Creates a configuration object.
     // is_installed: set to true if installed, else false.
     // schema_dir: MUST be set if not installed. Directory where GSettings schema is located.
diff --git a/src/client/org.yorba.geary.gschema.xml b/src/client/org.yorba.geary.gschema.xml
index e1ecd0f..41c8479 100644
--- a/src/client/org.yorba.geary.gschema.xml
+++ b/src/client/org.yorba.geary.gschema.xml
@@ -38,6 +38,13 @@
         <description>True if we should autoselect the next available conversation.</description>
     </key>
     
+    <key name="message-list-ascending" type="b">
+        <default>false</default>
+        <summary>display message list in ascending order</summary>
+        <description>True if we should display the message list in ascending order, false
+        for descending order.</description>
+    </key>
+    
 </schema>
 
 </schemalist>
diff --git a/src/client/ui/message-list-store.vala b/src/client/ui/message-list-store.vala
index b1ed2c4..c766d06 100644
--- a/src/client/ui/message-list-store.vala
+++ b/src/client/ui/message-list-store.vala
@@ -53,7 +53,11 @@ public class MessageListStore : Gtk.TreeStore {
     public MessageListStore() {
         set_column_types(Column.get_types());
         set_default_sort_func(sort_by_date);
-        set_sort_column_id(TreeSortable.DEFAULT_SORT_COLUMN_ID, Gtk.SortType.DESCENDING);
+        GearyApplication.instance.config.notify[Configuration.MESSAGE_LIST_ASCENDING_PROPERTY_NAME].
+            connect(on_config_order_changed);
+        
+        // Set initial ordering.
+        on_config_order_changed();
     }
     
     // The Email should've been fetched with REQUIRED_FIELDS.
@@ -224,5 +228,11 @@ public class MessageListStore : Gtk.TreeStore {
         
         return compare_conversation(a, b);
     }
+    
+    private void on_config_order_changed() {
+        set_sort_column_id(TreeSortable.DEFAULT_SORT_COLUMN_ID, 
+            GearyApplication.instance.config.message_list_ascending ? Gtk.SortType.ASCENDING :
+            Gtk.SortType.DESCENDING);
+    }
 }
 
diff --git a/src/client/ui/message-list-view.vala b/src/client/ui/message-list-view.vala
index 2cf27b1..c3292b1 100644
--- a/src/client/ui/message-list-view.vala
+++ b/src/client/ui/message-list-view.vala
@@ -9,9 +9,9 @@ public class MessageListView : Gtk.TreeView {
     
     public bool enable_load_more { get; set; default = true; }
     
-    // Used to avoid repeated calls to load_more(). Contains the last "upper" bound of the
-    // scroll adjustment seen at the call to load_more().
-    private double last_upper = -1.0;
+    // Used to avoid repeated calls to load_more(). Contains the last "upper" or "lower" bound of
+    // the scroll adjustment seen at the call to load_more().
+    private double last_bound = -1.0;
     
     public signal void conversation_selected(Geary.Conversation? conversation);
     public signal void load_more();
@@ -31,6 +31,9 @@ public class MessageListView : Gtk.TreeView {
         show.connect(on_show);
         
         store.row_deleted.connect(on_row_deleted);
+        
+        GearyApplication.instance.config.notify[Configuration.MESSAGE_LIST_ASCENDING_PROPERTY_NAME].
+            connect(on_config_order_changed);
     }
     
     private void on_style_changed() {
@@ -47,13 +50,29 @@ public class MessageListView : Gtk.TreeView {
         if (!enable_load_more)
             return;
         
-        // Check if we're at the very bottom of the list. If we are, it's time to
-        // issue a load_more signal.
-        if (get_vadjustment().get_value() >= get_vadjustment().get_upper() - 
-            get_vadjustment().page_size - LOAD_MORE_HEIGHT && get_vadjustment().get_upper() 
-            > last_upper) {
-            load_more();
-            last_upper = get_vadjustment().get_upper();
+        // Check if we're at the top (ascending) or bottom (descending) of the list.
+        // If we are, issue the load_more signal.
+        if (GearyApplication.instance.config.message_list_ascending) {
+            if (get_vadjustment().get_value() <= LOAD_MORE_HEIGHT && get_vadjustment().get_value() 
+                != last_bound) {
+                load_more();
+                last_bound = get_vadjustment().get_value();
+            }
+        } else {
+            if (get_vadjustment().get_value() >= get_vadjustment().get_upper() - 
+                get_vadjustment().page_size - LOAD_MORE_HEIGHT && get_vadjustment().get_upper() 
+                > last_bound) {
+                load_more();
+                last_bound = get_vadjustment().get_upper();
+            }
+        }
+    }
+    
+    private void on_config_order_changed() {
+        if (GearyApplication.instance.config.message_list_ascending) {
+            last_bound = double.MAX;
+        } else {
+            last_bound = -1;
         }
     }
     
diff --git a/src/client/ui/preferences-dialog.vala b/src/client/ui/preferences-dialog.vala
index 4775b84..38c95d7 100644
--- a/src/client/ui/preferences-dialog.vala
+++ b/src/client/ui/preferences-dialog.vala
@@ -7,6 +7,7 @@
 public class PreferencesDialog : Object {
     private Gtk.Dialog dialog;
     private Gtk.CheckButton autoselect;
+    private Gtk.ComboBoxText order_messages;
     private Gtk.Button close_button;
     private Configuration config;
     
@@ -16,11 +17,17 @@ public class PreferencesDialog : Object {
         
         dialog = builder.get_object("dialog") as Gtk.Dialog;
         autoselect = builder.get_object("autoselect") as Gtk.CheckButton;
+        order_messages = builder.get_object("order messages") as Gtk.ComboBoxText;
         close_button = builder.get_object("close_button") as Gtk.Button;
         
         autoselect.active = config.autoselect;
         
+        order_messages.append_text(_("Newest first"));
+        order_messages.append_text(_("Oldest first"));
+        order_messages.set_active(config.message_list_ascending ? 1 : 0);
+        
         autoselect.toggled.connect(on_autoselect_toggled);
+        order_messages.changed.connect(on_order_message_changed);
         close_button.clicked.connect(on_close);
         dialog.close.connect(on_escape);
     }
@@ -40,4 +47,8 @@ public class PreferencesDialog : Object {
     private void on_escape() {
         dialog.hide();
     }
+    
+    private void on_order_message_changed() {
+        config.message_list_ascending = order_messages.get_active() == 0 ? false : true;
+    }
 }
diff --git a/ui/preferences.glade b/ui/preferences.glade
index 47c8e6f..bf4df7c 100644
--- a/ui/preferences.glade
+++ b/ui/preferences.glade
@@ -55,7 +55,7 @@
                 <property name="margin_top">5</property>
                 <property name="margin_bottom">5</property>
                 <property name="xalign">0</property>
-                <property name="label" translatable="yes">Reading options</property>
+                <property name="label" translatable="yes">Message List</property>
                 <attributes>
                   <attribute name="weight" value="bold"/>
                 </attributes>
@@ -63,7 +63,7 @@
               <packing>
                 <property name="left_attach">0</property>
                 <property name="top_attach">0</property>
-                <property name="width">1</property>
+                <property name="width">2</property>
                 <property name="height">1</property>
               </packing>
             </child>
@@ -85,12 +85,39 @@
               <packing>
                 <property name="left_attach">0</property>
                 <property name="top_attach">1</property>
+                <property name="width">2</property>
+                <property name="height">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label: ordering">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="margin_left">12</property>
+                <property name="margin_right">5</property>
+                <property name="margin_top">5</property>
+                <property name="margin_bottom">5</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">Order messages</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">2</property>
                 <property name="width">1</property>
                 <property name="height">1</property>
               </packing>
             </child>
             <child>
-              <placeholder/>
+              <object class="GtkComboBoxText" id="order messages">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="top_attach">2</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
+              </packing>
             </child>
           </object>
           <packing>
