diff --git a/caosdb-proto b/caosdb-proto
index 547771c7df79f5b0d6c4d73a3d7e8c9c9e73cb71..c01fd9ff1471adafa707fdb36bdaa49749079fa6 160000
--- a/caosdb-proto
+++ b/caosdb-proto
@@ -1 +1 @@
-Subproject commit 547771c7df79f5b0d6c4d73a3d7e8c9c9e73cb71
+Subproject commit c01fd9ff1471adafa707fdb36bdaa49749079fa6
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/DeleteEntityProperties.java b/src/main/java/org/caosdb/server/database/backend/transaction/DeleteEntityProperties.java
index 7b02fbf003e49c18bc14a602f7e2f781b495c682..4072c1b2877cd9231424a98948fad32747870537 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/DeleteEntityProperties.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/DeleteEntityProperties.java
@@ -22,13 +22,12 @@
  */
 package org.caosdb.server.database.backend.transaction;
 
-import static org.caosdb.server.transaction.Transaction.ERROR_INTEGRITY_VIOLATION;
-
 import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.DeleteEntityPropertiesImpl;
 import org.caosdb.server.database.exceptions.IntegrityException;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.utils.EntityStatus;
+import org.caosdb.server.utils.ServerMessages;
 
 public class DeleteEntityProperties extends BackendTransaction {
 
@@ -50,7 +49,7 @@ public class DeleteEntityProperties extends BackendTransaction {
       try {
         ret.execute(this.entity.getId());
       } catch (final IntegrityException exc) {
-        this.entity.addError(ERROR_INTEGRITY_VIOLATION);
+        this.entity.addError(ServerMessages.ERROR_INTEGRITY_VIOLATION);
         throw exc;
       }
     }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/DeleteSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/transaction/DeleteSparseEntity.java
index 55989d219ad738d5a866e0ef6f322368c8fc559b..e371cfe1f9caf3d4438e8801d4a6cee1119322f8 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/DeleteSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/DeleteSparseEntity.java
@@ -24,13 +24,12 @@
  */
 package org.caosdb.server.database.backend.transaction;
 
-import static org.caosdb.server.transaction.Transaction.ERROR_INTEGRITY_VIOLATION;
-
 import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.DeleteSparseEntityImpl;
 import org.caosdb.server.database.exceptions.IntegrityException;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.utils.EntityStatus;
+import org.caosdb.server.utils.ServerMessages;
 
 public class DeleteSparseEntity extends BackendTransaction {
 
@@ -54,7 +53,7 @@ public class DeleteSparseEntity extends BackendTransaction {
         ret.execute(this.entity.getId());
       }
     } catch (final IntegrityException exc) {
-      this.entity.addError(ERROR_INTEGRITY_VIOLATION);
+      this.entity.addError(ServerMessages.ERROR_INTEGRITY_VIOLATION);
       throw exc;
     }
   }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityDatatype.java b/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityDatatype.java
index 182874d1f1e30ed8f5249e609dbbc42a724d94af..aa139e7db565ae82073d6983915c0c53e9cd8b51 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityDatatype.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityDatatype.java
@@ -1,12 +1,11 @@
 package org.caosdb.server.database.backend.transaction;
 
-import static org.caosdb.server.transaction.Transaction.ERROR_INTEGRITY_VIOLATION;
-
 import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.InsertEntityDatatypeImpl;
 import org.caosdb.server.database.exceptions.IntegrityException;
 import org.caosdb.server.database.proto.SparseEntity;
 import org.caosdb.server.entity.EntityInterface;
