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 768e7ab5240aca8122b2b733cdd41c836479e114..17107d44c28d037ebc242652cac60dac396093a5 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
@@ -5,6 +5,11 @@ import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.INCLUSIVE;
 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;
+import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckInContact;
+import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckIsSubsumes;
+import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckNotInContact;
+import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckOverlap;
+import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckSubsumes;
 import java.util.HashMap;
 import java.util.Objects;
 import org.apache.commons.lang3.Validate;
@@ -64,6 +69,11 @@ public abstract class AbstractGrowingBoundary<T extends Comparable<? super T>>
   protected HashMap<BoundaryCheckType, BoundaryCheck> getChecker() {
     HashMap<BoundaryCheckType, BoundaryCheck> map = new HashMap<>();
     map.put(BoundaryCheckType.IS_EQUAL, CheckEqual.getInstance());
+    map.put(BoundaryCheckType.IS_IN_CONTACT, CheckInContact.getInstance());
+    map.put(BoundaryCheckType.IS_NOT_IN_CONTACT, CheckNotInContact.getInstance());
+    map.put(BoundaryCheckType.IS_OVERLAPPING, CheckOverlap.getInstance());
+    map.put(BoundaryCheckType.IS_SUBSUMPTION, CheckIsSubsumes.getInstance());
+    map.put(BoundaryCheckType.SUBSUMES, CheckSubsumes.getInstance());
     return map;
   }
 
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqual.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqual.java
index a0ce4f868c06dea827c575d41458234e8356efef..1da5446244f82b28ac850ca21f831037bfafa18f 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqual.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqual.java
@@ -21,6 +21,10 @@ public class CheckEqual extends AbstractBoundaryCheck<AbstractGrowingBoundary> {
 
   @Override
   public boolean check(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
+    return checkEqual(b1, b2);
+  }
+
+  public static boolean checkEqual(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
     if (b1 == b2) {
       return true;
     }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContact.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContact.java
index 61de90e701ee200c0f8693f84788f46576f93cd5..c2a3fa790cc8f62951c961c803185bf65c4bbf0b 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContact.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContact.java
@@ -23,10 +23,10 @@ public class CheckInContact extends AbstractBoundaryCheck<AbstractGrowingBoundar
 
   @Override
   public boolean check(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
-    return checkBounds(b1, b2);
+    return checkInContact(b1, b2);
   }
 
-  public static boolean checkBounds(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
+  public static boolean checkInContact(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
     // TODO: check raw types
     if (b1.getLowerBound().compareTo(b2.getLowerBound()) <= 0) {
       return checkOrdered(b1, b2);
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckIsSubsumes.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckIsSubsumes.java
new file mode 100644
index 0000000000000000000000000000000000000000..f554327e0fd56eb2720cfef1e472bd042e9fd017
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckIsSubsumes.java
@@ -0,0 +1,30 @@
+package de.unikoblenz.fgbks.base.utils.boundary.checker;
+
+import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary;
+
+public class CheckIsSubsumes extends AbstractBoundaryCheck<AbstractGrowingBoundary> {
+
+  private static final CheckIsSubsumes instance = new CheckIsSubsumes();
+
+  private CheckIsSubsumes() {
+    super();
+  }
+
+  public static CheckIsSubsumes getInstance() {
+    return instance;
+  }
+
+  @Override
+  public BoundaryCheckType getType() {
+    return BoundaryCheckType.IS_SUBSUMPTION;
+  }
+
+  @Override
+  public boolean check(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
+    return checkIsSubsumption(b1, b2);
+  }
+
+  public static boolean checkIsSubsumption(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
+    return CheckSubsumes.checkSubsumes(b1, b2) || CheckSubsumes.checkSubsumes(b2, b1);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContact.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContact.java
index a29476f1ad5bed118a487765dc81fb8f49784f2f..21033ba96fef360a1848cb8c1aedda73eac5a754 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContact.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContact.java
@@ -21,6 +21,6 @@ public class CheckNotInContact extends AbstractBoundaryCheck<AbstractGrowingBoun
 
   @Override
   public boolean check(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
-    return !CheckInContact.checkBounds(b1, b2);
+    return !CheckInContact.checkInContact(b1, b2);
   }
 }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckOverlap.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckOverlap.java
new file mode 100644
index 0000000000000000000000000000000000000000..a98c6810e828e8e462c2bd1274c4c27d95d709c0
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckOverlap.java
@@ -0,0 +1,32 @@
+package de.unikoblenz.fgbks.base.utils.boundary.checker;
+
+import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary;
+
+public class CheckOverlap extends AbstractBoundaryCheck<AbstractGrowingBoundary> {
+
+  private static final CheckOverlap instance = new CheckOverlap();
+
+  private CheckOverlap() {
+    super();
+  }
+
+  public static CheckOverlap getInstance() {
+    return instance;
+  }
+
+  @Override
+  public BoundaryCheckType getType() {
+    return BoundaryCheckType.IS_OVERLAPPING;
+  }
+
+  @Override
+  public boolean check(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
+    return checkOverlapping(b1, b2);
+  }
+
+  public static boolean checkOverlapping(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
+    return CheckInContact.checkInContact(b1, b2)
+        && !CheckEqual.checkEqual(b1, b2)
+        && !CheckIsSubsumes.checkIsSubsumption(b1, b2);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckSubsumes.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckSubsumes.java
new file mode 100644
index 0000000000000000000000000000000000000000..4ee2b429bc6b19c3b0684060735f42fb421069e7
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckSubsumes.java
@@ -0,0 +1,56 @@
+package de.unikoblenz.fgbks.base.utils.boundary.checker;
+
+import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.EXCLUSIVE;
+import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.INCLUSIVE;
+
+import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary;
+
+public class CheckSubsumes extends AbstractBoundaryCheck<AbstractGrowingBoundary> {
+
+  private static final CheckSubsumes instance = new CheckSubsumes();
+
+  private CheckSubsumes() {
+    super();
+  }
+
+  public static CheckSubsumes getInstance() {
+    return instance;
+  }
+
+  @Override
+  public BoundaryCheckType getType() {
+    return BoundaryCheckType.SUBSUMES;
+  }
+
+  @Override
+  public boolean check(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
+    return checkSubsumes(b1, b2);
+  }
+
+  public static boolean checkSubsumes(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) {
+    // TODO: check raw types
+    int compLo = b1.getLowerBound().compareTo(b2.getLowerBound());
+    int compUp = b1.getUpperBound().compareTo(b2.getUpperBound());
+    if (compLo < 0 && compUp > 0) {
+      return true;
+    }
+    if (compLo > 0
+        || compUp < 0
+        || (compLo == 0
+            && b1.getLowerBoundType() == EXCLUSIVE
+            && b2.getLowerBoundType() == INCLUSIVE)
+        || (compUp == 0
+            && b1.getUpperBoundType() == EXCLUSIVE
+            && b2.getUpperBoundType() == INCLUSIVE)) {
+      return false;
+    }
+    if (compLo == 0 && b1.getLowerBoundType() != b2.getLowerBoundType()
+        || compUp == 0 && b1.getUpperBoundType() != b2.getUpperBoundType()) {
+      return true;
+    } else if ((compLo + compUp) == 0) {
+      return false;
+    } else {
+      return true;
+    }
+  }
+}
diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/AbstractCheckerTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/AbstractCheckerTest.java
index fb1ece2f70632896283d2991bef2d91e101aa0dc..8e5b5ddb789435f7af60d93ce7e7c619e3592c55 100644
--- a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/AbstractCheckerTest.java
+++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/AbstractCheckerTest.java
@@ -9,17 +9,19 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import de.unikoblenz.fgbks.base.utils.boundary.Boundary;
 import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VTypeRef;
 
-public class AbstractCheckerTest {
+public abstract class AbstractCheckerTest {
 
   protected BoundaryCheck checker;
 
   protected void doNumCheck(String b1, String b2, boolean expected) {
     doCheck(INTEGER, b1, b2, expected);
-    doCheck(INTEGER, b2, b1, expected);
     doCheck(LONG, b1, b2, expected);
-    doCheck(LONG, b2, b1, expected);
     doCheck(DOUBLE, b1, b2, expected);
-    doCheck(DOUBLE, b2, b1, expected);
+    if (checkBothWays()) {
+      doCheck(INTEGER, b2, b1, expected);
+      doCheck(LONG, b2, b1, expected);
+      doCheck(DOUBLE, b2, b1, expected);
+    }
   }
 
   private void doCheck(VTypeRef type, String b1, String b2, boolean expected) {
@@ -33,4 +35,6 @@ public class AbstractCheckerTest {
       assertFalse(checker.check(b1, b2), b1.getText() + " / " + b2.getText());
     }
   }
+
+  protected abstract boolean checkBothWays();
 }
diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContactTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContactTest.java
index e3b660641f88f7785ca8955dda4a2037a9390f94..741f2cadac14fdcc823b901cf2df128e7903b0e7 100644
--- a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContactTest.java
+++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContactTest.java
@@ -29,4 +29,9 @@ class CheckInContactTest extends AbstractCheckerTest {
     doNumCheck("[1..3]", "=4", false);
     doNumCheck("[1..3]", "<=4", true);
   }
+
+  @Override
+  protected boolean checkBothWays() {
+    return true;
+  }
 }
diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContactTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContactTest.java
index 2a54a6bffced11046710ae2b7fb7186345a2a638..7f100311735aaa32d47d71756a27235f50a5f8bf 100644
--- a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContactTest.java
+++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContactTest.java
@@ -29,4 +29,9 @@ class CheckNotInContactTest extends AbstractCheckerTest {
     doNumCheck("[1..3]", "=4", true);
     doNumCheck("[1..3]", "<=4", false);
   }
+
+  @Override
+  protected boolean checkBothWays() {
+    return true;
+  }
 }
diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckOverlapTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckOverlapTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..85f93ac9b93f75bfc70646cde29fddbfc7475f9f
--- /dev/null
+++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckOverlapTest.java
@@ -0,0 +1,63 @@
+package de.unikoblenz.fgbks.base.utils.boundary.checker;
+
+import io.quarkus.test.junit.QuarkusTest;
+import org.junit.jupiter.api.Test;
+
+@QuarkusTest
+class CheckOverlapTest extends AbstractCheckerTest {
+
+  @Test
+  void check() {
+    super.checker = CheckOverlap.getInstance();
+    doNumCheck("<1", "<5", false);
+    doNumCheck("<5", "<1", false);
+    doNumCheck("<1", ">5", false);
+    doNumCheck("[1..2]", ">5", false);
+    doNumCheck("[1..2]", ">2", false);
+    doNumCheck("[1..2]", "<2", true);
+    doNumCheck("[1..2]", "<1", false);
+    doNumCheck("[1..2]", "<=1", true);
+    doNumCheck("]1..2]", "<=1", false);
+    doNumCheck("]1..2]", "<1", false);
+    doNumCheck("[1..2]", "<1", false);
+    doNumCheck("[1..2]", "[1..2]", false);
+    doNumCheck("=1", "=1", false);
+    doNumCheck("[1..3]", "=1", false);
+    doNumCheck("[1..3]", "=2", false);
+    doNumCheck("[1..3]", "=3", false);
+    doNumCheck("[1..4]", "[2..3]", false);
+    doNumCheck("[1..4]", "]1..4[", false);
+    doNumCheck("[1..3]", "=0", false);
+    doNumCheck("[1..3]", "=4", false);
+    doNumCheck("[1..3]", "<=4", false);
+    doNumCheck("[1..3]", "<4", false);
+    doNumCheck("[1..3]", "<=3", false);
+    doNumCheck("[1..3]", ">0", false);
+    doNumCheck("[1..3]", ">=1", false);
+    doNumCheck("[1..3]", ">1", true);
+    doNumCheck("[1..3]", ">=2", true);
+    doNumCheck("=0", "[1..3]", false);
+    doNumCheck("=4", "[1..3]", false);
+    doNumCheck("<=4", "[1..3]", false);
+    doNumCheck("<4", "[1..3]", false);
+    doNumCheck("<=3", "[1..3]", false);
+    doNumCheck(">0", "[1..3]", false);
+    doNumCheck(">=1", "[1..3]", false);
+    doNumCheck(">1", "[1..3]", true);
+    doNumCheck(">=2", "[1..3]", true);
+    doNumCheck("=2", "=2", false);
+    doNumCheck("<2", "<2", false);
+    doNumCheck("<=2", "<=2", false);
+    doNumCheck(">2", ">2", false);
+    doNumCheck(">=2", ">=2", false);
+    doNumCheck("[1..3]", "[1..3]", false);
+    doNumCheck("[1..3[", "[1..3[", false);
+    doNumCheck("]1..3]", "]1..3]", false);
+    doNumCheck("]1..3[", "]1..3[", false);
+  }
+
+  @Override
+  protected boolean checkBothWays() {
+    return false;
+  }
+}
diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckSubsumesTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckSubsumesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..1583d7b7058d7ba799b2dfe56668091109a89175
--- /dev/null
+++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckSubsumesTest.java
@@ -0,0 +1,63 @@
+package de.unikoblenz.fgbks.base.utils.boundary.checker;
+
+import io.quarkus.test.junit.QuarkusTest;
+import org.junit.jupiter.api.Test;
+
+@QuarkusTest
+class CheckSubsumesTest extends AbstractCheckerTest {
+
+  @Test
+  void check() {
+    super.checker = CheckSubsumes.getInstance();
+    doNumCheck("<1", "<5", false);
+    doNumCheck("<5", "<1", true);
+    doNumCheck("<1", ">5", false);
+    doNumCheck("[1..2]", ">5", false);
+    doNumCheck("[1..2]", ">2", false);
+    doNumCheck("[1..2]", "<2", false);
+    doNumCheck("[1..2]", "<1", false);
+    doNumCheck("[1..2]", "<=1", false);
+    doNumCheck("]1..2]", "<=1", false);
+    doNumCheck("]1..2]", "<1", false);
+    doNumCheck("[1..2]", "<1", false);
+    doNumCheck("[1..2]", "[1..2]", false);
+    doNumCheck("=1", "=1", false);
+    doNumCheck("[1..3]", "=1", true);
+    doNumCheck("[1..3]", "=2", true);
+    doNumCheck("[1..3]", "=3", true);
+    doNumCheck("[1..4]", "[2..3]", true);
+    doNumCheck("[1..4]", "]1..4[", true);
+    doNumCheck("[1..3]", "=0", false);
+    doNumCheck("[1..3]", "=4", false);
+    doNumCheck("[1..3]", "<=4", false);
+    doNumCheck("[1..3]", "<4", false);
+    doNumCheck("[1..3]", "<=3", false);
+    doNumCheck("[1..3]", ">0", false);
+    doNumCheck("[1..3]", ">=1", false);
+    doNumCheck("[1..3]", ">1", false);
+    doNumCheck("[1..3]", ">=2", false);
+    doNumCheck("=0", "[1..3]", false);
+    doNumCheck("=4", "[1..3]", false);
+    doNumCheck("<=4", "[1..3]", true);
+    doNumCheck("<4", "[1..3]", true);
+    doNumCheck("<=3", "[1..3]", true);
+    doNumCheck(">0", "[1..3]", true);
+    doNumCheck(">=1", "[1..3]", true);
+    doNumCheck(">1", "[1..3]", false);
+    doNumCheck(">=2", "[1..3]", false);
+    doNumCheck("=2", "=2", false);
+    doNumCheck("<2", "<2", false);
+    doNumCheck("<=2", "<=2", false);
+    doNumCheck(">2", ">2", false);
+    doNumCheck(">=2", ">=2", false);
+    doNumCheck("[1..3]", "[1..3]", false);
+    doNumCheck("[1..3[", "[1..3[", false);
+    doNumCheck("]1..3]", "]1..3]", false);
+    doNumCheck("]1..3[", "]1..3[", false);
+  }
+
+  @Override
+  protected boolean checkBothWays() {
+    return false;
+  }
+}