final Set<NodeModel> oldParentClones = new HashSet<NodeModel>(oldParent.clones().toCollection());
final Set<NodeModel> newParentClones = new HashSet<NodeModel>(newParent.clones().toCollection());
final NodeRelativePath nodeRelativePath = new NodeRelativePath(oldParent, newParent);
final NodeModel commonAncestor = nodeRelativePath.commonAncestor();
for (NodeModel commonAncestorClone: commonAncestor.clones()){
NodeModel oldParentClone = nodeRelativePath.pathBegin(commonAncestorClone);
NodeModel newParentClone = nodeRelativePath.pathEnd(commonAncestorClone);
moveSingleNode(oldParentClone.getChildAt(oldIndex), newParentClone, newIndex, isLeft, changeSide);
oldParentClones.remove(oldParentClone);