diff --git a/nautilus-desktop/nautilus-desktop-window-slot.c b/nautilus-desktop/nautilus-desktop-window-slot.c
index d1c05e7..be834c2 100644
--- a/nautilus-desktop/nautilus-desktop-window-slot.c
+++ b/nautilus-desktop/nautilus-desktop-window-slot.c
@@ -64,4 +64,6 @@ nautilus_desktop_window_slot_init (NautilusDesktopWindowSlot *self)
   /* Disable the ability to change between types of views */
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "files-view-mode");
   g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
+  action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "files-view-mode-toggle");
+  g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
 }
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c
index e41c55a..e32e0fd 100644
--- a/src/nautilus-canvas-view.c
+++ b/src/nautilus-canvas-view.c
@@ -852,6 +852,18 @@ nautilus_canvas_view_can_zoom_out (NautilusFilesView *view)
 		> NAUTILUS_CANVAS_ZOOM_LEVEL_SMALL;
 }
 
+static gfloat
+nautilus_canvas_view_get_zoom_level_percentage (NautilusFilesView *view)
+{
+        guint icon_size;
+        NautilusCanvasZoomLevel zoom_level;
+
+        zoom_level = nautilus_canvas_view_get_zoom_level (view);
+        icon_size = nautilus_canvas_container_get_icon_size_for_zoom_level (zoom_level);
+
+        return (gfloat) icon_size / NAUTILUS_CANVAS_ICON_SIZE_STANDARD;
+}
+
 static gboolean
 nautilus_canvas_view_is_empty (NautilusFilesView *view)
 {
@@ -1895,6 +1907,7 @@ nautilus_canvas_view_class_init (NautilusCanvasViewClass *klass)
 	nautilus_files_view_class->bump_zoom_level = nautilus_canvas_view_bump_zoom_level;
 	nautilus_files_view_class->can_zoom_in = nautilus_canvas_view_can_zoom_in;
 	nautilus_files_view_class->can_zoom_out = nautilus_canvas_view_can_zoom_out;
+	nautilus_files_view_class->get_zoom_level_percentage = nautilus_canvas_view_get_zoom_level_percentage;
 	nautilus_files_view_class->clear = nautilus_canvas_view_clear;
 	nautilus_files_view_class->end_loading = nautilus_canvas_view_end_loading;
 	nautilus_files_view_class->file_changed = nautilus_canvas_view_file_changed;
diff --git a/src/nautilus-empty-view.c b/src/nautilus-empty-view.c
index b8518ab..8745e78 100644
--- a/src/nautilus-empty-view.c
+++ b/src/nautilus-empty-view.c
@@ -167,6 +167,12 @@ nautilus_empty_view_can_zoom_out (NautilusFilesView *view)
 	return FALSE;
 }
 
+static gfloat
+nautilus_empty_view_get_zoom_level_percentage (NautilusFilesView *view)
+{
+        return 1.0;
+}
+
 static void
 nautilus_empty_view_click_policy_changed (NautilusFilesView *directory_view)
 {
@@ -242,6 +248,7 @@ nautilus_empty_view_class_init (NautilusEmptyViewClass *class)
 	nautilus_files_view_class->bump_zoom_level = nautilus_empty_view_bump_zoom_level;
 	nautilus_files_view_class->can_zoom_in = nautilus_empty_view_can_zoom_in;
 	nautilus_files_view_class->can_zoom_out = nautilus_empty_view_can_zoom_out;
+	nautilus_files_view_class->get_zoom_level_percentage = nautilus_empty_view_get_zoom_level_percentage;
         nautilus_files_view_class->click_policy_changed = nautilus_empty_view_click_policy_changed;
 	nautilus_files_view_class->clear = nautilus_empty_view_clear;
 	nautilus_files_view_class->file_changed = nautilus_empty_view_file_changed;
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index 9452cda..7831bce 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -29,6 +29,7 @@
 
 #include "nautilus-application.h"
 #include "nautilus-error-reporting.h"
+#include "nautilus-file-undo-manager.h"
 #include "nautilus-floating-bar.h"
 #include "nautilus-list-view.h"
 #include "nautilus-canvas-view.h"
@@ -261,15 +262,17 @@ struct NautilusFilesViewDetails
 
         /* View menu */
         GtkWidget *view_menu_widget;
-        GtkWidget *view_icon;
         GtkWidget *sort_menu;
         GtkWidget *sort_trash_time;
         GtkWidget *sort_search_relevance;
         GtkWidget *visible_columns;
         GtkWidget *stop;
         GtkWidget *reload;
-        GtkAdjustment *zoom_adjustment;
-        GtkWidget *zoom_level_scale;
+        GtkBox *zoom_controls_box;
+        GtkLabel *zoom_level_label;
+
+        GtkModelButton *undo_button;
+        GtkModelButton *redo_button;
 
         gulong stop_signal_handler;
         gulong reload_signal_handler;
@@ -777,6 +780,14 @@ nautilus_files_view_restore_default_zoom_level (NautilusFilesView *view)
         NAUTILUS_FILES_VIEW_CLASS (G_OBJECT_GET_CLASS (view))->restore_default_zoom_level (view);
 }
 
