diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersection.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersection.java
index 016fcb0c02e89d5a02092405b91f95cc3d679c0a..fa1ff05f2013e15dda50a4dfe07ef048dff939e3 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersection.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersection.java
@@ -1,7 +1,14 @@
 package de.unikoblenz.fgbks.base.utils.boundary.bicreater;
 
+import static de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType.IS_NOT_IN_CONTACT;
+
 import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 public class BiCreaterStringIntersection extends AbstractBoundaryBiCreater<StringBoundary> {
 
@@ -22,6 +29,79 @@ public class BiCreaterStringIntersection extends AbstractBoundaryBiCreater<Strin
 
   @Override
   public Optional<StringBoundary> create(StringBoundary b1, StringBoundary b2) {
+    if (b1.checkWith(IS_NOT_IN_CONTACT, b2)) {
+      return Optional.empty();
+    }
+    if (b1.isMatchAny() && b2.isMatchAny()
+        || b1.isMatchAny() && !b2.matchesNoneOfValues()
+        || b2.isMatchAny() && !b1.matchesNoneOfValues()) {
+      return Optional.of(StringBoundary.getBuilder().isMatchAny(true).build());
+    }
+    if (b1.isMatchAny() && b2.matchesNoneOfValues()) {
+      return Optional.of(
+          StringBoundary.getBuilder().isMatchNoneOfValues(true).addValues(b2.getValues()).build());
+    }
+    if (b2.isMatchAny() && b1.matchesNoneOfValues()) {
+      return Optional.of(
+          StringBoundary.getBuilder().isMatchNoneOfValues(true).addValues(b1.getValues()).build());
+    }
+    if (b1.matchesNoneOfValues() && b2.matchesNoneOfValues()) {
+      Set<String> intersectionStrings = new HashSet<>();
+      intersectionStrings.addAll(Arrays.asList(b1.getValues()));
+      intersectionStrings.addAll(Arrays.asList(b2.getValues()));
+      if (intersectionStrings.size() == 0) {
+        return Optional.empty();
+      }
+      return Optional.of(
+          StringBoundary.getBuilder()
+              .isMatchNoneOfValues(true)
+              .addValues(b1.getValues())
+              .addValues(b2.getValues())
+              .build());
+    }
+    if (!b1.matchesNoneOfValues() && !b2.matchesNoneOfValues()) {
+      Set<String> intersectionStrings = new HashSet<>();
+      String[] b1v = b1.getValues();
+      int[] b2Hashes = b2.getValuesHashes();
+      for (String s1 : b1v) {
+        int h1 = Objects.hashCode(s1);
+        for (int h2 : b2Hashes) {
+          if (h1 == h2) {
+            intersectionStrings.add(s1);
+            break;
+          }
+        }
+      }
+      return Optional.of(StringBoundary.getBuilder().addValues(intersectionStrings).build());
+    }
+    if (b1.matchesNoneOfValues()) {
+      return Optional.of(
+          StringBoundary.getBuilder()
+              .addValues(getIntersectionStrings(b2, b1))
+              .build());
+    }
+    if (b2.matchesNoneOfValues()) {
+      return Optional.of(
+          StringBoundary.getBuilder()
+              .addValues(getIntersectionStrings(b1, b2))
+              .build());
+    }
     return Optional.empty();
   }
+
+  private Set<String> getIntersectionStrings(StringBoundary b1, StringBoundary b2) {
+    Set<String> intersectionStrings = new HashSet<>(Arrays.asList(b1.getValues()));
+    int[] b2Hashes = b2.getValuesHashes();
+    for (Iterator<String> it = intersectionStrings.iterator(); it.hasNext(); ) {
+      String element = it.next();
+      int h1 = Objects.hashCode(element);
+      for (int h2 : b2Hashes) {
+        if (h1 == h2) {
+          it.remove();
+          break;
+        }
+      }
+    }
+    return intersectionStrings;
+  }
 }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java
index 12d091ebd65780538dc64ab8f52ae43204f45eb3..65ca20e6afbba790f28d5a8cd49b3e23d061764c 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java
@@ -39,14 +39,14 @@ import de.unikoblenz.fgbks.base.utils.boundary.creater.BoundaryCreater;
 import de.unikoblenz.fgbks.base.utils.boundary.creater.BoundaryCreaterType;
 import de.unikoblenz.fgbks.base.utils.boundary.creater.CreaterStringLower;
 import de.unikoblenz.fgbks.base.utils.boundary.creater.CreaterStringUpper;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.Validate;
 