+import org.caosdb.server.utils.ServerMessages;
 
 public class InsertEntityDatatype extends BackendTransaction {
 
@@ -25,7 +24,7 @@ public class InsertEntityDatatype extends BackendTransaction {
     try {
       t.execute(e);
     } catch (final IntegrityException exc) {
-      this.entity.addError(ERROR_INTEGRITY_VIOLATION);
+      this.entity.addError(ServerMessages.ERROR_INTEGRITY_VIOLATION);
       throw exc;
     }
 
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java
index 22720f836e5cbd4912f3aedccd25398e80a19324..213c7529766dcac4cc002f81380bf8d141cd8065 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java
@@ -22,8 +22,6 @@
  */
 package org.caosdb.server.database.backend.transaction;
 
-import static org.caosdb.server.transaction.Transaction.ERROR_INTEGRITY_VIOLATION;
-
 import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.InsertSparseEntityImpl;
 import org.caosdb.server.database.exceptions.IntegrityException;
@@ -31,6 +29,7 @@ import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.SparseEntity;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Version;
+import org.caosdb.server.utils.ServerMessages;
 import org.caosdb.server.utils.Undoable;
 
 public class InsertSparseEntity extends BackendTransaction {
@@ -52,7 +51,7 @@ public class InsertSparseEntity extends BackendTransaction {
     try {
       t.execute(e);
     } catch (final IntegrityException exc) {
-      this.entity.addError(ERROR_INTEGRITY_VIOLATION);
+      this.entity.addError(ServerMessages.ERROR_INTEGRITY_VIOLATION);
       throw exc;
     }
 
diff --git a/src/main/java/org/caosdb/server/datatype/ReferenceDatatype.java b/src/main/java/org/caosdb/server/datatype/ReferenceDatatype.java
index 42f60cebc116d23137d359c11015a2978233234e..769d3ebdd109e22dcbc41f2ae7bd478b709f0482 100644
--- a/src/main/java/org/caosdb/server/datatype/ReferenceDatatype.java
+++ b/src/main/java/org/caosdb/server/datatype/ReferenceDatatype.java
@@ -27,9 +27,6 @@ import org.caosdb.server.entity.Message;
 @DatatypeDefinition(name = "Reference")
 public class ReferenceDatatype extends AbstractDatatype {
 
-  public static final Message REFERENCE_ID_NOT_PARSABLE =
-      new Message(217, "The reference is not parsable. It must be an integer.");
-
   @Override
   public ReferenceValue parseValue(final Object value) throws Message {
     return ReferenceValue.parseReference(value);
diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java
index 0a60f9af59f731098a0e194e4848b578094d4e68..76ed7bf1ed2a16dfbade6d6effb162e391ce1c84 100644
--- a/src/main/java/org/caosdb/server/entity/Entity.java
+++ b/src/main/java/org/caosdb/server/entity/Entity.java
@@ -662,18 +662,6 @@ public class Entity extends AbstractObservable implements EntityInterface {
     return ret;
   }
 
-  @Override
-  public final Message getMessage(final String type, final Integer code) {
-    for (final ToElementable m : this.messages) {
-      if (m instanceof Message
-          && ((Message) m).getType().equalsIgnoreCase(type)
-          && ((Message) m).getCode() == code) {
-        return (Message) m;
-      }
-    }
-    return null;
-  }
-
   @Override
   public final void addMessage(final ToElementable m) {
     this.messages.add(m);
@@ -691,7 +679,7 @@ public class Entity extends AbstractObservable implements EntityInterface {
 
   @Override
   public void addInfo(final String description) {
-    final Message m = new Message(MessageType.Info, 0, description);
+    final Message m = new Message(description);
     addMessage(m);
   }
 
diff --git a/src/main/java/org/caosdb/server/entity/Message.java b/src/main/java/org/caosdb/server/entity/Message.java
index a1d9513f3d7a2068e10563fbc2d4fb447fe1964b..bdf6488d15a1d77b3038ece18541cab78ee9c805 100644
--- a/src/main/java/org/caosdb/server/entity/Message.java
+++ b/src/main/java/org/caosdb/server/entity/Message.java
@@ -21,17 +21,18 @@
  */
 package org.caosdb.server.entity;
 
+import org.caosdb.api.entity.v1.MessageCode;
 import org.caosdb.server.entity.xml.ToElementable;
 import org.jdom2.Element;
 
 public class Message extends Exception implements Comparable<Message>, ToElementable {
 
   protected final String type;
-  private final Integer code;
+  private final MessageCode code;
   private final String description;
   private final String body;
 
-  private static final long serialVersionUID = -3005017964769041935L;
+  private static final long serialVersionUID = 1837110172902899264L;
 
   public enum MessageType {
     Warning,
@@ -48,7 +49,7 @@ public class Message extends Exception implements Comparable<Message>, ToElement
   public String toString() {
     return this.type.toString()
         + " ("
-        + (this.code != null ? Integer.toString(this.code) : "")
+        + this.code.toString()
         + ") - "
         + (this.description != null ? this.description : "");
   }
@@ -74,33 +75,33 @@ public class Message extends Exception implements Comparable<Message>, ToElement
     this(type, null, description, body);
   }
 
-  public Message(final String type, final Integer code) {
+  public Message(final String type, final MessageCode code) {
     this(type, code, null, null);
   }
 
-  public Message(final Integer code, final String description) {
+  public Message(final MessageCode code, final String description) {
     this(MessageType.Info, code, description);
   }
 
-  public Message(final MessageType type, final Integer code, final String description) {
+  public Message(final MessageType type, final MessageCode code, final String description) {
     this(type.toString(), code, description, null);
   }
 
   public Message(
-      final MessageType type, final Integer code, final String description, final String body) {
+      final MessageType type, final MessageCode code, final String description, final String body) {
     this(type.toString(), code, description, body);
   }
 
-  public Message(final String type, final Integer code, final String description) {
+  public Message(final String type, final MessageCode code, final String description) {
     this(type, code, description, null);
   }
 
   public Message(final MessageType type, final String description) {
-    this(type.toString(), 0, description);
+    this(type.toString(), MessageCode.MESSAGE_CODE_UNKNOWN, description);
   }
 
   public Message(
-      final String type, final Integer code, final String description, final String body) {
+      final String type, final MessageCode code, final String description, final String body) {
     this.code = code;
     this.description = description;
     this.body = body;
@@ -108,7 +109,7 @@ public class Message extends Exception implements Comparable<Message>, ToElement
   }
 
   public Message(
-      final Integer code, final String description, final String body, final MessageType type) {
+      final MessageCode code, final String description, final String body, final MessageType type) {
     this.code = code;
     this.description = description;
     this.body = body;
@@ -122,14 +123,14 @@ public class Message extends Exception implements Comparable<Message>, ToElement
     this.type = MessageType.Info.toString();
   }
 
-  public Integer getCode() {
+  public MessageCode getCode() {
     return this.code;
   }
 
   public Element toElement() {
     final Element e = new Element(this.type);
     if (this.code != null) {
-      e.setAttribute("code", Integer.toString(this.code));
+      e.setAttribute("code", this.code.toString());
     }
     if (this.description != null) {
       e.setAttribute("description", this.description);
@@ -153,8 +154,7 @@ public class Message extends Exception implements Comparable<Message>, ToElement
 
   public final void print(final String indent) {
     System.out.println(indent + "+---| " + this.type + " |------------------------ ");
-    System.out.println(
-        indent + "|        Code: " + (this.code != null ? Integer.toString(this.code) : "null"));
+    System.out.println(indent + "|        Code: " + this.code.toString());
     System.out.println(indent + "| Description: " + this.description);
     System.out.println(indent + "|        Body: " + this.body);
     System.out.println(indent + "+------------------------------------------------------ ");
diff --git a/src/main/java/org/caosdb/server/entity/TransactionEntity.java b/src/main/java/org/caosdb/server/entity/TransactionEntity.java
index 2883c076f437520581037219a724020b47893424..7dd96b7f5ba8dc71c976731fed4d91e43688f919 100644
--- a/src/main/java/org/caosdb/server/entity/TransactionEntity.java
+++ b/src/main/java/org/caosdb/server/entity/TransactionEntity.java
@@ -59,8 +59,6 @@ public interface TransactionEntity {
 
   public abstract List<Message> getMessages(String type);
 
-  public abstract Message getMessage(String type, Integer code);
-
   public abstract void addMessage(ToElementable m);
 
   public abstract void addError(Message m);
diff --git a/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java b/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java
index c83cb67883f5a616109268fb6d62bae40cd73e6b..140bb207b61d6f50a593feb24a43b3e324ddcff7 100644
--- a/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java
+++ b/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java
@@ -340,11 +340,6 @@ public class EntityWrapper implements EntityInterface {
     return this.entity.getMessages(type);
   }
 
-  @Override
-  public Message getMessage(final String type, final Integer code) {
-    return this.entity.getMessage(type, code);
-  }
-
   @Override
   public void addMessage(final ToElementable m) {
     this.entity.addMessage(m);
diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
index 5d33ce0b553c9abe709c81dfba364e8d176a0ffd..eeba659aa5ab0bd2b7271a8bd1fa9987268197fc 100644
--- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
+++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
@@ -181,19 +181,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
   }
 
   public static MessageCode getMessageCode(final Message m) {
-    if (m.equalsCore(ServerMessages.ENTITY_DOES_NOT_EXIST)) {
-      return MessageCode.MESSAGE_CODE_ENTITY_DOES_NOT_EXIST;
-    } else if (m.equalsCore(ServerMessages.ENTITY_HAS_NO_PROPERTIES)) {
-      return MessageCode.MESSAGE_CODE_ENTITY_HAS_NO_PROPERTIES;
-    } else if (m.equalsCore(ServerMessages.INTEGER_OUT_OF_RANGE)) {
-      return MessageCode.MESSAGE_CODE_INTEGER_VALUE_OUT_OF_RANGE;
-    } else if (m.equalsCore(ServerMessages.ENTITY_HAS_BEEN_DELETED_SUCCESSFULLY)) {
-      return MessageCode.MESSAGE_CODE_ENTITY_HAS_BEEN_DELETED_SUCCESSFULLY;
-    } else if (m.getCode() == 0) {
-      return MessageCode.MESSAGE_CODE_UNSPECIFIED;
-    } else {
-      return MessageCode.MESSAGE_CODE_UNKNOWN;
-    }
+    return m.getCode();
   }
 
   public Version convert(final org.caosdb.server.entity.Version from) {
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckFileStorageConsistency.java b/src/main/java/org/caosdb/server/jobs/core/CheckFileStorageConsistency.java
index 8dc6fc0c60bc234d65f576377a89244d0a7a673e..e425649bb1bc43a9745120ed078c653f55af2e38 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckFileStorageConsistency.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckFileStorageConsistency.java
@@ -127,8 +127,6 @@ public class CheckFileStorageConsistency extends FlagJob {
       getContainer()
           .addMessage(
               new Message(
-                  "Info",
-                  0,
                   "Test took too long. The results will be written to './ConsistencyTest.xml'"));
     } else {
       // add info/warning/error
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckRefidIsaParRefid.java b/src/main/java/org/caosdb/server/jobs/core/CheckRefidIsaParRefid.java
index 5b95840a13928040ee76198f793a85e2ad078a23..e739ffde01a38fb1539c97166014350e9f9c61d7 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckRefidIsaParRefid.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckRefidIsaParRefid.java
@@ -31,7 +31,6 @@ import org.caosdb.server.datatype.ReferenceValue;
 import org.caosdb.server.entity.Entity;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Message;
-import org.caosdb.server.entity.Message.MessageType;
 import org.caosdb.server.entity.Role;
 import org.caosdb.server.entity.wrapper.Parent;
 import org.caosdb.server.jobs.EntityJob;
@@ -143,8 +142,6 @@ public class CheckRefidIsaParRefid extends EntityJob implements Observer {
           getEntity()
               .addInfo(
                   new Message(
-                      MessageType.Info,
-                      0,
                       "Could not resolve all parents of the entity with id "
                           + child.toString()
                           + ". Problematic parent: "
diff --git a/src/main/java/org/caosdb/server/jobs/core/Inheritance.java b/src/main/java/org/caosdb/server/jobs/core/Inheritance.java
index 56ac72fab9f980581cf755c5018dad48ad841f96..78e89a53593e3f112650ed81e292d0c62f071e24 100644
--- a/src/main/java/org/caosdb/server/jobs/core/Inheritance.java
+++ b/src/main/java/org/caosdb/server/jobs/core/Inheritance.java
@@ -26,6 +26,7 @@ package org.caosdb.server.jobs.core;
 
 import java.util.ArrayList;
 import java.util.List;
+import org.caosdb.api.entity.v1.MessageCode;
 import org.caosdb.server.database.backend.transaction.RetrieveFullEntityTransaction;
 import org.caosdb.server.entity.Entity;
 import org.caosdb.server.entity.EntityInterface;
@@ -61,7 +62,7 @@ public class Inheritance extends EntityJob {
   public static final Message ILLEGAL_INHERITANCE_MODE =
       new Message(
           MessageType.Warning,
-          0,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
           "Unknown value for flag \"inheritance\". None of the parent's properties have been transfered to the child.");
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java b/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java
index 8133e4659d55caf29faa56eeb80ced194cd26cfc..7f9cf9be2496344473b487b24ab90d2d37e86a5c 100644
--- a/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java
+++ b/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java
@@ -30,6 +30,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import org.caosdb.api.entity.v1.MessageCode;
 import org.caosdb.server.CaosDBException;
 import org.caosdb.server.CaosDBServer;
 import org.caosdb.server.FileSystem;
@@ -132,8 +133,6 @@ public class InsertFilesInDir extends FlagJob {
           getContainer()
               .addMessage(
                   new Message(
-                      MessageType.Info,
-                      0,
                       "Files count in "
                           + dir.getName()
                           + "/: "
@@ -147,7 +146,12 @@ public class InsertFilesInDir extends FlagJob {
         throw new TransactionException(e);
       }
     } else {
-      getContainer().addMessage(new Message(MessageType.Error, 0, "No such directory: " + dirStr));
+      getContainer()
+          .addMessage(
+              new Message(
+                  MessageType.Error,
+                  MessageCode.MESSAGE_CODE_UNKNOWN,
+                  "No such directory: " + dirStr));
       return;
     }
   }
@@ -289,7 +293,7 @@ public class InsertFilesInDir extends FlagJob {
             .addMessage(
                 new Message(
                     MessageType.Warning,
-                    1,
+                    MessageCode.MESSAGE_CODE_UNKNOWN,
                     "Not explicitly included file: " + sub.getCanonicalPath()));
         return false;
       }
@@ -297,7 +301,9 @@ public class InsertFilesInDir extends FlagJob {
         getContainer()
             .addMessage(
                 new Message(
-                    MessageType.Warning, 2, "Explicitly excluded file: " + sub.getCanonicalPath()));
+                    MessageType.Warning,
+                    MessageCode.MESSAGE_CODE_UNKNOWN,
+                    "Explicitly excluded file: " + sub.getCanonicalPath()));
         return false;
       }
     }
@@ -305,14 +311,18 @@ public class InsertFilesInDir extends FlagJob {
       getContainer()
           .addMessage(
               new Message(
-                  MessageType.Warning, 3, "Hidden directory or file: " + sub.getCanonicalPath()));
+                  MessageType.Warning,
+                  MessageCode.MESSAGE_CODE_UNKNOWN,
+                  "Hidden directory or file: " + sub.getCanonicalPath()));
       return false;
     }
     if (sub.isDirectory() && !sub.canExecute()) {
       getContainer()
           .addMessage(
               new Message(
-                  MessageType.Warning, 4, "Unaccessible directory: " + sub.getCanonicalPath()));
+                  MessageType.Warning,
+                  MessageCode.MESSAGE_CODE_UNKNOWN,
+                  "Unaccessible directory: " + sub.getCanonicalPath()));
       return false;
     }
     if (!sub.canRead()) {
@@ -320,7 +330,7 @@ public class InsertFilesInDir extends FlagJob {
           .addMessage(
               new Message(
                   MessageType.Warning,
-                  5,
+                  MessageCode.MESSAGE_CODE_UNKNOWN,
                   "Unreadable directory or file: " + sub.getCanonicalPath()));
       return false;
     }
@@ -329,7 +339,7 @@ public class InsertFilesInDir extends FlagJob {
           .addMessage(
               new Message(
                   MessageType.Warning,
-                  6,
+                  MessageCode.MESSAGE_CODE_UNKNOWN,
                   "Directory or file is symbolic link: " + sub.getAbsolutePath()));
       if (!this.forceSymLinks) {
         return false;
@@ -355,11 +365,15 @@ public class InsertFilesInDir extends FlagJob {
     // overlaps the directory to be inserted.
 
     if (!dir.isDirectory()) {
-      throw new Message(MessageType.Error, 0, "Dir is not a directory.");
+      throw new Message(
+          MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "Dir is not a directory.");
     }
 
     if (!dir.canRead() || !dir.canExecute()) {
-      throw new Message(MessageType.Error, 0, "Cannot read or enter the desired directory.");
+      throw new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "Cannot read or enter the desired directory.");
     }
 
     final File base = new File(FileSystem.getBasepath());
@@ -375,7 +389,10 @@ public class InsertFilesInDir extends FlagJob {
         || isSubDir(tmp, dir)
         || isSubDir(dir, root)
         || isSubDir(root, dir)) {
-      throw new Message(MessageType.Error, 0, "Dir is not allowed: " + dir.toString());
+      throw new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "Dir is not allowed: " + dir.toString());
     }
 
     for (final File f : getAllowedFolders()) {
@@ -386,7 +403,7 @@ public class InsertFilesInDir extends FlagJob {
     }
     throw new Message(
         MessageType.Error,
-        1,
+        MessageCode.MESSAGE_CODE_UNKNOWN,
         "Dir is not allowed: "
             + dir.toString()
             + " Allowed directories: "
diff --git a/src/main/java/org/caosdb/server/jobs/core/TestMail.java b/src/main/java/org/caosdb/server/jobs/core/TestMail.java
index fb3e87097fae44f3f1f609dd7e347c27c6d971c2..210a9f59b879529f5f96954250556e88f60454be 100644
--- a/src/main/java/org/caosdb/server/jobs/core/TestMail.java
+++ b/src/main/java/org/caosdb/server/jobs/core/TestMail.java
@@ -25,7 +25,6 @@ package org.caosdb.server.jobs.core;
 import org.caosdb.server.CaosDBServer;
 import org.caosdb.server.ServerProperties;
 import org.caosdb.server.entity.Message;
-import org.caosdb.server.entity.Message.MessageType;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
 import org.caosdb.server.utils.ServerMessages;
@@ -49,8 +48,7 @@ public class TestMail extends FlagJob {
       if (Utils.isRFC822Compliant(value)) {
         final Mail m = new Mail(NAME, EMAIL, null, value, "Test mail", "This is a test mail.");
         m.send();
-        getContainer()
-            .addMessage(new Message(MessageType.Info, 0, "A mail has been send to " + value));
+        getContainer().addMessage(new Message("A mail has been send to " + value));
       } else {
         getContainer().addMessage(ServerMessages.EMAIL_NOT_WELL_FORMED);
       }
diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java
index fa5754c65e0e89baf90774fa7def683ece66236b..95f853d607edffa29b69e4f84657560ba3a52a48 100644
--- a/src/main/java/org/caosdb/server/query/Query.java
+++ b/src/main/java/org/caosdb/server/query/Query.java
@@ -46,6 +46,7 @@ import org.antlr.v4.runtime.CharStreams;
 import org.antlr.v4.runtime.CommonTokenStream;
 import org.apache.commons.jcs.access.behavior.ICacheAccess;
 import org.apache.shiro.subject.Subject;
+import org.caosdb.api.entity.v1.MessageCode;
 import org.caosdb.server.CaosDBServer;
 import org.caosdb.server.ServerProperties;
 import org.caosdb.server.caching.Cache;
@@ -754,7 +755,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
   }
 
   private void addWarning(final String w) {
-    this.messages.add(new Message(MessageType.Warning, 0, w));
+    this.messages.add(new Message(MessageType.Warning, MessageCode.MESSAGE_CODE_UNKNOWN, w));
   }
 
   private void cleanUp() {
diff --git a/src/main/java/org/caosdb/server/resource/ScriptingResource.java b/src/main/java/org/caosdb/server/resource/ScriptingResource.java
index 35885bb4376b26fc04977389f4dbf1cd7c40decd..4629457f7bad9eeedfcaf680e6dc3fb5556e6726 100644
--- a/src/main/java/org/caosdb/server/resource/ScriptingResource.java
+++ b/src/main/java/org/caosdb/server/resource/ScriptingResource.java
@@ -96,7 +96,17 @@ public class ScriptingResource extends AbstractCaosDBServerResource {
         return null;
       }
     } catch (Message m) {
-      return error(m, Status.valueOf(m.getCode()));
+      if (m == ServerMessages.SERVER_SIDE_SCRIPT_DOES_NOT_EXIST) {
+        return error(m, Status.CLIENT_ERROR_NOT_FOUND);
+      } else if (m == ServerMessages.SERVER_SIDE_SCRIPT_MISSING_CALL) {
+        return error(m, Status.CLIENT_ERROR_BAD_REQUEST);
+      } else if (m == ServerMessages.SERVER_SIDE_SCRIPT_NOT_EXECUTABLE) {
+        return error(m, Status.CLIENT_ERROR_BAD_REQUEST);
+      } else if (m == ServerMessages.SERVER_SIDE_SCRIPT_TIMEOUT) {
+        return error(m, Status.CLIENT_ERROR_BAD_REQUEST);
+      }
+
+      return error(m, Status.SERVER_ERROR_INTERNAL);
     } finally {
       deleteTmpFiles();
     }
diff --git a/src/main/java/org/caosdb/server/transaction/DeleteUserTransaction.java b/src/main/java/org/caosdb/server/transaction/DeleteUserTransaction.java
index 0f2f5b7fb676e436b131ca69678214c2e34b974c..dc935adc9ea0236ce3c8d54b498ed5f6b15a8c42 100644
--- a/src/main/java/org/caosdb/server/transaction/DeleteUserTransaction.java
+++ b/src/main/java/org/caosdb/server/transaction/DeleteUserTransaction.java
@@ -30,7 +30,6 @@ import org.caosdb.server.database.backend.transaction.DeletePassword;
 import org.caosdb.server.database.backend.transaction.DeleteUser;
 import org.caosdb.server.database.backend.transaction.RetrievePasswordValidator;
 import org.caosdb.server.entity.Message;
-import org.caosdb.server.entity.Message.MessageType;
 import org.caosdb.server.utils.ServerMessages;
 import org.jdom2.Element;
 
@@ -64,7 +63,7 @@ public class DeleteUserTransaction extends AccessControlTransaction {
     final Element ret = new Element("User");
     ret.setAttribute("realm", this.realm);
     ret.setAttribute("name", this.user);
-    ret.addContent(new Message(MessageType.Info, 0, "This user has been deleted.").toElement());
+    ret.addContent(new Message("This user has been deleted.").toElement());
     return ret;
   }
 }
diff --git a/src/main/java/org/caosdb/server/transaction/FileStorageConsistencyCheck.java b/src/main/java/org/caosdb/server/transaction/FileStorageConsistencyCheck.java
index ed93812d22eaad6bf448fa1dede2d92cea1d50a6..bbd1bbd56c57612f62c427676e2bef692ea6ac5c 100644
--- a/src/main/java/org/caosdb/server/transaction/FileStorageConsistencyCheck.java
+++ b/src/main/java/org/caosdb/server/transaction/FileStorageConsistencyCheck.java
@@ -28,6 +28,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.TimeZone;
+import org.caosdb.api.entity.v1.MessageCode;
 import org.caosdb.datetime.UTCDateTime;
 import org.caosdb.server.database.DatabaseAccessManager;
 import org.caosdb.server.database.access.Access;
@@ -176,7 +177,13 @@ public class FileStorageConsistencyCheck extends Thread
         sb.append('\n').append(t.toString());
       }
 
-      e.addContent(new Message("Error", 0, "An exception was thrown.", sb.toString()).toElement());
+      e.addContent(
+          new Message(
+                  "Error",
+                  MessageCode.MESSAGE_CODE_UNKNOWN,
+                  "An exception was thrown.",
+                  sb.toString())
+              .toElement());
     }
 
     final List<Message> results2Messages = results2Messages(getResults(), this.location);
@@ -196,24 +203,36 @@ public class FileStorageConsistencyCheck extends Thread
     final ArrayList<Message> ret = new ArrayList<Message>();
     if (results.isEmpty()) {
       if (location.length() > 0) {
-        ret.add(new Message("Info", 0, "File system below " + location + " is consistent."));
+        ret.add(new Message("File system below " + location + " is consistent."));
       } else {
-        ret.add(new Message("Info", 0, "File system is consistent."));
+        ret.add(new Message("File system is consistent."));
       }
     }
     for (final Entry<String, Integer> r : results.entrySet()) {
       switch (r.getValue()) {
         case FileConsistencyCheck.FILE_DOES_NOT_EXIST:
-          ret.add(new Message("Error", 0, r.getKey() + ": File does not exist."));
+          ret.add(
+              new Message(
+                  "Error",
+                  MessageCode.MESSAGE_CODE_FILE_NOT_FOUND,
+                  r.getKey() + ": File does not exist."));
           break;
         case FileConsistencyCheck.FILE_MODIFIED:
-          ret.add(new Message("Error", 0, r.getKey() + ": File was modified."));
+          ret.add(
+              new Message(
+                  "Error", MessageCode.MESSAGE_CODE_UNKNOWN, r.getKey() + ": File was modified."));
           break;
         case FileConsistencyCheck.UNKNOWN_FILE:
-          ret.add(new Message("Warning", 0, r.getKey() + ": Unknown file."));
+          ret.add(
+              new Message(
+                  "Warning", MessageCode.MESSAGE_CODE_UNKNOWN, r.getKey() + ": Unknown file."));
           break;
         case FileConsistencyCheck.NONE:
-          ret.add(new Message("Warning", 0, r.getKey() + ": Test result not available."));
+          ret.add(
+              new Message(
+                  "Warning",
+                  MessageCode.MESSAGE_CODE_UNKNOWN,
+                  r.getKey() + ": Test result not available."));
           break;
         default:
           break;
diff --git a/src/main/java/org/caosdb/server/transaction/Transaction.java b/src/main/java/org/caosdb/server/transaction/Transaction.java
index 028afdd695652cbe912e1c48dd0ac2491ec59c3a..b4d63fbb293e0119cefe90db34b9cfb28f4e0ce1 100644
--- a/src/main/java/org/caosdb/server/transaction/Transaction.java
+++ b/src/main/java/org/caosdb/server/transaction/Transaction.java
@@ -33,7 +33,6 @@ import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.misc.TransactionBenchmark;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Message;
-import org.caosdb.server.entity.Message.MessageType;
 import org.caosdb.server.entity.container.TransactionContainer;
 import org.caosdb.server.jobs.Job;
 import org.caosdb.server.jobs.Schedule;
@@ -52,9 +51,6 @@ import org.caosdb.server.utils.Observer;
 public abstract class Transaction<C extends TransactionContainer> extends AbstractObservable
     implements TransactionInterface {
 
-  public static final Message ERROR_INTEGRITY_VIOLATION =
-      new Message(MessageType.Error, 0, "This entity caused an unexpected integrity violation.");
-
   @Override
   public TransactionBenchmark getTransactionBenchmark() {
     return getContainer().getTransactionBenchmark();
diff --git a/src/main/java/org/caosdb/server/utils/ServerMessages.java b/src/main/java/org/caosdb/server/utils/ServerMessages.java
index f8898ff47bd77cbb786287b4a676f10d8b398995..6280ca28eb0515ce395b51ea3e75fd7984385a58 100644
--- a/src/main/java/org/caosdb/server/utils/ServerMessages.java
+++ b/src/main/java/org/caosdb/server/utils/ServerMessages.java
@@ -28,296 +28,417 @@ import org.caosdb.server.entity.Message.MessageType;
 public class ServerMessages {
 
   public static final Message ENTITY_HAS_BEEN_DELETED_SUCCESSFULLY =
-      new Message(MessageType.Info, 10, "This entity has been deleted successfully.");
+      new Message(
+          MessageType.Info,
+          MessageCode.MESSAGE_CODE_ENTITY_HAS_BEEN_DELETED_SUCCESSFULLY,
+          "This entity has been deleted successfully.");
 
   public static final Message ENTITY_DOES_NOT_EXIST =
-      new Message(MessageType.Error, 101, "Entity does not exist.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_ENTITY_DOES_NOT_EXIST,
+          "Entity does not exist.");
 
   public static final Message ENTITY_HAS_UNQUALIFIED_PROPERTIES =
-      new Message(MessageType.Error, 114, "Entity has unqualified properties.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_ENTITY_HAS_UNQUALIFIED_PROPERTIES,
+          "Entity has unqualified properties.");
 
   public static final Message ENTITY_HAS_UNQUALIFIED_PARENTS =
-      new Message(MessageType.Error, 116, "Entity has unqualified parents.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_ENTITY_HAS_UNQUALIFIED_PARENTS,
+          "Entity has unqualified parents.");
 
-  public static final Message PARSING_FAILED = new Message(MessageType.Error, 2, "Parsing failed.");
+  public static final Message PARSING_FAILED =
+      new Message(MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "Parsing failed.");
 
   public static final Message UNKNOWN_DATATYPE =
-      new Message(MessageType.Error, 0, "Unknown datatype.");
+      new Message(MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "Unknown data type.");
 
   public static final Message UNKNOWN_IMPORTANCE =
-      new Message(MessageType.Error, 0, "Unknown importance.");
+      new Message(MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "Unknown importance.");
 
   public static final Message ENTITY_HAS_NO_ID =
-      new Message(MessageType.Error, 0, "Entity has no ID.");
+      new Message(
+          MessageType.Error, MessageCode.MESSAGE_CODE_ENTITY_HAS_NO_ID, "Entity has no ID.");
 
   public static final Message REQUIRED_BY_PERSISTENT_ENTITY =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_REQUIRED_BY_PERSISTENT_ENTITY,
           "Entity is required by other entities which are not to be deleted.");
 
   public static final Message PROPERTY_HAS_NO_DATATYPE =
-      new Message(MessageType.Error, 110, "Property has no datatype.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_PROPERTY_HAS_NO_DATA_TYPE,
+          "Property has no data type.");
 
   public static final Message ENTITY_HAS_NO_DESCRIPTION =
-      new Message(MessageType.Error, 0, "Entity has no description.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_ENTITY_HAS_NO_DESCRIPTION,
+          "Entity has no description.");
 
   public static final Message ENTITY_HAS_NO_NAME =
-      new Message(MessageType.Error, 0, "Entity has no name.");
+      new Message(
+          MessageType.Error, MessageCode.MESSAGE_CODE_ENTITY_HAS_NO_NAME, "Entity has no name.");
 
   public static final Message OBLIGATORY_PROPERTY_MISSING =
-      new Message(MessageType.Error, 0, "An obligatory property is missing.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_OBLIGATORY_PROPERTY_MISSING,
+          "An obligatory property is missing.");
 
   public static final Message ENTITY_HAS_NO_PARENTS =
-      new Message(MessageType.Error, 0, "Entity has no parents.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_ENTITY_HAS_NO_PARENTS,
+          "Entity has no parents.");
 
   public static final Message ENTITY_HAS_NO_PROPERTIES =
-      new Message(MessageType.Error, 0, "Entity has no properties.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_ENTITY_HAS_NO_PROPERTIES,
+          "Entity has no properties.");
 
   public static final Message FILE_HAS_NO_TARGET_PATH =
-      new Message(MessageType.Error, 0, "No target path specified.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_FILE_HAS_NO_TARGET_PATH,
+          "No target path specified.");
 
   public static final Message TARGET_PATH_NOT_ALLOWED =
-      new Message(MessageType.Error, 0, "This target path is not allowed.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_TARGET_PATH_NOT_ALLOWED,
+          "This target path is not allowed.");
 
   public static final Message TARGET_PATH_EXISTS =
-      new Message(MessageType.Error, 0, "This target path does already exist.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_TARGET_PATH_EXISTS,
+          "This target path already exists and is owned by another entity.");
 
   public static final Message PROPERTY_HAS_NO_UNIT =
-      new Message(MessageType.Error, 0, "Property has no unit.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_PROPERTY_HAS_NO_UNIT,
+          "Property has no unit.");
 
   public static final Message CANNOT_PARSE_VALUE =
-      new Message(MessageType.Error, 0, "Cannot parse value.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_CANNOT_PARSE_VALUE,
+          "Cannot parse the value.");
 
   public static final Message CHECKSUM_TEST_FAILED =
-      new Message(MessageType.Error, 0, "Checksum test failed. File is corrupted.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_CHECKSUM_TEST_FAILED,
+          "Checksum test failed. File is corrupted.");
 
   public static final Message SIZE_TEST_FAILED =
-      new Message(MessageType.Error, 0, "Size test failed. File is corrupted.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_SIZE_TEST_FAILED,
+          "Size test failed. File is corrupted.");
 
   public static final Message CANNOT_CREATE_PARENT_FOLDER =
-      new Message(MessageType.Error, 0, "Could not create parent folder in the file system.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_CANNOT_CREATE_PARENT_FOLDER,
+          "Could not create parent folder in the file system.");
 
   public static final Message FILE_HAS_NOT_BEEN_UPLOAED =
-      new Message(MessageType.Error, 0, "File has not been uploaded.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_FILE_HAS_NOT_BEEN_UPLOAED,
+          "File has not been uploaded.");
 
   public static final Message THUMBNAIL_HAS_NOT_BEEN_UPLOAED =
-      new Message(MessageType.Error, 0, "Thumbnail has not been uploaded.");
+      new Message(
+          MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "Thumbnail has not been uploaded.");
 
   public static final Message CANNOT_MOVE_FILE_TO_TARGET_PATH =
-      new Message(MessageType.Error, 0, "Could not move file to it's target folder.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_CANNOT_MOVE_FILE_TO_TARGET_PATH,
+          "Could not move file to it's target folder.");
 
   public static final Message CANNOT_PARSE_DATETIME_VALUE =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_CANNOT_PARSE_DATETIME_VALUE,
           "Cannot parse value to datetime format (yyyy-mm-dd'T'hh:mm:ss[.fffffffff][TimeZone]).");
 
   public static final Message CANNOT_PARSE_DOUBLE_VALUE =
-      new Message(MessageType.Error, 0, "Cannot parse value to double.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_CANNOT_PARSE_DOUBLE_VALUE,
+          "Cannot parse value to double.");
 
   public static final Message CANNOT_PARSE_INT_VALUE =
-      new Message(MessageType.Error, 0, "Cannot parse value to integer.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_CANNOT_PARSE_INT_VALUE,
+          "Cannot parse value to integer.");
 
   public static final Message CANNOT_PARSE_BOOL_VALUE =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_CANNOT_PARSE_BOOL_VALUE,
           "Cannot parse value to boolean (either 'true' or 'false', ignoring case).");
 
   public static final Message CANNOT_CONNECT_TO_DATABASE =
-      new Message(MessageType.Error, 0, "Could not connect to MySQL server.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "Could not connect to MySQL server.");
 
   public static final Message REQUEST_BODY_NOT_WELLFORMED =
-      new Message(MessageType.Error, 0, "Request Body was not a well-formed xml.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "Request Body was not a well-formed xml.");
 
   public static final Message REQUEST_BODY_EMPTY =
-      new Message(MessageType.Error, 0, "Request body was empty.");
+      new Message(MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "Request body was empty.");
 
   public static final Message REQUEST_DOESNT_CONTAIN_EXPECTED_ELEMENTS =
-      new Message(MessageType.Error, 0, "Request body didn't contain the expected Elements.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "Request body didn't contain the expected Elements.");
 
   public static final Message FILE_NOT_IN_DROPOFFBOX =
-      new Message(MessageType.Error, 0, "File is not in drop-off box.");
+      new Message(
+          MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "File is not in drop-off box.");
 
   public static final Message FILE_NOT_FOUND =
-      new Message(MessageType.Error, 0, "File could not be found.");
+      new Message(
+          MessageType.Error, MessageCode.MESSAGE_CODE_FILE_NOT_FOUND, "File could not be found.");
 
   public static final Message CANNOT_MOVE_FILE_TO_TMP =
-      new Message(MessageType.Error, 0, "Could not move file to tmp folder.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "Could not move file to tmp folder.");
 
   public static final Message CANNOT_READ_FILE =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
           "Insufficient read permission for this file. Please make it readable.");
 
   public static final Message CANNOT_READ_THUMBNAIL =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
           "Insufficient read permission for this file's thumbnail. Please make it readable.");
 
   public static final Message NO_FILE_REPRESENTATION_SUBMITTED =
-      new Message(MessageType.Error, 0, "No file representation submitted.");
+      new Message(
+          MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "No file representation submitted.");
 
   public static final Message FORM_CONTAINS_UNSUPPORTED_CONTENT =
-      new Message(MessageType.Error, 0, "The form contains unsupported content");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "The form contains unsupported content");
 
   public static final Message WARNING_OCCURED =
       new Message(
           MessageType.Error,
-          128,
+          MessageCode.MESSAGE_CODE_WARNING_OCCURED,
           "A warning occured while processing an entity with the strict flag.");
 
   public static final Message ENTITY_NAME_IS_NOT_UNIQUE =
       new Message(
           MessageType.Error,
-          152,
+          MessageCode.MESSAGE_CODE_ENTITY_NAME_IS_NOT_UNIQUE,
           "Name is already in use. Choose a different name or reuse an existing entity.");
 
   public static final Message ROLE_NAME_IS_NOT_UNIQUE =
-      new Message(MessageType.Error, 1152, "Role name is already in use. Choose a different name.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "Role name is already in use. Choose a different name.");
 
   public static final Message QUERY_EXCEPTION =
-      new Message(MessageType.Error, 13, "This query finished with errors.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_QUERY_EXCEPTION,
+          "This query finished with errors.");
 
   public static final Message LOGOUT_INFO =
-      new Message(MessageType.Info, 201, "You have successfully logged out.");
+      new Message(
+          MessageType.Info, MessageCode.MESSAGE_CODE_UNKNOWN, "You have successfully logged out.");
 
   public static final Message ENTITY_IS_EMPTY =
-      new Message(MessageType.Error, 0, "This entity is empty.");
+      new Message(MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "This entity is empty.");
 
   public static final Message TRANSACTION_ROLL_BACK =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_TRANSACTION_ROLL_BACK,
           "An unknown error occured during the transaction and it was rolled back.");
 
   public static final Message FILE_UPLOAD_FAILED =
-      new Message(MessageType.Error, 0, "The file upload failed for an unknown reason.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "The file upload failed for an unknown reason.");
 
   public static final Message ACCOUNT_CANNOT_BE_ACTIVATED =
-      new Message(MessageType.Error, 0, "This account cannot be activated.");
+      new Message(
+          MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "This account cannot be activated.");
 
   public static final Message ACCOUNT_DOES_NOT_EXIST =
-      new Message(MessageType.Error, 0, "This account does not exist.");
+      new Message(
+          MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "This account does not exist.");
 
   public static final Message ACCOUNT_CANNOT_BE_RESET =
-      new Message(MessageType.Error, 0, "This account cannot be reset.");
+      new Message(
+          MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "This account cannot be reset.");
 
   public static final Message UNKNOWN_UNIT =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_UNKNOWN_UNIT,
           "Unknown unit. Values with this unit cannot be converted to other units when used in search queries.");
 
   public static final Message ACCOUNT_NAME_NOT_UNIQUE =
-      new Message(MessageType.Error, 0, "This user name is yet in use. Please choose another one.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "This user name is yet in use. Please choose another one.");
 
   public static final Message ACCOUNT_HAS_BEEN_DELETED =
-      new Message(MessageType.Info, 10, "This user has been deleted successfully.");
+      new Message(
+          MessageType.Info,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "This user has been deleted successfully.");
 
   public static final Message PLEASE_SET_A_PASSWORD =
-      new Message(MessageType.Info, 0, "Please set a password.");
+      new Message(MessageType.Info, MessageCode.MESSAGE_CODE_UNKNOWN, "Please set a password.");
 
   public static final Message USER_HAS_BEEN_ACTIVATED =
       new Message(
           MessageType.Info,
-          0,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
           "User has been activated. You can now log in with your username and password.");
 
   public static final Message UNAUTHENTICATED =
-      new Message(MessageType.Error, 401, "Sign in, please.");
+      new Message(MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "Sign in, please.");
 
   public static final Message AUTHORIZATION_ERROR =
-      new Message(MessageType.Error, 403, "You are not allowed to do this.");
+      new Message(
+          MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "You are not allowed to do this.");
 
   public static final Message REFERENCE_IS_NOT_ALLOWED_BY_DATATYPE =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_REFERENCE_IS_NOT_ALLOWED_BY_DATA_TYPE,
           "Reference not qualified. The value of this Reference Property is to be a child of its data type.");
 
   public static final Message CANNOT_PARSE_ENTITY_ACL =
-      new Message(MessageType.Error, 0, "Cannot parse EntityACL.");
+      new Message(MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "Cannot parse EntityACL.");
 
   public static final Message ROLE_DOES_NOT_EXIST =
-      new Message(MessageType.Error, 1104, "User Role does not exist.");
+      new Message(MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "User Role does not exist.");
 
   public static final Message ENTITY_NAME_DUPLICATES =
-      new Message(MessageType.Error, 0, "This entity cannot be identified due to name duplicates.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_ENTITY_NAME_DUPLICATES,
+          "This entity cannot be identified due to name duplicates.");
 
   public static final Message DATA_TYPE_NAME_DUPLICATES =
       new Message(
-          MessageType.Error, 0, "This data type cannot be identified due to name duplicates.");
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_DATA_TYPE_NAME_DUPLICATES,
+          "This data type cannot be identified due to name duplicates.");
 
   public static final Message ENTITY_HAS_NO_NAME_OR_ID =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_ENTITY_HAS_NO_NAME_OR_ID,
           "This entity cannot be identified as it didn't come with a name or id.");
 
   public static final Message EMAIL_NOT_WELL_FORMED =
-      new Message(MessageType.Error, 0, "This email address is not RFC822 compliant.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "This email address is not RFC822 compliant.");
 
   public static final Message PASSWORD_TOO_WEAK =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
           "This password is too weak. It should be longer than 8 characters and sufficiently random. ");
 
   public static final Message AFFILIATION_ERROR =
       new Message(
-          MessageType.Error, 0, "Affiliation is not defined for this child-parent constellation.");
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_AFFILIATION_ERROR,
+          "Affiliation is not defined for this child-parent constellation.");
 
   public static final Message QUERY_TEMPLATE_HAS_NO_QUERY_DEFINITION =
-      new Message(MessageType.Error, 0, "This QueryTemplate has no query definition.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "This QueryTemplate has no query definition.");
 
   public static final Message QUERY_TEMPLATE_WITH_COUNT =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
           "QueryTemplates may not be defined by 'COUNT...' queries for consistency reasons.");
 
   public static final Message QUERY_TEMPLATE_WITH_SELECT =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
           "QueryTemplates may not be defined by 'SELECT... FROM...' queries for consistency reasons.");
 
   public static final Message QUERY_PARSING_ERROR =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_QUERY_PARSING_ERROR,
           "An error occured during the parsing of this query. Maybe you use a wrong syntax?");
 
   public static final Message NAME_PROPERTIES_MUST_BE_TEXT =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_NAME_PROPERTIES_MUST_BE_TEXT,
           "A property which has 'name' as its parent must have a TEXT data type.");
 
   public static final Message PARENT_DUPLICATES_WARNING =
       new Message(
           MessageType.Warning,
-          0,
+          MessageCode.MESSAGE_CODE_PARENT_DUPLICATES_WARNING,
           "This entity had parent duplicates. That is meaningless and only one parent had been inserted.");
 
   public static final Message PARENT_DUPLICATES_ERROR =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_PARENT_DUPLICATES_ERROR,
           "This entity had parent duplicates. Parent duplicates are meaningless and would be ignored (and inserted only once). But these parents had diverging inheritance instructions which cannot be processed.");
 
   public static final Message ATOMICITY_ERROR =
       new Message(
           MessageType.Error,
-          12,
+          MessageCode.MESSAGE_CODE_ATOMICITY_ERROR,
           "One or more entities are not qualified. None of them have been inserted/updated/deleted.");
 
   public static final Message NO_SUCH_ENTITY_ROLE(final String role) {
-    return new Message(MessageType.Error, 0, "There is no such role '" + role + "'.");
+    return new Message(
+        MessageType.Error,
+        MessageCode.MESSAGE_CODE_NO_SUCH_ENTITY_ROLE,
+        "There is no such role '" + role + "'.");
   }
 
   public static Message UNKNOWN_ERROR(final String requestID) {
@@ -338,78 +459,124 @@ public class ServerMessages {
               + " and include the SRID into your report.";
     }
 
-    return new Message(MessageType.Error, 500, description, body.isEmpty() ? null : body);
+    return new Message(
+        MessageType.Error,
+        MessageCode.MESSAGE_CODE_UNKNOWN,
+        description,
+        body.isEmpty() ? null : body);
   }
 
   public static final Message REQUIRED_BY_UNQUALIFIED =
       new Message(
-          MessageType.Error, 192, "This entity cannot be deleted due to dependency problems");
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_REQUIRED_BY_UNQUALIFIED,
+          "This entity cannot be deleted due to dependency problems");
 
   public static final Message ENTITY_HAS_UNQUALIFIED_REFERENCE =
-      new Message(MessageType.Error, 0, "This entity has an unqualified reference.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_ENTITY_HAS_UNQUALIFIED_REFERENCE,
+          "This entity has an unqualified reference.");
 
   public static final Message REFERENCED_ENTITY_DOES_NOT_EXIST =
-      new Message(MessageType.Error, 235, "Referenced entity does not exist.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_REFERENCED_ENTITY_DOES_NOT_EXIST,
+          "Referenced entity does not exist.");
 
   public static final Message REFERENCE_NAME_DUPLICATES =
       new Message(
-          MessageType.Error, 0, "This reference cannot be identified due to name duplicates.");
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_REFERENCE_NAME_DUPLICATES,
+          "This reference cannot be identified due to name duplicates.");
 
   public static final Message DATATYPE_INHERITANCE_AMBIGUOUS =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_DATA_TYPE_INHERITANCE_AMBIGUOUS,
           "The datatype which is to be inherited could not be detected due to divergent datatypes of at least two parents.");
 
   public static final Message DATA_TYPE_DOES_NOT_ACCEPT_COLLECTION_VALUES =
       new Message(
           MessageType.Error,
-          0,
+          MessageCode.MESSAGE_CODE_DATA_TYPE_DOES_NOT_ACCEPT_COLLECTION_VALUES,
           "This datatype does not accept collections of values (e.g. Lists).");
 
   public static final Message CANNOT_PARSE_UNIT =
-      new Message(MessageType.Error, 0, "This unit cannot be parsed.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_CANNOT_PARSE_UNIT,
+          "This unit cannot be parsed.");
 
   public static final Message SERVER_SIDE_SCRIPT_DOES_NOT_EXIST =
       new Message(
-          MessageType.Error, 404, "This server-side script does not exist. Did you install it?");
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "This server-side script does not exist. Did you install it?");
 
   public static final Message SERVER_SIDE_SCRIPT_NOT_EXECUTABLE =
-      new Message(MessageType.Error, 400, "This server-side script is not executable.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "This server-side script is not executable.");
 
   public static final Message SERVER_SIDE_SCRIPT_ERROR =
-      new Message(MessageType.Error, 500, "The invocation of this server-side script failed.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "The invocation of this server-side script failed.");
 
   public static final Message SERVER_SIDE_SCRIPT_SETUP_ERROR =
       new Message(
           MessageType.Error,
-          500,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
           "The setup routine for the server-side script failed. This might indicate a misconfiguration of the server. Please contact the administrator.");
 
   public static final Message SERVER_SIDE_SCRIPT_TIMEOUT =
-      new Message(MessageType.Error, 400, "This server-side script did not finish in time.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "This server-side script did not finish in time.");
 
   public static final Message SERVER_SIDE_SCRIPT_MISSING_CALL =
-      new Message(MessageType.Error, 400, "You must specify the `call` field.");
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "You must specify the `call` field.");
 
   public static final Message ADDITIONAL_PROPERTY =
       new Message(
           MessageType.Warning,
-          0,
+          MessageCode.MESSAGE_CODE_ADDITIONAL_PROPERTY,
           "This property is an additional property which has no corresponding property among the properties of the parents.");
 
   public static final Message PROPERTY_WITH_DATATYPE_OVERRIDE =
-      new Message(MessageType.Warning, 0, "This property overrides the datatype.");
+      new Message(
+          MessageType.Warning,
+          MessageCode.MESSAGE_CODE_PROPERTY_WITH_DATA_TYPE_OVERRIDE,
+          "This property overrides the datatype.");
 
   public static final Message PROPERTY_WITH_DESC_OVERRIDE =
-      new Message(MessageType.Warning, 0, "This property overrides the description.");
+      new Message(
+          MessageType.Warning,
+          MessageCode.MESSAGE_CODE_PROPERTY_WITH_DESCRIPTION_OVERRIDE,
+          "This property overrides the description.");
 
   public static final Message PROPERTY_WITH_NAME_OVERRIDE =
-      new Message(MessageType.Warning, 0, "This property overrides the name.");
+      new Message(
+          MessageType.Warning,
+          MessageCode.MESSAGE_CODE_PROPERTY_WITH_NAME_OVERRIDE,
+          "This property overrides the name.");
 
   public static final Message INTEGER_OUT_OF_RANGE =
       new Message(
           MessageType.Error,
-          MessageCode.MESSAGE_CODE_INTEGER_VALUE_OUT_OF_RANGE_VALUE,
+          MessageCode.MESSAGE_CODE_INTEGER_VALUE_OUT_OF_RANGE,
           "The integer value is out of range. This server only supports signed 32 bit integers.");
+
+  public static final Message ERROR_INTEGRITY_VIOLATION =
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_INTEGRITY_VIOLOATION,
+          "This entity caused an unexpected integrity violation. This is a strong indicator for a server bug. Please report.");
 }