Index: libnautilus-private/nautilus-dnd.c
===================================================================
--- libnautilus-private/nautilus-dnd.c	(revision 14673)
+++ libnautilus-private/nautilus-dnd.c	(working copy)
@@ -411,6 +411,29 @@ check_same_fs (NautilusFile *file1,
 	return result;
 }
 
+static gboolean
+source_parent_is_writable_ (GFile *file)
+{
+	GFile *parent;
+	NautilusFile *naut_parent;
+	parent = g_file_get_parent (file);
+	if (parent == NULL) {
+		return FALSE;	
+	}
+	
+	/* if there's no a cached NautilusFile parent, it returns NULL */
+	naut_parent = nautilus_file_get_existing (parent);
+	g_object_unref (parent);
+
+	if (naut_parent != NULL && nautilus_file_can_write (naut_parent)) {
+		nautilus_file_unref (naut_parent);
+		return TRUE;
+	}
+	
+	nautilus_file_unref (naut_parent);
+	return FALSE;
+}
+
 void
 nautilus_drag_default_drop_action_for_icons (GdkDragContext *context,
 					     const char *target_uri_string, const GList *items,
@@ -418,6 +441,7 @@ nautilus_drag_default_drop_action_for_ic
 {
 	gboolean same_fs;
 	gboolean target_is_source_parent;
+	gboolean source_parent_is_writable;
 	const char *dropped_uri;
 	GFile *target, *dropped;
 	GdkDragAction actions;
@@ -502,8 +526,9 @@ nautilus_drag_default_drop_action_for_ic
 	/* Compare the first dropped uri with the target uri for same fs match. */
 	dropped = g_file_new_for_uri (dropped_uri);
 	target_is_source_parent = g_file_has_prefix (dropped, target);
-	
-	if (same_fs || target_is_source_parent ||
+	source_parent_is_writable = source_parent_is_writable_ (dropped);
+
+	if ((same_fs && source_parent_is_writable) || target_is_source_parent ||
 	    g_file_has_uri_scheme (dropped, "trash")) {
 		if (actions & GDK_ACTION_MOVE) {
 			*action = GDK_ACTION_MOVE;