@@ -177,10 +177,10 @@ public class StringBoundary extends AbstractBoundary<String> {
 
   public class Builder extends DefaultBuilder<StringBoundary> {
 
-    private List<String> buildingValues;
+    private Set<String> buildingValues;
 
     private Builder() {
-      buildingValues = new ArrayList<>();
+      buildingValues = new HashSet<>();
       value.matchAny = false;
       value.matchNoneOfValues = false;
     }
@@ -209,14 +209,6 @@ public class StringBoundary extends AbstractBoundary<String> {
       return addValues(Validate.notNull(Arrays.asList(values)));
     }
 
-    @Override
-    protected void validate() {
-      super.validate();
-      if (matchAny) {
-        // TODO exception
-      }
-    }
-
     @Override
     public StringBoundary build() {
       value.values = buildingValues.toArray(new String[0]);
diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersectionTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersectionTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..00880f0a98c196bdcf165306b73632c40f70d102
--- /dev/null
+++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersectionTest.java
@@ -0,0 +1,113 @@
+package de.unikoblenz.fgbks.base.utils.boundary.bicreater;
+
+import static de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType.INTERSECTION;
+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 BiCreaterStringIntersectionTest {
+
+  StringBoundary sb1;
+  StringBoundary sb2;
+  StringBoundary sbR;
+
+  @Test
+  void testCreater() {
+    sb1 = StringBoundary.getBuilder().addValue("a").build();
+    sb2 = StringBoundary.getBuilder().addValue("b").build();
+    assertFalse(sb1.createBi(INTERSECTION, sb2).isPresent());
+
+    sb1 = StringBoundary.getBuilder().addValue("a").build();
+    sb2 = StringBoundary.getBuilder().addValue("a").build();
+    sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get();
+    assertArrayEquals(new String[]{"a"}, sbR.getValues());
+    assertFalse(sbR.matchesNoneOfValues());
+    assertFalse(sbR.isMatchAny());
+
+    sb1 = StringBoundary.getBuilder().isMatchAny(true).build();
+    sb2 = StringBoundary.getBuilder().isMatchAny(true).build();
+    sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get();
+    assertArrayEquals(new String[]{}, sbR.getValues());
+    assertFalse(sbR.matchesNoneOfValues());
+    assertTrue(sbR.isMatchAny());
+
+    sb1 = StringBoundary.getBuilder().isMatchAny(true).build();
+    sb2 = StringBoundary.getBuilder().addValue("a").build();
+    sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get();
+    assertArrayEquals(new String[]{}, sbR.getValues());
+    assertFalse(sbR.matchesNoneOfValues());
+    assertTrue(sbR.isMatchAny());
+
+    sb1 = StringBoundary.getBuilder().addValue("a").build();
+    sb2 = StringBoundary.getBuilder().isMatchAny(true).build();
+    sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get();
+    assertArrayEquals(new String[]{}, sbR.getValues());
+    assertFalse(sbR.matchesNoneOfValues());
+    assertTrue(sbR.isMatchAny());
+
+    sb1 = StringBoundary.getBuilder().isMatchAny(true).build();
+    sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build();
+    sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get();
+    assertArrayEquals(new String[]{"a"}, sbR.getValues());
+    assertTrue(sbR.matchesNoneOfValues());
+    assertFalse(sbR.isMatchAny());
+
+    sb1 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build();
+    sb2 = StringBoundary.getBuilder().isMatchAny(true).build();
+    sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get();
+    assertArrayEquals(new String[]{"a"}, sbR.getValues());
+    assertTrue(sbR.matchesNoneOfValues());
+    assertFalse(sbR.isMatchAny());
+
+    sb1 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build();
+    sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build();
+    sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get();
+    assertArrayEquals(new String[]{"a"}, sbR.getValues());
+    assertTrue(sbR.matchesNoneOfValues());
+    assertFalse(sbR.isMatchAny());
+
+    sb1 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build();
+    sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").addValue("b").build();
+    sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get();
+    assertArrayEquals(new String[]{"a", "b"}, sbR.getValues());
+    assertTrue(sbR.matchesNoneOfValues());
+    assertFalse(sbR.isMatchAny());
+
+    sb1 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").addValue("b").build();
+    sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build();
+    sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get();
+    assertArrayEquals(new String[]{"a", "b"}, sbR.getValues());
+    assertTrue(sbR.matchesNoneOfValues());
+    assertFalse(sbR.isMatchAny());
+
+    sb1 = StringBoundary.getBuilder().addValue("a").addValue("b").build();
+    sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build();
+    sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get();
+    assertArrayEquals(new String[]{"b"}, sbR.getValues());
+    assertFalse(sbR.matchesNoneOfValues());
+    assertFalse(sbR.isMatchAny());
+
+    sb1 = StringBoundary.getBuilder().addValue("a").addValue("b").build();
+    sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").addValue("b").build();
+    assertFalse(sb1.createBi(INTERSECTION, sb2).isPresent());
+
+    sb1 = StringBoundary.getBuilder().addValue("a").addValue("b").build();
+    sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("c").build();
+    sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get();
+    assertArrayEquals(new String[]{"a", "b"}, sbR.getValues());
+    assertFalse(sbR.matchesNoneOfValues());
+    assertFalse(sbR.isMatchAny());
+
+    sb1 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("c").build();
+    sb2 = StringBoundary.getBuilder().addValue("a").addValue("b").build();
+    sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get();
+    assertArrayEquals(new String[]{"a", "b"}, sbR.getValues());
+    assertFalse(sbR.matchesNoneOfValues());
+    assertFalse(sbR.isMatchAny());
+  }
+}