+static gfloat
+nautilus_files_view_get_zoom_level_percentage (NautilusFilesView *view)
+{
+        g_return_val_if_fail (NAUTILUS_IS_FILES_VIEW (view), 1);
+
+        return NAUTILUS_FILES_VIEW_CLASS (G_OBJECT_GET_CLASS (view))->get_zoom_level_percentage (view);
+}
+
 gboolean
 nautilus_files_view_is_searching (NautilusView *view)
 {
@@ -1545,15 +1556,6 @@ action_select_pattern (GSimpleAction *action,
         select_pattern(user_data);
 }
 
-static void
-zoom_level_changed (GtkRange          *range,
-                    NautilusFilesView *view)
-{
-        g_action_group_change_action_state (view->details->view_action_group,
-                                            "zoom-to-level",
-                                            g_variant_new_int32 (gtk_range_get_value (range)));
-}
-
 typedef struct {
         NautilusFilesView *directory_view;
         GHashTable *added_locations;
@@ -6797,6 +6799,7 @@ nautilus_files_view_reset_view_menu (NautilusFilesView *view)
         GVariantIter iter;
         gboolean show_sort_trash, show_sort_search, show_sort_access, show_sort_modification, sort_available;
         const gchar *hint;
+        gchar *zoom_level_percent;
 
         view_action_group = nautilus_files_view_get_action_group (view);
 
@@ -6812,9 +6815,10 @@ nautilus_files_view_reset_view_menu (NautilusFilesView *view)
          */
         gtk_widget_set_sensitive (view->details->sort_menu,
                                   !nautilus_files_view_is_empty (view));
-        gtk_widget_set_sensitive (view->details->zoom_level_scale,
+        gtk_widget_set_sensitive (GTK_WIDGET (view->details->zoom_controls_box),
                                   !nautilus_files_view_is_empty (view));
 
+
         if (sort_available) {
                 variant = g_action_group_get_action_state_hint (view_action_group, "sort");
                 g_variant_iter_init (&iter, variant);
@@ -6832,10 +6836,9 @@ nautilus_files_view_reset_view_menu (NautilusFilesView *view)
         gtk_widget_set_visible (view->details->sort_trash_time, show_sort_trash);
         gtk_widget_set_visible (view->details->sort_search_relevance, show_sort_search);
 
-        variant = g_action_group_get_action_state (view_action_group, "zoom-to-level");
-        gtk_adjustment_set_value (view->details->zoom_adjustment,
-                                  g_variant_get_int32 (variant));
-        g_variant_unref (variant);
+        zoom_level_percent = g_strdup_printf ("%.0f%%", nautilus_files_view_get_zoom_level_percentage (view) * 100.0);
+        gtk_label_set_label (view->details->zoom_level_label, zoom_level_percent);
+        g_free (zoom_level_percent);
 }
 
 /* Convenience function to reset the menus owned by the view but managed on
@@ -7891,6 +7894,82 @@ nautilus_files_view_is_loading (NautilusView *view)
 }
 
 static void
+set_string_property (GObject *object,
+                     char    *prop_name,
+                     char    *value)
+{
+        GValue val = G_VALUE_INIT;
+        g_value_init (&val, G_TYPE_STRING);
+        g_value_set_string (&val, value);
+        g_object_set_property (object, prop_name, &val);
+        g_value_unset (&val);
+}
+
+static void
+update_undo_redo_labels (NautilusFilesView *view,
+                         gchar             *undo_label,
+                         gchar             *redo_label)
+{
+        set_string_property (G_OBJECT (view->details->undo_button), "text", undo_label);
+        set_string_property (G_OBJECT (view->details->redo_button), "text", redo_label);
+}
+
+static void
+undo_manager_changed (NautilusFilesView *view)
+{
+        NautilusWindow *window;
+        NautilusFileUndoInfo *info;
+        NautilusFileUndoManagerState undo_state;
+        gboolean undo_active, redo_active;
+        gchar *undo_label, *undo_description, *redo_label, *redo_description;
+        gboolean is_undo;
+        GAction *action;
+
+        window = nautilus_files_view_get_window (view);
+        undo_label = undo_description = redo_label = redo_description = NULL;
+
+        info = nautilus_file_undo_manager_get_action ();
+        undo_state = nautilus_file_undo_manager_get_state ();
+        undo_active = redo_active = FALSE;
+        if (info != NULL &&
+            (undo_state > NAUTILUS_FILE_UNDO_MANAGER_STATE_NONE)) {
+                is_undo = (undo_state == NAUTILUS_FILE_UNDO_MANAGER_STATE_UNDO);
+                undo_active = is_undo;
+                redo_active = !is_undo;
+                nautilus_file_undo_info_get_strings (info,
+                                                     &undo_label, &undo_description,
+                                                     &redo_label, &redo_description);
+        }
+
+        action = g_action_map_lookup_action (G_ACTION_MAP (window), "undo");
+        g_simple_action_set_enabled (G_SIMPLE_ACTION (action), undo_active);
+        action = g_action_map_lookup_action (G_ACTION_MAP (window), "redo");
+        g_simple_action_set_enabled (G_SIMPLE_ACTION (action), redo_active);
+
+        undo_label = undo_active ? undo_label : g_strdup (_("Undo"));
+        redo_label = redo_active ? redo_label : g_strdup (_("Redo"));
+        undo_label = undo_label == NULL ? g_strdup (_("Undo")) : undo_label;
+        redo_label = redo_label == NULL ? g_strdup (_("Redo")) : redo_label;
+        update_undo_redo_labels (view, undo_label, redo_label);
+
+        g_free (undo_label);
+        g_free (undo_description);
+        g_free (redo_label);
+        g_free (redo_description);
+}
+
+static void
+nautilus_files_view_constructed (GObject *object)
+{
+        NautilusFilesView *view;
+
+        view = NAUTILUS_FILES_VIEW (object);
+        g_signal_connect_object (nautilus_file_undo_manager_get (), "undo-changed",
+                                 G_CALLBACK (undo_manager_changed), view, G_CONNECT_SWAPPED);
+        undo_manager_changed (view);
+}
+
+static void
 nautilus_files_view_iface_init (NautilusViewInterface *iface)
 {
         iface->get_icon = nautilus_files_view_get_icon;
@@ -7905,7 +7984,6 @@ nautilus_files_view_iface_init (NautilusViewInterface *iface)
         iface->is_loading = nautilus_files_view_is_loading;
 }
 
-
 static void
 nautilus_files_view_class_init (NautilusFilesViewClass *klass)
 {
@@ -7916,6 +7994,7 @@ nautilus_files_view_class_init (NautilusFilesViewClass *klass)
         oclass = G_OBJECT_CLASS (klass);
 
         oclass->finalize = nautilus_files_view_finalize;
+        oclass->constructed = nautilus_files_view_constructed;
         oclass->get_property = nautilus_files_view_get_property;
         oclass->set_property = nautilus_files_view_set_property;
 
@@ -8064,8 +8143,8 @@ nautilus_files_view_init (NautilusFilesView *view)
         /* View menu */
         builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-toolbar-view-menu.ui");
         view->details->view_menu_widget =  g_object_ref_sink (gtk_builder_get_object (builder, "view_menu_widget"));
-        view->details->zoom_level_scale = GTK_WIDGET (gtk_builder_get_object (builder, "zoom_level_scale"));
-        view->details->zoom_adjustment = GTK_ADJUSTMENT (gtk_builder_get_object (builder, "zoom_adjustment"));
+        view->details->zoom_controls_box = GTK_BOX (gtk_builder_get_object (builder, "zoom_controls_box"));
+        view->details->zoom_level_label = GTK_LABEL (gtk_builder_get_object (builder, "zoom_level_label"));
 
         view->details->sort_menu =  GTK_WIDGET (gtk_builder_get_object (builder, "sort_menu"));
         view->details->sort_trash_time =  GTK_WIDGET (gtk_builder_get_object (builder, "sort_trash_time"));
@@ -8074,8 +8153,8 @@ nautilus_files_view_init (NautilusFilesView *view)
         view->details->reload =  GTK_WIDGET (gtk_builder_get_object (builder, "reload"));
         view->details->stop =  GTK_WIDGET (gtk_builder_get_object (builder, "stop"));
 
-        g_signal_connect (view->details->zoom_level_scale, "value-changed",
-                          G_CALLBACK (zoom_level_changed), view);
+        view->details->undo_button = GTK_MODEL_BUTTON (gtk_builder_get_object (builder, "undo"));
+        view->details->redo_button = GTK_MODEL_BUTTON (gtk_builder_get_object (builder, "redo"));
 
         g_signal_connect (view,
                           "end-file-changes",
diff --git a/src/nautilus-files-view.h b/src/nautilus-files-view.h
index 9b5a28b..a6fcf75 100644
--- a/src/nautilus-files-view.h
+++ b/src/nautilus-files-view.h
@@ -191,6 +191,9 @@ struct NautilusFilesViewClass {
          * return whether the view is at minimum size (furthest-out zoom level) */
         gboolean (* can_zoom_out)            (NautilusFilesView *view);
 
+        /* The current zoom level as a percentage of the default (0, 1] */
+        gfloat   (*get_zoom_level_percentage)  (NautilusFilesView *view);
+
         /* reveal_selection is a function pointer that subclasses may
          * override to make sure the selected items are sufficiently
          * apparent to the user (e.g., scrolled into view). By default,
diff --git a/src/nautilus-icon-info.h b/src/nautilus-icon-info.h
index 03998d4..f034ba8 100644
--- a/src/nautilus-icon-info.h
+++ b/src/nautilus-icon-info.h
@@ -82,10 +82,6 @@ const char *          nautilus_icon_info_get_used_name                (NautilusI
 
 void                  nautilus_icon_info_clear_caches                 (void);
 
-/* Relationship between zoom levels and icons sizes. */
-guint nautilus_get_list_icon_size_for_zoom_level          (NautilusListZoomLevel  zoom_level);
-guint nautilus_get_canvas_icon_size_for_zoom_level          (NautilusCanvasZoomLevel  zoom_level);
-
 gint  nautilus_get_icon_size_for_stock_size          (GtkIconSize        size);
 
 G_END_DECLS
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index f23f4ce..4cb4da4 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -2777,6 +2777,20 @@ nautilus_list_view_can_zoom_out (NautilusFilesView *view)
 	return NAUTILUS_LIST_VIEW (view)->details->zoom_level > NAUTILUS_LIST_ZOOM_LEVEL_SMALL;
 }
 
+static gfloat
+nautilus_list_view_get_zoom_level_percentage (NautilusFilesView *view)
+{
+        NautilusListView *list_view;
+        guint icon_size;
+
+        g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), 1.0);
+
+        list_view = NAUTILUS_LIST_VIEW (view);
+        icon_size = nautilus_list_model_get_icon_size_for_zoom_level (list_view->details->zoom_level);
+
+        return (gfloat) icon_size / NAUTILUS_LIST_ICON_SIZE_STANDARD;
+}
+
 static void
 nautilus_list_view_click_policy_changed (NautilusFilesView *directory_view)
 {
@@ -3126,6 +3140,7 @@ nautilus_list_view_class_init (NautilusListViewClass *class)
 	nautilus_files_view_class->bump_zoom_level = nautilus_list_view_bump_zoom_level;
 	nautilus_files_view_class->can_zoom_in = nautilus_list_view_can_zoom_in;
 	nautilus_files_view_class->can_zoom_out = nautilus_list_view_can_zoom_out;
+	nautilus_files_view_class->get_zoom_level_percentage = nautilus_list_view_get_zoom_level_percentage;
         nautilus_files_view_class->click_policy_changed = nautilus_list_view_click_policy_changed;
 	nautilus_files_view_class->clear = nautilus_list_view_clear;
 	nautilus_files_view_class->file_changed = nautilus_list_view_file_changed;
diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c
index 02e204b..5bbb27b 100644
--- a/src/nautilus-toolbar.c
+++ b/src/nautilus-toolbar.c
@@ -66,14 +66,13 @@ struct _NautilusToolbarPrivate {
 
 	GtkWidget *operations_button;
 	GtkWidget *view_button;
-	GtkWidget *action_button;
+	GtkWidget *view_toggle_button;
 
         GtkWidget *operations_popover;
         GtkWidget *operations_container;
         GtkWidget *operations_revealer;
         GtkWidget *operations_icon;
-	GtkWidget *view_icon;
-	GMenu *action_menu;
+	GtkWidget *view_toggle_icon;
 
 	GtkWidget *forward_button;
 	GtkWidget *back_button;
@@ -754,8 +753,6 @@ on_progress_has_viewers_changed (NautilusProgressInfoManager *manager,
 static void
 nautilus_toolbar_init (NautilusToolbar *self)
 {
-	GtkBuilder *builder;
-
 	self->priv = nautilus_toolbar_get_instance_private (self);
 	gtk_widget_init_template (GTK_WIDGET (self));
 
@@ -767,12 +764,6 @@ nautilus_toolbar_init (NautilusToolbar *self)
 	gtk_container_add (GTK_CONTAINER (self->priv->location_entry_container),
 					  self->priv->location_entry);
 
-	builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-toolbar-action-menu.ui");
-	self->priv->action_menu = G_MENU (gtk_builder_get_object (builder, "action-menu"));
-	gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (self->priv->action_button),
-					G_MENU_MODEL (self->priv->action_menu));
-	g_object_unref (builder);
-
         self->priv->progress_manager = nautilus_progress_info_manager_dup_singleton ();
 	g_signal_connect (self->priv->progress_manager, "new-progress-info",
 			  G_CALLBACK (on_new_progress_info), self);
@@ -897,8 +888,8 @@ nautilus_toolbar_class_init (NautilusToolbarClass *klass)
 	gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, operations_container);
 	gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, operations_revealer);
 	gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, view_button);
-        gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, view_icon);
-	gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, action_button);
+	gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, view_toggle_icon);
+	gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, view_toggle_button);
 	gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, path_bar_container);
 	gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, location_entry_container);
 	gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, back_button);
