[163987] XML outline expects DND data too early
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContentOutlineConfiguration.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContentOutlineConfiguration.java
index ce87173..ea8ac30 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContentOutlineConfiguration.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContentOutlineConfiguration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -18,17 +18,24 @@
 import org.eclipse.jface.action.IContributionItem;
 import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.SafeRunnable;
 import org.eclipse.jface.util.TransferDragSourceListener;
 import org.eclipse.jface.util.TransferDropTargetListener;
 import org.eclipse.jface.viewers.IContentProvider;
 import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.dnd.DND;
 import org.eclipse.swt.dnd.DragSourceEvent;
 import org.eclipse.swt.dnd.DropTargetEvent;
 import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.wst.common.ui.internal.dnd.ObjectTransfer;
-import org.eclipse.wst.common.ui.internal.dnd.ViewerDragAdapter;
-import org.eclipse.wst.common.ui.internal.dnd.ViewerDropAdapter;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.wst.common.ui.internal.dnd.DragAndDropCommand;
 import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
 import org.eclipse.wst.dtd.ui.internal.DTDUIPlugin;
 import org.eclipse.wst.dtd.ui.internal.dnd.DTDDragAndDropManager;
@@ -146,83 +153,6 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDragSourceListeners(org.eclipse.jface.viewers.TreeViewer)
-	 */
-	public TransferDragSourceListener[] getTransferDragSourceListeners(TreeViewer treeViewer) {
-		if (fTransferDragSourceListeners == null) {
-			// emulate the XMLDragAndDropManager
-			final ViewerDragAdapter dragAdapter = new ViewerDragAdapter(treeViewer);
-			fTransferDragSourceListeners = new TransferDragSourceListener[]{new TransferDragSourceListener() {
-				public void dragFinished(DragSourceEvent event) {
-					dragAdapter.dragFinished(event);
-				}
-
-				public void dragSetData(DragSourceEvent event) {
-					dragAdapter.dragSetData(event);
-				}
-
-				public void dragStart(DragSourceEvent event) {
-					dragAdapter.dragStart(event);
-				}
-
-				public Transfer getTransfer() {
-					return ObjectTransfer.getInstance();
-				}
-			}};
-		}
-
-		return fTransferDragSourceListeners;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDropTargetListeners(org.eclipse.jface.viewers.TreeViewer)
-	 */
-	public TransferDropTargetListener[] getTransferDropTargetListeners(TreeViewer treeViewer) {
-		if (fTransferDropTargetListeners == null) {
-			// emulate the XMLDragAnDropManager
-			final ViewerDropAdapter dropAdapter = new ViewerDropAdapter(treeViewer, new DTDDragAndDropManager());
-			fTransferDropTargetListeners = new TransferDropTargetListener[]{new TransferDropTargetListener() {
-				public void dragEnter(DropTargetEvent event) {
-					dropAdapter.dragEnter(event);
-				}
-
-				public void dragLeave(DropTargetEvent event) {
-					dropAdapter.dragLeave(event);
-				}
-
-				public void dragOperationChanged(DropTargetEvent event) {
-					dropAdapter.dragOperationChanged(event);
-				}
-
-				public void dragOver(DropTargetEvent event) {
-					dropAdapter.dragOver(event);
-				}
-
-				public void drop(DropTargetEvent event) {
-					dropAdapter.drop(event);
-				}
-
-				public void dropAccept(DropTargetEvent event) {
-					dropAdapter.dropAccept(event);
-				}
-
-				public Transfer getTransfer() {
-					return ObjectTransfer.getInstance();
-				}
-
-				public boolean isEnabled(DropTargetEvent event) {
-					return getTransfer().isSupportedType(event.currentDataType);
-				}
-			}};
-		}
-		return fTransferDropTargetListeners;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
 	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#unconfigure(org.eclipse.jface.viewers.TreeViewer)
 	 */
 	public void unconfigure(TreeViewer viewer) {
@@ -233,4 +163,121 @@
 			fMenuHelper = null;
 		}
 	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDragSourceListeners(org.eclipse.jface.viewers.TreeViewer)
+	 */
+	public TransferDragSourceListener[] getTransferDragSourceListeners(final TreeViewer treeViewer) {
+		if (fTransferDragSourceListeners == null) {
+			fTransferDragSourceListeners = new TransferDragSourceListener[]{new TransferDragSourceListener() {
+				public void dragFinished(DragSourceEvent event) {
+					LocalSelectionTransfer.getTransfer().setSelection(null);
+				}
+	
+				public void dragSetData(DragSourceEvent event) {
+				}
+	
+				public void dragStart(DragSourceEvent event) {
+					LocalSelectionTransfer.getTransfer().setSelection(treeViewer.getSelection());
+				}
+	
+				public Transfer getTransfer() {
+					return LocalSelectionTransfer.getTransfer();
+				}
+			}};
+		}
+	
+		return fTransferDragSourceListeners;
+	}
+
+	/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDropTargetListeners(org.eclipse.jface.viewers.TreeViewer)
+		 */
+	public TransferDropTargetListener[] getTransferDropTargetListeners(final TreeViewer treeViewer) {
+		if (fTransferDropTargetListeners == null) {
+			fTransferDropTargetListeners = new TransferDropTargetListener[]{new TransferDropTargetListener() {
+				public void dragEnter(DropTargetEvent event) {
+					event.operations = DND.DROP_COPY | DND.DROP_MOVE;
+				}
+	
+				public void dragLeave(DropTargetEvent event) {
+				}
+	
+				public void dragOperationChanged(DropTargetEvent event) {
+				}
+	
+				public void dragOver(DropTargetEvent event) {
+					event.feedback = DND.FEEDBACK_SELECT;
+					float feedbackFloat = getHeightInItem(event);
+					if (feedbackFloat > 0.75) {
+						event.feedback = DND.FEEDBACK_INSERT_AFTER;
+					}
+					else if (feedbackFloat < 0.25) {
+						event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+					}
+					event.feedback |= DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
+				}
+	
+				public void drop(DropTargetEvent event) {
+					if (event.operations != DND.DROP_NONE && LocalSelectionTransfer.getTransfer().getSelection() instanceof IStructuredSelection) {
+						IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
+						if (selection != null && !selection.isEmpty() && event.item != null && event.item.getData() != null) {
+							/*
+							 * the command uses these numbers instead of the
+							 * feedback constants (even though it converts in
+							 * the other direction as well)
+							 */
+							float feedbackFloat = getHeightInItem(event);
+	
+							final DragAndDropCommand command = new DTDDragAndDropManager().createCommand(event.item.getData(), feedbackFloat, event.operations, event.detail, selection.toList());
+							if (command != null && command.canExecute()) {
+								SafeRunnable.run(new SafeRunnable() {
+									public void run() throws Exception {
+										command.execute();
+									}
+								});
+							}
+						}
+					}
+				}
+	
+				public void dropAccept(DropTargetEvent event) {
+				}
+	
+				private float getHeightInItem(DropTargetEvent event) {
+					if(event.item == null) return .5f;
+					if (event.item instanceof TreeItem) {
+						TreeItem treeItem = (TreeItem) event.item;
+						Control control = treeItem.getParent();
+						Point point = control.toControl(new Point(event.x, event.y));
+						Rectangle bounds = treeItem.getBounds();
+						return (float) (point.y - bounds.y) / (float) bounds.height;
+					}
+					else if (event.item instanceof TableItem) {
+						TableItem tableItem = (TableItem) event.item;
+						Control control = tableItem.getParent();
+						Point point = control.toControl(new Point(event.x, event.y));
+						Rectangle bounds = tableItem.getBounds(0);
+						return (float) (point.y - bounds.y) / (float) bounds.height;
+					}
+					else {
+						return 0.0F;
+					}
+				}
+				
+				public Transfer getTransfer() {
+					return LocalSelectionTransfer.getTransfer();
+				}
+	
+				public boolean isEnabled(DropTargetEvent event) {
+					return getTransfer().isSupportedType(event.currentDataType);
+				}
+			}};
+		}
+		return fTransferDropTargetListeners;
+	}
 }
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/ConfigurableContentOutlinePage.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/ConfigurableContentOutlinePage.java
index ab4b531..8e31f81 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/ConfigurableContentOutlinePage.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/ConfigurableContentOutlinePage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -92,7 +92,7 @@
 	 * Provides double-click registration so it can be done before the Control
 	 * is created.
 	 */
-	private class DoubleClickProvider implements IDoubleClickListener {
+	class DoubleClickProvider implements IDoubleClickListener {
 		private IDoubleClickListener[] listeners = null;
 
 		void addDoubleClickListener(IDoubleClickListener newListener) {
@@ -359,9 +359,9 @@
 		}
 
 		fDragAdapter = new DelegatingDragAdapter();
-		fDragSource = new DragSource(getControl(), DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK);
+		fDragSource = new DragSource(getControl(), DND.DROP_COPY | DND.DROP_MOVE);
 		fDropAdapter = new DelegatingDropAdapter();
-		fDropTarget = new DropTarget(getControl(), DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK);
+		fDropTarget = new DropTarget(getControl(), DND.DROP_COPY | DND.DROP_MOVE);
 
 		setConfiguration(getConfiguration());
 
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeViewer.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeViewer.java
index 912a8df..14d094b 100644
--- a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeViewer.java
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeViewer.java
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * Copyright (c) 2004 IBM Corporation and others. All rights reserved. This
+ * Copyright (c) 2004, 2007 IBM Corporation and others. All rights reserved. This
  * program and the accompanying materials are made available under the terms
  * of the Eclipse Public License v1.0 which accompanies this distribution, and
  * is available at http://www.eclipse.org/legal/epl-v10.html
@@ -13,20 +13,36 @@
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.SafeRunnable;
 import org.eclipse.jface.viewers.CellEditor;
 import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.TreeItem;
 import org.eclipse.wst.sse.core.StructuredModelManager;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
 import org.eclipse.wst.xml.ui.internal.actions.NodeAction;
 import org.eclipse.wst.xml.ui.internal.contentoutline.XMLNodeActionManager;
-import org.eclipse.wst.xml.ui.internal.dnd.XMLDragAndDropManager;
+import org.eclipse.wst.xml.ui.internal.dnd.DragNodeCommand;
 import org.w3c.dom.Document;
 
 public class XMLTableTreeViewer extends TreeViewer implements IDesignViewer {
@@ -66,7 +82,13 @@
 
 		createContextMenu();
 
-		XMLDragAndDropManager.addDragAndDropSupport(this);
+		DragSource dragSource = new DragSource(getControl(), DND.DROP_COPY | DND.DROP_MOVE);
+		dragSource.addDragListener(createDragSourceListener());
+		dragSource.setTransfer(new Transfer[] {LocalSelectionTransfer.getTransfer()});
+
+		DropTarget dropTarget = new DropTarget(getControl(), DND.DROP_COPY | DND.DROP_MOVE);
+		dropTarget.addDropListener(createDropTargetListener());
+		dropTarget.setTransfer(new Transfer[] {LocalSelectionTransfer.getTransfer()});
 	}
 
 	/**
@@ -149,4 +171,91 @@
 
 	}
 
+	private DragSourceListener createDragSourceListener() {
+		return new DragSourceListener() {
+			public void dragFinished(DragSourceEvent event) {
+				LocalSelectionTransfer.getTransfer().setSelection(null);
+			}
+
+			public void dragSetData(DragSourceEvent event) {
+			}
+
+			public void dragStart(DragSourceEvent event) {
+				LocalSelectionTransfer.getTransfer().setSelection(getSelection());
+			}
+		};
+	}
+
+	private DropTargetListener createDropTargetListener() {
+		return new DropTargetListener() {
+			public void dragEnter(DropTargetEvent event) {
+			}
+
+			public void dragLeave(DropTargetEvent event) {
+			}
+
+			public void dragOperationChanged(DropTargetEvent event) {
+			}
+
+			public void drop(DropTargetEvent event) {
+				if (event.operations != DND.DROP_NONE && LocalSelectionTransfer.getTransfer().getSelection() instanceof IStructuredSelection) {
+					dragOver(event);
+					IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
+					if (selection != null && !selection.isEmpty() && event.item != null && event.item.getData() != null) {
+						/*
+						 * the command uses these numbers instead of the
+						 * feedback constants (even though it converts in
+						 * the other direction as well)
+						 */
+						float feedbackFloat = getHeightInItem(event);
+
+						final DragNodeCommand command = new DragNodeCommand(event.item.getData(), feedbackFloat, event.operations, event.detail, selection.toList(), XMLTableTreeViewer.this);
+						if (command != null && command.canExecute()) {
+							SafeRunnable.run(new SafeRunnable() {
+								public void run() throws Exception {
+									command.execute();
+								}
+							});
+						}
+					}
+				}
+			}
+
+			public void dropAccept(DropTargetEvent event) {
+			}
+
+			public void dragOver(DropTargetEvent event) {
+				event.feedback = DND.FEEDBACK_SELECT;
+				float feedbackFloat = getHeightInItem(event);
+				if (feedbackFloat > 0.75) {
+					event.feedback = DND.FEEDBACK_INSERT_AFTER;
+				}
+				else if (feedbackFloat < 0.25) {
+					event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+				}
+				event.feedback |= DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
+			}
+
+			private float getHeightInItem(DropTargetEvent event) {
+				if(event.item == null) return .5f;
+				if (event.item instanceof TreeItem) {
+					TreeItem treeItem = (TreeItem) event.item;
+					Control control = treeItem.getParent();
+					Point point = control.toControl(new Point(event.x, event.y));
+					Rectangle bounds = treeItem.getBounds();
+					return (float) (point.y - bounds.y) / (float) bounds.height;
+				}
+				else if (event.item instanceof TableItem) {
+					TableItem tableItem = (TableItem) event.item;
+					Control control = tableItem.getParent();
+					Point point = control.toControl(new Point(event.x, event.y));
+					Rectangle bounds = tableItem.getBounds(0);
+					return (float) (point.y - bounds.y) / (float) bounds.height;
+				}
+				else {
+					return 0.0F;
+				}
+			}
+		};
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/XMLContentOutlineConfiguration.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/XMLContentOutlineConfiguration.java
index 6c37951..b4be68a 100644
--- a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/XMLContentOutlineConfiguration.java
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/XMLContentOutlineConfiguration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,6 +16,8 @@
 import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.SafeRunnable;
 import org.eclipse.jface.util.TransferDragSourceListener;
 import org.eclipse.jface.util.TransferDropTargetListener;
 import org.eclipse.jface.viewers.IContentProvider;
