public void drop(DropTargetDropEvent e) {
		try {
			Transferable tr = e.getTransferable();
			
			// flavor not supported, reject drop
			if (! tr.isDataFlavorSupported(DndTreeNode.FOLDER_FLAVOR)) {
				e.rejectDrop();
			}
			
			//cast into appropriate data type
			DndTreeNode node = (DndTreeNode)tr.getTransferData(DndTreeNode.FOLDER_FLAVOR);
			
			//get new parent node
			Point loc = e.getLocation();
			TreePath destinationPath = getPathForLocation(loc.x, loc.y);
			
			final String msg = testDropTarget(destinationPath, selectedTreePath);
			final Frame  parent = getFrame();
			if (msg != null) {
				e.rejectDrop();
				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						JOptionPane.showMessageDialog(
								parent, msg, "Error Dialog", JOptionPane.ERROR_MESSAGE);
					}
				});
				return;
			}
			
			// Retrieve the new and old parent nodes
			DndTreeNode newParent = (DndTreeNode)destinationPath.getLastPathComponent();
			DndTreeNode oldParent = (DndTreeNode)getSelectedNode().getParent();
			
			try {
				oldParent.remove(getSelectedNode());
				newParent.add(node);
				e.acceptDrop(DnDConstants.ACTION_MOVE);
			} catch (java.lang.IllegalStateException ils) {
				e.rejectDrop();
			}
			e.getDropTargetContext().dropComplete(true);
			
			//expand nodes appropriately - this probably isnt the best way...
			DefaultTreeModel model = (DefaultTreeModel) getModel();
			model.reload(oldParent);
			model.reload(newParent);
			TreePath parentPath = new TreePath(newParent.getPath());
			expandPath(parentPath);
		}
		catch (IOException io) { e.rejectDrop(); }
		catch (UnsupportedFlavorException ufe) {e.rejectDrop();}
	}