@@ -918,12 +909,6 @@ nautilus_toolbar_new ()
 			     NULL);
 }
 
-GMenu *
-nautilus_toolbar_get_action_menu (NautilusToolbar *self)
-{
-	return self->priv->action_menu;
-}
-
 GtkWidget *
 nautilus_toolbar_get_path_bar (NautilusToolbar *self)
 {
@@ -949,10 +934,10 @@ nautilus_toolbar_set_show_location_entry (NautilusToolbar *self,
 }
 
 static gboolean
-nautilus_toolbar_view_icon_transform_to (GBinding     *binding,
-                                         const GValue *from_value,
-                                         GValue       *to_value,
-                                         gpointer      user_data)
+nautilus_toolbar_view_toggle_icon_transform_to (GBinding     *binding,
+                                                const GValue *from_value,
+                                                GValue       *to_value,
+                                                gpointer      user_data)
 {
         GIcon *icon;
 
@@ -979,11 +964,17 @@ nautilus_toolbar_view_widget_transform_to (GBinding     *binding,
         toolbar = NAUTILUS_TOOLBAR (user_data);
         view_widget = g_value_get_object (from_value);
 
-        gtk_widget_set_sensitive (toolbar->priv->view_button, view_widget != NULL);
         gtk_menu_button_set_popover (GTK_MENU_BUTTON (toolbar->priv->view_button), NULL);
 
         g_value_set_object (to_value, view_widget);
 
+        /* Make the sensitivity change after the popover has been set, so that the sensitivity
+         * propagates to the popover. Otherwise the popover will remain greyed out after
+         * switching to a previous tab
+         */
+        gtk_widget_set_sensitive (toolbar->priv->view_button, view_widget != NULL);
+        gtk_widget_set_sensitive (toolbar->priv->view_toggle_button, view_widget != NULL);
+
         return TRUE;
 }
 
@@ -1002,9 +993,9 @@ nautilus_toolbar_set_active_slot (NautilusToolbar    *toolbar,
                 if (slot) {
                         toolbar->priv->icon_binding =
                                         g_object_bind_property_full (slot, "icon",
-                                                                     toolbar->priv->view_icon, "gicon",
+                                                                     toolbar->priv->view_toggle_icon, "gicon",
                                                                      G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE,
-                                                                     (GBindingTransformFunc) nautilus_toolbar_view_icon_transform_to,
+                                                                     (GBindingTransformFunc) nautilus_toolbar_view_toggle_icon_transform_to,
                                                                      NULL,
                                                                      toolbar,
                                                                      NULL);
diff --git a/src/nautilus-toolbar.h b/src/nautilus-toolbar.h
index 573c7c2..41ec2ae 100644
--- a/src/nautilus-toolbar.h
+++ b/src/nautilus-toolbar.h
@@ -66,7 +66,6 @@ GtkWidget *nautilus_toolbar_new (void);
 
 GtkWidget *nautilus_toolbar_get_path_bar (NautilusToolbar *self);
 GtkWidget *nautilus_toolbar_get_location_entry (NautilusToolbar *self);
-GMenu     *nautilus_toolbar_get_action_menu (NautilusToolbar *self);
 
 void nautilus_toolbar_set_show_location_entry (NautilusToolbar *self,
 					       gboolean show_location_entry);
diff --git a/src/nautilus-ui-utilities.c b/src/nautilus-ui-utilities.c
index c0eaab4..bf1b384 100644
--- a/src/nautilus-ui-utilities.c
+++ b/src/nautilus-ui-utilities.c
@@ -145,29 +145,6 @@ nautilus_gmenu_add_item_in_submodel (GMenu       *menu,
 }
 
 void
-nautilus_gmenu_replace_section (GMenu       *menu,
-				const gchar *section_id,
-				GMenuModel  *section)
-{
-	GMenuModel *orig_section;
-	GMenuItem *item;
-	gint idx;
-
-	orig_section = find_gmenu_model (G_MENU_MODEL (menu), section_id);
-	g_return_if_fail (orig_section != NULL);
-
-	g_menu_remove_all (G_MENU (orig_section));
-
-	for (idx = 0; idx < g_menu_model_get_n_items (section); idx++) {
-		item = g_menu_item_new_from_model (section, idx);
-		g_menu_append_item (G_MENU (orig_section), item);
-		g_object_unref (item);
-	}
-
-	g_object_unref (orig_section);
-}
-
-void
 nautilus_pop_up_context_menu (GtkWidget      *parent,
 			      GMenu          *menu,
 			      GdkEventButton *event)
diff --git a/src/nautilus-ui-utilities.h b/src/nautilus-ui-utilities.h
index 46e8203..c214b80 100644
--- a/src/nautilus-ui-utilities.h
+++ b/src/nautilus-ui-utilities.h
@@ -34,9 +34,6 @@ void nautilus_gmenu_merge                          (GMenu             *original,
 						    GMenu             *gmenu_to_merge,
 						    const gchar       *submodel_name,
 						    gboolean           prepend);
-void nautilus_gmenu_replace_section                (GMenu             *menu,
-						    const gchar       *section_id,
-						    GMenuModel        *section);
 void nautilus_pop_up_context_menu                  (GtkWidget         *parent,
 						    GMenu             *menu,
 						    GdkEventButton    *event);
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index 76cfeef..2d41492 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -720,12 +720,49 @@ action_search_visible (GSimpleAction *action,
 }
 
 static void
+change_files_view_mode (NautilusWindowSlot *self,
+                        guint               view_id)
+{
+        const gchar *preferences_key;
+
+        nautilus_window_slot_set_content_view (self, view_id);
+        preferences_key = nautilus_view_is_searching (nautilus_window_slot_get_current_view (self)) ?
+                          NAUTILUS_PREFERENCES_SEARCH_VIEW :
+                          NAUTILUS_PREFERENCES_DEFAULT_FOLDER_VIEWER;
+
+        g_settings_set_enum (nautilus_preferences, preferences_key, view_id);
+}
+
+static void
+action_files_view_mode_toggle (GSimpleAction *action,
+                               GVariant      *value,
+                               gpointer       user_data)
+{
+        NautilusWindowSlot *self;
+        NautilusWindowSlotPrivate *priv;
+        guint current_view_id;
+
+        self = NAUTILUS_WINDOW_SLOT (user_data);
+        priv = nautilus_window_slot_get_instance_private (self);
+        if (priv->content_view == NULL || !NAUTILUS_IS_FILES_VIEW (priv->content_view)) {
+                return;
+        }
+
+        current_view_id = nautilus_files_view_get_view_id (NAUTILUS_FILES_VIEW (priv->content_view));
+        if (current_view_id == NAUTILUS_VIEW_GRID_ID) {
+                change_files_view_mode (self, NAUTILUS_VIEW_LIST_ID);
+        }
+        else if (current_view_id == NAUTILUS_VIEW_LIST_ID) {
+                change_files_view_mode (self, NAUTILUS_VIEW_GRID_ID);
+        }
+}
+
+static void
 action_files_view_mode (GSimpleAction *action,
 		        GVariant      *value,
 		        gpointer       user_data)
 {
         NautilusWindowSlot *self;
-        const gchar *preferences_key;
         guint view_id;
 
         view_id =  g_variant_get_uint32 (value);
@@ -734,12 +771,7 @@ action_files_view_mode (GSimpleAction *action,
         if (!NAUTILUS_IS_FILES_VIEW (nautilus_window_slot_get_current_view (self)))
                 return;
 
-        nautilus_window_slot_set_content_view (self, view_id);
-        preferences_key = nautilus_view_is_searching (nautilus_window_slot_get_current_view (self)) ?
-                          NAUTILUS_PREFERENCES_SEARCH_VIEW :
-                          NAUTILUS_PREFERENCES_DEFAULT_FOLDER_VIEWER;
-
-        g_settings_set_enum (nautilus_preferences, preferences_key, view_id);
+        change_files_view_mode (self, view_id);
 
         g_simple_action_set_state (action, value);
 }
@@ -747,6 +779,7 @@ action_files_view_mode (GSimpleAction *action,
 const GActionEntry slot_entries[] = {
         /* 4 is NAUTILUS_VIEW_INVALID_ID */
         { "files-view-mode", NULL, "u", "uint32 4", action_files_view_mode },
+        { "files-view-mode-toggle", action_files_view_mode_toggle },
         { "search-visible", NULL, NULL, "false", action_search_visible },
 };
 
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 936db68..d3e1239 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -414,9 +414,9 @@ action_undo (GSimpleAction *action,
 }
 
 static void
-action_toggle_state_action_button (GSimpleAction *action,
-				   GVariant      *state,
-				   gpointer       user_data)
+action_toggle_state_view_button (GSimpleAction *action,
+				 GVariant      *state,
+				 gpointer       user_data)
 {
 	GVariant *current_state;
 
@@ -427,55 +427,6 @@ action_toggle_state_action_button (GSimpleAction *action,
 }
 
 static void
-undo_manager_changed (NautilusWindow *window)
-{
-	NautilusToolbar *toolbar;
-	NautilusFileUndoInfo *info;
-	NautilusFileUndoManagerState undo_state;
-	gboolean undo_active, redo_active;
-	gchar *undo_label, *undo_description, *redo_label, *redo_description;
-	gboolean is_undo;
-	GMenu* undo_section;
-	GAction *action;
-
-	toolbar = NAUTILUS_TOOLBAR (window->priv->toolbar);
-	undo_label = undo_description = redo_label = redo_description = NULL;
-
-	info = nautilus_file_undo_manager_get_action ();
-	undo_state = nautilus_file_undo_manager_get_state ();
-	undo_active = redo_active = FALSE;
-	if (info != NULL &&
-	    (undo_state > NAUTILUS_FILE_UNDO_MANAGER_STATE_NONE)) {
-		is_undo = (undo_state == NAUTILUS_FILE_UNDO_MANAGER_STATE_UNDO);
-		undo_active = is_undo;
-		redo_active = !is_undo;
-		nautilus_file_undo_info_get_strings (info,
-						     &undo_label, &undo_description,
-						     &redo_label, &redo_description);
-	}
-
-	action = g_action_map_lookup_action (G_ACTION_MAP (window), "undo");
-	g_simple_action_set_enabled (G_SIMPLE_ACTION (action), undo_active);
-	action = g_action_map_lookup_action (G_ACTION_MAP (window), "redo");
-	g_simple_action_set_enabled (G_SIMPLE_ACTION (action), redo_active);
-
-	undo_section = g_menu_new ();
-	undo_label = undo_active ? undo_label : g_strdup (_("Undo"));
-	redo_label = redo_active ? redo_label : g_strdup (_("Redo"));
-	g_menu_append (undo_section, undo_label, "win.undo");
-	g_menu_append (undo_section, redo_label, "win.redo");
-	nautilus_gmenu_replace_section (nautilus_toolbar_get_action_menu (toolbar),
-					"undo-redo-section",
-					G_MENU_MODEL (undo_section));
-
-	g_object_unref (undo_section);
-	g_free (undo_label);
-	g_free (undo_description);
-	g_free (redo_label);
-	g_free (redo_description);
-}
-
-static void
 on_location_changed (NautilusWindow *window)
 {
         gtk_places_sidebar_set_location (GTK_PLACES_SIDEBAR (window->priv->places_sidebar),
@@ -2071,7 +2022,7 @@ const GActionEntry win_entries[] = {
 	{ "back",  action_back },
 	{ "forward",  action_forward },
 	{ "up",  action_up },
-	{ "action-menu", action_toggle_state_action_button, NULL, "false", NULL },
+	{ "view-menu", action_toggle_state_view_button, NULL, "false", NULL },
 	{ "reload", action_reload },
 	{ "stop", action_stop },
 	{ "new-tab", action_new_tab },
@@ -2135,7 +2086,7 @@ nautilus_window_initialize_actions (NautilusWindow *window)
 	nautilus_application_add_accelerator (app, "win.tab-move-right", "<shift><control>Page_Down");
 	nautilus_application_add_accelerator (app, "win.prompt-root-location", "slash");
 	nautilus_application_add_accelerator (app, "win.prompt-home-location", "asciitilde");
-	nautilus_application_add_accelerator (app, "win.action-menu", "F10");
+	nautilus_application_add_accelerator (app, "win.view-menu", "F10");
 
 	/* Alt+N for the first 9 tabs */
 	for (i = 0; i < 9; ++i) {
@@ -2150,10 +2101,6 @@ nautilus_window_initialize_actions (NautilusWindow *window)
 		nautilus_window_show_sidebar (window);
 
 	g_variant_unref (state);
-
-	g_signal_connect_object (nautilus_file_undo_manager_get (), "undo-changed",
-				 G_CALLBACK (undo_manager_changed), window, G_CONNECT_SWAPPED);
-	undo_manager_changed (window);
 }
 
 
diff --git a/src/resources/nautilus.gresource.xml b/src/resources/nautilus.gresource.xml
index 0acbc70..30a0566 100644
--- a/src/resources/nautilus.gresource.xml
+++ b/src/resources/nautilus.gresource.xml
@@ -7,7 +7,6 @@
     <file>ui/nautilus-pathbar-context-menu.ui</file>
     <file>ui/nautilus-toolbar.ui</file>
     <file>ui/nautilus-toolbar-view-menu.ui</file>
-    <file>ui/nautilus-toolbar-action-menu.ui</file>
     <file>ui/nautilus-create-folder-dialog.ui</file>
     <file>ui/nautilus-rename-file-popover.ui</file>
     <file>ui/nautilus-files-view-context-menus.ui</file>
diff --git a/src/resources/ui/nautilus-toolbar-action-menu.ui b/src/resources/ui/nautilus-toolbar-action-menu.ui
deleted file mode 100644
index a0eefd6..0000000
--- a/src/resources/ui/nautilus-toolbar-action-menu.ui
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0"?>
-<interface>
-  <!-- interface-requires gtk+ 3.0 -->
-  <menu id="action-menu">
-    <section>
-      <item>
-        <attribute name="label" translatable="yes">New _Folder</attribute>
-        <attribute name="action">view.new-folder</attribute>
-      </item>
-      <item>
-        <attribute name="label" translatable="yes">New _Tab</attribute>
-        <attribute name="action">win.new-tab</attribute>
-      </item>
-    </section>
-    <section>
-      <attribute name="id">undo-redo-section</attribute>
-    </section>
-    <section>
-      <item>
-        <attribute name="label" translatable="yes">Select _All</attribute>
-        <attribute name="action">view.select-all</attribute>
-      </item>
-      <item>
-        <attribute name="label" translatable="yes">Enter _Location</attribute>
-        <attribute name="action">win.enter-location</attribute>
-      </item>
-    </section>
-    <section>
-      <item>
-        <attribute name="label" translatable="yes">_Bookmark this Location</attribute>
-        <attribute name="action">win.bookmark-current-location</attribute>
-      </item>
-    </section>
-  </menu>
-</interface>
\ No newline at end of file
diff --git a/src/resources/ui/nautilus-toolbar-view-menu.ui b/src/resources/ui/nautilus-toolbar-view-menu.ui
index 7cb336d..e375f16 100644
--- a/src/resources/ui/nautilus-toolbar-view-menu.ui
+++ b/src/resources/ui/nautilus-toolbar-view-menu.ui
@@ -9,22 +9,116 @@
         <property name="orientation">vertical</property>
         <property name="width_request">160</property>
         <child>
-          <object class="GtkBox" id="views_box">
+          <object class="GtkBox" id="new_buttons_box">
             <property name="visible">True</property>
             <property name="orientation">horizontal</property>
+            <property name="homogeneous">True</property>
+            <style>
+              <class name="linked"/>
+            </style>
+            <child>
+              <object class="GtkButton" id="new-folder">
+                <property name="visible">True</property>
+                <property name="action_name">view.new-folder</property>
+                <child>
+                  <object class="GtkImage">
+                    <property name="visible">True</property>
+                    <property name="icon-name">folder-new-symbolic</property>
+                    <property name="icon-size">1</property>
+                  </object>
+                </child>
+                <child internal-child="accessible">
+                  <object class="AtkObject">
+                    <property name="accessible-name" translatable="yes">New Folder</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="bookmark-this-location">
+                <property name="visible">True</property>
+                <property name="action_name">win.bookmark-current-location</property>
+                <child>
+                  <object class="GtkImage">
+                    <property name="visible">True</property>
+                    <property name="icon-name">bookmark-new-symbolic</property>
+                    <property name="icon-size">1</property>
+                  </object>
+                </child>
+                <child internal-child="accessible">
+                  <object class="AtkObject">
+                    <property name="accessible-name" translatable="yes">_Bookmark this Location</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="new-tab">
+                <property name="visible">True</property>
+                <property name="action-name">win.new-tab</property>
+                <child>
+                  <object class="GtkImage">
+                    <property name="visible">True</property>
+                    <property name="icon-name">tab-new-symbolic</property>
+                    <property name="icon-size">1</property>
+                  </object>
+                </child>
+                <child internal-child="accessible">
+                  <object class="AtkObject">
+                    <property name="accessible-name" translatable="yes">New _Tab</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkSeparator">
+            <property name="visible">True</property>
+            <property name="orientation">horizontal</property>
+            <property name="margin-top">6</property>
             <property name="margin-bottom">6</property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkBox" id="zoom_controls_box">
+            <property name="visible">True</property>
+            <property name="orientation">horizontal</property>
+            <property name="homogeneous">True</property>
             <style>
-                <class name="linked"/>
+              <class name="linked"/>
             </style>
             <child>
-              <object class="GtkModelButton" id="grid_button">
+              <object class="GtkButton" id="zoom-out">
                 <property name="visible">True</property>
-                <property name="text">Grid</property>
-                <property name="action-name">slot.files-view-mode</property>
-                <property name="action-target">uint32 0</property>
-                <property name="iconic">True</property>
-                <property name="centered">True</property>
-                <property name="icon">icon_grid</property>
+                <property name="action-name">view.zoom-out</property>
+                <child>
+                  <object class="GtkImage">
+                    <property name="visible">True</property>
+                    <property name="icon-name">zoom-out-symbolic</property>
+                    <property name="icon-size">1</property>
+                  </object>
+                </child>
+                <child internal-child="accessible">
+                  <object class="AtkObject">
+                    <property name="accessible-name" translatable="yes">Zoom Out</property>
+                  </object>
+                </child>
               </object>
               <packing>
                 <property name="expand">True</property>
@@ -33,14 +127,20 @@
               </packing>
             </child>
             <child>
-              <object class="GtkModelButton" id="list_button">
+              <object class="GtkButton" id="zoom-default">
                 <property name="visible">True</property>
-                <property name="text">List</property>
-                <property name="action-name">slot.files-view-mode</property>
-                <property name="action-target">uint32 1</property>
-                <property name="iconic">True</property>
-                <property name="centered">True</property>
-                <property name="icon">icon_list</property>
+                <property name="action_name">view.zoom-default</property>
+                <child>
+                  <object class="GtkLabel" id="zoom_level_label">
+                    <property name="visible">True</property>
+                    <property name="width-chars">5</property>
+                  </object>
+                </child>
+                <child internal-child="accessible">
+                  <object class="AtkObject">
+                    <property name="accessible-name" translatable="yes">Reset Zoom</property>
+                  </object>
+                </child>
               </object>
               <packing>
                 <property name="expand">True</property>
@@ -48,28 +148,54 @@
                 <property name="position">1</property>
               </packing>
             </child>
+            <child>
+              <object class="GtkButton" id="zoom-in">
+                <property name="visible">True</property>
+                <property name="action_name">view.zoom-in</property>
+                <child>
+                  <object class="GtkImage">
+                    <property name="visible">True</property>
+                    <property name="icon-name">zoom-in-symbolic</property>
+                    <property name="icon-size">1</property>
+                  </object>
+                </child>
+                <child internal-child="accessible">
+                  <object class="AtkObject">
+                    <property name="accessible-name" translatable="yes">Zoom In</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
           </object>
         </child>
         <child>
-          <object class="GtkScale" id="zoom_level_scale">
+          <object class="GtkSeparator">
+            <property name="visible">True</property>
+            <property name="orientation">horizontal</property>
+            <property name="margin-top">6</property>
+            <property name="margin-bottom">6</property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkModelButton" id="undo">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
-            <property name="draw_value">False</property>
-            <property name="has_origin">False</property>
-            <property name="adjustment">zoom_adjustment</property>
-            <property name="round_digits">0</property>
-            <property name="restrict_to_fill_level">False</property>
-            <marks>
-              <mark value="0" position="bottom"/>
-              <mark value="1" position="bottom"/>
-              <mark value="2" position="bottom"/>
-              <mark value="3" position="bottom"/>
-            </marks>
+            <property name="text" translatable="yes">Undo</property>
+            <property name="action-name">win.undo</property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkModelButton" id="redo">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="text" translatable="yes">Redo</property>
+            <property name="action-name">win.redo</property>
           </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-          </packing>
         </child>
         <child>
           <object class="GtkBox" id="sort_menu">
@@ -211,17 +337,4 @@
       </object>
     </child>
   </object>
-  <object class="GThemedIcon" id="icon_grid">
-    <property name="name">view-grid-symbolic</property>
-  </object>
-  <object class="GThemedIcon" id="icon_list">
-    <property name="name">view-list-symbolic</property>
-  </object>
-  <object class="GtkAdjustment" id="zoom_adjustment">
-    <property name="lower">0</property>
-    <property name="upper">3</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">1</property>
-    <property name="value">1</property>
-  </object>
 </interface>
diff --git a/src/resources/ui/nautilus-toolbar.ui b/src/resources/ui/nautilus-toolbar.ui
index 024e3f3..ee4f917 100644
--- a/src/resources/ui/nautilus-toolbar.ui
+++ b/src/resources/ui/nautilus-toolbar.ui
@@ -72,15 +72,15 @@
       </packing>
     </child>
     <child>
-      <object class="GtkMenuButton" id="action_button">
+      <object class="GtkMenuButton" id="view_button">
         <property name="visible">True</property>
         <property name="sensitive">True</property>
-        <property name="action_name">win.action-menu</property>
+        <property name="action_name">win.view-menu</property>
         <style>
           <class name="image-button"/>
         </style>
         <child>
-          <object class="GtkImage" id="action_icon">
+          <object class="GtkImage">
             <property name="visible">True</property>
             <property name="icon-name">open-menu-symbolic</property>
             <property name="icon-size">1</property>
@@ -98,22 +98,23 @@
       </packing>
     </child>
     <child>
-      <object class="GtkMenuButton" id="view_button">
+      <object class="GtkButton" id="view_toggle_button">
         <property name="visible">True</property>
         <property name="sensitive">True</property>
+        <property name="action_name">slot.files-view-mode-toggle</property>
         <style>
           <class name="image-button"/>
         </style>
         <child>
-          <object class="GtkImage" id="view_icon">
+          <object class="GtkImage" id="view_toggle_icon">
             <property name="visible">True</property>
             <property name="icon-size">1</property>
           </object>
         </child>
         <child internal-child="accessible">
           <object class="AtkObject">
-            <property name="accessible-name" translatable="yes">View menu</property>
-            <property name="accessible-description" translatable="yes">Open view menu</property>
+            <property name="accessible-name" translatable="yes">Grid/list toggle</property>
+            <property name="accessible-description" translatable="yes">Toggle between grid and list view</property>
           </object>
         </child>
       </object>
