{
       this.key = key;
       this.val = val;
-      flags |= Flag.RearSticky;
     }
 
     public MTextProperty (MSymbol key, object val,
     {
       check_pos (pos, true);
 
+      if (from == to)
+       return;
       int pos_idx = pos_to_idx (this, pos);
       int from_idx = pos_to_idx (mt2, from);
       int to_idx = pos_to_idx (mt2, to);
 
       private MInterval LeftMost
       {
-       get { return (Left == null ? this : Left.LeftMost); }
+       get {
+         if (Left == null)
+           return this;
+         Left.update_from_to ();
+         return Left.LeftMost;
+       }
       }
 
       private MInterval RightMost
       {
-       get { return (Right == null ? this : Right.RightMost); }
+       get {
+         if (Right == null)
+           return this;
+         Right.update_from_to ();
+         return Right.RightMost;
+       }
       }
 
       private MInterval Prev {
          MInterval i;
 
          if (Left != null)
-           for (i = Left; i.Right != null; i = i.Right);
+           for (i = Left; i.Right != null; i = i.Right)
+             i.update_from_to ();
          else
            {
              MInterval child = this;
              for (i = Parent; i != null && i.Left == child;
-                  child = i, i = i.Parent);
+                  child = i, i = i.Parent)
+               i.update_from_to ();
            }
          return i;
        }
          MInterval i;
 
          if (Right != null)
-           for (i = Right; i.Left != null; i = i.Left);
+           for (i = Right; i.Left != null; i = i.Left)
+             i.update_from_to ();
          else
            {
              MInterval child = this;
              for (i = Parent; i != null && i.Right == child;
-                  child = i, i = i.Parent);
+                  child = i, i = i.Parent)
+               i.update_from_to ();
            }
          return i;
        }
       {
        update_from_to ();
        M17N.DebugPrint ("insert({0}) at {1} in ", interval.Length, pos);
-       DumpOne (false, true);
+       DumpOne (false, false);
 
        interval.set_mtext (mtext);
 
          }
        else                    // (pos > To)
          Next.Insert (pos, interval);
+       M17N.DebugPrint (" done\n");
       }
 
       private void vacate_node (MInterval interval)