docs: protected IndexTreePath<SpatialEntry> createNewRoot(final N oldRoot, final N newNode, int splitAxis) {
      N root = createNewDirectoryNode();
      writeNode(root);
      // get split history
      SplitHistory sh = null;
      // TODO: see whether root entry is ALWAYS a directory entry .. it SHOULD!
      sh = ((XTreeDirectoryEntry) getRootEntry()).getSplitHistory();
      if(sh == null) {
        sh = new SplitHistory(getDimensionality());
      }
      sh.setDim(splitAxis);
  
      // switch the ids
      oldRoot.setPageID(root.getPageID());
      if(!oldRoot.isLeaf()) {
        // TODO: test whether this is neccessary
        for(int i = 0; i < oldRoot.getNumEntries(); i++) {
          N node = getNode(oldRoot.getEntry(i));
          writeNode(node);
        }
      }
      // adjust supernode id
      if(oldRoot.isSuperNode()) {
        supernodes.remove(Long.valueOf(getRootID()));
        supernodes.put(Long.valueOf(oldRoot.getPageID()), oldRoot);
      }
  
      root.setPageID(getRootID());
      SpatialEntry oldRootEntry = createNewDirectoryEntry(oldRoot);
      SpatialEntry newNodeEntry = createNewDirectoryEntry(newNode);
      ((SplitHistorySpatialEntry) oldRootEntry).setSplitHistory(sh);
      try {
        ((SplitHistorySpatialEntry) newNodeEntry).setSplitHistory((SplitHistory) sh.clone());
      }
      catch(CloneNotSupportedException e) {
        throw new RuntimeException("Clone of a split history should not throw an Exception", e);
      }
      root.addDirectoryEntry(oldRootEntry);
      root.addDirectoryEntry(newNodeEntry);
  
      writeNode(root);
      writeNode(oldRoot);
      writeNode(newNode);
      if(getLogger().isDebugging()) {
        getLogger().debugFine(new StringBuilder(1000).append("Create new Root: ID=").append(root.getPageID()) //
            .append("\nchild1 ").append(oldRoot).append(' ').append(new HyperBoundingBox(oldRootEntry)) //
            .append("\nchild2 ").append(newNode).append(' ').append(new HyperBoundingBox(newNodeEntry)));
      }
      // the root entry still needs to be set to the new root node's MBR
      return new IndexTreePath<>(null, getRootEntry(), 0);
    }