diff --git a/.gitignore b/.gitignore
index 4dee5e1147037aa9ba7d12683a93415d2edc70cc..29db7e2a82bddb3ccf4339f3d47945e393803169 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,7 @@
 
 # Exclude all target folders
 */target/*
+
+
+# ignore temporay camunda frontend
+/dmnverifiercamundamodelerplugin/*
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractGrowingBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractGrowingBoundary.java
index a64b10913eadf89eeb023d1cf57c59dee5378b69..092e7a8895a9cfc4c970c8fc4cfbf3e297305451 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractGrowingBoundary.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractGrowingBoundary.java
@@ -19,9 +19,11 @@ import static de.unikoblenz.fgbks.base.utils.boundary.creater.BoundaryCreaterTyp
 import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterAppend;
 import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterBetween;
 import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterCombine;
+import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterIntersection;
+import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterLowerBounds;
+import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterUpperBounds;
 import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreater;
 import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType;
-import de.unikoblenz.fgbks.base.utils.boundary.bicreater.EmptyBiCreater;
 import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheck;
 import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType;
 import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckEqual;
@@ -54,9 +56,9 @@ public abstract class AbstractGrowingBoundary<T extends Comparable<? super T>>
     checkerMap.put(SUBSUMES, CheckSubsumes.getInstance());
     createrMap.put(UPPER, CreaterUpper.getInstance());
     createrMap.put(LOWER, CreaterLower.getInstance());
-    biCreaterMap.put(INTERSECTION, EmptyBiCreater.getInstance());
-    biCreaterMap.put(LOWER_BOUNDS, EmptyBiCreater.getInstance());
-    biCreaterMap.put(UPPER_BOUNDS, EmptyBiCreater.getInstance());
+    biCreaterMap.put(INTERSECTION, BiCreaterIntersection.getInstance());
+    biCreaterMap.put(LOWER_BOUNDS, BiCreaterLowerBounds.getInstance());
+    biCreaterMap.put(UPPER_BOUNDS, BiCreaterUpperBounds.getInstance());
     biCreaterMap.put(BETWEEN, BiCreaterBetween.getInstance());
     biCreaterMap.put(APPEND, BiCreaterAppend.getInstance());
     biCreaterMap.put(COMBINE, BiCreaterCombine.getInstance());
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterBetween.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterBetween.java
index b49e845040179b0f5f961cc1274e8e91d1faea4d..f76d28bf2934960b912339a5032fc4dc1595761c 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterBetween.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterBetween.java
@@ -59,11 +59,11 @@ public class BiCreaterBetween extends AbstractBoundaryBiCreater<AbstractGrowingB
       long b2L = (long) b1.getLowerBound();
       long b2U = (long) b1.getUpperBound();
       if (b1U + 1 == b2L
-          && b1.getUpperBoundType() == INCLUSIVE
-          && b2.getLowerBoundType() == INCLUSIVE
+              && b1.getUpperBoundType() == INCLUSIVE
+              && b2.getLowerBoundType() == INCLUSIVE
           || b2U + 1 == b1L
-          && b2.getUpperBoundType() == INCLUSIVE
-          && b1.getLowerBoundType() == INCLUSIVE) {
+              && b2.getUpperBoundType() == INCLUSIVE
+              && b1.getLowerBoundType() == INCLUSIVE) {
         return Optional.empty();
       }
     }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterIntersection.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterIntersection.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9774699f80ef0c0fb2f14b12a825ab020af7a85
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterIntersection.java
@@ -0,0 +1,41 @@
+package de.unikoblenz.fgbks.base.utils.boundary.bicreater;
+
+import static de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType.INTERSECTION;
+import static de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType.IS_NOT_IN_CONTACT;
+
+import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary;
+import java.util.Optional;
+
+public class BiCreaterIntersection extends AbstractBoundaryBiCreater<AbstractGrowingBoundary> {
+
+  private static final BiCreaterIntersection instance = new BiCreaterIntersection();
+
+  private BiCreaterIntersection() {
+    super();
+  }
+
+  public static BiCreaterIntersection getInstance() {
+    return instance;
+  }
+
+  @Override
+  public BoundaryBiCreaterType getType() {
+    return INTERSECTION;
+  }
+
+  @Override
+  public Optional<AbstractGrowingBoundary> create(
+      AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
+    if (b1.checkWith(IS_NOT_IN_CONTACT, b2)) {
+      return Optional.empty();
+    }
+    int compLower = b1.compareToLowerBound(b2);
+    int compUpper = b1.compareToUpperBound(b2);
+    return Optional.of(
+        b1.getCopy(
+            compLower > 0 ? b1.getLowerBound() : b2.getLowerBound(),
+            compUpper < 0 ? b1.getUpperBound() : b2.getUpperBound(),
+            compLower > 0 ? b1.getLowerBoundType() : b2.getLowerBoundType(),
+            compUpper < 0 ? b1.getUpperBoundType() : b2.getUpperBoundType()));
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterLowerBounds.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterLowerBounds.java
new file mode 100644
index 0000000000000000000000000000000000000000..2723cf33707b556f417c9265729283550e670aa5
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterLowerBounds.java
@@ -0,0 +1,57 @@
+package de.unikoblenz.fgbks.base.utils.boundary.bicreater;
+
+import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.EXCLUSIVE;
+import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.INCLUSIVE;
+import static de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType.LOWER_BOUNDS;
+
+import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary;
+import de.unikoblenz.fgbks.base.utils.boundary.impl.IntegerBoundary;
+import de.unikoblenz.fgbks.base.utils.boundary.impl.LongBoundary;
+import java.util.Optional;
+
+public class BiCreaterLowerBounds extends AbstractBoundaryBiCreater<AbstractGrowingBoundary> {
+
+  private static final BiCreaterLowerBounds instance = new BiCreaterLowerBounds();
+
+  private BiCreaterLowerBounds() {
+    super();
+  }
+
+  public static BiCreaterLowerBounds getInstance() {
+    return instance;
+  }
+
+  @Override
+  public BoundaryBiCreaterType getType() {
+    return LOWER_BOUNDS;
+  }
+
+  @Override
+  public Optional<AbstractGrowingBoundary> create(
+      AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
+    if (b1 instanceof IntegerBoundary) {
+      if ((int) b1.getLowerBound() + 1 == (int) b2.getLowerBound()
+          && b1.getLowerBoundType() == EXCLUSIVE
+          && b2.getLowerBoundType() == INCLUSIVE) {
+        return Optional.empty();
+      }
+    }
+    if (b1 instanceof LongBoundary) {
+      if (b1.getUpperBound().equals((long) b2.getUpperBound() + 1)
+          && b1.getLowerBoundType() == EXCLUSIVE
+          && b2.getLowerBoundType() == INCLUSIVE) {
+        return Optional.empty();
+      }
+    }
+    try {
+      return Optional.of(
+          b1.getCopy(
+              b1.getLowerBound(),
+              b2.getLowerBound(),
+              b1.getLowerBoundType().getOp(),
+              b2.getLowerBoundType()));
+    } catch (Exception e) {
+      return Optional.empty();
+    }
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterUpperBounds.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterUpperBounds.java
new file mode 100644
index 0000000000000000000000000000000000000000..a9a3ff2ae37a5ea925be5f4748c79bca62680220
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterUpperBounds.java
@@ -0,0 +1,57 @@
+package de.unikoblenz.fgbks.base.utils.boundary.bicreater;
+
+import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.EXCLUSIVE;
+import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.INCLUSIVE;
+import static de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType.UPPER_BOUNDS;
+
+import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary;
+import de.unikoblenz.fgbks.base.utils.boundary.impl.IntegerBoundary;
+import de.unikoblenz.fgbks.base.utils.boundary.impl.LongBoundary;
+import java.util.Optional;
+
+public class BiCreaterUpperBounds extends AbstractBoundaryBiCreater<AbstractGrowingBoundary> {
+
+  private static final BiCreaterUpperBounds instance = new BiCreaterUpperBounds();
+
+  private BiCreaterUpperBounds() {
+    super();
+  }
+
+  public static BiCreaterUpperBounds getInstance() {
+    return instance;
+  }
+
+  @Override
+  public BoundaryBiCreaterType getType() {
+    return UPPER_BOUNDS;
+  }
+
+  @Override
+  public Optional<AbstractGrowingBoundary> create(
+      AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
+    if (b1 instanceof IntegerBoundary) {
+      if (b1.getUpperBound().equals((int) b2.getUpperBound() + 1)
+          && b1.getUpperBoundType() == INCLUSIVE
+          && b2.getUpperBoundType() == EXCLUSIVE) {
+        return Optional.empty();
+      }
+    }
+    if (b1 instanceof LongBoundary) {
+      if (b1.getUpperBound().equals((long) b2.getUpperBound() + 1)
+          && b1.getUpperBoundType() == INCLUSIVE
+          && b2.getUpperBoundType() == EXCLUSIVE) {
+        return Optional.empty();
+      }
+    }
+    try {
+      return Optional.of(
+          b1.getCopy(
+              b2.getUpperBound(),
+              b1.getUpperBound(),
+              b2.getUpperBoundType().getOp(),
+              b1.getUpperBoundType()));
+    } catch (Exception e) {
+      return Optional.empty();
+    }
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PartialReductionVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PartialReductionVerifier.java
index ce56c450de75f31b01b74ba0fbdf1d94d9220abd..508e238d7355eedd798756933ec9013ae0c3ffc6 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PartialReductionVerifier.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PartialReductionVerifier.java
@@ -31,16 +31,15 @@ public class PartialReductionVerifier extends AbstractVerifier {
   }
 
   private void findPartialReduction(VDmnDecisionTable dmnDecisionTable) {
-    List<List<VDmnRule>> identicalOutputCluster = VDmnFunctions
-        .getRuleClustersWithIdenticalOutput(dmnDecisionTable);
+    List<List<VDmnRule>> identicalOutputCluster =
+        VDmnFunctions.getRuleClustersWithIdenticalOutput(dmnDecisionTable);
     List<VDmnInputColumn> inColumns = dmnDecisionTable.getInputColumns();
     identicalOutputCluster.stream() // do: parallelStream() ?
         .forEach(c -> findPartialReduction(inColumns, 0, c, false));
   }
 
-  private void findPartialReduction(List<VDmnInputColumn> inColumns, int i,
-      List<VDmnRule> clusterRules,
-      boolean hasCombination) {
+  private void findPartialReduction(
+      List<VDmnInputColumn> inColumns, int i, List<VDmnRule> clusterRules, boolean hasCombination) {
     if (i == inColumns.size()) {
       if (hasCombination) {
         clusterRules.forEach(
@@ -51,8 +50,8 @@ public class PartialReductionVerifier extends AbstractVerifier {
         vreFactory.addToEntry(VerificationClassification.WARNING, "PartialReduction");
       }
     } else {
-      List<VDmnInputValue> rules = VDmnFunctions
-          .getColumnValuesInRules(inColumns.get(i), clusterRules);
+      List<VDmnInputValue> rules =
+          VDmnFunctions.getColumnValuesInRules(inColumns.get(i), clusterRules);
       List<List<VDmnRule>> nClusters = new ArrayList<>();
       List<Boolean> combinationCluster = new ArrayList<>();
       for (int i1 = 0; i1 < rules.size(); i1++) {
@@ -98,5 +97,4 @@ public class PartialReductionVerifier extends AbstractVerifier {
       }
     }
   }
-
 }