diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9a650aeff..7970554ec 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,7 +7,13 @@ The project does _not_ follow Semantic Versioning and the changes are documented
## Feburary 2024
-- de.itemis.mps.editor.diagram: Avoid unnecessary layouting of sub-diagrams
+### Added
+
+- com.mbeddr.mpsutil.blutil: A new ifInstanceOf statement was added that supports else if and else branches.
+
+### Fixed
+
+- de.itemis.mps.editor.diagram: Avoid unnecessary layouting of sub-diagrams.
- de.itemis.mps.editor.diagram: A layouting bug related to ports was fixed.
## January 2024
diff --git a/README.md b/README.md
index ec55dae8e..90b84187a 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
# MPS Extensions
-![JetBrains MPS 2022.2.1](https://img.shields.io/badge/JetBrains%20MPS-2022.2.1-orange)
+![JetBrains MPS 2022.2.2](https://img.shields.io/badge/JetBrains%20MPS-2022.2.2-orange)
The MPS extensions aim to ease language development within MPS. They are maintained by itemis, JetBrains, and the open source community, and its development is closely aligned with the development of MPS.
diff --git a/code/.mps/modules.xml b/code/.mps/modules.xml
index 76e339033..ca041a8d3 100644
--- a/code/.mps/modules.xml
+++ b/code/.mps/modules.xml
@@ -9,6 +9,7 @@
+
diff --git a/code/blutil/languages/com.mbeddr.mpsutil.blutil/blutil.mpl b/code/blutil/languages/com.mbeddr.mpsutil.blutil/blutil.mpl
index 27175900a..0281d6751 100644
--- a/code/blutil/languages/com.mbeddr.mpsutil.blutil/blutil.mpl
+++ b/code/blutil/languages/com.mbeddr.mpsutil.blutil/blutil.mpl
@@ -34,6 +34,8 @@
f3061a53-9226-4cc5-a443-f952ceaf5816(jetbrains.mps.baseLanguage)
6ed54515-acc8-4d1e-a16c-9fd6cfe951ea(MPS.Core)
c72da2b9-7cce-4447-8389-f407dc1158b7(jetbrains.mps.lang.structure)
+ 9a4afe51-f114-4595-b5df-048ce3c596be(jetbrains.mps.runtime)
+ 2bdcefec-ba49-4b32-ab50-ebc7a41d5090(jetbrains.mps.lang.smodel#1139186730696)
@@ -43,6 +45,7 @@
+
@@ -81,6 +84,7 @@
+
@@ -134,8 +138,13 @@
92d2ea16-5a42-4fdf-a676-c7604efe3504(de.slisson.mps.richtext)
3a13115c-633c-4c5c-bbcc-75c4219e9555(jetbrains.mps.lang.quotation)
760a0a8c-eabb-4521-8bfd-65db761a9ba3(jetbrains.mps.baseLanguage.logging)
+ 13744753-c81f-424a-9c1b-cf8943bf4e86(jetbrains.mps.lang.sharedConcepts)
+
+
+
+
@@ -202,6 +211,7 @@
+
@@ -214,6 +224,7 @@
83888646-71ce-4f1c-9c53-c54016f6ad4f(jetbrains.mps.baseLanguage.collections)
ceab5195-25ea-4f22-9b92-103b95ca8c0c(jetbrains.mps.lang.core)
f3061a53-9226-4cc5-a443-f952ceaf5816(jetbrains.mps.baseLanguage)
+ 7866978e-a0f0-4cc7-81bc-4d213d9375e1(jetbrains.mps.lang.smodel)
diff --git a/code/blutil/languages/com.mbeddr.mpsutil.blutil/generator/template/main@generator.mps b/code/blutil/languages/com.mbeddr.mpsutil.blutil/generator/template/main@generator.mps
index 9bbb37463..d9fd5de17 100644
--- a/code/blutil/languages/com.mbeddr.mpsutil.blutil/generator/template/main@generator.mps
+++ b/code/blutil/languages/com.mbeddr.mpsutil.blutil/generator/template/main@generator.mps
@@ -9,6 +9,7 @@
+
@@ -29,6 +30,8 @@
+
+
@@ -93,6 +96,7 @@
+
@@ -205,6 +209,9 @@
+
+
+
@@ -305,6 +312,12 @@
+
+
+
+
+
+
@@ -335,6 +348,7 @@
+
@@ -7903,5 +7917,360 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/behavior.mps b/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/behavior.mps
index d3a931e48..8c978ad9b 100644
--- a/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/behavior.mps
+++ b/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/behavior.mps
@@ -17,6 +17,8 @@
+
+
@@ -2417,5 +2419,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/constraints.mps b/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/constraints.mps
index 0498359db..05b0766e6 100644
--- a/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/constraints.mps
+++ b/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/constraints.mps
@@ -4,6 +4,7 @@
+
@@ -48,6 +49,7 @@
+
@@ -95,11 +97,17 @@
+
+
+
+
+
+
@@ -109,6 +117,7 @@
+
@@ -148,6 +157,7 @@
+
@@ -156,11 +166,16 @@
+
+
+
+
+
@@ -174,6 +189,9 @@
+
+
+
@@ -193,6 +211,14 @@
+
+
+
+
+
+
+
+
@@ -223,6 +249,7 @@
+
@@ -1156,5 +1183,181 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/dataFlow.mps b/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/dataFlow.mps
index 60f488075..03d5df066 100644
--- a/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/dataFlow.mps
+++ b/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/dataFlow.mps
@@ -7,9 +7,11 @@
+
+
@@ -58,6 +60,10 @@
+
+
+
+
@@ -97,6 +103,7 @@
+
@@ -136,6 +143,7 @@
+
@@ -799,5 +807,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/editor.mps b/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/editor.mps
index 40dbfb56d..e64947cd5 100644
--- a/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/editor.mps
+++ b/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/editor.mps
@@ -6,6 +6,9 @@
+
+
+
@@ -21,11 +24,22 @@
+
+
+
-
+
+
+
+
+
+
+
+
+
@@ -62,6 +76,11 @@
+
+
+
+
+
@@ -99,6 +118,7 @@
+
@@ -142,7 +162,11 @@
+
+
+
+
@@ -151,10 +175,17 @@
+
+
+
+
+
+
+
@@ -170,6 +201,9 @@
+
+
+
@@ -232,6 +266,10 @@
+
+
+
+
@@ -247,7 +285,7 @@
-
+
@@ -279,6 +317,9 @@
+
+
+
@@ -297,6 +338,7 @@
+
@@ -349,6 +391,9 @@
+
+
+
@@ -361,6 +406,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -394,8 +481,12 @@
-
-
+
+
+
+
+
+
@@ -415,6 +506,14 @@
+
+
+
+
+
+
+
+
@@ -2254,7 +2353,7 @@
-
+
@@ -2529,7 +2628,7 @@
-
+
@@ -2539,7 +2638,7 @@
-
+
@@ -2622,7 +2721,7 @@
-
+
@@ -2892,7 +2991,7 @@
-
+
@@ -2902,7 +3001,7 @@
-
+
@@ -3395,5 +3494,448 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/structure.mps b/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/structure.mps
index 77a873a04..24301a697 100644
--- a/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/structure.mps
+++ b/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/structure.mps
@@ -9,8 +9,9 @@
+
+
-
@@ -1011,5 +1012,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/typesystem.mps b/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/typesystem.mps
index 2a9ada6d4..c730cd6f9 100644
--- a/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/typesystem.mps
+++ b/code/blutil/languages/com.mbeddr.mpsutil.blutil/languageModels/typesystem.mps
@@ -15,6 +15,7 @@
+
@@ -117,6 +118,7 @@
+
@@ -261,6 +263,10 @@
+
+
+
+
@@ -3143,5 +3149,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/blutil/solutions/com.mbeddr.mpsutil.blutil.genutil.rt/com.mbeddr.mpsutil.blutil.genutil.rt.msd b/code/blutil/solutions/com.mbeddr.mpsutil.blutil.genutil.rt/com.mbeddr.mpsutil.blutil.genutil.rt.msd
index 5d9f802dd..44537e729 100644
--- a/code/blutil/solutions/com.mbeddr.mpsutil.blutil.genutil.rt/com.mbeddr.mpsutil.blutil.genutil.rt.msd
+++ b/code/blutil/solutions/com.mbeddr.mpsutil.blutil.genutil.rt/com.mbeddr.mpsutil.blutil.genutil.rt.msd
@@ -16,8 +16,10 @@
6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)
6ed54515-acc8-4d1e-a16c-9fd6cfe951ea(MPS.Core)
215c4c45-ba99-49f5-9ab7-4b6901a63cfd(MPS.Generator)
+ f3061a53-9226-4cc5-a443-f952ceaf5816(jetbrains.mps.baseLanguage)
+
@@ -34,6 +36,11 @@
+
+
+
+
+
diff --git a/code/blutil/solutions/com.mbeddr.mpsutil.blutil.genutil.rt/models/genUtil.mps b/code/blutil/solutions/com.mbeddr.mpsutil.blutil.genutil.rt/models/genUtil.mps
index d4ae95b28..db802bf41 100644
--- a/code/blutil/solutions/com.mbeddr.mpsutil.blutil.genutil.rt/models/genUtil.mps
+++ b/code/blutil/solutions/com.mbeddr.mpsutil.blutil.genutil.rt/models/genUtil.mps
@@ -5,11 +5,13 @@
+
+
diff --git a/code/blutil/tests/test.com.mbeddr.mpsutil.blutil/models/test.com.mbeddr.mpsutil.blutil.ifInstanceOf@tests.mps b/code/blutil/tests/test.com.mbeddr.mpsutil.blutil/models/test.com.mbeddr.mpsutil.blutil.ifInstanceOf@tests.mps
new file mode 100644
index 000000000..06726edf3
--- /dev/null
+++ b/code/blutil/tests/test.com.mbeddr.mpsutil.blutil/models/test.com.mbeddr.mpsutil.blutil.ifInstanceOf@tests.mps
@@ -0,0 +1,543 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/blutil/tests/test.com.mbeddr.mpsutil.blutil/test.com.mbeddr.mpsutil.blutil.msd b/code/blutil/tests/test.com.mbeddr.mpsutil.blutil/test.com.mbeddr.mpsutil.blutil.msd
new file mode 100644
index 000000000..ef08a3ab7
--- /dev/null
+++ b/code/blutil/tests/test.com.mbeddr.mpsutil.blutil/test.com.mbeddr.mpsutil.blutil.msd
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ f3061a53-9226-4cc5-a443-f952ceaf5816(jetbrains.mps.baseLanguage)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/build/solutions/de.itemis.mps.extensions.build/models/de.itemis.mps.extensions.build.mps b/code/build/solutions/de.itemis.mps.extensions.build/models/de.itemis.mps.extensions.build.mps
index a5bec6079..824ce0bfc 100644
--- a/code/build/solutions/de.itemis.mps.extensions.build/models/de.itemis.mps.extensions.build.mps
+++ b/code/build/solutions/de.itemis.mps.extensions.build/models/de.itemis.mps.extensions.build.mps
@@ -6604,6 +6604,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -6648,6 +6658,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -6941,6 +6961,11 @@
+
+
+
+
+
diff --git a/docs/extensions/bl-extensions/blutil.md b/docs/extensions/bl-extensions/blutil.md
index 7693852cd..33ffd1eb9 100644
--- a/docs/extensions/bl-extensions/blutil.md
+++ b/docs/extensions/bl-extensions/blutil.md
@@ -130,6 +130,29 @@ typeswitch (sourceScope) {
}
```
+### IfInstanceOf
+
+This concept enhances the same concept from the language `jetbrains.mps.lang.smodel` with support for else if and else branches. You can give your expression a name for each branch:
+
+``````
+test withElseIfAndElse {
+ node node = new node();
+ int result;
+ ifInstanceOf (node is ClassConcept cls) {
+ result = cls.isNotNull ? 0 : 1;
+
+ } else ifInstanceOf (node is AbstractCatchClause acc) {
+ result = acc.isNotNull ? 2 : 3;
+ } else ifInstanceOf (node is AbstractClassifierReference acr) {
+ result = acr.isNotNull ? 5 : 6;
+ } else {
+ result = 7;
+ }
+
+ assert 0 equals result ;
+}
+``````
+
## blutil.genutil
This language contains helpful expressions for generators.