diff --git a/src/nautilus-places-sidebar.c b/src/nautilus-places-sidebar.c
index b634399..5d719a7 100644
--- a/src/nautilus-places-sidebar.c
+++ b/src/nautilus-places-sidebar.c
@@ -143,6 +143,7 @@ typedef enum {
 	PLACES_MOUNTED_VOLUME,
 	PLACES_BOOKMARK,
 	PLACES_HEADING,
+	PLACES_DUMMY,
 } PlaceType;
 
 typedef enum {
@@ -1058,6 +1059,103 @@ loading_uri_callback (NautilusWindow *window,
     	}
 }
 
+static gboolean
+remove_dummy_foreach_func (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
+{
+	NautilusPlacesSidebar *sidebar;
+	PlaceType place_type;
+
+	sidebar = NAUTILUS_PLACES_SIDEBAR (data);
+
+	gtk_tree_model_get (model, iter,
+			    PLACES_SIDEBAR_COLUMN_ROW_TYPE, &place_type,
+			    -1);
+
+	if (place_type == PLACES_DUMMY) {
+
+		GtkTreeIter child_iter;
+

+		gtk_list_store_remove (sidebar->store, &child_iter);
+
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+static void
+remove_dummy (NautilusPlacesSidebar *sidebar)
+{
+	GtkTreeModel *model;
+
+	model = gtk_tree_view_get_model (sidebar->tree_view);
+	gtk_tree_model_foreach (model, remove_dummy_foreach_func, sidebar);
+}
+
+static void
+add_dummy (NautilusPlacesSidebar *sidebar,
+           GtkTreePath *path,
+           GtkTreeViewDropPosition pos)
+{
+	GtkTreeModel *model;
+	GtkTreeIter iter, child_iter, dummy_iter;
+	GIcon *icon;
+	GdkPixbuf *pixbuf;
+	NautilusIconInfo *icon_info;
+	int icon_size;
+
+	if (!path) {
+		return;
+	}
+
+	model = gtk_tree_view_get_model (sidebar->tree_view);
+	gtk_tree_model_get_iter (model, &iter, path);
+
+	/* Remove the old dummy (if any) */
+	remove_dummy (sidebar);
+
+	icon = g_themed_icon_new (GTK_STOCK_ADD);
+	icon_size = nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU);
+	icon_info = nautilus_icon_info_lookup (icon, icon_size);
+	pixbuf = nautilus_icon_info_get_pixbuf_at_size (icon_info, icon_size);
+
+
+	if ((pos == GTK_TREE_VIEW_DROP_BEFORE) ||
+	    (pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE)) {
+		gtk_list_store_insert_before (sidebar->store, &dummy_iter, &child_iter);
+	} else {
+		gtk_list_store_insert_after (sidebar->store, &dummy_iter, &child_iter);
+	}
+
+	gtk_list_store_set (sidebar->store, &dummy_iter,
+			    PLACES_SIDEBAR_COLUMN_ICON, pixbuf,
+			    PLACES_SIDEBAR_COLUMN_NAME, _("Add Bookmark"),
+			    PLACES_SIDEBAR_COLUMN_URI, NULL,
+			    PLACES_SIDEBAR_COLUMN_DRIVE, NULL,
+			    PLACES_SIDEBAR_COLUMN_VOLUME, NULL,
+			    PLACES_SIDEBAR_COLUMN_MOUNT, NULL,
+			    PLACES_SIDEBAR_COLUMN_ROW_TYPE, PLACES_DUMMY,
+			    PLACES_SIDEBAR_COLUMN_INDEX, 0,
+			    PLACES_SIDEBAR_COLUMN_EJECT, FALSE,
+			    PLACES_SIDEBAR_COLUMN_NO_EJECT, TRUE,
+			    PLACES_SIDEBAR_COLUMN_BOOKMARK, FALSE,
+			    PLACES_SIDEBAR_COLUMN_TOOLTIP, NULL,
+			    PLACES_SIDEBAR_COLUMN_EJECT_ICON, NULL,
+			    PLACES_SIDEBAR_COLUMN_SECTION_TYPE, SECTION_BOOKMARKS,
+			    -1);
+
+
+	g_object_unref (icon_info);
+	g_object_unref (pixbuf);
+	g_object_unref (icon);
+}
+
 /* Computes the appropriate row and position for dropping */
 static gboolean
 compute_drop_position (GtkTreeView *tree_view,
@@ -1065,12 +1163,22 @@ compute_drop_position (GtkTreeView *tree_view,
 		       int                      y,
 		       GtkTreePath            **path,
 		       GtkTreeViewDropPosition *pos,
+		       gboolean                *should_display_dummy,
+		       gboolean                *is_over_dummy,
 		       NautilusPlacesSidebar *sidebar)
 {
 	GtkTreeModel *model;
 	GtkTreeIter iter;
 	PlaceType place_type;
 	SectionType section_type;
+	gboolean is_heading;
+
+	if (is_over_dummy != NULL) {
+		*is_over_dummy = FALSE;
+	}
+	if (should_display_dummy != NULL) {
+		*should_display_dummy = FALSE;
+	}
 
 	if (!gtk_tree_view_get_dest_row_at_pos (tree_view,
 						x, y,
@@ -1086,18 +1194,24 @@ compute_drop_position (GtkTreeView *tree_view,
 			    PLACES_SIDEBAR_COLUMN_SECTION_TYPE, &section_type,
 			    -1);
 
-	if (place_type == PLACES_HEADING && section_type != SECTION_BOOKMARKS) {
-		/* never drop on headings, but special case the bookmarks heading,
-		 * so we can drop bookmarks in between it and the first item.
-		 */
+	is_heading = FALSE;
+	if (place_type == PLACES_HEADING) {
+		/* never drop on headings; special case the computer heading */
 
-		gtk_tree_path_free (*path);
-		*path = NULL;
-		
-		return FALSE;
+		if (section_type != SECTION_COMPUTER &&
+		    section_type != SECTION_BOOKMARKS) {
+
+			gtk_tree_path_free (*path);
+			*path = NULL;
+	
+			return FALSE;
+		} else {
+			is_heading = TRUE;
+		}
 	}
 
-	if (section_type != SECTION_BOOKMARKS &&
+	if (!is_heading && 
+	    section_type != SECTION_BOOKMARKS &&
 	    sidebar->drag_data_received &&
 	    sidebar->drag_data_info == GTK_TREE_MODEL_ROW) {
 		/* don't allow dropping bookmarks into non-bookmark areas */
@@ -1108,18 +1222,41 @@ compute_drop_position (GtkTreeView *tree_view,
 		return FALSE;
 	}
 
-	if (section_type == SECTION_BOOKMARKS) {
-		*pos = GTK_TREE_VIEW_DROP_AFTER;
-	} else {
-		/* non-bookmark shortcuts can only be dragged into */
-		*pos = GTK_TREE_VIEW_DROP_INTO_OR_BEFORE;
+	if (is_heading) {
+		switch (section_type) {
+		case SECTION_BOOKMARKS:
+			/* We are over the bookmarks heading, only allow AFTER */
+			*pos = GTK_TREE_VIEW_DROP_AFTER;
+			break;
+		case SECTION_COMPUTER:
+			/* We are over the computer heading, only allow BEFORE */
+			*pos = GTK_TREE_VIEW_DROP_BEFORE;
+			break;
+		default:
+			g_assert_not_reached ();
+			break;
+		}
 	}
 
-	if (*pos != GTK_TREE_VIEW_DROP_BEFORE &&
-	    sidebar->drag_data_received &&
-	    sidebar->drag_data_info == GTK_TREE_MODEL_ROW) {
-		/* bookmark rows are never dragged into other bookmark rows */
-		*pos = GTK_TREE_VIEW_DROP_AFTER;
+	if (is_over_dummy != NULL) {
+		*is_over_dummy = (place_type == PLACES_DUMMY);
+	}
+
+	if (should_display_dummy != NULL) {
+		if ((section_type == SECTION_BOOKMARKS || is_heading) &&
+		    (is_over_dummy ||
+		     (*pos == GTK_TREE_VIEW_DROP_BEFORE) ||
+		     (*pos == GTK_TREE_VIEW_DROP_AFTER))) {
+			*should_display_dummy = TRUE;
+		}
+	}
+
+	/* Only allow the INTO variants; bookmakrs and reordering are done with
+	 * the dummy */
+	if (*pos == GTK_TREE_VIEW_DROP_BEFORE) {
+		*pos = GTK_TREE_VIEW_DROP_INTO_OR_BEFORE;
+	} else if (*pos == GTK_TREE_VIEW_DROP_AFTER) {
+		*pos = GTK_TREE_VIEW_DROP_INTO_OR_AFTER;
 	}
 
 	return TRUE;
@@ -1155,6 +1292,8 @@ free_drag_data (NautilusPlacesSidebar *sidebar)
 		nautilus_drag_destroy_selection_list (sidebar->drag_list);
 		sidebar->drag_list = NULL;
 	}
+
+	remove_dummy (sidebar);
 }
 
 static gboolean
@@ -1200,7 +1339,7 @@ drag_motion_callback (GtkTreeView *tree_view,
 	int action;
 	GtkTreeIter iter;
 	char *uri;
-	gboolean res;
+	gboolean should_display_dummy, is_over_dummy, res;
 
 	if (!sidebar->drag_data_received) {
 		if (!get_drag_data (tree_view, context, time)) {
@@ -1209,12 +1348,18 @@ drag_motion_callback (GtkTreeView *tree_view,
 	}
 
 	path = NULL;
-	res = compute_drop_position (tree_view, x, y, &path, &pos, sidebar);
+	res = compute_drop_position (tree_view, x, y, &path, &pos, &should_display_dummy, &is_over_dummy, sidebar);
 
 	if (!res) {
 		goto out;
 	}
 
+	if (!is_over_dummy && should_display_dummy) {
+		add_dummy (sidebar, path, pos);
+	} else if (!should_display_dummy) {
+		remove_dummy (sidebar);
+	}
+
 	if (pos == GTK_TREE_VIEW_DROP_BEFORE ||
 	    pos == GTK_TREE_VIEW_DROP_AFTER ) {
 		if (sidebar->drag_data_received &&
@@ -1440,7 +1585,7 @@ drag_data_received_callback (GtkWidget *widget,
 	}
 
 	/* Compute position */
-	success = compute_drop_position (tree_view, x, y, &tree_path, &tree_pos, sidebar);
+	success = compute_drop_position (tree_view, x, y, &tree_path, &tree_pos, NULL, NULL, sidebar);
 	if (!success) {
 		goto out;
 	}
@@ -1449,6 +1594,9 @@ drag_data_received_callback (GtkWidget *widget,
 
 	if (tree_pos == GTK_TREE_VIEW_DROP_BEFORE ||
 	    tree_pos == GTK_TREE_VIEW_DROP_AFTER) {
+
+		g_assert_not_reached ();
+
 		model = gtk_tree_view_get_model (tree_view);
 
 		if (!gtk_tree_model_get_iter (model, &iter, tree_path)) {
