final int oldIndex = oldParent.getChildPosition(child);
if (oldParent != newParent || oldIndex != newIndex || changeSide != false) {
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);
newParentClones.remove(newParentClone);
}