diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractBoundary.java
index 868e621d9e0b06db428e56fd57f59c1fe42d9759..406a6a3736c010cb3589818f2868a0a3432d22e0 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractBoundary.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractBoundary.java
@@ -18,7 +18,7 @@ public abstract class AbstractBoundary<T extends Comparable<? super T>> implemen
   private HashMap<BoundaryBiCreaterType, BoundaryBiCreater> biCreaterFunctions;
   private HashMap<BoundaryCreaterType, BoundaryCreater> createrFunctions;
   private Class<T> type;
-  private String text;
+  protected String text;
 
   protected AbstractBoundary(String text, Class<T> type) {
     this.text = text;
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 ab43e382788a832eb091dca27cb359bdff9f2f73..6394aa81939ba8309432c67752da113cc4341d8d 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
@@ -15,6 +15,7 @@ import static de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType.
 import static de.unikoblenz.fgbks.base.utils.boundary.creater.BoundaryCreaterType.LOWER;
 import static de.unikoblenz.fgbks.base.utils.boundary.creater.BoundaryCreaterType.UPPER;
 
+import de.unikoblenz.fgbks.base.builder.DefaultBuilder;
 import de.unikoblenz.fgbks.base.utils.boundary.AbstractBoundary;
 import de.unikoblenz.fgbks.base.utils.boundary.Boundary;
 import de.unikoblenz.fgbks.base.utils.boundary.BoundaryParseException;
@@ -37,8 +38,11 @@ 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.HashMap;
+import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.Validate;
@@ -76,6 +80,10 @@ public class StringBoundary extends AbstractBoundary<String> {
     super(text, String.class);
   }
 
+  private StringBoundary() {
+    super(String.class);
+  }
+
   @Override
   public int compareTo(Boundary o) {
     return o.getText().compareTo(o.getText());
@@ -156,4 +164,56 @@ public class StringBoundary extends AbstractBoundary<String> {
         + Arrays.stream(values).map(v -> '"' + v + '"').collect(Collectors.joining(","))
         + (matchNoneOfValues ? ")" : "");
   }
+
+  public static Builder getBuilder() {
+    return new StringBoundary().new Builder();
+  }
+
+  public class Builder extends DefaultBuilder<StringBoundary> {
+
+    private List<String> buildingValues;
+
+    private Builder() {
+      buildingValues = new ArrayList<>();
+      value.matchAny = false;
+      value.matchNoneOfValues = false;
+    }
+
+    public Builder isMatchNoneOfValues(boolean matchNoneOfValues) {
+      value.matchNoneOfValues = matchNoneOfValues;
+      return this;
+    }
+
+    public Builder isMatchAny(boolean matchAny) {
+      value.matchAny = matchAny;
+      value.matchNoneOfValues = false;
+      value.values = new String[0];
+      return this;
+    }
+
+    public Builder addValue(String value) {
+      buildingValues.add(Validate.notNull(value));
+      return this;
+    }
+
+    public Builder addValues(Collection<String> values) {
+      buildingValues.addAll(Validate.noNullElements(values));
+      return this;
+    }
+
+    @Override
+    protected void validate() {
+      super.validate();
+      if (matchAny) {
+        // TODO exception
+      }
+    }
+
+    @Override
+    public StringBoundary build() {
+      value.values = buildingValues.toArray(new String[buildingValues.size()]);
+      value.text = value.getParsedText();
+      return super.build();
+    }
+  }
 }
diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundaryTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundaryTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5db876c0405b02304da009f8a6ec6510a95febbf
--- /dev/null
+++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundaryTest.java
@@ -0,0 +1,24 @@
+package de.unikoblenz.fgbks.base.utils.boundary.impl;
+
+import io.quarkus.test.junit.QuarkusTest;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+@QuarkusTest
+class StringBoundaryTest {
+
+  @Test
+  public void testBuilder() {
+    StringBoundary sb = StringBoundary.getBuilder().addValue("a").build();
+    Assertions.assertEquals("a", sb.getValues()[0]);
+    Assertions.assertFalse(sb.isMatchAny());
+    Assertions.assertFalse(sb.matchesNoneOfValues());
+    Assertions.assertEquals("\"a\"", sb.getText());
+
+    sb = StringBoundary.getBuilder().addValue("a").addValue("b").isMatchNoneOfValues(true).build();
+    Assertions.assertEquals("a", sb.getValues()[0]);
+    Assertions.assertFalse(sb.isMatchAny());
+    Assertions.assertTrue(sb.matchesNoneOfValues());
+    Assertions.assertEquals("not(\"a\",\"b\")", sb.getText());
+  }
+}