diff --git a/src/client/sidebar/sidebar-tree.vala b/src/client/sidebar/sidebar-tree.vala
index 38a3dc7..0b5f2ba 100644
--- a/src/client/sidebar/sidebar-tree.vala
+++ b/src/client/sidebar/sidebar-tree.vala
@@ -6,6 +6,10 @@
 
 public class Sidebar.Tree : Gtk.TreeView {
     public const int ICON_SIZE = 16;
+    public const int CHILD_HORIZONTAL_OFFSET = 12;
+    public const int HEADER_MARGIN_TOP = 6;
+    public const int TEXT_HEIGHT = 11;
+    public const float HEADER_YALIGN = 0.5f * (1 + HEADER_MARGIN_TOP / (float) (HEADER_MARGIN_TOP + TEXT_HEIGHT));
     
     // Only one ExternalDropHandler can be registered with the Tree; it's responsible for completing
     // the "drag-data-received" signal properly.
@@ -34,6 +38,61 @@ public class Sidebar.Tree : Gtk.TreeView {
         }
     }
     
+    public class ExpanderRenderer : Gtk.CellRenderer {
+        private static const Gtk.Requisition size = { 8, 8 };
+        
+        public ExpanderRenderer() {
+            mode = Gtk.CellRendererMode.ACTIVATABLE;
+        }
+        
+        public override void get_size(Gtk.Widget widget, Gdk.Rectangle? cell_area, out int x, out int y, out int width, out int height) {
+            x = 0;
+            y = 0;
+            
+            width = (int) xpad * 2 + size.width;
+            height = (int) ypad * 2 + size.height;
+        }
+        
+        public override void render(Cairo.Context context, Gtk.Widget widget, Gdk.Rectangle background_area,
+            Gdk.Rectangle cell_area, Gtk.CellRendererState flags) {
+            if ((flags & Gtk.CellRendererState.EXPANDABLE) == 0) {
+                return;
+            }
+            widget.get_style_context().set_state(((flags & Gtk.CellRendererState.EXPANDED) == 0) ? Gtk.StateFlags.NORMAL : Gtk.StateFlags.ACTIVE);
+
+            int x = cell_area.x + offset(cell_area.width, size.width, xalign);
+            int y = cell_area.y + offset(cell_area.height, size.height, yalign);
+            
+            widget.get_style_context().render_expander(context, x, y, size.width, size.height);
+        }
+        
+        private static int offset(int big, int small, float align) {
+            return int.max((int) (align*(big - small)), 0);
+        }
+        
+        public override bool activate(Gdk.Event event, Gtk.Widget widget, string str_path, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gtk.CellRendererState flags) {
+            Gtk.TreePath? path = new Gtk.TreePath.from_string(str_path);
+            
+            if (path == null) {
+                return false;
+            }
+            
+            Sidebar.Tree parent = (Sidebar.Tree) widget;
+            
+            EntryWrapper? wrapper = parent.get_wrapper_at_path(path);
+            if (wrapper == null) {
+                return false;
+            }
+            
+            if (parent.is_expanded_content_parent(path, wrapper)) {
+                if (!parent.ignore_spurious_expander_click) {// listen to SidebarTree::button_press_event
+                    parent.collapse_row(path);
+                }
+            }
+            parent.ignore_spurious_expander_click = false;
+            return false;// allow the event to keep propagating
+        }
+    }
     private class RootWrapper : EntryWrapper {
         public int root_position;
         
@@ -73,10 +132,9 @@ public class Sidebar.Tree : Gtk.TreeView {
     private Gee.HashMap<Sidebar.Branch, int> branches = new Gee.HashMap<Sidebar.Branch, int>();
     private int editing_disabled = 0;
     private bool mask_entry_selected_signal = false;
+    private bool ignore_spurious_expander_click = false;
     private weak EntryWrapper? selected_wrapper = null;
     private Gtk.Menu? default_context_menu = null;
-    private bool expander_called_manually = false;
-    private int expander_special_count = 0;
     private bool is_internal_drag_in_progress = false;
     private Sidebar.Entry? internal_drag_source_entry = null;
     private Gtk.TreeRowReference? old_path_ref = null;
@@ -99,6 +157,10 @@ public class Sidebar.Tree : Gtk.TreeView {
         
         Gtk.TreeViewColumn text_column = new Gtk.TreeViewColumn();
         text_column.set_sizing(Gtk.TreeViewColumnSizing.FIXED);
+        ExpanderRenderer expander_renderer = new ExpanderRenderer();
+        text_column.pack_start(expander_renderer, false);
+        text_column.set_cell_data_func(expander_renderer, expander_renderer_function);
+        
         Gtk.CellRendererPixbuf icon_renderer = new Gtk.CellRendererPixbuf();
         text_column.pack_start(icon_renderer, false);
         text_column.add_attribute(icon_renderer, "pixbuf", Columns.PIXBUF);
@@ -116,7 +178,8 @@ public class Sidebar.Tree : Gtk.TreeView {
         set_enable_search(false);
         set_search_column(-1);
         set_rules_hint(false);
-        set_show_expanders(true);
+        set_show_expanders(false);
+        set_level_indentation(CHILD_HORIZONTAL_OFFSET);
         set_reorderable(false);
         set_enable_tree_lines(false);
         set_grid_lines(Gtk.TreeViewGridLines.NONE);
@@ -126,9 +189,6 @@ public class Sidebar.Tree : Gtk.TreeView {
         selection.set_mode(Gtk.SelectionMode.BROWSE);
         selection.set_select_function(on_selection);
         
-        test_expand_row.connect(on_toggle_row);
-        test_collapse_row.connect(on_toggle_row);
-        
         // It Would Be Nice if the target entries and actions were gleaned by querying each 
         // Sidebar.Entry as it was added, but that's a tad too complicated for our needs
         // currently
@@ -162,7 +222,7 @@ public class Sidebar.Tree : Gtk.TreeView {
         icon_theme.changed.disconnect(on_theme_change);
     }
     
-    public void icon_renderer_function(Gtk.CellLayout layout, Gtk.CellRenderer renderer, Gtk.TreeModel model, Gtk.TreeIter iter) {
+    private void icon_renderer_function(Gtk.CellLayout layout, Gtk.CellRenderer renderer, Gtk.TreeModel model, Gtk.TreeIter iter) {
         EntryWrapper? wrapper = get_wrapper_at_iter(iter);
         if (wrapper == null) {
             return;
@@ -170,6 +230,23 @@ public class Sidebar.Tree : Gtk.TreeView {
         renderer.visible = !(wrapper.entry is Sidebar.Header);
     }
     
+    private void expander_renderer_function(Gtk.CellLayout layout, Gtk.CellRenderer renderer, Gtk.TreeModel model, Gtk.TreeIter iter) {
+        EntryWrapper? wrapper = get_wrapper_at_iter(iter);
+        if (wrapper == null) {
+            return;
+        }
+        renderer.xpad = 1;
+        renderer.xalign = 0.0f;
+        
+        if (wrapper.entry is Sidebar.Header && wrapper.get_path().to_string() != _("Inboxes")) {
+            renderer.ypad = 0;
+            renderer.yalign = HEADER_YALIGN;
+        } else {
+            renderer.ypad = 0;
+            renderer.yalign = 0.5f;
+        }
+    }
+    
     private void on_drag_begin(Gdk.DragContext ctx) {
         is_internal_drag_in_progress = true;
     }
@@ -282,11 +359,20 @@ public class Sidebar.Tree : Gtk.TreeView {
 
     private string get_name_for_entry(Sidebar.Entry entry) {
         string name = Geary.HTML.escape_markup(entry.get_sidebar_name());
+        bool is_first_entry = false;
+        if (name == _("Inboxes")) {
+            is_first_entry = true;
+        }
         
         Sidebar.EmphasizableEntry? emphasizable_entry = entry as Sidebar.EmphasizableEntry;
-        if (emphasizable_entry != null && emphasizable_entry.is_emphasized())
-            name = "<b>%s</b>".printf(name);
+        if (emphasizable_entry != null && emphasizable_entry.is_emphasized()) {
+            name = @"<span size='$(TEXT_HEIGHT * Pango.SCALE)' weight='bold'>$(name)</span>";
+        }
         
+        // Add vertical spacing manually, because CellRendererTexts don't support yalign
+        if (entry is Sidebar.Header && !is_first_entry) {
+            name += @"<span rise='$(HEADER_MARGIN_TOP * Pango.SCALE)'> </span>";
+        }
         return name;
     }
     
@@ -333,7 +419,6 @@ public class Sidebar.Tree : Gtk.TreeView {
     }
     
     public void toggle_branch_expansion(Gtk.TreePath path, bool expand_all) {
-        expander_called_manually = true;
         if (is_row_expanded(path))
             collapse_row(path);
         else
@@ -341,7 +426,6 @@ public class Sidebar.Tree : Gtk.TreeView {
     }
     
     public bool expand_to_entry(Sidebar.Entry entry) {
-        expander_called_manually = true;
         EntryWrapper? wrapper = get_wrapper(entry);
         if (wrapper == null)
             return false;
@@ -352,7 +436,6 @@ public class Sidebar.Tree : Gtk.TreeView {
     }
     
     public void expand_to_first_child(Sidebar.Entry entry) {
-        expander_called_manually = true;
         EntryWrapper? wrapper = get_wrapper(entry);
         if (wrapper == null)
             return;
@@ -900,40 +983,8 @@ public class Sidebar.Tree : Gtk.TreeView {
         return true;
     }
     
-    public bool on_toggle_row(Gtk.TreeIter iter, Gtk.TreePath path) {
-        // Determine whether to allow the row to toggle
-        EntryWrapper? wrapper = get_wrapper_at_iter(iter);
-        if (wrapper == null) {
-            return false; // don't affect things
-        }
-        
-        // Most of the time, only allow manual toggles
-        bool should_allow_toggle = expander_called_manually;
-        
-        // Cancel out the manual flag
-        expander_called_manually = false;
-        
-        // If we are an expanded parent entry with content
-        if (is_row_expanded(path) && store.iter_has_child(iter) && wrapper.entry is Sidebar.SelectableEntry) {
-            // We are taking a special action
-            expander_special_count++;
-            if (expander_special_count == 1) {
-                // Workaround that prevents arrows from double-toggling
-                return true;
-            } else {
-                // Toggle only if non-manual, as opposed to the usual behavior
-                should_allow_toggle = !should_allow_toggle;
-            }
-        } else {
-            // Reset the special behavior count
-            expander_special_count = 0;
-        }
-        
-        if (should_allow_toggle) {
-            return false;
-        }
-        // Prevent branch expansion toggle
-        return true;
+    private bool is_expanded_content_parent(Gtk.TreePath path, EntryWrapper wrapper) {
+        return is_row_expanded(path) && store.iter_has_child(wrapper.get_iter()) && wrapper.entry is Sidebar.SelectableEntry;
     }
     
     public override bool button_press_event(Gdk.EventButton event) {
@@ -958,11 +1009,14 @@ public class Sidebar.Tree : Gtk.TreeView {
                 return base.button_press_event(event);
             }
             
+            ignore_spurious_expander_click = false;
             // Enable single click to toggle tree entries (bug 4985)
             if (wrapper.entry is Sidebar.ExpandableEntry
                 || wrapper.entry is Sidebar.InternalDropTargetEntry) {
-                // all labels are InternalDropTargetEntries
-                toggle_branch_expansion(path, false);
+                if (!is_expanded_content_parent(path, wrapper)) {
+                    ignore_spurious_expander_click = true;// tell ExpanderCellRenderer::activate()
+                    toggle_branch_expansion(path, false);
+                }
             }
             
             // Is this a click on an already-highlighted tree item?
