private PO createNode(int nodeId, int parentId) {
    final String nodeTableName = getNodeTableName();
    PO node = null;
    if (nodeTableName.equals(MTree_Node.Table_Name)) {
      MTree_Node n = new MTree_Node(this, nodeId);
      if (nodeId != ROOT_Node_ID) n.setParent_ID(parentId);
      node = n;
    } else if (nodeTableName.equals(MTree_NodeBP.Table_Name)) {
      MTree_NodeBP n = new MTree_NodeBP(this, nodeId);
      if (nodeId != ROOT_Node_ID) n.setParent_ID(parentId);
      node = n;
    } else if (nodeTableName.equals(MTree_NodePR.Table_Name)) {
      MTree_NodePR n = new MTree_NodePR(this, nodeId);
      if (nodeId != ROOT_Node_ID) n.setParent_ID(parentId);
      node = n;
    } else if (nodeTableName.equals(MTree_NodeMM.Table_Name)) {
      MTree_NodeMM n = new MTree_NodeMM(this, nodeId);
      if (nodeId != ROOT_Node_ID) n.setParent_ID(parentId);
      node = n;
    } else {
      throw new AdempiereException("No Table Model for " + nodeTableName);
    }

    node.saveEx();
    return node;
  }
  /**
   * Add Node to correct tree
   *
   * @param ctx cpntext
   * @param treeType tree type
   * @param Record_ID id
   * @param trxName transaction
   * @return true if node added
   */
  public static boolean addNode(Properties ctx, String treeType, int Record_ID, String trxName) {
    // TODO: Check & refactor this
    // Get Tree
    int AD_Tree_ID = 0;
    MClient client = MClient.get(ctx);
    I_AD_ClientInfo ci = client.getInfo();

    if (TREETYPE_Activity.equals(treeType)) AD_Tree_ID = ci.getAD_Tree_Activity_ID();
    else if (TREETYPE_BoM.equals(treeType))
      throw new IllegalArgumentException("BoM Trees not supported");
    else if (TREETYPE_BPartner.equals(treeType)) AD_Tree_ID = ci.getAD_Tree_BPartner_ID();
    else if (TREETYPE_Campaign.equals(treeType)) AD_Tree_ID = ci.getAD_Tree_Campaign_ID();
    else if (TREETYPE_ElementValue.equals(treeType))
      throw new IllegalArgumentException("ElementValue cannot use this API");
    else if (TREETYPE_Menu.equals(treeType)) AD_Tree_ID = ci.getAD_Tree_Menu_ID();
    else if (TREETYPE_Organization.equals(treeType)) AD_Tree_ID = ci.getAD_Tree_Org_ID();
    else if (TREETYPE_Product.equals(treeType)) AD_Tree_ID = ci.getAD_Tree_Product_ID();
    else if (TREETYPE_ProductCategory.equals(treeType))
      throw new IllegalArgumentException("Product Category Trees not supported");
    else if (TREETYPE_Project.equals(treeType)) AD_Tree_ID = ci.getAD_Tree_Project_ID();
    else if (TREETYPE_SalesRegion.equals(treeType)) AD_Tree_ID = ci.getAD_Tree_SalesRegion_ID();

    if (AD_Tree_ID == 0) throw new IllegalArgumentException("No Tree found");
    MTree_Base tree = MTree_Base.get(ctx, AD_Tree_ID, trxName);
    if (tree.get_ID() != AD_Tree_ID)
      throw new IllegalArgumentException("Tree found AD_Tree_ID=" + AD_Tree_ID);

    // Insert Tree in correct tree
    boolean saved = false;
    if (TREETYPE_Menu.equals(treeType)) {
      MTree_NodeMM node = new MTree_NodeMM(tree, Record_ID);
      saved = node.save();
    } else if (TREETYPE_BPartner.equals(treeType)) {
      MTree_NodeBP node = new MTree_NodeBP(tree, Record_ID);
      saved = node.save();
    } else if (TREETYPE_Product.equals(treeType)) {
      MTree_NodePR node = new MTree_NodePR(tree, Record_ID);
      saved = node.save();
    } else {
      MTree_Node node = new MTree_Node(tree, Record_ID);
      saved = node.save();
    }
    return saved;
  } // addNode