diff -ruN Alacarte.orig/MainWindow.py Alacarte/MainWindow.py
--- Alacarte.orig/MainWindow.py	2009-09-26 02:30:48.000000000 +0200
+++ Alacarte/MainWindow.py	2009-12-21 22:27:14.000000000 +0100
@@ -419,6 +419,8 @@
 				elif item.get_type() == gmenu.TYPE_DIRECTORY:
 					if self.editor.moveMenu(item, new_parent) == False:
 						self.loadUpdates()
+				elif item.get_type() == gmenu.TYPE_SEPARATOR:
+					self.editor.moveSeparator(item, new_parent)
 				else:
 					context.finish(False, False, etime) 
 				context.finish(True, True, etime)
@@ -495,7 +497,9 @@
 
 	def on_item_tree_drag_data_received(self, treeview, context, x, y, selection, info, etime):
 		items = treeview.get_model()
-		types = (gtk.TREE_VIEW_DROP_BEFORE,	gtk.TREE_VIEW_DROP_INTO_OR_BEFORE)
+		types_before = (gtk.TREE_VIEW_DROP_BEFORE, gtk.TREE_VIEW_DROP_INTO_OR_BEFORE)
+		types_into = (gtk.TREE_VIEW_DROP_INTO_OR_BEFORE, gtk.TREE_VIEW_DROP_INTO_OR_AFTER)
+		types_after = (gtk.TREE_VIEW_DROP_AFTER, gtk.TREE_VIEW_DROP_INTO_OR_AFTER)
 		if selection.target == 'ALACARTE_ITEM_ROW':
 			drop_info = treeview.get_dest_row_at_pos(x, y)
 			before = None
@@ -503,22 +507,32 @@
 			if self.drag_data == None:
 				return False
 			item = self.drag_data
+			# by default we assume, that the items stays in the same menu
+			destination = item.get_parent()
 			if drop_info:
 				path, position = drop_info
-				if position in types:
-					before = items[path][3]
+				target = items[path][3]
+				# move the item to the directory, if the item was dropped into it
+				if (target.get_type() == gmenu.TYPE_DIRECTORY) and (position in types_into):
+					# append the selected item to the choosen menu
+					destination = target
+				elif position in types_before:
+					before = target
+				elif position in types_after:
+					after = target
 				else:
-					after = items[path][3]
+					# this does not happen
+					pass
 			else:
 				path = (len(items) - 1,)
 				after = items[path][3]
 			if item.get_type() == gmenu.TYPE_ENTRY:
-				self.editor.moveItem(item, item.get_parent(), before, after)
+				self.editor.moveItem(item, destination, before, after)
 			elif item.get_type() == gmenu.TYPE_DIRECTORY:
-				if self.editor.moveMenu(item, item.get_parent(), before, after) == False:
+				if self.editor.moveMenu(item, destination, before, after) == False:
 					self.loadUpdates()
 			elif item.get_type() == gmenu.TYPE_SEPARATOR:
-				self.editor.moveSeparator(item, item.get_parent(), before, after)
+				self.editor.moveSeparator(item, destination, before, after)
 			context.finish(True, True, etime)
 		elif selection.target == 'text/plain':
 			if selection.data == None:
diff -ruN Alacarte.orig/MenuEditor.py Alacarte/MenuEditor.py
--- Alacarte.orig/MenuEditor.py	2009-09-26 02:30:48.000000000 +0200
+++ Alacarte/MenuEditor.py	2009-12-21 22:26:47.000000000 +0100
@@ -343,8 +343,15 @@
 		self.save()
 
 	def moveSeparator(self, separator, new_parent, before=None, after=None):
+		undo = []
+		# remove the original separator if its parent is not the new destination
+		if separator.get_parent() != new_parent:
+			self.deleteSeparator(separator)
+			undo.append(separator)
+		# this adds the new separator to the specified position
 		self.__positionItem(new_parent, separator, before, after)
-		self.__addUndo([self.__getMenu(new_parent),])
+		undo.append(self.__getMenu(new_parent))
+		self.__addUndo(undo)
 		self.save()
 
 	def deleteItem(self, item):
@@ -690,18 +697,21 @@
 		self.__addXmlFilename(xml_parent, dom, file_id, 'Exclude')
 
 	def __positionItem(self, parent, item, before=None, after=None):
-		if not before and not after:
-			return
 		if after:
 			index = parent.contents.index(after) + 1
 		elif before:
 			index = parent.contents.index(before)
+		else:
+			# append the item to the list
+			index = len(parent.contents)
 		contents = parent.contents
 		#if this is a move to a new parent you can't remove the item
-		try:
+		if item in contents:
+			# decrease the destination index, if we shorten the list
+			if (before and (contents.index(item) < index)) \
+					or (after and (contents.index(item) < index - 1)):
+				index -= 1
 			contents.remove(item)
-		except:
-			pass
 		contents.insert(index, item)
 		layout = self.__createLayout(contents)
 		dom = self.__getMenu(parent).dom
