public final boolean setParentNode(NodeState new_parent_node, String tag_name){
    // nape parent node is null
    if( new_parent_node == null){
      clearParentConnection();
      return true;
    }
    // tagname is null
    if( tag_name == null ){
      return false;
    }
    
    if( new_parent_node == this ){ //STUPID, but DAU's welcome  ;)
      return false;
    }
    
    // everything stays the same
    if( this.parent_node == new_parent_node && tag_name.equals(this.tag_name)){
      return true;
    }
      
    // check if tag_name exists in in this and parent
    if( this.md3 == null || new_parent_node.md3 == null){
      return false;
    }
    MD3_Tag tag_current =            this.md3.getTagByName(0, tag_name);
    MD3_Tag tag_parent  = new_parent_node.md3.getTagByName(0, tag_name);
    if( tag_current == null || tag_parent == null) {
      return false;
    }

    // ready for new connection:
    // delete old connection
    clearParentConnection();
    // make new connection
    makeParentConnection(new_parent_node, tag_name, tag_current.INDEX, tag_parent .INDEX);
    return true;
  }