diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c
index 0bc0577..742c096 100644
--- a/libnautilus-private/nautilus-icon-container.c
+++ b/libnautilus-private/nautilus-icon-container.c
@@ -6429,6 +6429,36 @@ nautilus_icon_container_is_empty (NautilusIconContainer *container)
 	return container->details->icons == NULL;
 }
 
+gboolean
+nautilus_icon_container_selection_is_in_first_column (NautilusIconContainer *container)
+{
+	NautilusIcon *selected_icon, *icon;
+	GList *selection, *first, *l;
+	double minx = 1024;
+
+	selection = nautilus_icon_container_get_selected_icons (container);
+
+	/* The condition is never true if there are no selected items or
+	 * multiple selected items */
+	if (g_list_length (selection) != 1) {
+		g_list_free (selection);
+		return FALSE;
+	}
+
+	first = g_list_first (selection);
+	selected_icon = (NautilusIcon *) first->data;
+
+	/* XXX this is quite slow, isn't there a better way? */
+	for (l = container->details->icons; l != NULL; l = l->next) {
+		icon = (NautilusIcon *) l->data;
+		minx = MIN (minx, icon->x);
+	}
+
+	g_list_free (selection);
+
+	return selected_icon->x == minx;
+}
+
 NautilusIconData *
 nautilus_icon_container_get_first_visible_icon (NautilusIconContainer *container)
 {
diff --git a/libnautilus-private/nautilus-icon-container.h b/libnautilus-private/nautilus-icon-container.h
index 711a591..15c37af 100644
--- a/libnautilus-private/nautilus-icon-container.h
+++ b/libnautilus-private/nautilus-icon-container.h
@@ -256,6 +256,7 @@ void              nautilus_icon_container_reveal                        (Nautilu
 									 NautilusIconData       *data);
 gboolean          nautilus_icon_container_is_empty                      (NautilusIconContainer  *container);
 NautilusIconData *nautilus_icon_container_get_first_visible_icon        (NautilusIconContainer  *container);
+gboolean          nautilus_icon_container_selection_is_in_first_column  (NautilusIconContainer *container);
 void              nautilus_icon_container_scroll_to_icon                (NautilusIconContainer  *container,
 									 NautilusIconData       *data);
 
diff --git a/src/nautilus-actions.h b/src/nautilus-actions.h
index 74c130f..0d0fb52 100644
--- a/src/nautilus-actions.h
+++ b/src/nautilus-actions.h
@@ -35,6 +35,8 @@
 #define NAUTILUS_ACTION_FORWARD "Forward"
 #define NAUTILUS_ACTION_SHOW_HIDE_TOOLBAR "Show Hide Toolbar"
 #define NAUTILUS_ACTION_SHOW_HIDE_SIDEBAR "Show Hide Sidebar"
+#define NAUTILUS_ACTION_SHOW_PLACES_SIDEBAR "Show Places Sidebar"
+#define NAUTILUS_ACTION_SHOW_TREE_SIDEBAR "Show Tree Sidebar"
 #define NAUTILUS_ACTION_SHOW_HIDE_STATUSBAR "Show Hide Statusbar"
 #define NAUTILUS_ACTION_SHOW_HIDE_LOCATION_BAR "Show Hide Location Bar"
 #define NAUTILUS_ACTION_SHOW_HIDE_EXTRA_PANE "Show Hide Extra Pane"
diff --git a/src/nautilus-icon-view.c b/src/nautilus-icon-view.c
index 254166c..4ec26a3 100644
--- a/src/nautilus-icon-view.c
+++ b/src/nautilus-icon-view.c
@@ -66,6 +66,7 @@
 #include <unistd.h>
 
 #include "nautilus-audio-mime-types.h"
+#include "nautilus-navigation-window.h"
 
 #define POPUP_PATH_ICON_APPEARANCE		"/selection/Icon Appearance Items"
 
@@ -2628,6 +2629,26 @@ nautilus_icon_view_update_click_mode (NautilusIconView *icon_view)
 }
 
 static gboolean
