diff --git a/sablecc-runtime/src/main/java/de/hhu/stups/sablecc/patch/PositionedNode.java b/sablecc-runtime/src/main/java/de/hhu/stups/sablecc/patch/PositionedNode.java
index d26abd46336d98e28e3785e8858d9987bc5b897f..574d0e9ad4aecb8052f5ee49bf27c1c210d0356a 100644
--- a/sablecc-runtime/src/main/java/de/hhu/stups/sablecc/patch/PositionedNode.java
+++ b/sablecc-runtime/src/main/java/de/hhu/stups/sablecc/patch/PositionedNode.java
@@ -10,6 +10,19 @@ public class PositionedNode {
   private SourcePosition startPos;
   private SourcePosition endPos;
 
+  public PositionedNode(final SourcePosition startPos, final SourcePosition endPos) {
+    this.startPos = startPos;
+    this.endPos = endPos;
+  }
+
+  public PositionedNode() {
+    this(null, null);
+  }
+
+  public PositionedNode(final PositionedNode node) {
+    this(node.startPos, node.endPos);
+  }
+
   public SourcePosition getStartPos() {
     /*
      * Special treatment for tokens because they don't get a position in the
diff --git a/src/main/java/org/sablecc/sablecc/GenAlts.java b/src/main/java/org/sablecc/sablecc/GenAlts.java
index 3edc0437607243545cf2805ec2a0cf307a4f66db..8d92b5f05154e985aca24a7cce8e18c038874355 100644
--- a/src/main/java/org/sablecc/sablecc/GenAlts.java
+++ b/src/main/java/org/sablecc/sablecc/GenAlts.java
@@ -247,20 +247,20 @@ public class GenAlts extends DepthFirstAdapter
           case ElemInfo.NONE:
             {
               macros.apply(file, "CloneBodyNode",
-                           new String[] {info.type, nodeName(info.name), i.hasNext() ? "," : ""});
+                           new String[] {info.name, nodeName(info.name)});
             }
             break;
           case ElemInfo.STAR:
           case ElemInfo.PLUS:
             {
               macros.apply(file, "CloneBodyList",
-                           new String[] {nodeName(info.name), i.hasNext() ? "," : ""});
+                           new String[] {info.name, nodeName(info.name)});
             }
             break;
           }
       }
 
-      macros.apply(file, "CloneTail", null);
+      macros.apply(file, "CloneTail", new String[] {name});
 
       macros.apply(file, "Apply", new String[] {name});
 
diff --git a/src/main/java/org/sablecc/sablecc/node/AAlt.java b/src/main/java/org/sablecc/sablecc/node/AAlt.java
index 2d7f69f7bfca5402cd6d852ec2f093a19ce53019..144ab37c8b6026ac8124a54fcd0c01b4488abd2c 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAlt.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAlt.java
@@ -31,13 +31,18 @@ public final class AAlt extends PAlt
 
     }
 
+    public AAlt(AAlt node)
+    {
+        super(node);
+        setAltName(cloneNode(node._altName_));
+        setElems(cloneList(node._elems_));
+        setAltTransform(cloneNode(node._altTransform_));
+    }
+
     @Override
     public AAlt clone()
     {
-        return new AAlt(
-            cloneNode(this._altName_),
-            cloneList(this._elems_),
-            cloneNode(this._altTransform_));
+        return new AAlt(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AAltTransform.java b/src/main/java/org/sablecc/sablecc/node/AAltTransform.java
index 1693edacbbd0be69d886808a33d7b7a947075e67..16c9d4d0bd2a81f4c7a9eb46321a683afe78222a 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAltTransform.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAltTransform.java
@@ -31,13 +31,18 @@ public final class AAltTransform extends PAltTransform
 
     }
 
+    public AAltTransform(AAltTransform node)
+    {
+        super(node);
+        setLBrace(cloneNode(node._lBrace_));
+        setTerms(cloneList(node._terms_));
+        setRBrace(cloneNode(node._rBrace_));
+    }
+
     @Override
     public AAltTransform clone()
     {
-        return new AAltTransform(
-            cloneNode(this._lBrace_),
-            cloneList(this._terms_),
-            cloneNode(this._rBrace_));
+        return new AAltTransform(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AAst.java b/src/main/java/org/sablecc/sablecc/node/AAst.java
index ae6e7e338fea65d3ca0a4e300fdb4c1d6e771ca0..c5002df4a52bc895fa0934205fe8c34aec79cafc 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAst.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAst.java
@@ -23,11 +23,16 @@ public final class AAst extends PAst
 
     }
 
+    public AAst(AAst node)
+    {
+        super(node);
+        setProds(cloneList(node._prods_));
+    }
+
     @Override
     public AAst clone()
     {
-        return new AAst(
-            cloneList(this._prods_));
+        return new AAst(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AAstAlt.java b/src/main/java/org/sablecc/sablecc/node/AAstAlt.java
index e847561751c22fd8fe0acc8e01ce358eea9bb8f7..ade7c7e1ed01917d3f843d4dedb37d88c0a8b277 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAstAlt.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAstAlt.java
@@ -27,12 +27,17 @@ public final class AAstAlt extends PAstAlt
 
     }
 
+    public AAstAlt(AAstAlt node)
+    {
+        super(node);
+        setAltName(cloneNode(node._altName_));
+        setElems(cloneList(node._elems_));
+    }
+
     @Override
     public AAstAlt clone()
     {
-        return new AAstAlt(
-            cloneNode(this._altName_),
-            cloneList(this._elems_));
+        return new AAstAlt(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AAstProd.java b/src/main/java/org/sablecc/sablecc/node/AAstProd.java
index a261769fb665167adef68140e8f912b8037f7943..bf451c69cc0c9650809b694778c96d181ee0d73d 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAstProd.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAstProd.java
@@ -27,12 +27,17 @@ public final class AAstProd extends PAstProd
 
     }
 
+    public AAstProd(AAstProd node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+        setAlts(cloneList(node._alts_));
+    }
+
     @Override
     public AAstProd clone()
     {
-        return new AAstProd(
-            cloneNode(this._id_),
-            cloneList(this._alts_));
+        return new AAstProd(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ACharBasic.java b/src/main/java/org/sablecc/sablecc/node/ACharBasic.java
index c4d4d2a833e70d70517e5b098642d87124cd783d..e2c2c290835a2f9a2063c212bfd8ffc0fcf1e239 100644
--- a/src/main/java/org/sablecc/sablecc/node/ACharBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/ACharBasic.java
@@ -22,11 +22,16 @@ public final class ACharBasic extends PBasic
 
     }
 
+    public ACharBasic(ACharBasic node)
+    {
+        super(node);
+        setChar(cloneNode(node._char_));
+    }
+
     @Override
     public ACharBasic clone()
     {
-        return new ACharBasic(
-            cloneNode(this._char_));
+        return new ACharBasic(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ACharChar.java b/src/main/java/org/sablecc/sablecc/node/ACharChar.java
index 37a29b80eec375183a0efc718d1ccb7974a00928..c843556274ff14ff8c5ed26eba4085bce641344a 100644
--- a/src/main/java/org/sablecc/sablecc/node/ACharChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/ACharChar.java
@@ -22,11 +22,16 @@ public final class ACharChar extends PChar
 
     }
 
+    public ACharChar(ACharChar node)
+    {
+        super(node);
+        setChar(cloneNode(node._char_));
+    }
+
     @Override
     public ACharChar clone()
     {
-        return new ACharChar(
-            cloneNode(this._char_));
+        return new ACharChar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AConcat.java b/src/main/java/org/sablecc/sablecc/node/AConcat.java
index 9b5977adc3195ca853d3a6a159db8f45cdc7c13e..a3c666d899b9eba07d7f60c3d1dd7c14f86aefa7 100644
--- a/src/main/java/org/sablecc/sablecc/node/AConcat.java
+++ b/src/main/java/org/sablecc/sablecc/node/AConcat.java
@@ -23,11 +23,16 @@ public final class AConcat extends PConcat
 
     }
 
+    public AConcat(AConcat node)
+    {
+        super(node);
+        setUnExps(cloneList(node._unExps_));
+    }
+
     @Override
     public AConcat clone()
     {
-        return new AConcat(
-            cloneList(this._unExps_));
+        return new AConcat(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ADecChar.java b/src/main/java/org/sablecc/sablecc/node/ADecChar.java
index 92025a2a4e60711e7ee7386dccf7b4f8f47271b4..31c50336ad18ef60fe1ef63de05d70f27111b186 100644
--- a/src/main/java/org/sablecc/sablecc/node/ADecChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/ADecChar.java
@@ -22,11 +22,16 @@ public final class ADecChar extends PChar
 
     }
 
+    public ADecChar(ADecChar node)
+    {
+        super(node);
+        setDecChar(cloneNode(node._decChar_));
+    }
+
     @Override
     public ADecChar clone()
     {
-        return new ADecChar(
-            cloneNode(this._decChar_));
+        return new ADecChar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AElem.java b/src/main/java/org/sablecc/sablecc/node/AElem.java
index 9b1daba89a47168c07372ce8cceeb05bd2edd5f9..70985fa2053b5bd3e69a3d48e2e7d94c07881e34 100644
--- a/src/main/java/org/sablecc/sablecc/node/AElem.java
+++ b/src/main/java/org/sablecc/sablecc/node/AElem.java
@@ -34,14 +34,19 @@ public final class AElem extends PElem
 
     }
 
+    public AElem(AElem node)
+    {
+        super(node);
+        setElemName(cloneNode(node._elemName_));
+        setSpecifier(cloneNode(node._specifier_));
+        setId(cloneNode(node._id_));
+        setUnOp(cloneNode(node._unOp_));
+    }
+
     @Override
     public AElem clone()
     {
-        return new AElem(
-            cloneNode(this._elemName_),
-            cloneNode(this._specifier_),
-            cloneNode(this._id_),
-            cloneNode(this._unOp_));
+        return new AElem(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AGrammar.java b/src/main/java/org/sablecc/sablecc/node/AGrammar.java
index 9a3c3b40ae9178415a89bf531b2c7f1908d808a2..1408be174f1495e9d50121985c3ab83e92401a2c 100644
--- a/src/main/java/org/sablecc/sablecc/node/AGrammar.java
+++ b/src/main/java/org/sablecc/sablecc/node/AGrammar.java
@@ -47,17 +47,22 @@ public final class AGrammar extends PGrammar
 
     }
 
+    public AGrammar(AGrammar node)
+    {
+        super(node);
+        setPackage(cloneList(node._package_));
+        setHelpers(cloneNode(node._helpers_));
+        setStates(cloneNode(node._states_));
+        setTokens(cloneNode(node._tokens_));
+        setIgnTokens(cloneNode(node._ignTokens_));
+        setProductions(cloneNode(node._productions_));
+        setAst(cloneNode(node._ast_));
+    }
+
     @Override
     public AGrammar clone()
     {
-        return new AGrammar(
-            cloneList(this._package_),
-            cloneNode(this._helpers_),
-            cloneNode(this._states_),
-            cloneNode(this._tokens_),
-            cloneNode(this._ignTokens_),
-            cloneNode(this._productions_),
-            cloneNode(this._ast_));
+        return new AGrammar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AHelperDef.java b/src/main/java/org/sablecc/sablecc/node/AHelperDef.java
index 9b9a77316367539e7b75fe76bf9a0ba87a5f135b..872f966d1c3f06975db23d335cc41d9ea212b2fa 100644
--- a/src/main/java/org/sablecc/sablecc/node/AHelperDef.java
+++ b/src/main/java/org/sablecc/sablecc/node/AHelperDef.java
@@ -26,12 +26,17 @@ public final class AHelperDef extends PHelperDef
 
     }
 
+    public AHelperDef(AHelperDef node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+        setRegExp(cloneNode(node._regExp_));
+    }
+
     @Override
     public AHelperDef clone()
     {
-        return new AHelperDef(
-            cloneNode(this._id_),
-            cloneNode(this._regExp_));
+        return new AHelperDef(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AHelpers.java b/src/main/java/org/sablecc/sablecc/node/AHelpers.java
index 2205d2bf25d441e48424738a95c5e4754b89fb93..5b5f96a2fc755b92da1c790d5ed37651689977a9 100644
--- a/src/main/java/org/sablecc/sablecc/node/AHelpers.java
+++ b/src/main/java/org/sablecc/sablecc/node/AHelpers.java
@@ -23,11 +23,16 @@ public final class AHelpers extends PHelpers
 
     }
 
+    public AHelpers(AHelpers node)
+    {
+        super(node);
+        setHelperDefs(cloneList(node._helperDefs_));
+    }
+
     @Override
     public AHelpers clone()
     {
-        return new AHelpers(
-            cloneList(this._helperDefs_));
+        return new AHelpers(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AHexChar.java b/src/main/java/org/sablecc/sablecc/node/AHexChar.java
index d20a390e45c8214f3886d1a5b1d83c82456eb32e..03913724395d8f7bee061d6a68c0bb2d8c8a0f8d 100644
--- a/src/main/java/org/sablecc/sablecc/node/AHexChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/AHexChar.java
@@ -22,11 +22,16 @@ public final class AHexChar extends PChar
 
     }
 
+    public AHexChar(AHexChar node)
+    {
+        super(node);
+        setHexChar(cloneNode(node._hexChar_));
+    }
+
     @Override
     public AHexChar clone()
     {
-        return new AHexChar(
-            cloneNode(this._hexChar_));
+        return new AHexChar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AIdBasic.java b/src/main/java/org/sablecc/sablecc/node/AIdBasic.java
index 8b908945a068a76cfa356f8e88336846b6fcd2b4..8ce3a09337bf32bc4de18b083f419640490b6f4b 100644
--- a/src/main/java/org/sablecc/sablecc/node/AIdBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/AIdBasic.java
@@ -22,11 +22,16 @@ public final class AIdBasic extends PBasic
 
     }
 
+    public AIdBasic(AIdBasic node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+    }
+
     @Override
     public AIdBasic clone()
     {
-        return new AIdBasic(
-            cloneNode(this._id_));
+        return new AIdBasic(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AIgnTokens.java b/src/main/java/org/sablecc/sablecc/node/AIgnTokens.java
index 5fad1bc061908c5d5674092511d2d3f591a44575..4e89102c1903fe8b3ccd83a88ae9a6d4ffdb3600 100644
--- a/src/main/java/org/sablecc/sablecc/node/AIgnTokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/AIgnTokens.java
@@ -23,11 +23,16 @@ public final class AIgnTokens extends PIgnTokens
 
     }
 
+    public AIgnTokens(AIgnTokens node)
+    {
+        super(node);
+        setListId(cloneList(node._listId_));
+    }
+
     @Override
     public AIgnTokens clone()
     {
-        return new AIgnTokens(
-            cloneList(this._listId_));
+        return new AIgnTokens(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AIntervalSet.java b/src/main/java/org/sablecc/sablecc/node/AIntervalSet.java
index 4d182030e88b13765def80eecec9bd2885401077..dbd1b004938d96aba08682da410bcc1eb8e67293 100644
--- a/src/main/java/org/sablecc/sablecc/node/AIntervalSet.java
+++ b/src/main/java/org/sablecc/sablecc/node/AIntervalSet.java
@@ -26,12 +26,17 @@ public final class AIntervalSet extends PSet
 
     }
 
+    public AIntervalSet(AIntervalSet node)
+    {
+        super(node);
+        setLeft(cloneNode(node._left_));
+        setRight(cloneNode(node._right_));
+    }
+
     @Override
     public AIntervalSet clone()
     {
-        return new AIntervalSet(
-            cloneNode(this._left_),
-            cloneNode(this._right_));
+        return new AIntervalSet(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AListTerm.java b/src/main/java/org/sablecc/sablecc/node/AListTerm.java
index d8ac882986f78ba37ba141a13ede881dbae1e916..33ef29cd0c671b9d752bbd7bb36b46c79a776b9d 100644
--- a/src/main/java/org/sablecc/sablecc/node/AListTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/AListTerm.java
@@ -27,12 +27,17 @@ public final class AListTerm extends PTerm
 
     }
 
+    public AListTerm(AListTerm node)
+    {
+        super(node);
+        setLBkt(cloneNode(node._lBkt_));
+        setListTerms(cloneList(node._listTerms_));
+    }
+
     @Override
     public AListTerm clone()
     {
-        return new AListTerm(
-            cloneNode(this._lBkt_),
-            cloneList(this._listTerms_));
+        return new AListTerm(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AMinusBinOp.java b/src/main/java/org/sablecc/sablecc/node/AMinusBinOp.java
index 835b9ff909e29f4e1e6883a1d48fd724048c6aaf..f83b25fd65f5487f1ec3b746148bafe2b0f221e5 100644
--- a/src/main/java/org/sablecc/sablecc/node/AMinusBinOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/AMinusBinOp.java
@@ -13,10 +13,15 @@ public final class AMinusBinOp extends PBinOp
         // Constructor
     }
 
+    public AMinusBinOp(AMinusBinOp node)
+    {
+        super(node);
+    }
+
     @Override
     public AMinusBinOp clone()
     {
-        return new AMinusBinOp();
+        return new AMinusBinOp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ANewListTerm.java b/src/main/java/org/sablecc/sablecc/node/ANewListTerm.java
index 43dd3b20874877be17967a7f679ce644c2b255b7..d90bcba479d7d8106b4f28e99c5968397378a3b1 100644
--- a/src/main/java/org/sablecc/sablecc/node/ANewListTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ANewListTerm.java
@@ -31,13 +31,18 @@ public final class ANewListTerm extends PListTerm
 
     }
 
+    public ANewListTerm(ANewListTerm node)
+    {
+        super(node);
+        setProdName(cloneNode(node._prodName_));
+        setLPar(cloneNode(node._lPar_));
+        setParams(cloneList(node._params_));
+    }
+
     @Override
     public ANewListTerm clone()
     {
-        return new ANewListTerm(
-            cloneNode(this._prodName_),
-            cloneNode(this._lPar_),
-            cloneList(this._params_));
+        return new ANewListTerm(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ANewTerm.java b/src/main/java/org/sablecc/sablecc/node/ANewTerm.java
index be1dc74571fa009e969f6d3de52f9e9d1286af16..5b15adbda881acec82476b5edbd11a88bbe8b15c 100644
--- a/src/main/java/org/sablecc/sablecc/node/ANewTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ANewTerm.java
@@ -31,13 +31,18 @@ public final class ANewTerm extends PTerm
 
     }
 
+    public ANewTerm(ANewTerm node)
+    {
+        super(node);
+        setProdName(cloneNode(node._prodName_));
+        setLPar(cloneNode(node._lPar_));
+        setParams(cloneList(node._params_));
+    }
+
     @Override
     public ANewTerm clone()
     {
-        return new ANewTerm(
-            cloneNode(this._prodName_),
-            cloneNode(this._lPar_),
-            cloneList(this._params_));
+        return new ANewTerm(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ANullTerm.java b/src/main/java/org/sablecc/sablecc/node/ANullTerm.java
index 8a02cd29be264e174b860605d44fcd4d4212ea18..7054505a7a1ef9ae63394fc304f87c6f2ae981a6 100644
--- a/src/main/java/org/sablecc/sablecc/node/ANullTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ANullTerm.java
@@ -13,10 +13,15 @@ public final class ANullTerm extends PTerm
         // Constructor
     }
 
+    public ANullTerm(ANullTerm node)
+    {
+        super(node);
+    }
+
     @Override
     public ANullTerm clone()
     {
-        return new ANullTerm();
+        return new ANullTerm(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AOperationSet.java b/src/main/java/org/sablecc/sablecc/node/AOperationSet.java
index 3e89f909c2796573fdf6244c4dceba82f0070eab..d34ea9083b2320230c007b7ce205715ed0c1c8eb 100644
--- a/src/main/java/org/sablecc/sablecc/node/AOperationSet.java
+++ b/src/main/java/org/sablecc/sablecc/node/AOperationSet.java
@@ -30,13 +30,18 @@ public final class AOperationSet extends PSet
 
     }
 
+    public AOperationSet(AOperationSet node)
+    {
+        super(node);
+        setLeft(cloneNode(node._left_));
+        setBinOp(cloneNode(node._binOp_));
+        setRight(cloneNode(node._right_));
+    }
+
     @Override
     public AOperationSet clone()
     {
-        return new AOperationSet(
-            cloneNode(this._left_),
-            cloneNode(this._binOp_),
-            cloneNode(this._right_));
+        return new AOperationSet(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/APlusBinOp.java b/src/main/java/org/sablecc/sablecc/node/APlusBinOp.java
index 30b4a0cfcd1b18b181135618e9d12631e5836580..37600cb7b4a975622dde5b3c3a7a6bc09daf3c9c 100644
--- a/src/main/java/org/sablecc/sablecc/node/APlusBinOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/APlusBinOp.java
@@ -13,10 +13,15 @@ public final class APlusBinOp extends PBinOp
         // Constructor
     }
 
+    public APlusBinOp(APlusBinOp node)
+    {
+        super(node);
+    }
+
     @Override
     public APlusBinOp clone()
     {
-        return new APlusBinOp();
+        return new APlusBinOp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/APlusUnOp.java b/src/main/java/org/sablecc/sablecc/node/APlusUnOp.java
index 9ecf271b2e2a17f6e1a10de2fa178e5a05a13fcc..d31ac09b57b26ae668c4f218bc75b23ef6061ec5 100644
--- a/src/main/java/org/sablecc/sablecc/node/APlusUnOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/APlusUnOp.java
@@ -22,11 +22,16 @@ public final class APlusUnOp extends PUnOp
 
     }
 
+    public APlusUnOp(APlusUnOp node)
+    {
+        super(node);
+        setPlus(cloneNode(node._plus_));
+    }
+
     @Override
     public APlusUnOp clone()
     {
-        return new APlusUnOp(
-            cloneNode(this._plus_));
+        return new APlusUnOp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AProd.java b/src/main/java/org/sablecc/sablecc/node/AProd.java
index 829b66bb31a8a8e9d6594c679a9da10a722c76ed..d058034bd0aebeceeaef06d86c224e16a49bb50f 100644
--- a/src/main/java/org/sablecc/sablecc/node/AProd.java
+++ b/src/main/java/org/sablecc/sablecc/node/AProd.java
@@ -35,14 +35,19 @@ public final class AProd extends PProd
 
     }
 
+    public AProd(AProd node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+        setArrow(cloneNode(node._arrow_));
+        setProdTransform(cloneList(node._prodTransform_));
+        setAlts(cloneList(node._alts_));
+    }
+
     @Override
     public AProd clone()
     {
-        return new AProd(
-            cloneNode(this._id_),
-            cloneNode(this._arrow_),
-            cloneList(this._prodTransform_),
-            cloneList(this._alts_));
+        return new AProd(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AProdName.java b/src/main/java/org/sablecc/sablecc/node/AProdName.java
index 272d4a2f68ed2965ec28f0254eee795f03518e02..48d5ed27d687398584365e3eaec51a60f3897e83 100644
--- a/src/main/java/org/sablecc/sablecc/node/AProdName.java
+++ b/src/main/java/org/sablecc/sablecc/node/AProdName.java
@@ -26,12 +26,17 @@ public final class AProdName extends PProdName
 
     }
 
+    public AProdName(AProdName node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+        setProdNameTail(cloneNode(node._prodNameTail_));
+    }
+
     @Override
     public AProdName clone()
     {
-        return new AProdName(
-            cloneNode(this._id_),
-            cloneNode(this._prodNameTail_));
+        return new AProdName(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AProductionSpecifier.java b/src/main/java/org/sablecc/sablecc/node/AProductionSpecifier.java
index 3e958eca00211a4363803ca5097763f90524ac27..df84feb26a50114481a2831c23ce5703db629ebf 100644
--- a/src/main/java/org/sablecc/sablecc/node/AProductionSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/AProductionSpecifier.java
@@ -13,10 +13,15 @@ public final class AProductionSpecifier extends PSpecifier
         // Constructor
     }
 
+    public AProductionSpecifier(AProductionSpecifier node)
+    {
+        super(node);
+    }
+
     @Override
     public AProductionSpecifier clone()
     {
-        return new AProductionSpecifier();
+        return new AProductionSpecifier(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AProductions.java b/src/main/java/org/sablecc/sablecc/node/AProductions.java
index 3feac8c3ba3b38dd8bb2c91193d45a3f1217f817..d5078d560f1fbbed861ba7fcd3a378bd2cb9f7db 100644
--- a/src/main/java/org/sablecc/sablecc/node/AProductions.java
+++ b/src/main/java/org/sablecc/sablecc/node/AProductions.java
@@ -23,11 +23,16 @@ public final class AProductions extends PProductions
 
     }
 
+    public AProductions(AProductions node)
+    {
+        super(node);
+        setProds(cloneList(node._prods_));
+    }
+
     @Override
     public AProductions clone()
     {
-        return new AProductions(
-            cloneList(this._prods_));
+        return new AProductions(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AQMarkUnOp.java b/src/main/java/org/sablecc/sablecc/node/AQMarkUnOp.java
index aa2b81fbbe90bcce2f64f699a3eed24216ceacd4..da78e8791a964e97e6b0ad7f2a4b67503a0d40ed 100644
--- a/src/main/java/org/sablecc/sablecc/node/AQMarkUnOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/AQMarkUnOp.java
@@ -22,11 +22,16 @@ public final class AQMarkUnOp extends PUnOp
 
     }
 
+    public AQMarkUnOp(AQMarkUnOp node)
+    {
+        super(node);
+        setQMark(cloneNode(node._qMark_));
+    }
+
     @Override
     public AQMarkUnOp clone()
     {
-        return new AQMarkUnOp(
-            cloneNode(this._qMark_));
+        return new AQMarkUnOp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ARegExp.java b/src/main/java/org/sablecc/sablecc/node/ARegExp.java
index 18ca2e4b55a3b3f284753ee3e876692bcef71253..e9a9eedb3c25e100bf69f23d6e5147f1be40a3d8 100644
--- a/src/main/java/org/sablecc/sablecc/node/ARegExp.java
+++ b/src/main/java/org/sablecc/sablecc/node/ARegExp.java
@@ -23,11 +23,16 @@ public final class ARegExp extends PRegExp
 
     }
 
+    public ARegExp(ARegExp node)
+    {
+        super(node);
+        setConcats(cloneList(node._concats_));
+    }
+
     @Override
     public ARegExp clone()
     {
-        return new ARegExp(
-            cloneList(this._concats_));
+        return new ARegExp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ARegExpBasic.java b/src/main/java/org/sablecc/sablecc/node/ARegExpBasic.java
index 50cec7258118a68a71db9746ebff6aa787456099..1c29eec74ef24927e70082fbd0062f8fff48b504 100644
--- a/src/main/java/org/sablecc/sablecc/node/ARegExpBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/ARegExpBasic.java
@@ -22,11 +22,16 @@ public final class ARegExpBasic extends PBasic
 
     }
 
+    public ARegExpBasic(ARegExpBasic node)
+    {
+        super(node);
+        setRegExp(cloneNode(node._regExp_));
+    }
+
     @Override
     public ARegExpBasic clone()
     {
-        return new ARegExpBasic(
-            cloneNode(this._regExp_));
+        return new ARegExpBasic(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ASetBasic.java b/src/main/java/org/sablecc/sablecc/node/ASetBasic.java
index 1c747e4c1e31ff08fc4c0dc98889bb9b9d7d39ca..9c26ab094894d9991f42894ccab765ae515d4d50 100644
--- a/src/main/java/org/sablecc/sablecc/node/ASetBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/ASetBasic.java
@@ -22,11 +22,16 @@ public final class ASetBasic extends PBasic
 
     }
 
+    public ASetBasic(ASetBasic node)
+    {
+        super(node);
+        setSet(cloneNode(node._set_));
+    }
+
     @Override
     public ASetBasic clone()
     {
-        return new ASetBasic(
-            cloneNode(this._set_));
+        return new ASetBasic(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ASimpleListTerm.java b/src/main/java/org/sablecc/sablecc/node/ASimpleListTerm.java
index 4187c1e444ed82e43bf353a1624076fa96b6f79c..7821735cd82e0ac2cfd98073959ea2448ded3e47 100644
--- a/src/main/java/org/sablecc/sablecc/node/ASimpleListTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ASimpleListTerm.java
@@ -30,13 +30,18 @@ public final class ASimpleListTerm extends PListTerm
 
     }
 
+    public ASimpleListTerm(ASimpleListTerm node)
+    {
+        super(node);
+        setSpecifier(cloneNode(node._specifier_));
+        setId(cloneNode(node._id_));
+        setSimpleTermTail(cloneNode(node._simpleTermTail_));
+    }
+
     @Override
     public ASimpleListTerm clone()
     {
-        return new ASimpleListTerm(
-            cloneNode(this._specifier_),
-            cloneNode(this._id_),
-            cloneNode(this._simpleTermTail_));
+        return new ASimpleListTerm(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ASimpleTerm.java b/src/main/java/org/sablecc/sablecc/node/ASimpleTerm.java
index 7f7cd418d01529166277f7beab296f7be679aac6..693bea1fb73a5b757e3d08436fc9d46d14b8d8d3 100644
--- a/src/main/java/org/sablecc/sablecc/node/ASimpleTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ASimpleTerm.java
@@ -30,13 +30,18 @@ public final class ASimpleTerm extends PTerm
 
     }
 
+    public ASimpleTerm(ASimpleTerm node)
+    {
+        super(node);
+        setSpecifier(cloneNode(node._specifier_));
+        setId(cloneNode(node._id_));
+        setSimpleTermTail(cloneNode(node._simpleTermTail_));
+    }
+
     @Override
     public ASimpleTerm clone()
     {
-        return new ASimpleTerm(
-            cloneNode(this._specifier_),
-            cloneNode(this._id_),
-            cloneNode(this._simpleTermTail_));
+        return new ASimpleTerm(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStarUnOp.java b/src/main/java/org/sablecc/sablecc/node/AStarUnOp.java
index 3d6abe6bc1e6abc5ddfaf0b9d5be0e08f9a1d7c9..65146a48504d8ed4393b1648d5b9e97ca9006b22 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStarUnOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStarUnOp.java
@@ -22,11 +22,16 @@ public final class AStarUnOp extends PUnOp
 
     }
 
+    public AStarUnOp(AStarUnOp node)
+    {
+        super(node);
+        setStar(cloneNode(node._star_));
+    }
+
     @Override
     public AStarUnOp clone()
     {
-        return new AStarUnOp(
-            cloneNode(this._star_));
+        return new AStarUnOp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStateList.java b/src/main/java/org/sablecc/sablecc/node/AStateList.java
index 0f768522016448966e3721a8d6c2be51b5127e87..f24a890d5701946bb38c36329b6e38697b9b8e95 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStateList.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStateList.java
@@ -31,13 +31,18 @@ public final class AStateList extends PStateList
 
     }
 
+    public AStateList(AStateList node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+        setTransition(cloneNode(node._transition_));
+        setStateLists(cloneList(node._stateLists_));
+    }
+
     @Override
     public AStateList clone()
     {
-        return new AStateList(
-            cloneNode(this._id_),
-            cloneNode(this._transition_),
-            cloneList(this._stateLists_));
+        return new AStateList(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStateListTail.java b/src/main/java/org/sablecc/sablecc/node/AStateListTail.java
index 545102071a3e55aa33a9d3231c6dd4ffc2dbfe76..b07fbfcc87000a2dd5447b1fa408324ac0189454 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStateListTail.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStateListTail.java
@@ -26,12 +26,17 @@ public final class AStateListTail extends PStateListTail
 
     }
 
+    public AStateListTail(AStateListTail node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+        setTransition(cloneNode(node._transition_));
+    }
+
     @Override
     public AStateListTail clone()
     {
-        return new AStateListTail(
-            cloneNode(this._id_),
-            cloneNode(this._transition_));
+        return new AStateListTail(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStates.java b/src/main/java/org/sablecc/sablecc/node/AStates.java
index 271b30f0de3191fd817c386fdb2ebf850d6f499f..1c8e4eec6b5720a5b3ed770eda397c1f1a9e91ab 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStates.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStates.java
@@ -23,11 +23,16 @@ public final class AStates extends PStates
 
     }
 
+    public AStates(AStates node)
+    {
+        super(node);
+        setListId(cloneList(node._listId_));
+    }
+
     @Override
     public AStates clone()
     {
-        return new AStates(
-            cloneList(this._listId_));
+        return new AStates(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStringBasic.java b/src/main/java/org/sablecc/sablecc/node/AStringBasic.java
index 5b96778e5c089dbfb9df0703416cf4e27eb7a99e..79963c2303490abda7f75c28d4befd4afe39b524 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStringBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStringBasic.java
@@ -22,11 +22,16 @@ public final class AStringBasic extends PBasic
 
     }
 
+    public AStringBasic(AStringBasic node)
+    {
+        super(node);
+        setString(cloneNode(node._string_));
+    }
+
     @Override
     public AStringBasic clone()
     {
-        return new AStringBasic(
-            cloneNode(this._string_));
+        return new AStringBasic(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ATokenDef.java b/src/main/java/org/sablecc/sablecc/node/ATokenDef.java
index be7cb58bf6cc256b0760b37daaf9cbfbe5dbf7cc..b2e423d3a805e98c22fa34324f1f0d8f73de1d21 100644
--- a/src/main/java/org/sablecc/sablecc/node/ATokenDef.java
+++ b/src/main/java/org/sablecc/sablecc/node/ATokenDef.java
@@ -38,15 +38,20 @@ public final class ATokenDef extends PTokenDef
 
     }
 
+    public ATokenDef(ATokenDef node)
+    {
+        super(node);
+        setStateList(cloneNode(node._stateList_));
+        setId(cloneNode(node._id_));
+        setRegExp(cloneNode(node._regExp_));
+        setSlash(cloneNode(node._slash_));
+        setLookAhead(cloneNode(node._lookAhead_));
+    }
+
     @Override
     public ATokenDef clone()
     {
-        return new ATokenDef(
-            cloneNode(this._stateList_),
-            cloneNode(this._id_),
-            cloneNode(this._regExp_),
-            cloneNode(this._slash_),
-            cloneNode(this._lookAhead_));
+        return new ATokenDef(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ATokenSpecifier.java b/src/main/java/org/sablecc/sablecc/node/ATokenSpecifier.java
index 716ff3b0db9d45c6f253f5dc3b41d15690e97ec1..596e939289aa23f3a6dda76391f0258452049e66 100644
--- a/src/main/java/org/sablecc/sablecc/node/ATokenSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/ATokenSpecifier.java
@@ -13,10 +13,15 @@ public final class ATokenSpecifier extends PSpecifier
         // Constructor
     }
 
+    public ATokenSpecifier(ATokenSpecifier node)
+    {
+        super(node);
+    }
+
     @Override
     public ATokenSpecifier clone()
     {
-        return new ATokenSpecifier();
+        return new ATokenSpecifier(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ATokens.java b/src/main/java/org/sablecc/sablecc/node/ATokens.java
index f770883897f9375c3eaeb455a7d22bd2c04c90d0..2ad3db72495dcb10f541587b3d10da2ea21f342b 100644
--- a/src/main/java/org/sablecc/sablecc/node/ATokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/ATokens.java
@@ -23,11 +23,16 @@ public final class ATokens extends PTokens
 
     }
 
+    public ATokens(ATokens node)
+    {
+        super(node);
+        setTokenDefs(cloneList(node._tokenDefs_));
+    }
+
     @Override
     public ATokens clone()
     {
-        return new ATokens(
-            cloneList(this._tokenDefs_));
+        return new ATokens(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ATransition.java b/src/main/java/org/sablecc/sablecc/node/ATransition.java
index f5ea0f3fa60c1ba9cc71647914b6e07f265c9997..e0c63282c9b02a058fac2f6e4cb6d636133d5e8c 100644
--- a/src/main/java/org/sablecc/sablecc/node/ATransition.java
+++ b/src/main/java/org/sablecc/sablecc/node/ATransition.java
@@ -22,11 +22,16 @@ public final class ATransition extends PTransition
 
     }
 
+    public ATransition(ATransition node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+    }
+
     @Override
     public ATransition clone()
     {
-        return new ATransition(
-            cloneNode(this._id_));
+        return new ATransition(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AUnExp.java b/src/main/java/org/sablecc/sablecc/node/AUnExp.java
index bcd27d97189864e7feb0466e0df9dd15ac39fc22..ea2d1e39625a98a4d8b7c12bac7784127e3caf6e 100644
--- a/src/main/java/org/sablecc/sablecc/node/AUnExp.java
+++ b/src/main/java/org/sablecc/sablecc/node/AUnExp.java
@@ -26,12 +26,17 @@ public final class AUnExp extends PUnExp
 
     }
 
+    public AUnExp(AUnExp node)
+    {
+        super(node);
+        setBasic(cloneNode(node._basic_));
+        setUnOp(cloneNode(node._unOp_));
+    }
+
     @Override
     public AUnExp clone()
     {
-        return new AUnExp(
-            cloneNode(this._basic_),
-            cloneNode(this._unOp_));
+        return new AUnExp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/EOF.java b/src/main/java/org/sablecc/sablecc/node/EOF.java
index 20a719fa40d04f98f898c57a7e99554b93cf2e63..5097f39cd8213c78aa0567870c15183e3ece638d 100644
--- a/src/main/java/org/sablecc/sablecc/node/EOF.java
+++ b/src/main/java/org/sablecc/sablecc/node/EOF.java
@@ -9,20 +9,23 @@ public final class EOF extends Token
 {
     public EOF()
     {
-        setText("");
+        super("");
     }
 
     public EOF(int line, int pos)
     {
-        setText("");
-        setLine(line);
-        setPos(pos);
+        super("", line, pos);
+    }
+
+    public EOF(EOF token)
+    {
+        super(token);
     }
 
     @Override
     public EOF clone()
     {
-        return new EOF(getLine(), getPos());
+        return new EOF(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/Node.java b/src/main/java/org/sablecc/sablecc/node/Node.java
index b4c0c3309a2da3e60aed1dd4216feaf4c0d5afac..c04d51db5c55fc710a792bcb03ac1fe87024989d 100644
--- a/src/main/java/org/sablecc/sablecc/node/Node.java
+++ b/src/main/java/org/sablecc/sablecc/node/Node.java
@@ -10,6 +10,17 @@ public abstract class Node extends PositionedNode implements Switchable, Cloneab
 {
     private Node parent;
 
+    public Node()
+    {}
+
+    public Node(Node node)
+    {
+        super(node);
+        // Copy constructor intentionally does not keep parent!
+        // The new copied node is not a child of the original parent anymore.
+        this.parent = null;
+    }
+
     @Override
     public abstract Node clone();
 
diff --git a/src/main/java/org/sablecc/sablecc/node/PAlt.java b/src/main/java/org/sablecc/sablecc/node/PAlt.java
index 0b5516f2b2bc641a5aa78d0f2de25da0092a9578..805ab230e329fd4693a7994ac3b49cd7e3f32695 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAlt.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAlt.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PAlt extends Node
 {
+    public PAlt()
+    {}
+
+    public PAlt(PAlt node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PAlt clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PAltTransform.java b/src/main/java/org/sablecc/sablecc/node/PAltTransform.java
index 35b5362309960485747bcbb60e22e686ce1e1446..f0eafa2ea20ba7bc6895e3f410c8c79566b18ac5 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAltTransform.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAltTransform.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PAltTransform extends Node
 {
+    public PAltTransform()
+    {}
+
+    public PAltTransform(PAltTransform node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PAltTransform clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PAst.java b/src/main/java/org/sablecc/sablecc/node/PAst.java
index ef1f009c8880a27ca872b421d0837252efc01b6f..04d7430515d9fa82ccfb32cb04b3783329803d63 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAst.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAst.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PAst extends Node
 {
+    public PAst()
+    {}
+
+    public PAst(PAst node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PAst clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PAstAlt.java b/src/main/java/org/sablecc/sablecc/node/PAstAlt.java
index 4dc2c2b41b47aa73c2e6c86bc8276021407ca744..7fa3763890d2b5441d693633db0c2d3526a8b452 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAstAlt.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAstAlt.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PAstAlt extends Node
 {
+    public PAstAlt()
+    {}
+
+    public PAstAlt(PAstAlt node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PAstAlt clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PAstProd.java b/src/main/java/org/sablecc/sablecc/node/PAstProd.java
index 6b85532aa34d023487b21e5e27d41dd15772d1d6..de12a50aa730b3d35c761e96a8a20b47a192de19 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAstProd.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAstProd.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PAstProd extends Node
 {
+    public PAstProd()
+    {}
+
+    public PAstProd(PAstProd node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PAstProd clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PBasic.java b/src/main/java/org/sablecc/sablecc/node/PBasic.java
index 70bcd901cb304d1d8a9f5555cf38b23f483985f8..2a3b4b9c02c9a6371c9a782958d8f2bd31fabd80 100644
--- a/src/main/java/org/sablecc/sablecc/node/PBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/PBasic.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PBasic extends Node
 {
+    public PBasic()
+    {}
+
+    public PBasic(PBasic node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PBasic clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PBinOp.java b/src/main/java/org/sablecc/sablecc/node/PBinOp.java
index 2b2e9ef558f69770ee3fb8e4699ba08136bdef9e..1d35acb71ff9a10a68dfa8bf74677218ba20bd86 100644
--- a/src/main/java/org/sablecc/sablecc/node/PBinOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/PBinOp.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PBinOp extends Node
 {
+    public PBinOp()
+    {}
+
+    public PBinOp(PBinOp node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PBinOp clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PChar.java b/src/main/java/org/sablecc/sablecc/node/PChar.java
index bf0fc3ca59f2c1d0456d69f07b7315b23574bf33..1e1975cc9edebdde7462b3d85320c5e4b857a8f1 100644
--- a/src/main/java/org/sablecc/sablecc/node/PChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/PChar.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PChar extends Node
 {
+    public PChar()
+    {}
+
+    public PChar(PChar node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PChar clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PConcat.java b/src/main/java/org/sablecc/sablecc/node/PConcat.java
index c5c9870169d0bd4fb6d6d80d81c3a569a811d450..7c9ef83e1a5faa05761ed20a792560264a01ea72 100644
--- a/src/main/java/org/sablecc/sablecc/node/PConcat.java
+++ b/src/main/java/org/sablecc/sablecc/node/PConcat.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PConcat extends Node
 {
+    public PConcat()
+    {}
+
+    public PConcat(PConcat node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PConcat clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PElem.java b/src/main/java/org/sablecc/sablecc/node/PElem.java
index 9ead0491725ce0ba30b66aba9e32d9b815e8dabc..748f1bc5ec9b069d99b54db2d2a361af026991c5 100644
--- a/src/main/java/org/sablecc/sablecc/node/PElem.java
+++ b/src/main/java/org/sablecc/sablecc/node/PElem.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PElem extends Node
 {
+    public PElem()
+    {}
+
+    public PElem(PElem node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PElem clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PGrammar.java b/src/main/java/org/sablecc/sablecc/node/PGrammar.java
index 3609b3d84cf42d5d18d841074b92ed8ed4d1b4b9..8501e4c0b95d2135664b18fb021ad9742313759e 100644
--- a/src/main/java/org/sablecc/sablecc/node/PGrammar.java
+++ b/src/main/java/org/sablecc/sablecc/node/PGrammar.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PGrammar extends Node
 {
+    public PGrammar()
+    {}
+
+    public PGrammar(PGrammar node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PGrammar clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PHelperDef.java b/src/main/java/org/sablecc/sablecc/node/PHelperDef.java
index 3c73a8c632e17ee2568cc7e7a53c46fd887db926..b9e501dc3ebc011a5faf44dd0934345c69fa6740 100644
--- a/src/main/java/org/sablecc/sablecc/node/PHelperDef.java
+++ b/src/main/java/org/sablecc/sablecc/node/PHelperDef.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PHelperDef extends Node
 {
+    public PHelperDef()
+    {}
+
+    public PHelperDef(PHelperDef node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PHelperDef clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PHelpers.java b/src/main/java/org/sablecc/sablecc/node/PHelpers.java
index 66e7c21fb23d9ac7153f2a198a02ecd96d1ef482..a1ddbf2b92fa1914726da310f944720600c43a22 100644
--- a/src/main/java/org/sablecc/sablecc/node/PHelpers.java
+++ b/src/main/java/org/sablecc/sablecc/node/PHelpers.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PHelpers extends Node
 {
+    public PHelpers()
+    {}
+
+    public PHelpers(PHelpers node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PHelpers clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PIgnTokens.java b/src/main/java/org/sablecc/sablecc/node/PIgnTokens.java
index 5af522344619ba29d0cde1876d4a869adb97b197..fb53108b47c422f028ac881a09990a31f790c53c 100644
--- a/src/main/java/org/sablecc/sablecc/node/PIgnTokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/PIgnTokens.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PIgnTokens extends Node
 {
+    public PIgnTokens()
+    {}
+
+    public PIgnTokens(PIgnTokens node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PIgnTokens clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PListTerm.java b/src/main/java/org/sablecc/sablecc/node/PListTerm.java
index da5bde57ca851d921c69874cffe3dc462f7b61ec..d8e7a48fc7537f0a1ca95dfc1a9eec33df44497b 100644
--- a/src/main/java/org/sablecc/sablecc/node/PListTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/PListTerm.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PListTerm extends Node
 {
+    public PListTerm()
+    {}
+
+    public PListTerm(PListTerm node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PListTerm clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PProd.java b/src/main/java/org/sablecc/sablecc/node/PProd.java
index 5eae94a3e0016f63abafc7ae5cb04aa437a70189..2d9db40db2087d7b65bc2e48ba491854392625a8 100644
--- a/src/main/java/org/sablecc/sablecc/node/PProd.java
+++ b/src/main/java/org/sablecc/sablecc/node/PProd.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PProd extends Node
 {
+    public PProd()
+    {}
+
+    public PProd(PProd node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PProd clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PProdName.java b/src/main/java/org/sablecc/sablecc/node/PProdName.java
index eff659cd238b1c6e7791f18c99e0864137301492..380e8da86d939305a4353354040908258a3175e7 100644
--- a/src/main/java/org/sablecc/sablecc/node/PProdName.java
+++ b/src/main/java/org/sablecc/sablecc/node/PProdName.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PProdName extends Node
 {
+    public PProdName()
+    {}
+
+    public PProdName(PProdName node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PProdName clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PProductions.java b/src/main/java/org/sablecc/sablecc/node/PProductions.java
index f12d223382bd8169b2a306d5d2e2d327cf97f2a1..98da82638503ce58f7d0a5dcab776c74d0f75a45 100644
--- a/src/main/java/org/sablecc/sablecc/node/PProductions.java
+++ b/src/main/java/org/sablecc/sablecc/node/PProductions.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PProductions extends Node
 {
+    public PProductions()
+    {}
+
+    public PProductions(PProductions node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PProductions clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PRegExp.java b/src/main/java/org/sablecc/sablecc/node/PRegExp.java
index c9ae46786bcf2fd868d62fcb35135e4ec192fe58..3ebc5a202aafbe5c3b3c9eeb7876811385bff89e 100644
--- a/src/main/java/org/sablecc/sablecc/node/PRegExp.java
+++ b/src/main/java/org/sablecc/sablecc/node/PRegExp.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PRegExp extends Node
 {
+    public PRegExp()
+    {}
+
+    public PRegExp(PRegExp node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PRegExp clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PSet.java b/src/main/java/org/sablecc/sablecc/node/PSet.java
index 5d2b31e19a1b696a18c9d2d3cf5e60c251d34dd3..e9d659382aa480c0e48ba2bc7cecb37981d8a5f4 100644
--- a/src/main/java/org/sablecc/sablecc/node/PSet.java
+++ b/src/main/java/org/sablecc/sablecc/node/PSet.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PSet extends Node
 {
+    public PSet()
+    {}
+
+    public PSet(PSet node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PSet clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PSpecifier.java b/src/main/java/org/sablecc/sablecc/node/PSpecifier.java
index 787ba31bd818ef02ce17579ca9d9b1f03006a8b0..39fc6267212ab15aa372725b0867cca14da46a45 100644
--- a/src/main/java/org/sablecc/sablecc/node/PSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/PSpecifier.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PSpecifier extends Node
 {
+    public PSpecifier()
+    {}
+
+    public PSpecifier(PSpecifier node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PSpecifier clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PStateList.java b/src/main/java/org/sablecc/sablecc/node/PStateList.java
index 24b52b2922f3df81d2339a98b9d989b21936bc74..b8509d11053b69d32c20260b72b11cb4af5e9d2d 100644
--- a/src/main/java/org/sablecc/sablecc/node/PStateList.java
+++ b/src/main/java/org/sablecc/sablecc/node/PStateList.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PStateList extends Node
 {
+    public PStateList()
+    {}
+
+    public PStateList(PStateList node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PStateList clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PStateListTail.java b/src/main/java/org/sablecc/sablecc/node/PStateListTail.java
index b50809e8856ab3014bf075334974eddfdfe6f1f9..3968b1082c1f172e094d050aea9c395ceea9be7a 100644
--- a/src/main/java/org/sablecc/sablecc/node/PStateListTail.java
+++ b/src/main/java/org/sablecc/sablecc/node/PStateListTail.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PStateListTail extends Node
 {
+    public PStateListTail()
+    {}
+
+    public PStateListTail(PStateListTail node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PStateListTail clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PStates.java b/src/main/java/org/sablecc/sablecc/node/PStates.java
index df9262739243cd81a9192efe6f1226a9c6c83524..c0f22d478a1f94a32d4197f128defd220ab886fe 100644
--- a/src/main/java/org/sablecc/sablecc/node/PStates.java
+++ b/src/main/java/org/sablecc/sablecc/node/PStates.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PStates extends Node
 {
+    public PStates()
+    {}
+
+    public PStates(PStates node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PStates clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PTerm.java b/src/main/java/org/sablecc/sablecc/node/PTerm.java
index cea2601f5e95197ae9b1f760517e10752992b1ec..e3e93730dcc61b39ac3fa36b010370dca07f8e4f 100644
--- a/src/main/java/org/sablecc/sablecc/node/PTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/PTerm.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PTerm extends Node
 {
+    public PTerm()
+    {}
+
+    public PTerm(PTerm node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PTerm clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PTokenDef.java b/src/main/java/org/sablecc/sablecc/node/PTokenDef.java
index 96e71a7ba2fa0d1665dae4d7ee6d6a25b5260cce..783f7429f527e3eedcf317914e7b161f270ee6a2 100644
--- a/src/main/java/org/sablecc/sablecc/node/PTokenDef.java
+++ b/src/main/java/org/sablecc/sablecc/node/PTokenDef.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PTokenDef extends Node
 {
+    public PTokenDef()
+    {}
+
+    public PTokenDef(PTokenDef node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PTokenDef clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PTokens.java b/src/main/java/org/sablecc/sablecc/node/PTokens.java
index daa2a57e8f076900af7609ad609fad40b965f79a..d0b4af8c15e5b50afc3796e6d741b82361346bb3 100644
--- a/src/main/java/org/sablecc/sablecc/node/PTokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/PTokens.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PTokens extends Node
 {
+    public PTokens()
+    {}
+
+    public PTokens(PTokens node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PTokens clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PTransition.java b/src/main/java/org/sablecc/sablecc/node/PTransition.java
index e91c82d6d249542627448da88cea1e5013603859..d8b166d4d497dbacadd8f8227dfb0788a3d1b68d 100644
--- a/src/main/java/org/sablecc/sablecc/node/PTransition.java
+++ b/src/main/java/org/sablecc/sablecc/node/PTransition.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PTransition extends Node
 {
+    public PTransition()
+    {}
+
+    public PTransition(PTransition node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PTransition clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PUnExp.java b/src/main/java/org/sablecc/sablecc/node/PUnExp.java
index 1561ea6923bda990350cf8c2a65bed146b2a549a..28f0cbadbcaa0433cdd6501c21abaeab6d660806 100644
--- a/src/main/java/org/sablecc/sablecc/node/PUnExp.java
+++ b/src/main/java/org/sablecc/sablecc/node/PUnExp.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PUnExp extends Node
 {
+    public PUnExp()
+    {}
+
+    public PUnExp(PUnExp node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PUnExp clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PUnOp.java b/src/main/java/org/sablecc/sablecc/node/PUnOp.java
index 45a73f93c9a544796e7e7a114247129bda23537c..fc09a3313178fcab10351741575164f30ca6bfe3 100644
--- a/src/main/java/org/sablecc/sablecc/node/PUnOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/PUnOp.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PUnOp extends Node
 {
+    public PUnOp()
+    {}
+
+    public PUnOp(PUnOp node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PUnOp clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/Start.java b/src/main/java/org/sablecc/sablecc/node/Start.java
index 2626e783adfbba06017803e5b573bbcb078cb72e..0988c84f035f06138fea1ccbdf1097b123aa2a56 100644
--- a/src/main/java/org/sablecc/sablecc/node/Start.java
+++ b/src/main/java/org/sablecc/sablecc/node/Start.java
@@ -22,12 +22,17 @@ public final class Start extends Node
         setEOF(_eof_);
     }
 
+    public Start(Start node)
+    {
+        super(node);
+        setPGrammar(cloneNode(node._pGrammar_));
+        setEOF(cloneNode(node._eof_));
+    }
+
     @Override
     public Start clone()
     {
-        return new Start(
-            cloneNode(this._pGrammar_),
-            cloneNode(this._eof_));
+        return new Start(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TAbstract.java b/src/main/java/org/sablecc/sablecc/node/TAbstract.java
index a942340e3fc037e3a0e8d8d257a47651f9cd574c..dbccebb01e230af3687606897527355e89c30abd 100644
--- a/src/main/java/org/sablecc/sablecc/node/TAbstract.java
+++ b/src/main/java/org/sablecc/sablecc/node/TAbstract.java
@@ -9,20 +9,23 @@ public final class TAbstract extends Token
 {
     public TAbstract()
     {
-        super.setText("Abstract");
+        super("Abstract");
     }
 
     public TAbstract(int line, int pos)
     {
-        super.setText("Abstract");
-        setLine(line);
-        setPos(pos);
+        super("Abstract", line, pos);
+    }
+
+    public TAbstract(TAbstract token)
+    {
+        super(token);
     }
 
     @Override
     public TAbstract clone()
     {
-        return new TAbstract(getLine(), getPos());
+        return new TAbstract(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TArrow.java b/src/main/java/org/sablecc/sablecc/node/TArrow.java
index 4817c02c0d3a84ba2de6f6e7b27e594d11c97c4d..1ad0fb658d47012c7e199108f49ea1eb987fd6f2 100644
--- a/src/main/java/org/sablecc/sablecc/node/TArrow.java
+++ b/src/main/java/org/sablecc/sablecc/node/TArrow.java
@@ -9,20 +9,23 @@ public final class TArrow extends Token
 {
     public TArrow()
     {
-        super.setText("->");
+        super("->");
     }
 
     public TArrow(int line, int pos)
     {
-        super.setText("->");
-        setLine(line);
-        setPos(pos);
+        super("->", line, pos);
+    }
+
+    public TArrow(TArrow token)
+    {
+        super(token);
     }
 
     @Override
     public TArrow clone()
     {
-        return new TArrow(getLine(), getPos());
+        return new TArrow(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TBar.java b/src/main/java/org/sablecc/sablecc/node/TBar.java
index ea2cccb4426039282634618fbc718cbad026e5ed..d6119ef2375b80eca8dcefecaed173f1c38f9e1a 100644
--- a/src/main/java/org/sablecc/sablecc/node/TBar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TBar.java
@@ -9,20 +9,23 @@ public final class TBar extends Token
 {
     public TBar()
     {
-        super.setText("|");
+        super("|");
     }
 
     public TBar(int line, int pos)
     {
-        super.setText("|");
-        setLine(line);
-        setPos(pos);
+        super("|", line, pos);
+    }
+
+    public TBar(TBar token)
+    {
+        super(token);
     }
 
     @Override
     public TBar clone()
     {
-        return new TBar(getLine(), getPos());
+        return new TBar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TBlank.java b/src/main/java/org/sablecc/sablecc/node/TBlank.java
index bc3665009bb6feab47a12704a8e7c104842e6ab7..70b8ecf905be3f22432f256b9af5730ca4ccaa68 100644
--- a/src/main/java/org/sablecc/sablecc/node/TBlank.java
+++ b/src/main/java/org/sablecc/sablecc/node/TBlank.java
@@ -9,20 +9,23 @@ public final class TBlank extends Token
 {
     public TBlank(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TBlank(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TBlank(TBlank token)
+    {
+        super(token);
     }
 
     @Override
     public TBlank clone()
     {
-        return new TBlank(getText(), getLine(), getPos());
+        return new TBlank(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TChar.java b/src/main/java/org/sablecc/sablecc/node/TChar.java
index 98b21a2d37dbadf2822d47306810c888621b05ca..6f70e04472fec0daf5c881dfa00395cd23804314 100644
--- a/src/main/java/org/sablecc/sablecc/node/TChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TChar.java
@@ -9,20 +9,23 @@ public final class TChar extends Token
 {
     public TChar(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TChar(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TChar(TChar token)
+    {
+        super(token);
     }
 
     @Override
     public TChar clone()
     {
-        return new TChar(getText(), getLine(), getPos());
+        return new TChar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TColon.java b/src/main/java/org/sablecc/sablecc/node/TColon.java
index 65692a48195015c67c0cdddeaf9b2f1a8959117b..cab5d5a6ff434fa5fe5e7d042dd0a13093191379 100644
--- a/src/main/java/org/sablecc/sablecc/node/TColon.java
+++ b/src/main/java/org/sablecc/sablecc/node/TColon.java
@@ -9,20 +9,23 @@ public final class TColon extends Token
 {
     public TColon()
     {
-        super.setText(":");
+        super(":");
     }
 
     public TColon(int line, int pos)
     {
-        super.setText(":");
-        setLine(line);
-        setPos(pos);
+        super(":", line, pos);
+    }
+
+    public TColon(TColon token)
+    {
+        super(token);
     }
 
     @Override
     public TColon clone()
     {
-        return new TColon(getLine(), getPos());
+        return new TColon(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TComma.java b/src/main/java/org/sablecc/sablecc/node/TComma.java
index 8b421b5a98327a32b7167ebc3f389123e52e8f88..5b906b344dd35499653b7f2e29d4652c98a2a0f3 100644
--- a/src/main/java/org/sablecc/sablecc/node/TComma.java
+++ b/src/main/java/org/sablecc/sablecc/node/TComma.java
@@ -9,20 +9,23 @@ public final class TComma extends Token
 {
     public TComma()
     {
-        super.setText(",");
+        super(",");
     }
 
     public TComma(int line, int pos)
     {
-        super.setText(",");
-        setLine(line);
-        setPos(pos);
+        super(",", line, pos);
+    }
+
+    public TComma(TComma token)
+    {
+        super(token);
     }
 
     @Override
     public TComma clone()
     {
-        return new TComma(getLine(), getPos());
+        return new TComma(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TComment.java b/src/main/java/org/sablecc/sablecc/node/TComment.java
index 28348652e8a046a60e40ae069165ccecd77de2f6..67275750b6300598089f24bbe9c1909553c9ea5e 100644
--- a/src/main/java/org/sablecc/sablecc/node/TComment.java
+++ b/src/main/java/org/sablecc/sablecc/node/TComment.java
@@ -9,20 +9,23 @@ public final class TComment extends Token
 {
     public TComment(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TComment(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TComment(TComment token)
+    {
+        super(token);
     }
 
     @Override
     public TComment clone()
     {
-        return new TComment(getText(), getLine(), getPos());
+        return new TComment(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TDDot.java b/src/main/java/org/sablecc/sablecc/node/TDDot.java
index fd34621c749fea90a4bdc212e3c103719cd86876..68a47c7ab79f3802c45a6d386c1e2ba7609fdfa5 100644
--- a/src/main/java/org/sablecc/sablecc/node/TDDot.java
+++ b/src/main/java/org/sablecc/sablecc/node/TDDot.java
@@ -9,20 +9,23 @@ public final class TDDot extends Token
 {
     public TDDot()
     {
-        super.setText("..");
+        super("..");
     }
 
     public TDDot(int line, int pos)
     {
-        super.setText("..");
-        setLine(line);
-        setPos(pos);
+        super("..", line, pos);
+    }
+
+    public TDDot(TDDot token)
+    {
+        super(token);
     }
 
     @Override
     public TDDot clone()
     {
-        return new TDDot(getLine(), getPos());
+        return new TDDot(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TDecChar.java b/src/main/java/org/sablecc/sablecc/node/TDecChar.java
index 9511c49e38fdb6b9a2cf55e12a350a712bf8a026..11fef1ec15e9712027b9143d86223cd97607c04e 100644
--- a/src/main/java/org/sablecc/sablecc/node/TDecChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TDecChar.java
@@ -9,20 +9,23 @@ public final class TDecChar extends Token
 {
     public TDecChar(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TDecChar(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TDecChar(TDecChar token)
+    {
+        super(token);
     }
 
     @Override
     public TDecChar clone()
     {
-        return new TDecChar(getText(), getLine(), getPos());
+        return new TDecChar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TDot.java b/src/main/java/org/sablecc/sablecc/node/TDot.java
index ff5683783d98e6ce6ebe0d92fda74d628b75cf40..7915cfc83c5bd87c53c24c7a4b9e182366f94bc9 100644
--- a/src/main/java/org/sablecc/sablecc/node/TDot.java
+++ b/src/main/java/org/sablecc/sablecc/node/TDot.java
@@ -9,20 +9,23 @@ public final class TDot extends Token
 {
     public TDot()
     {
-        super.setText(".");
+        super(".");
     }
 
     public TDot(int line, int pos)
     {
-        super.setText(".");
-        setLine(line);
-        setPos(pos);
+        super(".", line, pos);
+    }
+
+    public TDot(TDot token)
+    {
+        super(token);
     }
 
     @Override
     public TDot clone()
     {
-        return new TDot(getLine(), getPos());
+        return new TDot(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TEqual.java b/src/main/java/org/sablecc/sablecc/node/TEqual.java
index 015aba3c9f38188b56ec1c94e87ab64b29d54bde..990a8fbf51f9b75227c5096a8bcb7a655a73d704 100644
--- a/src/main/java/org/sablecc/sablecc/node/TEqual.java
+++ b/src/main/java/org/sablecc/sablecc/node/TEqual.java
@@ -9,20 +9,23 @@ public final class TEqual extends Token
 {
     public TEqual()
     {
-        super.setText("=");
+        super("=");
     }
 
     public TEqual(int line, int pos)
     {
-        super.setText("=");
-        setLine(line);
-        setPos(pos);
+        super("=", line, pos);
+    }
+
+    public TEqual(TEqual token)
+    {
+        super(token);
     }
 
     @Override
     public TEqual clone()
     {
-        return new TEqual(getLine(), getPos());
+        return new TEqual(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/THelpers.java b/src/main/java/org/sablecc/sablecc/node/THelpers.java
index 4c843ba6f63cbef6c0bad41887d6e3c036dfabdc..454b298ad210d38ceff50c5b54adaba7f0e93e04 100644
--- a/src/main/java/org/sablecc/sablecc/node/THelpers.java
+++ b/src/main/java/org/sablecc/sablecc/node/THelpers.java
@@ -9,20 +9,23 @@ public final class THelpers extends Token
 {
     public THelpers()
     {
-        super.setText("Helpers");
+        super("Helpers");
     }
 
     public THelpers(int line, int pos)
     {
-        super.setText("Helpers");
-        setLine(line);
-        setPos(pos);
+        super("Helpers", line, pos);
+    }
+
+    public THelpers(THelpers token)
+    {
+        super(token);
     }
 
     @Override
     public THelpers clone()
     {
-        return new THelpers(getLine(), getPos());
+        return new THelpers(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/THexChar.java b/src/main/java/org/sablecc/sablecc/node/THexChar.java
index 852b578f9c7e2c1af5bb389e528de3dbadeea713..be72cbca158910c92060f95f0de855c5e90b3acd 100644
--- a/src/main/java/org/sablecc/sablecc/node/THexChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/THexChar.java
@@ -9,20 +9,23 @@ public final class THexChar extends Token
 {
     public THexChar(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public THexChar(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public THexChar(THexChar token)
+    {
+        super(token);
     }
 
     @Override
     public THexChar clone()
     {
-        return new THexChar(getText(), getLine(), getPos());
+        return new THexChar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TId.java b/src/main/java/org/sablecc/sablecc/node/TId.java
index fc6487560485ea98e391b04b2a752cc887592ed1..6ecb2e6e46e54fc9c703cfcbb94a1c7964ba833f 100644
--- a/src/main/java/org/sablecc/sablecc/node/TId.java
+++ b/src/main/java/org/sablecc/sablecc/node/TId.java
@@ -9,20 +9,23 @@ public final class TId extends Token
 {
     public TId(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TId(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TId(TId token)
+    {
+        super(token);
     }
 
     @Override
     public TId clone()
     {
-        return new TId(getText(), getLine(), getPos());
+        return new TId(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TIgnored.java b/src/main/java/org/sablecc/sablecc/node/TIgnored.java
index 55a4e7c9ad91e8d1132ef43fa2f668a125f57c8b..d250772a77f047426cb337649916c840d63cf0d3 100644
--- a/src/main/java/org/sablecc/sablecc/node/TIgnored.java
+++ b/src/main/java/org/sablecc/sablecc/node/TIgnored.java
@@ -9,20 +9,23 @@ public final class TIgnored extends Token
 {
     public TIgnored()
     {
-        super.setText("Ignored");
+        super("Ignored");
     }
 
     public TIgnored(int line, int pos)
     {
-        super.setText("Ignored");
-        setLine(line);
-        setPos(pos);
+        super("Ignored", line, pos);
+    }
+
+    public TIgnored(TIgnored token)
+    {
+        super(token);
     }
 
     @Override
     public TIgnored clone()
     {
-        return new TIgnored(getLine(), getPos());
+        return new TIgnored(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TLBkt.java b/src/main/java/org/sablecc/sablecc/node/TLBkt.java
index 60600372288ca800b778d38a884fd139b5a77457..3cfb5e3af9fc56469010a2807902665f8c259762 100644
--- a/src/main/java/org/sablecc/sablecc/node/TLBkt.java
+++ b/src/main/java/org/sablecc/sablecc/node/TLBkt.java
@@ -9,20 +9,23 @@ public final class TLBkt extends Token
 {
     public TLBkt()
     {
-        super.setText("[");
+        super("[");
     }
 
     public TLBkt(int line, int pos)
     {
-        super.setText("[");
-        setLine(line);
-        setPos(pos);
+        super("[", line, pos);
+    }
+
+    public TLBkt(TLBkt token)
+    {
+        super(token);
     }
 
     @Override
     public TLBkt clone()
     {
-        return new TLBkt(getLine(), getPos());
+        return new TLBkt(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TLBrace.java b/src/main/java/org/sablecc/sablecc/node/TLBrace.java
index c7c8c11ebfae55d3ec7e0abea9f437b43ded88dd..2717770b77e5b0886feae2c730d5745d37622d65 100644
--- a/src/main/java/org/sablecc/sablecc/node/TLBrace.java
+++ b/src/main/java/org/sablecc/sablecc/node/TLBrace.java
@@ -9,20 +9,23 @@ public final class TLBrace extends Token
 {
     public TLBrace()
     {
-        super.setText("{");
+        super("{");
     }
 
     public TLBrace(int line, int pos)
     {
-        super.setText("{");
-        setLine(line);
-        setPos(pos);
+        super("{", line, pos);
+    }
+
+    public TLBrace(TLBrace token)
+    {
+        super(token);
     }
 
     @Override
     public TLBrace clone()
     {
-        return new TLBrace(getLine(), getPos());
+        return new TLBrace(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TLPar.java b/src/main/java/org/sablecc/sablecc/node/TLPar.java
index 06b5aa99817f3ae421f958e2e896a3ee0504918a..0ce2f6982e1176c551cf7517d3c0f946ca9f7b78 100644
--- a/src/main/java/org/sablecc/sablecc/node/TLPar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TLPar.java
@@ -9,20 +9,23 @@ public final class TLPar extends Token
 {
     public TLPar()
     {
-        super.setText("(");
+        super("(");
     }
 
     public TLPar(int line, int pos)
     {
-        super.setText("(");
-        setLine(line);
-        setPos(pos);
+        super("(", line, pos);
+    }
+
+    public TLPar(TLPar token)
+    {
+        super(token);
     }
 
     @Override
     public TLPar clone()
     {
-        return new TLPar(getLine(), getPos());
+        return new TLPar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TMinus.java b/src/main/java/org/sablecc/sablecc/node/TMinus.java
index 1d5915482c242e9aa396633b815eac0d9a97b773..9eaaffa3782372bc9e9dd9c058c3aa72a7a4b8e1 100644
--- a/src/main/java/org/sablecc/sablecc/node/TMinus.java
+++ b/src/main/java/org/sablecc/sablecc/node/TMinus.java
@@ -9,20 +9,23 @@ public final class TMinus extends Token
 {
     public TMinus()
     {
-        super.setText("-");
+        super("-");
     }
 
     public TMinus(int line, int pos)
     {
-        super.setText("-");
-        setLine(line);
-        setPos(pos);
+        super("-", line, pos);
+    }
+
+    public TMinus(TMinus token)
+    {
+        super(token);
     }
 
     @Override
     public TMinus clone()
     {
-        return new TMinus(getLine(), getPos());
+        return new TMinus(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TNew.java b/src/main/java/org/sablecc/sablecc/node/TNew.java
index 39bcc556ee97270857ce3ef71b58cb3e4f965fcc..5bb658b89fbf2eb39da666f1d2827ea5671d69bf 100644
--- a/src/main/java/org/sablecc/sablecc/node/TNew.java
+++ b/src/main/java/org/sablecc/sablecc/node/TNew.java
@@ -9,20 +9,23 @@ public final class TNew extends Token
 {
     public TNew()
     {
-        super.setText("New");
+        super("New");
     }
 
     public TNew(int line, int pos)
     {
-        super.setText("New");
-        setLine(line);
-        setPos(pos);
+        super("New", line, pos);
+    }
+
+    public TNew(TNew token)
+    {
+        super(token);
     }
 
     @Override
     public TNew clone()
     {
-        return new TNew(getLine(), getPos());
+        return new TNew(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TNull.java b/src/main/java/org/sablecc/sablecc/node/TNull.java
index 0e718da416260e7a9fca0480a20e19634ff52b43..80cb56a77e81e73a730ec77107dd3c42f05a11e4 100644
--- a/src/main/java/org/sablecc/sablecc/node/TNull.java
+++ b/src/main/java/org/sablecc/sablecc/node/TNull.java
@@ -9,20 +9,23 @@ public final class TNull extends Token
 {
     public TNull()
     {
-        super.setText("Null");
+        super("Null");
     }
 
     public TNull(int line, int pos)
     {
-        super.setText("Null");
-        setLine(line);
-        setPos(pos);
+        super("Null", line, pos);
+    }
+
+    public TNull(TNull token)
+    {
+        super(token);
     }
 
     @Override
     public TNull clone()
     {
-        return new TNull(getLine(), getPos());
+        return new TNull(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TPackage.java b/src/main/java/org/sablecc/sablecc/node/TPackage.java
index 2e6ff4f1653671e26e8f5196557450fce7b399c3..dd8c3af6c7dd74366563cf08d77c1225ce508ec3 100644
--- a/src/main/java/org/sablecc/sablecc/node/TPackage.java
+++ b/src/main/java/org/sablecc/sablecc/node/TPackage.java
@@ -9,20 +9,23 @@ public final class TPackage extends Token
 {
     public TPackage()
     {
-        super.setText("Package");
+        super("Package");
     }
 
     public TPackage(int line, int pos)
     {
-        super.setText("Package");
-        setLine(line);
-        setPos(pos);
+        super("Package", line, pos);
+    }
+
+    public TPackage(TPackage token)
+    {
+        super(token);
     }
 
     @Override
     public TPackage clone()
     {
-        return new TPackage(getLine(), getPos());
+        return new TPackage(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TPkgId.java b/src/main/java/org/sablecc/sablecc/node/TPkgId.java
index 3913ccdc14cdc7e354bb5fdccbfd46309b98cb9b..4a35d8f5f549c3c4a32bfae3cfc7d07d7a68ec75 100644
--- a/src/main/java/org/sablecc/sablecc/node/TPkgId.java
+++ b/src/main/java/org/sablecc/sablecc/node/TPkgId.java
@@ -9,20 +9,23 @@ public final class TPkgId extends Token
 {
     public TPkgId(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TPkgId(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TPkgId(TPkgId token)
+    {
+        super(token);
     }
 
     @Override
     public TPkgId clone()
     {
-        return new TPkgId(getText(), getLine(), getPos());
+        return new TPkgId(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TPlus.java b/src/main/java/org/sablecc/sablecc/node/TPlus.java
index d3fd88d4a16918edc54ed96f1b664061a0121c87..45fe18001fde2ba28d64540bd8b0a07bcc2528a1 100644
--- a/src/main/java/org/sablecc/sablecc/node/TPlus.java
+++ b/src/main/java/org/sablecc/sablecc/node/TPlus.java
@@ -9,20 +9,23 @@ public final class TPlus extends Token
 {
     public TPlus()
     {
-        super.setText("+");
+        super("+");
     }
 
     public TPlus(int line, int pos)
     {
-        super.setText("+");
-        setLine(line);
-        setPos(pos);
+        super("+", line, pos);
+    }
+
+    public TPlus(TPlus token)
+    {
+        super(token);
     }
 
     @Override
     public TPlus clone()
     {
-        return new TPlus(getLine(), getPos());
+        return new TPlus(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TProductionSpecifier.java b/src/main/java/org/sablecc/sablecc/node/TProductionSpecifier.java
index b73250d3e6f95504fb8e725410f6301c6d4b7908..df07e5837e5a5f8650eab871aad8365e56dd4f76 100644
--- a/src/main/java/org/sablecc/sablecc/node/TProductionSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/TProductionSpecifier.java
@@ -9,20 +9,23 @@ public final class TProductionSpecifier extends Token
 {
     public TProductionSpecifier()
     {
-        super.setText("P");
+        super("P");
     }
 
     public TProductionSpecifier(int line, int pos)
     {
-        super.setText("P");
-        setLine(line);
-        setPos(pos);
+        super("P", line, pos);
+    }
+
+    public TProductionSpecifier(TProductionSpecifier token)
+    {
+        super(token);
     }
 
     @Override
     public TProductionSpecifier clone()
     {
-        return new TProductionSpecifier(getLine(), getPos());
+        return new TProductionSpecifier(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TProductions.java b/src/main/java/org/sablecc/sablecc/node/TProductions.java
index bbcf9d44e26362ae501bc5ae04e58ecc1b620b9a..707edf785d210cf5fb62c9a29e0218e813e53d56 100644
--- a/src/main/java/org/sablecc/sablecc/node/TProductions.java
+++ b/src/main/java/org/sablecc/sablecc/node/TProductions.java
@@ -9,20 +9,23 @@ public final class TProductions extends Token
 {
     public TProductions()
     {
-        super.setText("Productions");
+        super("Productions");
     }
 
     public TProductions(int line, int pos)
     {
-        super.setText("Productions");
-        setLine(line);
-        setPos(pos);
+        super("Productions", line, pos);
+    }
+
+    public TProductions(TProductions token)
+    {
+        super(token);
     }
 
     @Override
     public TProductions clone()
     {
-        return new TProductions(getLine(), getPos());
+        return new TProductions(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TQMark.java b/src/main/java/org/sablecc/sablecc/node/TQMark.java
index 5b77234f754f1433cb1180504039893e83943b25..6899c0001c4805ed95985c8d0a6f50edf03c6830 100644
--- a/src/main/java/org/sablecc/sablecc/node/TQMark.java
+++ b/src/main/java/org/sablecc/sablecc/node/TQMark.java
@@ -9,20 +9,23 @@ public final class TQMark extends Token
 {
     public TQMark()
     {
-        super.setText("?");
+        super("?");
     }
 
     public TQMark(int line, int pos)
     {
-        super.setText("?");
-        setLine(line);
-        setPos(pos);
+        super("?", line, pos);
+    }
+
+    public TQMark(TQMark token)
+    {
+        super(token);
     }
 
     @Override
     public TQMark clone()
     {
-        return new TQMark(getLine(), getPos());
+        return new TQMark(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TRBkt.java b/src/main/java/org/sablecc/sablecc/node/TRBkt.java
index a64429b3cc1bafe79b275fdb64d98d09bc00cfa4..058d8e5a4d335f4cc7261c43edebcf35d8b37c2c 100644
--- a/src/main/java/org/sablecc/sablecc/node/TRBkt.java
+++ b/src/main/java/org/sablecc/sablecc/node/TRBkt.java
@@ -9,20 +9,23 @@ public final class TRBkt extends Token
 {
     public TRBkt()
     {
-        super.setText("]");
+        super("]");
     }
 
     public TRBkt(int line, int pos)
     {
-        super.setText("]");
-        setLine(line);
-        setPos(pos);
+        super("]", line, pos);
+    }
+
+    public TRBkt(TRBkt token)
+    {
+        super(token);
     }
 
     @Override
     public TRBkt clone()
     {
-        return new TRBkt(getLine(), getPos());
+        return new TRBkt(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TRBrace.java b/src/main/java/org/sablecc/sablecc/node/TRBrace.java
index 7a8a97bb0a6a8752c0a93d751135ced50299340f..6af214d976f1fe41bff86204cf4afcad625bb934 100644
--- a/src/main/java/org/sablecc/sablecc/node/TRBrace.java
+++ b/src/main/java/org/sablecc/sablecc/node/TRBrace.java
@@ -9,20 +9,23 @@ public final class TRBrace extends Token
 {
     public TRBrace()
     {
-        super.setText("}");
+        super("}");
     }
 
     public TRBrace(int line, int pos)
     {
-        super.setText("}");
-        setLine(line);
-        setPos(pos);
+        super("}", line, pos);
+    }
+
+    public TRBrace(TRBrace token)
+    {
+        super(token);
     }
 
     @Override
     public TRBrace clone()
     {
-        return new TRBrace(getLine(), getPos());
+        return new TRBrace(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TRPar.java b/src/main/java/org/sablecc/sablecc/node/TRPar.java
index b186f71fb4d8d881bbefb7a17632862a9465aa68..692be1b7cf344d623f13f239315261e283ee2ac5 100644
--- a/src/main/java/org/sablecc/sablecc/node/TRPar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TRPar.java
@@ -9,20 +9,23 @@ public final class TRPar extends Token
 {
     public TRPar()
     {
-        super.setText(")");
+        super(")");
     }
 
     public TRPar(int line, int pos)
     {
-        super.setText(")");
-        setLine(line);
-        setPos(pos);
+        super(")", line, pos);
+    }
+
+    public TRPar(TRPar token)
+    {
+        super(token);
     }
 
     @Override
     public TRPar clone()
     {
-        return new TRPar(getLine(), getPos());
+        return new TRPar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TSemicolon.java b/src/main/java/org/sablecc/sablecc/node/TSemicolon.java
index 65561a562caf4de4492e2843f4c51a8dcab6f321..bf681ed37ba9fda4e359f9d94ede6f4392c8fb6b 100644
--- a/src/main/java/org/sablecc/sablecc/node/TSemicolon.java
+++ b/src/main/java/org/sablecc/sablecc/node/TSemicolon.java
@@ -9,20 +9,23 @@ public final class TSemicolon extends Token
 {
     public TSemicolon()
     {
-        super.setText(";");
+        super(";");
     }
 
     public TSemicolon(int line, int pos)
     {
-        super.setText(";");
-        setLine(line);
-        setPos(pos);
+        super(";", line, pos);
+    }
+
+    public TSemicolon(TSemicolon token)
+    {
+        super(token);
     }
 
     @Override
     public TSemicolon clone()
     {
-        return new TSemicolon(getLine(), getPos());
+        return new TSemicolon(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TSlash.java b/src/main/java/org/sablecc/sablecc/node/TSlash.java
index 68eae045cc58ce2150f085ea3144d85ba1f5e687..0602691a4d422b86fafdbfed3b96d9dfe42e84bf 100644
--- a/src/main/java/org/sablecc/sablecc/node/TSlash.java
+++ b/src/main/java/org/sablecc/sablecc/node/TSlash.java
@@ -9,20 +9,23 @@ public final class TSlash extends Token
 {
     public TSlash()
     {
-        super.setText("/");
+        super("/");
     }
 
     public TSlash(int line, int pos)
     {
-        super.setText("/");
-        setLine(line);
-        setPos(pos);
+        super("/", line, pos);
+    }
+
+    public TSlash(TSlash token)
+    {
+        super(token);
     }
 
     @Override
     public TSlash clone()
     {
-        return new TSlash(getLine(), getPos());
+        return new TSlash(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TStar.java b/src/main/java/org/sablecc/sablecc/node/TStar.java
index 37ff65d699bc2c3ec583c2afa0bdedae569380b4..eb5f04ee3a16bc882b5a024a70ad6cb389d702ba 100644
--- a/src/main/java/org/sablecc/sablecc/node/TStar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TStar.java
@@ -9,20 +9,23 @@ public final class TStar extends Token
 {
     public TStar()
     {
-        super.setText("*");
+        super("*");
     }
 
     public TStar(int line, int pos)
     {
-        super.setText("*");
-        setLine(line);
-        setPos(pos);
+        super("*", line, pos);
+    }
+
+    public TStar(TStar token)
+    {
+        super(token);
     }
 
     @Override
     public TStar clone()
     {
-        return new TStar(getLine(), getPos());
+        return new TStar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TStates.java b/src/main/java/org/sablecc/sablecc/node/TStates.java
index 6f4dd26aa72d3d34cb5624c559df29311029b744..ac0705d7eca896ff01fc87e69ed40fd976f7ff6b 100644
--- a/src/main/java/org/sablecc/sablecc/node/TStates.java
+++ b/src/main/java/org/sablecc/sablecc/node/TStates.java
@@ -9,20 +9,23 @@ public final class TStates extends Token
 {
     public TStates()
     {
-        super.setText("States");
+        super("States");
     }
 
     public TStates(int line, int pos)
     {
-        super.setText("States");
-        setLine(line);
-        setPos(pos);
+        super("States", line, pos);
+    }
+
+    public TStates(TStates token)
+    {
+        super(token);
     }
 
     @Override
     public TStates clone()
     {
-        return new TStates(getLine(), getPos());
+        return new TStates(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TString.java b/src/main/java/org/sablecc/sablecc/node/TString.java
index f04e798308b84f99d10ac13a0e7c54198ea615a6..74779c4e44efefd91718cf0712817f334f138fa0 100644
--- a/src/main/java/org/sablecc/sablecc/node/TString.java
+++ b/src/main/java/org/sablecc/sablecc/node/TString.java
@@ -9,20 +9,23 @@ public final class TString extends Token
 {
     public TString(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TString(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TString(TString token)
+    {
+        super(token);
     }
 
     @Override
     public TString clone()
     {
-        return new TString(getText(), getLine(), getPos());
+        return new TString(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TSyntax.java b/src/main/java/org/sablecc/sablecc/node/TSyntax.java
index 699ec81368d537b148738386bedf255a89846a26..292cdcbb814e34f35b0825bf15c215bd7b046bb1 100644
--- a/src/main/java/org/sablecc/sablecc/node/TSyntax.java
+++ b/src/main/java/org/sablecc/sablecc/node/TSyntax.java
@@ -9,20 +9,23 @@ public final class TSyntax extends Token
 {
     public TSyntax()
     {
-        super.setText("Syntax");
+        super("Syntax");
     }
 
     public TSyntax(int line, int pos)
     {
-        super.setText("Syntax");
-        setLine(line);
-        setPos(pos);
+        super("Syntax", line, pos);
+    }
+
+    public TSyntax(TSyntax token)
+    {
+        super(token);
     }
 
     @Override
     public TSyntax clone()
     {
-        return new TSyntax(getLine(), getPos());
+        return new TSyntax(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TTokenSpecifier.java b/src/main/java/org/sablecc/sablecc/node/TTokenSpecifier.java
index 98bc334709a97419a4e80605ae29557d2f03ed89..07c241402cafe59b030049936ddb367f9886c37a 100644
--- a/src/main/java/org/sablecc/sablecc/node/TTokenSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/TTokenSpecifier.java
@@ -9,20 +9,23 @@ public final class TTokenSpecifier extends Token
 {
     public TTokenSpecifier()
     {
-        super.setText("T");
+        super("T");
     }
 
     public TTokenSpecifier(int line, int pos)
     {
-        super.setText("T");
-        setLine(line);
-        setPos(pos);
+        super("T", line, pos);
+    }
+
+    public TTokenSpecifier(TTokenSpecifier token)
+    {
+        super(token);
     }
 
     @Override
     public TTokenSpecifier clone()
     {
-        return new TTokenSpecifier(getLine(), getPos());
+        return new TTokenSpecifier(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TTokens.java b/src/main/java/org/sablecc/sablecc/node/TTokens.java
index 02740484431f7c344eef52de797e5c9230b95313..04ef9e32fec3a5499e19664f6121e362f0ec4c78 100644
--- a/src/main/java/org/sablecc/sablecc/node/TTokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/TTokens.java
@@ -9,20 +9,23 @@ public final class TTokens extends Token
 {
     public TTokens()
     {
-        super.setText("Tokens");
+        super("Tokens");
     }
 
     public TTokens(int line, int pos)
     {
-        super.setText("Tokens");
-        setLine(line);
-        setPos(pos);
+        super("Tokens", line, pos);
+    }
+
+    public TTokens(TTokens token)
+    {
+        super(token);
     }
 
     @Override
     public TTokens clone()
     {
-        return new TTokens(getLine(), getPos());
+        return new TTokens(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TTree.java b/src/main/java/org/sablecc/sablecc/node/TTree.java
index 4fb7688a5caebce04bb6e081b81ec786a46c738f..4701d53c947f1a1417c159c576e9d12aeda309ce 100644
--- a/src/main/java/org/sablecc/sablecc/node/TTree.java
+++ b/src/main/java/org/sablecc/sablecc/node/TTree.java
@@ -9,20 +9,23 @@ public final class TTree extends Token
 {
     public TTree()
     {
-        super.setText("Tree");
+        super("Tree");
     }
 
     public TTree(int line, int pos)
     {
-        super.setText("Tree");
-        setLine(line);
-        setPos(pos);
+        super("Tree", line, pos);
+    }
+
+    public TTree(TTree token)
+    {
+        super(token);
     }
 
     @Override
     public TTree clone()
     {
-        return new TTree(getLine(), getPos());
+        return new TTree(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/Token.java b/src/main/java/org/sablecc/sablecc/node/Token.java
index cd88b31b9299b681a4b965b2c6111a7091ddd3f2..861f4988b88f3612b9bb1a9b4104f5a9c2e805a0 100644
--- a/src/main/java/org/sablecc/sablecc/node/Token.java
+++ b/src/main/java/org/sablecc/sablecc/node/Token.java
@@ -12,6 +12,31 @@ public abstract class Token extends Node implements IToken
     private int line;
     private int pos;
 
+    public Token(String text, int line, int pos)
+    {
+        this.text = text;
+        this.line = line;
+        this.pos = pos;
+    }
+
+    public Token(String text)
+    {
+        this(text, 0, 0);
+    }
+
+    public Token()
+    {
+        this((String)null);
+    }
+
+    public Token(Token token)
+    {
+        super(token);
+        this.text = token.text;
+        this.line = token.line;
+        this.pos = token.pos;
+    }
+
     @Override
     public String getText()
     {
diff --git a/src/main/resources/org/sablecc/sablecc/alternatives.txt b/src/main/resources/org/sablecc/sablecc/alternatives.txt
index ef3c2d4e3ee034a003f8ff1b95f613436312a81a..eb1569cd445760238f281c1b10430881090760ad 100644
--- a/src/main/resources/org/sablecc/sablecc/alternatives.txt
+++ b/src/main/resources/org/sablecc/sablecc/alternatives.txt
@@ -78,24 +78,29 @@ $
 
 Macro:CloneHeader
 
-    @Override
-    public $0$ clone()
+    public $0$($0$ node)
     {
-        return new $0$(
+        super(node);
+
 $
 
 Macro:CloneBodyNode
+        set$0$(cloneNode(node._$1$_));
 
-            cloneNode(this._$1$_)$2$
 $
 
 Macro:CloneBodyList
+        set$0$(cloneList(node._$1$_));
 
-            cloneList(this._$0$_)$1$
 $
 
 Macro:CloneTail
-);
+    }
+
+    @Override
+    public $0$ clone()
+    {
+        return new $0$(this);
     }
 
 $
diff --git a/src/main/resources/org/sablecc/sablecc/productions.txt b/src/main/resources/org/sablecc/sablecc/productions.txt
index 061f218ab7970dbb73e8b6642ccd7469f9832645..90b681ff3c59ce77a23edec8d605ceb9eb5b5017 100644
--- a/src/main/resources/org/sablecc/sablecc/productions.txt
+++ b/src/main/resources/org/sablecc/sablecc/productions.txt
@@ -12,6 +12,14 @@ package $0$;
 
 public abstract class $1$ extends Node
 {
+    public $1$()
+    {}
+
+    public $1$($1$ node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract $1$ clone();
 }
diff --git a/src/main/resources/org/sablecc/sablecc/tokens.txt b/src/main/resources/org/sablecc/sablecc/tokens.txt
index f93224cd03ff3b3ee5bb851a8f2e687da82aad31..c26f6434699e9ba91d88db4563bb2a2e0d7584e3 100644
--- a/src/main/resources/org/sablecc/sablecc/tokens.txt
+++ b/src/main/resources/org/sablecc/sablecc/tokens.txt
@@ -20,20 +20,23 @@ public final class $2$ extends Token
 {
     public $2$(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public $2$(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public $2$($2$ token)
+    {
+        super(token);
     }
 
     @Override
     public $2$ clone()
     {
-        return new $2$(getText(), getLine(), getPos());
+        return new $2$(this);
     }
 
     @Override
@@ -61,20 +64,23 @@ public final class $2$ extends Token
 {
     public $2$()
     {
-        super.setText("$3$");
+        super("$3$");
     }
 
     public $2$(int line, int pos)
     {
-        super.setText("$3$");
-        setLine(line);
-        setPos(pos);
+        super("$3$", line, pos);
+    }
+
+    public $2$($2$ token)
+    {
+        super(token);
     }
 
     @Override
     public $2$ clone()
     {
-        return new $2$(getLine(), getPos());
+        return new $2$(this);
     }
 
     @Override
diff --git a/src/main/resources/org/sablecc/sablecc/utils.txt b/src/main/resources/org/sablecc/sablecc/utils.txt
index 983fc3e8d2169a49a0249049de83e1c06d737345..05a3036f91f445c5e259c817fc1d125ceaa91472 100644
--- a/src/main/resources/org/sablecc/sablecc/utils.txt
+++ b/src/main/resources/org/sablecc/sablecc/utils.txt
@@ -30,12 +30,17 @@ public final class Start extends Node
         setEOF(_eof_);
     }
 
+    public Start(Start node)
+    {
+        super(node);
+        set$2$(cloneNode(node._$3$_));
+        setEOF(cloneNode(node._eof_));
+    }
+
     @Override
     public Start clone()
     {
-        return new Start(
-            cloneNode(this._$3$_),
-            cloneNode(this._eof_));
+        return new Start(this);
     }
 
     @Override
@@ -153,20 +158,23 @@ public final class EOF extends Token
 {
     public EOF()
     {
-        setText("");
+        super("");
     }
 
     public EOF(int line, int pos)
     {
-        setText("");
-        setLine(line);
-        setPos(pos);
+        super("", line, pos);
+    }
+
+    public EOF(EOF token)
+    {
+        super(token);
     }
 
     @Override
     public EOF clone()
     {
-        return new EOF(getLine(), getPos());
+        return new EOF(this);
     }
 
     @Override
@@ -193,6 +201,31 @@ public abstract class Token extends Node implements IToken
     private int line;
     private int pos;
 
+    public Token(String text, int line, int pos)
+    {
+        this.text = text;
+        this.line = line;
+        this.pos = pos;
+    }
+
+    public Token(String text)
+    {
+        this(text, 0, 0);
+    }
+
+    public Token()
+    {
+        this((String)null);
+    }
+
+    public Token(Token token)
+    {
+        super(token);
+        this.text = token.text;
+        this.line = token.line;
+        this.pos = token.pos;
+    }
+
     @Override
     public String getText()
     {
@@ -263,6 +296,17 @@ public abstract class Node extends PositionedNode implements Switchable, Cloneab
 {
     private Node parent;
 
+    public Node()
+    {}
+
+    public Node(Node node)
+    {
+        super(node);
+        // Copy constructor intentionally does not keep parent!
+        // The new copied node is not a child of the original parent anymore.
+        this.parent = null;
+    }
+
     @Override
     public abstract Node clone();