diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetween.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetween.java
index 3b6f10a5d2e84ad44110dada1df648f5dbb8c175..295615f5e00d0d2705940e33a8cbdf799dbb719c 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetween.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetween.java
@@ -1,7 +1,10 @@
 package de.unikoblenz.fgbks.base.utils.boundary.bicreater;
 
 import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Optional;
+import java.util.Set;
 
 public class BiCreaterStringBetween extends AbstractBoundaryBiCreater<StringBoundary> {
 
@@ -22,6 +25,43 @@ public class BiCreaterStringBetween extends AbstractBoundaryBiCreater<StringBoun
 
   @Override
   public Optional<StringBoundary> create(StringBoundary b1, StringBoundary b2) {
-    return Optional.empty();
+    if (b1.matchesAny() || b2.matchesAny()) {
+      return Optional.empty();
+    }
+    if (b1.matchesNoneOfValues() && b2.matchesNoneOfValues()) {
+      Set<String> vals1 = new HashSet<>(Arrays.asList(b1.getValues()));
+      Set<String> vals2 = new HashSet<>(Arrays.asList(b2.getValues()));
+      Set<String> values = new HashSet<>();
+      for (String v1 : vals1) {
+        if (vals2.contains(v1)) {
+          values.add(v1);
+        }
+      }
+      if (values.size() == 0) {
+        return Optional.empty();
+      }
+      return Optional.of(StringBoundary.getBuilder().addValues(values).build());
+    }
+    if (b1.matchesNoneOfValues()) {
+      return getOneIsNoneOfValues(b1, b2);
+    }
+    if (b2.matchesNoneOfValues()) {
+      return getOneIsNoneOfValues(b2, b1);
+    }
+    return Optional.of(
+        StringBoundary.getBuilder()
+            .matchesNoneOfValues(true)
+            .addValues(b1.getValues())
+            .addValues(b2.getValues())
+            .build());
+  }
+
+  private Optional<StringBoundary> getOneIsNoneOfValues(StringBoundary b1, StringBoundary b2) {
+    Set<String> values = new HashSet<>(Arrays.asList(b1.getValues()));
+    values.removeAll(Arrays.asList(b2.getValues()));
+    if (values.size() == 0) {
+      return Optional.empty();
+    }
+    return Optional.of(StringBoundary.getBuilder().addValues(values).build());
   }
 }
diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetweenTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetweenTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f706a23980eecf4875e2aa79d3a955c51e7d831
--- /dev/null
+++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetweenTest.java
@@ -0,0 +1,72 @@
+package de.unikoblenz.fgbks.base.utils.boundary.bicreater;
+
+import static de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType.BETWEEN;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary;
+import io.quarkus.test.junit.QuarkusTest;
+import org.junit.jupiter.api.Test;
+
+@QuarkusTest
+class BiCreaterStringBetweenTest {
+
+  StringBoundary sb1;
+  StringBoundary sb2;
+  StringBoundary sbR;
+
+  @Test
+  void testCreater() {
+    sb1 = StringBoundary.getBuilder().addValue("a").build();
+    sb2 = StringBoundary.getBuilder().addValue("b").build();
+    sbR = (StringBoundary) sb1.createBi(BETWEEN, sb2).get();
+    assertArrayEquals(new String[]{"a", "b"}, sbR.getValues());
+    assertTrue(sbR.matchesNoneOfValues());
+    assertFalse(sbR.matchesAny());
+
+    sb1 = StringBoundary.getBuilder().addValue("a").matchesNoneOfValues(true).build();
+    sb2 = StringBoundary.getBuilder().addValue("b").build();
+    sbR = (StringBoundary) sb1.createBi(BETWEEN, sb2).get();
+    assertArrayEquals(new String[]{"a"}, sbR.getValues());
+    assertFalse(sbR.matchesNoneOfValues());
+    assertFalse(sbR.matchesAny());
+
+    sb1 = StringBoundary.getBuilder().addValue("a").matchesNoneOfValues(true).build();
+    sb2 = StringBoundary.getBuilder().addValue("a").build();
+    assertFalse(sb1.createBi(BETWEEN, sb2).isPresent());
+    assertFalse(sb2.createBi(BETWEEN, sb1).isPresent());
+
+    sb1 = StringBoundary.getBuilder().addValue("a").matchesNoneOfValues(true).build();
+    sb2 = StringBoundary.getBuilder().addValue("b").matchesNoneOfValues(true).build();
+    assertFalse(sb1.createBi(BETWEEN, sb2).isPresent());
+    assertFalse(sb2.createBi(BETWEEN, sb1).isPresent());
+
+    sb1 = StringBoundary.getBuilder().addValue("a").matchesNoneOfValues(true).build();
+    sb2 = StringBoundary.getBuilder().addValue("a").matchesNoneOfValues(true).build();
+    sbR = (StringBoundary) sb1.createBi(BETWEEN, sb2).get();
+    assertArrayEquals(new String[]{"a"}, sbR.getValues());
+    assertFalse(sbR.matchesNoneOfValues());
+    assertFalse(sbR.matchesAny());
+
+    sb1 =
+        StringBoundary.getBuilder()
+            .addValue("a")
+            .addValue("b")
+            .addValue("c")
+            .matchesNoneOfValues(true)
+            .build();
+    sb2 = StringBoundary.getBuilder().addValue("a").matchesNoneOfValues(true).build();
+    sbR = (StringBoundary) sb1.createBi(BETWEEN, sb2).get();
+    assertArrayEquals(new String[]{"a"}, sbR.getValues());
+    assertFalse(sbR.matchesNoneOfValues());
+    assertFalse(sbR.matchesAny());
+
+    sb1 = StringBoundary.getBuilder().addValue("a").build();
+    sb2 = StringBoundary.getBuilder().addValue("a").build();
+    sbR = (StringBoundary) sb1.createBi(BETWEEN, sb2).get();
+    assertArrayEquals(new String[]{"a"}, sbR.getValues());
+    assertTrue(sbR.matchesNoneOfValues());
+    assertFalse(sbR.matchesAny());
+  }
+}