diff --git a/build.xml b/build.xml
index d5438f6a..d940621d 100644
--- a/build.xml
+++ b/build.xml
@@ -511,6 +511,7 @@
+
@@ -643,6 +644,7 @@
+
@@ -2548,6 +2550,7 @@
+
@@ -2680,6 +2683,7 @@
+
@@ -3964,7 +3968,7 @@
-
+
@@ -4118,7 +4122,6 @@
-
@@ -5514,7 +5517,48 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -5555,11 +5599,12 @@
+
-
+
@@ -5588,7 +5633,6 @@
-
@@ -5602,6 +5646,7 @@
+
@@ -6046,7 +6091,6 @@
-
diff --git a/coderules/languages/jetbrains.mps.lang.coderules/generator/template/main@generator.mps b/coderules/languages/jetbrains.mps.lang.coderules/generator/template/main@generator.mps
index 608de56b..20e438d6 100644
--- a/coderules/languages/jetbrains.mps.lang.coderules/generator/template/main@generator.mps
+++ b/coderules/languages/jetbrains.mps.lang.coderules/generator/template/main@generator.mps
@@ -5,18 +5,19 @@
-
+
-
+
-
+
+
@@ -48,6 +49,10 @@
+
+
+
+
@@ -131,6 +136,10 @@
+
+
+
+
@@ -321,6 +330,7 @@
+
@@ -398,6 +408,12 @@
+
+
+
+
+
+
@@ -480,6 +496,9 @@
+
+
+
@@ -566,6 +585,7 @@
+
@@ -680,6 +700,10 @@
+
+
+
+
@@ -687,17 +711,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -707,7 +751,14 @@
+
+
+
+
+
+
+
@@ -760,6 +811,11 @@
+
+
+
+
+
@@ -1539,55 +1595,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
@@ -1681,55 +1691,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
@@ -3176,7 +3140,25 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -3368,6 +3350,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -3389,6 +3433,13 @@
+
+
+
+
+
+
+
@@ -6788,57 +6839,14 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
@@ -6940,57 +6948,14 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
@@ -7208,55 +7173,13 @@
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
@@ -10683,6 +10606,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -10751,21 +10689,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -14078,6 +14001,12 @@
+
+
+
+
+
+
@@ -15177,6 +15106,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -15201,23 +15147,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -15395,6 +15324,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -15435,23 +15381,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -15579,13 +15508,16 @@
-
+
+
+
+
@@ -15619,9 +15551,6 @@
-
-
-
@@ -16091,5 +16020,1542 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/coderules/languages/jetbrains.mps.lang.coderules/runtime/models/jetbrains.mps.lang.coderules.eval.mps b/coderules/languages/jetbrains.mps.lang.coderules/runtime/models/jetbrains.mps.lang.coderules.eval.mps
index 9b2f184a..3c14670f 100644
--- a/coderules/languages/jetbrains.mps.lang.coderules/runtime/models/jetbrains.mps.lang.coderules.eval.mps
+++ b/coderules/languages/jetbrains.mps.lang.coderules/runtime/models/jetbrains.mps.lang.coderules.eval.mps
@@ -113,6 +113,9 @@
+
+
+
@@ -5068,6 +5071,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -5118,7 +5136,16 @@
-
+
+
+
+
+
+
+
+
+
+
@@ -5190,6 +5217,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -5261,6 +5336,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -5294,6 +5433,14 @@
+
+
+
+
+
+
+
+
@@ -5565,9 +5712,23 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -5866,67 +6027,83 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/coderules/languages/jetbrains.mps.lang.coderules/runtime/models/jetbrains.mps.lang.coderules.program.analysis.mps b/coderules/languages/jetbrains.mps.lang.coderules/runtime/models/jetbrains.mps.lang.coderules.program.analysis.mps
index 72802572..053ca99b 100644
--- a/coderules/languages/jetbrains.mps.lang.coderules/runtime/models/jetbrains.mps.lang.coderules.program.analysis.mps
+++ b/coderules/languages/jetbrains.mps.lang.coderules/runtime/models/jetbrains.mps.lang.coderules.program.analysis.mps
@@ -66,6 +66,9 @@
+
+
+
@@ -157,6 +160,9 @@
+
+
+
@@ -182,7 +188,9 @@
-
+
+
+
@@ -312,6 +320,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -438,6 +470,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -446,6 +519,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1678,6 +1765,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2700,6 +2882,9 @@
+
+
+
@@ -2890,7 +3075,7 @@
-
+
@@ -2970,6 +3155,9 @@
+
+
+
@@ -2996,6 +3184,9 @@
+
+
+
@@ -3213,8 +3404,8 @@
-
-
+
+
@@ -3245,5 +3436,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/coderules/solutions/jetbrains.mps.coderules.build/models/jetbrains.mps.coderules.build.mps b/coderules/solutions/jetbrains.mps.coderules.build/models/jetbrains.mps.coderules.build.mps
index a176ff89..c6240f53 100644
--- a/coderules/solutions/jetbrains.mps.coderules.build/models/jetbrains.mps.coderules.build.mps
+++ b/coderules/solutions/jetbrains.mps.coderules.build/models/jetbrains.mps.coderules.build.mps
@@ -2,13 +2,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -1710,6 +1710,11 @@
+
+
+
+
+
diff --git a/coderules/solutions/jetbrains.mps.coderules.typechecking.test/models/jetbrains.mps.coderules.incrementality@tests.mps b/coderules/solutions/jetbrains.mps.coderules.typechecking.test/models/jetbrains.mps.coderules.incrementality@tests.mps
index b9462204..525f0f72 100644
--- a/coderules/solutions/jetbrains.mps.coderules.typechecking.test/models/jetbrains.mps.coderules.incrementality@tests.mps
+++ b/coderules/solutions/jetbrains.mps.coderules.typechecking.test/models/jetbrains.mps.coderules.incrementality@tests.mps
@@ -101,6 +101,7 @@
+
@@ -115,6 +116,7 @@
+
@@ -316,22 +318,11 @@
-
-
-
-
-
-
-
-
-
-
-
@@ -354,6 +345,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -745,14 +775,6 @@
-
-
-
-
-
-
-
-
@@ -855,21 +877,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -894,82 +901,22 @@
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
@@ -977,41 +924,43 @@
-
-
-
+
+
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
-
+
@@ -1041,19 +990,21 @@
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
-
+
@@ -1061,15 +1012,6 @@
-
-
-
-
-
-
-
-
-
diff --git a/coderules/solutions/jetbrains.mps.lang.coderules.template/jetbrains.mps.lang.coderules.template.msd b/coderules/solutions/jetbrains.mps.lang.coderules.template/jetbrains.mps.lang.coderules.template.msd
index 39d34249..403f4b96 100644
--- a/coderules/solutions/jetbrains.mps.lang.coderules.template/jetbrains.mps.lang.coderules.template.msd
+++ b/coderules/solutions/jetbrains.mps.lang.coderules.template/jetbrains.mps.lang.coderules.template.msd
@@ -13,6 +13,7 @@
6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)
da80355b-a098-4248-9ec8-70d10dd7e9af(jetbrains.mps.reporting.runtime)
bbf5c548-7111-4a53-a117-cdefc664cf34(jetbrains.mps.logic.reactor)
+ 26e8f4ce-2a35-4f44-8065-e5ba154b18e9(jetbrains.mps.lang.coderules.runtime)
@@ -33,6 +34,7 @@
+
diff --git a/coderules/solutions/jetbrains.mps.lang.coderules.template/models/jetbrains.mps.lang.coderules.template.mps b/coderules/solutions/jetbrains.mps.lang.coderules.template/models/jetbrains.mps.lang.coderules.template.mps
index 90c3d0df..7dc5c8a0 100644
--- a/coderules/solutions/jetbrains.mps.lang.coderules.template/models/jetbrains.mps.lang.coderules.template.mps
+++ b/coderules/solutions/jetbrains.mps.lang.coderules.template/models/jetbrains.mps.lang.coderules.template.mps
@@ -25,6 +25,7 @@
+
@@ -392,6 +393,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -2680,6 +2691,9 @@
+
+
+
@@ -2694,6 +2708,10 @@
+
+
+
+
@@ -2713,6 +2731,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4199,6 +4230,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4427,6 +4474,11 @@
+
+
+
+
+
diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournalImpl.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournalImpl.kt
index 2cd58d9d..7b6be627 100644
--- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournalImpl.kt
+++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournalImpl.kt
@@ -215,6 +215,7 @@ internal open class MatchJournalImpl(
override fun kind(): Kind = Kind.PROPAGATION
override fun uniqueTag(): Any = tag().hashCode()
override fun tag(): String = "initialrule${"initialrule".hashCode()}"
+ override fun basetag(): String = tag()
override fun headKept(): Iterable = emptyList()
override fun headReplaced(): Iterable = emptyList()
override fun guard(): Iterable = emptyList()
diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/program/Rule.java b/reactor/Core/src/jetbrains/mps/logic/reactor/program/Rule.java
index f4e1a8bf..af50b3f2 100644
--- a/reactor/Core/src/jetbrains/mps/logic/reactor/program/Rule.java
+++ b/reactor/Core/src/jetbrains/mps/logic/reactor/program/Rule.java
@@ -32,10 +32,15 @@ public abstract class Rule {
public abstract Object uniqueTag();
/**
- * A human-readable identifier, not guaranteed to be unique
+ * Human-readable identifier, not guaranteed to be unique.
*/
public abstract String tag();
+ /**
+ * Human-readable identifier shared by all rules produced from the same template.
+ */
+ public abstract String basetag();
+
/**
* An origin serves as justification for all constraints affected by this rule.
*/
diff --git a/reactor/Test/src/program/MockProgram.kt b/reactor/Test/src/program/MockProgram.kt
index feb84633..39a9cf5d 100644
--- a/reactor/Test/src/program/MockProgram.kt
+++ b/reactor/Test/src/program/MockProgram.kt
@@ -85,6 +85,8 @@ class MockRule(
override fun tag(): String = tag
+ override fun basetag(): String = tag
+
override fun headKept(): Iterable = kept
override fun headReplaced(): Iterable = replaced