@@ -24,12 +26,15 @@
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.dnd.DND;
 import org.eclipse.swt.dnd.DragSourceEvent;
 import org.eclipse.swt.dnd.DropTargetEvent;
 import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.wst.common.ui.internal.dnd.ObjectTransfer;
-import org.eclipse.wst.common.ui.internal.dnd.ViewerDragAdapter;
-import org.eclipse.wst.common.ui.internal.dnd.ViewerDropAdapter;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.TreeItem;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
 import org.eclipse.wst.sse.core.utils.StringUtils;
 import org.eclipse.wst.sse.ui.internal.IReleasable;
@@ -48,7 +53,7 @@
 import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeContentProvider;
 import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeLabelProvider;
 import org.eclipse.wst.xml.ui.internal.contentoutline.XMLNodeActionManager;
-import org.eclipse.wst.xml.ui.internal.dnd.XMLDragAndDropManager;
+import org.eclipse.wst.xml.ui.internal.dnd.DragNodeCommand;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
@@ -386,68 +391,109 @@
 	 * 
 	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDragSourceListeners(org.eclipse.jface.viewers.TreeViewer)
 	 */
-	public TransferDragSourceListener[] getTransferDragSourceListeners(TreeViewer treeViewer) {
+	public TransferDragSourceListener[] getTransferDragSourceListeners(final TreeViewer treeViewer) {
 		if (fTransferDragSourceListeners == null) {
-			// emulate the XMLDragAndDropManager
-			final ViewerDragAdapter dragAdapter = new ViewerDragAdapter(treeViewer);
 			fTransferDragSourceListeners = new TransferDragSourceListener[]{new TransferDragSourceListener() {
+
 				public void dragFinished(DragSourceEvent event) {
-					dragAdapter.dragFinished(event);
+					LocalSelectionTransfer.getTransfer().setSelection(null);
 				}
 
 				public void dragSetData(DragSourceEvent event) {
-					dragAdapter.dragSetData(event);
 				}
 
 				public void dragStart(DragSourceEvent event) {
-					dragAdapter.dragStart(event);
+					LocalSelectionTransfer.getTransfer().setSelection(treeViewer.getSelection());
 				}
 
 				public Transfer getTransfer() {
-					return ObjectTransfer.getInstance();
+					return LocalSelectionTransfer.getTransfer();
 				}
 			}};
 		}
 
 		return fTransferDragSourceListeners;
 	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDropTargetListeners(org.eclipse.jface.viewers.TreeViewer)
-	 */
-	public TransferDropTargetListener[] getTransferDropTargetListeners(TreeViewer treeViewer) {
+	 
+	 /*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDropTargetListeners(org.eclipse.jface.viewers.TreeViewer)
+		 */
+	public TransferDropTargetListener[] getTransferDropTargetListeners(final TreeViewer treeViewer) {
 		if (fTransferDropTargetListeners == null) {
-			// emulate the XMLDragAnDropManager
-			final ViewerDropAdapter dropAdapter = new ViewerDropAdapter(treeViewer, new XMLDragAndDropManager());
 			fTransferDropTargetListeners = new TransferDropTargetListener[]{new TransferDropTargetListener() {
 				public void dragEnter(DropTargetEvent event) {
-					dropAdapter.dragEnter(event);
 				}
 
 				public void dragLeave(DropTargetEvent event) {
-					dropAdapter.dragLeave(event);
 				}
 
 				public void dragOperationChanged(DropTargetEvent event) {
-					dropAdapter.dragOperationChanged(event);
 				}
 
 				public void dragOver(DropTargetEvent event) {
-					dropAdapter.dragOver(event);
+					event.feedback = DND.FEEDBACK_SELECT;
+					float feedbackFloat = getHeightInItem(event);
+					if (feedbackFloat > 0.75) {
+						event.feedback = DND.FEEDBACK_INSERT_AFTER;
+					}
+					else if (feedbackFloat < 0.25) {
+						event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+					}
+					event.feedback |= DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
 				}
 
 				public void drop(DropTargetEvent event) {
-					dropAdapter.drop(event);
+					if (event.operations != DND.DROP_NONE && LocalSelectionTransfer.getTransfer().getSelection() != null && !LocalSelectionTransfer.getTransfer().getSelection().isEmpty()) {
+						IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
+						if (selection != null && !selection.isEmpty() && event.item != null && event.item.getData() != null) {
+							/*
+							 * the command uses these numbers instead of the
+							 * feedback constants (even though it converts in
+							 * the other direction as well)
+							 */
+							float feedbackFloat = getHeightInItem(event);
+
+							final DragNodeCommand command = new DragNodeCommand(event.item.getData(), feedbackFloat, event.operations, event.detail, selection.toList(), treeViewer);
+							if (command != null && command.canExecute()) {
+								SafeRunnable.run(new SafeRunnable() {
+									public void run() throws Exception {
+										command.execute();
+									}
+								});
+							}
+						}
+					}
 				}
 
 				public void dropAccept(DropTargetEvent event) {
-					dropAdapter.dropAccept(event);
+				}
+
+				private float getHeightInItem(DropTargetEvent event) {
+					if (event.item == null)
+						return .5f;
+					if (event.item instanceof TreeItem) {
+						TreeItem treeItem = (TreeItem) event.item;
+						Control control = treeItem.getParent();
+						Point point = control.toControl(new Point(event.x, event.y));
+						Rectangle bounds = treeItem.getBounds();
+						return (float) (point.y - bounds.y) / (float) bounds.height;
+					}
+					else if (event.item instanceof TableItem) {
+						TableItem tableItem = (TableItem) event.item;
+						Control control = tableItem.getParent();
+						Point point = control.toControl(new Point(event.x, event.y));
+						Rectangle bounds = tableItem.getBounds(0);
+						return (float) (point.y - bounds.y) / (float) bounds.height;
+					}
+					else {
+						return 0.0F;
+					}
 				}
 
 				public Transfer getTransfer() {
-					return ObjectTransfer.getInstance();
+					return LocalSelectionTransfer.getTransfer();
 				}
 
 				public boolean isEnabled(DropTargetEvent event) {