 		return feed.isLocalFeed ? nil : feed
 	}
 
-	func validateLocalDrop(_ draggedFeeds: Set<PasteboardFeed>, parentNode: Node, proposedChildIndex index: Int) -> NSDragOperation {
-
-//		let parentNode = nodeForItem(item)
-
-		return SidebarOutlineDataSource.dragOperationNone
-	}
-
 	func validateSingleNonLocalFeedDrop(_ outlineView: NSOutlineView, _ draggedFeed: PasteboardFeed, _ parentNode: Node, _ index: Int) -> NSDragOperation {
 		// A non-local feed should always drag on to an Account or Folder node, with NSOutlineViewDropOnItemIndex — since we don’t know where it would sort till we read the feed.
 		guard let dropTargetNode = ancestorThatCanAcceptNonLocalFeed(parentNode) else {

	// MARK: - Drag and Drop

	func outlineView(_ outlineView: NSOutlineView, validateDrop info: NSDraggingInfo, proposedItem item: Any?, proposedChildIndex index: Int) -> NSDragOperation {
		let parentNode = nodeForItem(item)
		if parentNode == treeController.rootNode {
			return SidebarOutlineDataSource.dragOperationNone
		}

		guard let draggedFeeds = PasteboardFeed.pasteboardFeeds(with: info.draggingPasteboard()), !draggedFeeds.isEmpty else {
			return SidebarOutlineDataSource.dragOperationNone
		}

		let contentsType = draggedFeedContentsType(draggedFeeds)
		if contentsType == .empty || contentsType == .mixed || contentsType == .multipleNonLocal {
			return SidebarOutlineDataSource.dragOperationNone
		}

		if contentsType == .singleNonLocal {
			let draggedNonLocalFeed = singleNonLocalFeed(from: draggedFeeds)!
			return validateSingleNonLocalFeedDrop(outlineView, draggedNonLocalFeed, parentNode, index)
		}

//		let draggingSourceOutlineView = info.draggingSource() as? NSOutlineView
//		let isLocalDrop = draggingSourceOutlineView == outlineView

//		// If NSOutlineViewDropOnItemIndex, retarget to parent of parent item, if possible.
//		if index == NSOutlineViewDropOnItemIndex && !parentNode.canHaveChildNodes {
//			guard let grandparentNode = parentNode.parent, grandparentNode.canHaveChildNodes else {
//				return SidebarOutlineDataSource.dragOperationNone
//			}
//			outlineView.setDropItem(grandparentNode, dropChildIndex: NSOutlineViewDropOnItemIndex)
//			return isLocalDrop ? .move : .copy
//		}

//		if isLocalDrop {
//			return validateLocalDrop(draggedFeeds, parentNode: parentNode, proposedChildIndex: index)
//		}
		return SidebarOutlineDataSource.dragOperationNone
	}

	func outlineView(_ outlineView: NSOutlineView, acceptDrop info: NSDraggingInfo, item: Any?, childIndex index: Int) -> Bool {
		let parentNode = nodeForItem(item)
		if parentNode == treeController.rootNode {

		return .copy
	}

	func validateSingleLocalFeedDrop(_ outlineView: NSOutlineView, _ draggedFeed: PasteboardFeed, _ parentNode: Node, _ index: Int) -> NSDragOperation {
		// A local feed should always drag on to an Account or Folder node, and we can provide an index.
		guard let dropTargetNode = ancestorThatCanAcceptLocalFeed(parentNode) else {
			return SidebarOutlineDataSource.dragOperationNone
		}
		if nodeHasChildRepresentingDraggedFeed(dropTargetNode, draggedFeed) {
			return SidebarOutlineDataSource.dragOperationNone
		}
		let updatedIndex = indexWhereDraggedFeedWouldAppear(dropTargetNode, draggedFeed)
		if parentNode !== dropTargetNode || index != updatedIndex {
			outlineView.setDropItem(dropTargetNode, dropChildIndex: updatedIndex)
		}
		return .move
	}

	func validateLocalFeedsDrop(_ outlineView: NSOutlineView, _ draggedFeeds: Set<PasteboardFeed>, _ parentNode: Node, _ index: Int) -> NSDragOperation {
		// Local feeds should always drag on to an Account or Folder node, and index should be NSOutlineViewDropOnItemIndex since we can’t provide multiple indexes.
		guard let dropTargetNode = ancestorThatCanAcceptLocalFeed(parentNode) else {
			return SidebarOutlineDataSource.dragOperationNone
		}
		if nodeHasChildRepresentingAnyDraggedFeed(dropTargetNode, draggedFeeds) {
			return SidebarOutlineDataSource.dragOperationNone
		}
		if parentNode !== dropTargetNode || index != NSOutlineViewDropOnItemIndex {
			outlineView.setDropItem(dropTargetNode, dropChildIndex: NSOutlineViewDropOnItemIndex)
		}
		return .move
	}

	func nodeIsAccountOrFolder(_ node: Node) -> Bool {
		return node.representedObject is Account || node.representedObject is Folder
	}

	func nodeIsDropTarget(_ node: Node) -> Bool {
		return node.canHaveChildNodes && nodeIsAccountOrFolder(node)
	}

	func ancestorThatCanAcceptLocalFeed(_ node: Node) -> Node? {
		if nodeIsDropTarget(node) {
			return node
		}
		guard let parentNode = node.parent else {
			return nil
		}
		return ancestorThatCanAcceptLocalFeed(parentNode)
	}

	func ancestorThatCanAcceptNonLocalFeed(_ node: Node) -> Node? {