+key_press_event_cb (GtkWidget *widget, GdkEventKey *event, NautilusIconView *icon_view)
+{
+	NautilusIconContainer *container;
+	NautilusWindow *window;
+
+	if (event->keyval == GDK_KEY_Left) {
+		window = nautilus_view_get_nautilus_window (NAUTILUS_VIEW (icon_view));
+		if (nautilus_window_get_window_type (window) == NAUTILUS_WINDOW_NAVIGATION) {
+			container = get_icon_container (icon_view);
+			if (nautilus_icon_container_selection_is_in_first_column (container)) {
+				nautilus_navigation_window_set_focus_on_sidebar (NAUTILUS_NAVIGATION_WINDOW (window));
+				return TRUE;
+			}
+		}
+	}
+
+	return FALSE;
+}
+
+static gboolean
 get_stored_layout_timestamp (NautilusIconContainer *container,
 			     NautilusIconData *icon_data,
 			     time_t *timestamp,
@@ -2751,6 +2772,9 @@ create_icon_container (NautilusIconView *icon_view)
 				 G_CALLBACK (nautilus_view_update_menus), icon_view,
 				 G_CONNECT_SWAPPED);
 
+	g_signal_connect_object (icon_container, "key_press_event",
+				 G_CALLBACK (key_press_event_cb), icon_view, 0);
+
 	g_signal_connect_object (icon_container, "get_stored_layout_timestamp",
 				 G_CALLBACK (get_stored_layout_timestamp), icon_view, 0);
 	g_signal_connect_object (icon_container, "store_layout_timestamp",
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 568db6f..6e91ee2 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -32,6 +32,7 @@
 #include "nautilus-error-reporting.h"
 #include "nautilus-view-dnd.h"
 #include "nautilus-view-factory.h"
+#include "nautilus-navigation-window.h"
 
 #include <string.h>
 #include <eel/eel-vfs-extensions.h>
@@ -982,6 +983,7 @@ key_press_callback (GtkWidget *widget, GdkEventKey *event, gpointer callback_dat
 	gboolean handled;
 	GtkTreeView *tree_view;
 	GtkTreePath *path;
+	guint depth;
 
 	tree_view = GTK_TREE_VIEW (widget);
 
@@ -1009,12 +1011,19 @@ key_press_callback (GtkWidget *widget, GdkEventKey *event, gpointer callback_dat
 			if (!gtk_tree_view_collapse_row (tree_view, path)) {
 				/* if the row is already collapsed or doesn't have any children,
 				 * jump to the parent row instead.
+				 * If there's no parent, jump to the sidebar, if any.
 				 */
-				if ((gtk_tree_path_get_depth (path) > 1) && gtk_tree_path_up (path)) {
+				depth = gtk_tree_path_get_depth (path);
+				if (depth == 1) {
+					NautilusWindow *window;
+					window = nautilus_view_get_nautilus_window (NAUTILUS_VIEW (view));
+					if (nautilus_window_get_window_type (window) == NAUTILUS_WINDOW_NAVIGATION) {
+						nautilus_navigation_window_set_focus_on_sidebar (NAUTILUS_NAVIGATION_WINDOW (window));
+					}
+				} else if (depth > 1 && gtk_tree_path_up (path)) {
 					gtk_tree_view_set_cursor (tree_view, path, NULL, FALSE);
 				}
 			}
-
 			gtk_tree_path_free (path);
 		}
 		handled = TRUE;
diff --git a/src/nautilus-navigation-window-menus.c b/src/nautilus-navigation-window-menus.c
index 20051da..7578a1d 100644
--- a/src/nautilus-navigation-window-menus.c
+++ b/src/nautilus-navigation-window-menus.c
@@ -900,10 +900,10 @@ static const GtkToggleActionEntry navigation_toggle_entries[] = {
 
 static const GtkRadioActionEntry navigation_radio_entries[] = {
 	{ "Sidebar Places", NULL,
-	  N_("Places"), NULL, N_("Select Places as the default sidebar"),
+	  N_("Places"), "<shift><control>1", N_("Select Places as the default sidebar"),
 	  SIDEBAR_PLACES },
 	{ "Sidebar Tree", NULL,
-	  N_("Tree"), NULL, N_("Select Tree as the default sidebar"),
+	  N_("Tree"), "<shift><control>2", N_("Select Tree as the default sidebar"),
 	  SIDEBAR_TREE }
 };
 
diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c
index f3119d2..c5ba2bb 100644
--- a/src/nautilus-navigation-window.c
+++ b/src/nautilus-navigation-window.c
@@ -1129,3 +1129,32 @@ nautilus_navigation_window_split_view_showing (NautilusNavigationWindow *window)
 {
 	return g_list_length (NAUTILUS_WINDOW (window)->details->panes) > 1;
 }
+
+void
+nautilus_navigation_window_set_focus_on_sidebar (NautilusNavigationWindow *window)
+{
+	GtkContainer *container;
+	GList *children, *first;
+	GtkWidget *sidebar;
+
+	g_assert (NAUTILUS_IS_NAVIGATION_WINDOW (window));
+
+	/* only move the focus to the sidebar when it is shown */
+	if (nautilus_navigation_window_sidebar_showing (window)) {
+
+		container = GTK_CONTAINER (window->details->sidebar);
+		children = gtk_container_get_children (container);
+
+		first = g_list_first (children);
+
+		sidebar = GTK_WIDGET (first->data);
+		if (NAUTILUS_IS_PLACES_SIDEBAR (sidebar)) {
+			nautilus_places_sidebar_grab_focus (sidebar);
+		} else if (FM_IS_TREE_VIEW (sidebar)) {
+			fm_tree_view_grab_focus (FM_TREE_VIEW (sidebar));
+		}
+
+		g_list_free (children);
+	}
+}
+
diff --git a/src/nautilus-navigation-window.h b/src/nautilus-navigation-window.h
index c3a0c90..6fd250c 100644
--- a/src/nautilus-navigation-window.h
+++ b/src/nautilus-navigation-window.h
@@ -97,6 +97,7 @@ void     nautilus_navigation_window_restore_focus_widget (NautilusNavigationWind
 void     nautilus_navigation_window_split_view_on        (NautilusNavigationWindow *window);
 void     nautilus_navigation_window_split_view_off       (NautilusNavigationWindow *window);
 gboolean nautilus_navigation_window_split_view_showing   (NautilusNavigationWindow *window);
+void     nautilus_navigation_window_set_focus_on_sidebar (NautilusNavigationWindow *window);
 
 gboolean nautilus_navigation_window_is_in_temporary_navigation_bar (GtkWidget *widget,
 				NautilusNavigationWindow *window);
diff --git a/src/nautilus-places-sidebar.c b/src/nautilus-places-sidebar.c
index 828b9d0..d6b9c04 100644
--- a/src/nautilus-places-sidebar.c
+++ b/src/nautilus-places-sidebar.c
@@ -51,6 +51,7 @@
 #include "nautilus-places-sidebar.h"
 #include "nautilus-window.h"
 #include "nautilus-window-slot.h"
+#include "nautilus-view.h"
 
 #define DEBUG_FLAG NAUTILUS_DEBUG_PLACES
 #include <libnautilus-private/nautilus-debug.h>
@@ -2400,6 +2401,16 @@ empty_trash_cb (GtkMenuItem           *item,
 	nautilus_file_operations_empty_trash (GTK_WIDGET (sidebar->window));
 }
 
+static void
+move_focus_to_active_slot (NautilusPlacesSidebar *sidebar)
+{
+	NautilusWindowSlot *slot;
+
+	slot = nautilus_window_get_active_slot (sidebar->window);
+
+	nautilus_view_grab_focus (slot->content_view);
+}
+
 /* Handler for GtkWidget::key-press-event on the shortcuts list */
 static gboolean
 bookmarks_key_press_event_cb (GtkWidget             *widget,
@@ -2439,6 +2450,13 @@ bookmarks_key_press_event_cb (GtkWidget             *widget,
       return eject_or_unmount_selection (sidebar);
   }
 
+  if ((event->keyval == GDK_KEY_Right ||
+       event->keyval == GDK_KEY_KP_Right) &&
+      (event->state & modifiers) == 0) {
+      move_focus_to_active_slot (sidebar);
+      return TRUE;
+  }
+
   if ((event->keyval == GDK_KEY_Delete
       || event->keyval == GDK_KEY_KP_Delete)
       && (event->state & modifiers) == 0) {
@@ -2922,6 +2940,18 @@ heading_cell_renderer_func (GtkTreeViewColumn *column,
 	}
 }
 
+void
+nautilus_places_sidebar_grab_focus (GtkWidget *widget)
+{
+	NautilusPlacesSidebar *sidebar;
+
+	sidebar = NAUTILUS_PLACES_SIDEBAR (widget);
+
+	if (sidebar != NULL && sidebar->tree_view != NULL) {
+		gtk_widget_grab_focus (GTK_WIDGET (sidebar->tree_view));
+	}
+}
+
 static void
 nautilus_places_sidebar_init (NautilusPlacesSidebar *sidebar)
 {
diff --git a/src/nautilus-places-sidebar.h b/src/nautilus-places-sidebar.h
index 470b825..d832da8 100644
--- a/src/nautilus-places-sidebar.h
+++ b/src/nautilus-places-sidebar.h
@@ -46,5 +46,6 @@
 GType nautilus_places_sidebar_get_type (void);
 GtkWidget * nautilus_places_sidebar_new (NautilusWindow *window);
 
+void nautilus_places_sidebar_grab_focus (GtkWidget *sidebar);
 
 #endif
diff --git a/src/nautilus-tree-sidebar.c b/src/nautilus-tree-sidebar.c
index 987f416..9cc8d4f 100644
--- a/src/nautilus-tree-sidebar.c
+++ b/src/nautilus-tree-sidebar.c
@@ -672,6 +672,28 @@ is_parent_writable (NautilusFile *file)
 }
 
 static gboolean
+key_pressed_callback (GtkTreeView *treeview,
+		      GdkEventKey *event,
+		      FMTreeView *view)
+{
+	NautilusWindowSlot *slot;
+	guint modifiers;
+
+	modifiers = gtk_accelerator_get_default_mod_mask ();
+
+	if ((event->keyval == GDK_KEY_Right ||
+	     event->keyval == GDK_KEY_KP_Right) &&
+	    (event->state & modifiers) == 0) {
+		/* XXX check some condition on view->details->tree_view */
+		slot = nautilus_window_get_active_slot (view->details->window);
+		nautilus_view_grab_focus (slot->content_view);
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+static gboolean
 button_pressed_callback (GtkTreeView *treeview, GdkEventButton *event,
 			 FMTreeView *view)
 {
@@ -1389,6 +1411,11 @@ create_tree (FMTreeView *view)
 			  "button_press_event", G_CALLBACK (button_pressed_callback),
 			  view);
 
+	g_signal_connect (G_OBJECT (view->details->tree_widget),
+			  "key_press_event",
+			  G_CALLBACK (key_pressed_callback),
+			  view);
+
 	slot = nautilus_window_get_active_slot (view->details->window);
 	location = nautilus_window_slot_get_current_uri (slot);
 	schedule_select_and_show_location (view, location);
@@ -1453,6 +1480,14 @@ loading_uri_callback (NautilusWindow *window,
 	schedule_select_and_show_location (view, location);
 }
 
+void
+fm_tree_view_grab_focus (FMTreeView *view)
+{
+	if (view != NULL && view->details->tree_widget != NULL) {
+		gtk_widget_grab_focus (GTK_WIDGET (view->details->tree_widget));
+	}
+}
+
 static void
 fm_tree_view_init (FMTreeView *view)
 {
diff --git a/src/nautilus-tree-sidebar.h b/src/nautilus-tree-sidebar.h
index 7d57350..1d43fec 100644
--- a/src/nautilus-tree-sidebar.h
+++ b/src/nautilus-tree-sidebar.h
@@ -62,5 +62,6 @@ typedef struct {
 GType fm_tree_view_get_type (void);
 
 GtkWidget *nautilus_tree_sidebar_new (NautilusWindow *window);
+void       fm_tree_view_grab_focus (FMTreeView *view);
 
 #endif /* FM_TREE_VIEW_H */
