diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/value/AbstractStringValueObject.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/value/AbstractStringValueObject.java
index ec5e6f969aa49de71def80bf25b53e4aa3d59b1f..a7f54fe675a9ccfc21d07cf53383f957a879b9a1 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/value/AbstractStringValueObject.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/value/AbstractStringValueObject.java
@@ -7,7 +7,7 @@ import static org.apache.commons.lang3.Validate.notNull;
 
 public abstract class AbstractStringValueObject extends AbstractSimpleValueObject<String> {
 
-  public static final int MIN_LEN = 1;
+  public static final int DEFAULT_MIN_LEN = 1;
 
   protected AbstractStringValueObject() {}
 
@@ -25,10 +25,10 @@ public abstract class AbstractStringValueObject extends AbstractSimpleValueObjec
     if (handleBlanksAsNull() && super.getValue().trim().isEmpty()) {
       return null;
     }
-    return isBlankAllowed() ? super.getValue() : toStringTimTrailing();
+    return isBlankAllowed() ? super.getValue() : toStringTrim();
   }
 
-  private String toStringTimTrailing() {
+  private String toStringTrim() {
     return super.getValue().trim();
   }
 
@@ -54,7 +54,7 @@ public abstract class AbstractStringValueObject extends AbstractSimpleValueObjec
   }
 
   protected Integer getMinLength() {
-    return MIN_LEN;
+    return DEFAULT_MIN_LEN;
   }
 
   protected abstract Integer getMaxLength();
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Message.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Message.java
new file mode 100644
index 0000000000000000000000000000000000000000..b7ed52c9fc0085cc1682894b1a6cff98c4ada6a8
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Message.java
@@ -0,0 +1,15 @@
+package de.unikoblenz.fgbks.core.dmn.domain;
+
+import de.unikoblenz.fgbks.base.value.AbstractStringValueObject;
+
+public class Message extends AbstractStringValueObject {
+
+  public Message(String initialValue) {
+    super(initialValue);
+  }
+
+  @Override
+  protected Integer getMaxLength() {
+    return 500;
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/AbstractId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/AbstractId.java
new file mode 100644
index 0000000000000000000000000000000000000000..e57aadf9ea84703e6441b91d3c383d19146ce7d1
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/AbstractId.java
@@ -0,0 +1,15 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+import de.unikoblenz.fgbks.base.value.AbstractStringValueObject;
+
+public abstract class AbstractId extends AbstractStringValueObject {
+
+  public AbstractId(String initialValue) {
+    super(initialValue);
+  }
+
+  @Override
+  protected Integer getMaxLength() {
+    return 100;
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionId.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a95016fab9e9331ad5d6331892fe58e1b5244f0
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionId.java
@@ -0,0 +1,8 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+public class DecisionId extends AbstractId {
+
+  public DecisionId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionTableId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionTableId.java
new file mode 100644
index 0000000000000000000000000000000000000000..87292a9374afa23c839fc73b0460c62bb26d7348
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionTableId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("decisionTableId")
+public class DecisionTableId extends AbstractId {
+
+  public DecisionTableId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputEntryId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputEntryId.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c1d594c07c4f2f34e2588a001aef3cbc76b2172
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputEntryId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("inputEntryId")
+public class InputEntryId extends AbstractId {
+
+  public InputEntryId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputExpressionId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputExpressionId.java
new file mode 100644
index 0000000000000000000000000000000000000000..b39666065143b330673240eb3c50e957ff97930d
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputExpressionId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("inputExpressionId")
+public class InputExpressionId extends AbstractId {
+
+  public InputExpressionId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputId.java
new file mode 100644
index 0000000000000000000000000000000000000000..91f6586817943019d626b527d8ba7de6fee0b1e0
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("inputId")
+public class InputId extends AbstractId {
+
+  public InputId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/JsonIdentifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/JsonIdentifier.java
new file mode 100644
index 0000000000000000000000000000000000000000..4952c6a8823f9bb08bf66c2b45f04b3bf5643363
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/JsonIdentifier.java
@@ -0,0 +1,15 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface JsonIdentifier {
+
+  String value() default "id";
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputEntryId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputEntryId.java
new file mode 100644
index 0000000000000000000000000000000000000000..853d5ce2f3e3d700587e9b61c71b6ecd2742a1c1
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputEntryId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("outputEntryId")
+public class OutputEntryId extends AbstractId {
+
+  public OutputEntryId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputId.java
new file mode 100644
index 0000000000000000000000000000000000000000..201b43b25cab989165bb191878a7b0ddcbcf6cd8
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("OutputId")
+public class OutputId extends AbstractId {
+
+  public OutputId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/RuleId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/RuleId.java
new file mode 100644
index 0000000000000000000000000000000000000000..b38220e9788a8e9720d4879d1e4aa7d8bb349842
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/RuleId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("ruleId")
+public class RuleId extends AbstractId {
+
+  public RuleId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntry.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntry.java
index 287e719b490f95ebc02315baa5afc011cef6eb68..029dd51e77d943c7cd167e60e97073899d22795f 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntry.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntry.java
@@ -1,6 +1,7 @@
 package de.unikoblenz.fgbks.core.dmn.verfication.result;
 
 import de.unikoblenz.fgbks.base.builder.DefaultBuilder;
+import de.unikoblenz.fgbks.core.dmn.domain.Message;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -17,7 +18,7 @@ public class VerificationResultEntry extends AbstractResultObject {
   }
 
   private Set<VerificationResultEntryElement> verificationResultEntryElements;
-  private String message;
+  private Message message;
   private VerificationClassification verificationClassification;
 
   protected VerificationResultEntry() {
@@ -40,8 +41,8 @@ public class VerificationResultEntry extends AbstractResultObject {
   }
 
   @JsonbProperty("message")
-  public String getMessage() {
-    return message;
+  public Message getMessage() {
+    return new Message(message.getValue());
   }
 
   private void addVerificationResultEntry(
@@ -61,8 +62,8 @@ public class VerificationResultEntry extends AbstractResultObject {
       return this;
     }
 
-    public Builder withMessage(String message) {
-      value.message = message;
+    public Builder withMessage(Message message) {
+      value.message = new Message(message.getValue());
       return this;
     }
 
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryElement.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryElement.java
index 63e7360e5f45b7b7bae5f4e185c08bea7521c638..032ce6df64a51f1ec523b8c611c65cdd0b1669dc 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryElement.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryElement.java
@@ -1,5 +1,7 @@
 package de.unikoblenz.fgbks.core.dmn.verfication.result;
 
+import de.unikoblenz.fgbks.core.dmn.domain.id.AbstractId;
+import de.unikoblenz.fgbks.core.dmn.domain.id.JsonIdentifier;
 import java.util.HashMap;
 import java.util.Map;
 import javax.json.bind.annotation.JsonbProperty;
@@ -8,71 +10,37 @@ import org.apache.commons.lang3.Validate;
 // @JsonbTypeSerializer(VerificationResultEntryElementJsonSerializer.class)
 public class VerificationResultEntryElement extends AbstractResultObject {
 
-  private static final String DECISION_ID = "decisionId";
-  private static final String DECISION_TABLE_ID = "decisionTableId";
-  private static final String INPUT_ID = "inputId";
-  private static final String INPUT_EXPRESSION_ID = "inputExpressionId";
-  private static final String OUTPUT_ID = "outputId";
-  private static final String RULE_ID = "ruleId";
-  private static final String INPUT_ENTRY_ID = "inputEntryId";
-  private static final String OUTPUT_ENTRY_ID = "outputEntryId";
+  private final Map<String, AbstractId> identifier;
 
-  private final Map<String, Object> properties;
-
-  @JsonbProperty("properties")
-  public Map<String, Object> getProperties() {
-    return new HashMap<>(properties);
+  @JsonbProperty("identifier")
+  public Map<String, Object> getIdentifier() {
+    return new HashMap<>(identifier);
   }
 
   private VerificationResultEntryElement() {
-    properties = new HashMap<>();
+    identifier = new HashMap<>();
   }
 
   public static VerificationResultEntryElement create() {
     return new VerificationResultEntryElement();
   }
 
-  public VerificationResultEntryElement withDecisionId(String decisionId) {
-    return withProperty(DECISION_ID, decisionId);
-  }
+  public VerificationResultEntryElement withIdentifier(AbstractId value) {
 
-  public VerificationResultEntryElement withDecisionTableId(String decisionTableId) {
-    return withProperty(DECISION_TABLE_ID, decisionTableId);
-  }
-
-  public VerificationResultEntryElement withInputId(String inputId) {
-    return withProperty(INPUT_ID, inputId);
-  }
-
-  public VerificationResultEntryElement withInputExpressionId(String inputExpressionId) {
-    return withProperty(INPUT_EXPRESSION_ID, inputExpressionId);
-  }
-
-  public VerificationResultEntryElement withOutputId(String outputId) {
-    return withProperty(OUTPUT_ID, outputId);
-  }
-
-  public VerificationResultEntryElement withRuleId(String ruleId) {
-    return withProperty(RULE_ID, ruleId);
-  }
-
-  public VerificationResultEntryElement withInputEntryId(String inputEntryId) {
-    return withProperty(INPUT_ENTRY_ID, inputEntryId);
-  }
-
-  public VerificationResultEntryElement withOutputEntryId(String outputEntryId) {
-    return withProperty(OUTPUT_ENTRY_ID, outputEntryId);
-  }
-
-  private VerificationResultEntryElement withProperty(String key, String value) {
-    // every properties can only be set once
+    // Check if annotation is present
+    Validate.isTrue(
+        value.getClass().isAnnotationPresent(JsonIdentifier.class),
+        "No annotation \"JsonIdentifier\" for AbstractId %s present.",
+        value.getClass().getSimpleName());
+    String keyValue = value.getClass().getAnnotation(JsonIdentifier.class).value();
+    // every identifier can only be set once
     Validate.isTrue(
-        !properties.containsKey(key),
-        "Property %s with value %s in %s already set",
-        key,
+        !identifier.containsKey(keyValue),
+        "Identifier %s with value %s in %s already set.",
+        keyValue,
         value,
         VerificationResultEntryElement.class.getSimpleName());
-    properties.put(key, value);
+    identifier.put(keyValue, value);
     return this;
   }
 }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryFactory.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryFactory.java
index 5a57a75380f9bfef9a34ab856318f63c24b70b53..bc651b989e577f9ae940d62f2f89cb467a763961 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryFactory.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryFactory.java
@@ -1,5 +1,6 @@
 package de.unikoblenz.fgbks.core.dmn.verfication.result;
 
+import de.unikoblenz.fgbks.core.dmn.domain.Message;
 import de.unikoblenz.fgbks.core.dmn.verfication.result.VerificationResultEntry.VerificationClassification;
 import de.unikoblenz.fgbks.core.dmn.verfication.result.VerifierResult.Builder;
 import org.apache.commons.lang3.Validate;
@@ -37,11 +38,15 @@ public class VerificationResultEntryFactory {
 
   public void addToEntry(
       VerificationClassification verificationClassification, String message, Object... args) {
+    addToEntry(verificationClassification, new Message(String.format(message, args)));
+  }
+
+  public void addToEntry(VerificationClassification verificationClassification, Message message) {
     Validate.notNull(
         verificationResultEntryBuilder,
         "First call \"addElement\" in VerificationResultEntryFactory before calling \"addToEntry\"");
     verificationResultEntryBuilder.withClassification(verificationClassification);
-    verificationResultEntryBuilder.withMessage(String.format(Validate.notNull(message), args));
+    verificationResultEntryBuilder.withMessage(message);
     verifierResultBuilder.addVerificationResultEntry(verificationResultEntryBuilder.build());
     verificationResultEntryBuilder = null;
   }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/SampleVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/SampleVerifier.java
index 6e202dd3a3c031c188c551e8fab9661074653969..0edc2e936d8b563368d0435d8b1e625f2275f9ea 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/SampleVerifier.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/SampleVerifier.java
@@ -3,6 +3,9 @@ package de.unikoblenz.fgbks.core.dmn.verfication.verifier;
 import static de.unikoblenz.fgbks.core.dmn.verfication.VerificationType.IDENTICAL_BUSINESS_RULE_VERIFICATION;
 import static de.unikoblenz.fgbks.core.dmn.verfication.result.VerificationResultEntry.VerificationClassification.*;
 
+import de.unikoblenz.fgbks.core.dmn.domain.id.InputEntryId;
+import de.unikoblenz.fgbks.core.dmn.domain.id.OutputEntryId;
+import de.unikoblenz.fgbks.core.dmn.domain.id.RuleId;
 import de.unikoblenz.fgbks.core.dmn.verfication.result.VerificationResultEntryElement;
 
 public class SampleVerifier extends AbstractVerifier {
@@ -15,15 +18,15 @@ public class SampleVerifier extends AbstractVerifier {
   protected void doVerification() {
     vref.addElement(
         VerificationResultEntryElement.create()
-            .withDecisionId("hello workd")
-            .withInputEntryId("adsas")
-            .withRuleId("asdads"));
+            .withIdentifier(new InputEntryId("asdasda"))
+            .withIdentifier(new OutputEntryId("test"))
+            .withIdentifier(new RuleId("asdasd")));
     vref.addElement(
         VerificationResultEntryElement.create()
-            .withDecisionId("hello workd")
-            .withInputEntryId("adsas")
-            .withRuleId("asdads"));
-    vref.addToEntry(ERROR, "Asd");
+            .withIdentifier(new InputEntryId("asdasda"))
+            .withIdentifier(new OutputEntryId("test"))
+            .withIdentifier(new RuleId("asdasd")));
+    vref.addToEntry(ERROR, "My sample message");
     try {
       Thread.sleep(1500);
     } catch (InterruptedException e) {