Node applyExtensionRule2( Node node, int edgeLabelBegin, int edgeLabelEnd, 
			int pathPos, int edgePos, Rule2Type type ) throws MVDException
	{
	   Node newLeaf,newInternal,son;
	   // newSon
	   if ( type == Rule2Type.newSon )                                       
	   {
		  if ( debug )
			  System.out.println("rule 2: new leaf ("+edgeLabelBegin+","
				+edgeLabelEnd+")");
	      // create a new leaf (4) with the characters of the extension 
	      newLeaf = new Node( node, edgeLabelBegin, edgeLabelEnd, pathPos );
	      // connect newLeaf (4) as the new son of node (1) 
	      son = node.sons;
	      while ( son.rightSibling != null )
	         son = son.rightSibling;
	      connectSiblings(son, newLeaf);
	      // return (4)
	      return newLeaf;
	   }
	   // split
	   if ( debug )
		   System.out.println( "rule 2: split ("+edgeLabelBegin+","
				+edgeLabelEnd+")" );
	   // create a new internal node (3) at the split point
	   newInternal = new Node( node.father, node.edgeLabelStart,
	       node.edgeLabelStart+edgePos, node.pathPosition );
	   // update the node (1) incoming edge starting index (it now starts 
	   // where node (3) incoming edge ends)
	   node.edgeLabelStart += edgePos+1;
	   // create a new leaf (2) with the characters of the extension 
	   newLeaf = new Node( newInternal, edgeLabelBegin, edgeLabelEnd, pathPos );
	   // connect newInternal (3) where node (1) was 
	   // connect (3) with (1)'s left sibling 
	   connectSiblings( node.leftSibling, newInternal );   
	   // connect (3) with (1)'s right sibling
	   connectSiblings( newInternal, node.rightSibling );
	   node.leftSibling = null;
	   // connect (3) with (1)'s father 
	   if ( newInternal.father.sons == node )            
	      newInternal.father.sons = newInternal;
	   // connect newLeaf (2) and node (1) as sons of newInternal (3)
	   newInternal.sons = node;
	   node.father = newInternal;
	   connectSiblings( node, newLeaf );
	   // return (3) 
	   return newInternal;
	}