diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java b/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java
index 91843299a881659f96bc79a9d4938c7d9a7735df..af3ba15a6152141350b4a2f5109d7ce606ec5259 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java
@@ -15,7 +15,7 @@ import org.caosdb.server.utils.ServerMessages;
  *
  * @author Timm Fitschen (t.fitschen@indiscale.com)
  */
-@JobAnnotation(time = JobExecutionTime.CHECK, transaction = WriteTransaction.class)
+@JobAnnotation(time = JobExecutionTime.POST_CHECK, transaction = WriteTransaction.class)
 public class CheckStateTransition extends EntityStateJob {
 
   private static final Message TRANSITION_NOT_ALLOWED =
diff --git a/src/main/java/org/caosdb/server/jobs/core/InheritInitialState.java b/src/main/java/org/caosdb/server/jobs/core/InheritInitialState.java
new file mode 100644
index 0000000000000000000000000000000000000000..e21d76c9e5e5f356026cb94d8d8a5f098caeaa8e
--- /dev/null
+++ b/src/main/java/org/caosdb/server/jobs/core/InheritInitialState.java
@@ -0,0 +1,34 @@
+package org.caosdb.server.jobs.core;
+
+import java.util.List;
+import org.caosdb.server.entity.Message;
+import org.caosdb.server.entity.wrapper.Parent;
+import org.caosdb.server.entity.wrapper.Property;
+import org.caosdb.server.jobs.JobAnnotation;
+import org.caosdb.server.jobs.JobExecutionTime;
+
+@JobAnnotation(time = JobExecutionTime.CHECK)
+public class InheritInitialState extends EntityStateJob {
+
+  @Override
+  protected void run() {
+    try {
+      State parentState = getFirstParentState();
+      if (parentState != null) {
+        getEntity().addMessage(parentState);
+      }
+    } catch (Message e) {
+      getEntity().addError(e);
+    }
+  }
+
+  private State getFirstParentState() throws Message {
+    for (Parent par : getEntity().getParents()) {
+      List<Property> stateProperties = getStateProperties(par, false);
+      if (stateProperties.size() > 0) {
+        return createState(stateProperties.get(0));
+      }
+    }
+    return null;
+  }
+}
diff --git a/src/main/java/org/caosdb/server/jobs/core/InitEntityStateJobs.java b/src/main/java/org/caosdb/server/jobs/core/InitEntityStateJobs.java
index e4a32bc5f8f2bd3b7e11363f07992a9ceb3b16ef..5dec5d492a10f8e48a1c9877145c94e6db8b1534 100644
--- a/src/main/java/org/caosdb/server/jobs/core/InitEntityStateJobs.java
+++ b/src/main/java/org/caosdb/server/jobs/core/InitEntityStateJobs.java
@@ -7,8 +7,10 @@ import org.caosdb.server.CaosDBServer;
 import org.caosdb.server.entity.ClientMessage;
 import org.caosdb.server.entity.Entity;
 import org.caosdb.server.entity.EntityInterface;
+import org.caosdb.server.entity.InsertEntity;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.Message.MessageType;
+import org.caosdb.server.entity.Role;
 import org.caosdb.server.entity.UpdateEntity;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.jobs.JobAnnotation;
@@ -43,6 +45,13 @@ public class InitEntityStateJobs extends EntityStateJob implements Observer {
         appendJob(CheckStateTransition.class);
         appendJob(MakeStateProperty.class);
         appendJob(MakeStateMessage.class);
+      } else if (newState == null
+          && getEntity().getRole() == Role.Record
+          && getEntity() instanceof InsertEntity) {
+        appendJob(InheritInitialState.class);
+        appendJob(CheckStateTransition.class);
+        appendJob(MakeStateProperty.class);
+        appendJob(MakeStateMessage.class);
       }
     }
   }
diff --git a/src/main/java/org/caosdb/server/jobs/core/MakeStateMessage.java b/src/main/java/org/caosdb/server/jobs/core/MakeStateMessage.java
index f2090d8245bc07bb40965562c93adc4ee71185c8..f47c1157cc529832175593bb1d56262557e88dc2 100644
--- a/src/main/java/org/caosdb/server/jobs/core/MakeStateMessage.java
+++ b/src/main/java/org/caosdb/server/jobs/core/MakeStateMessage.java
@@ -1,6 +1,7 @@
 package org.caosdb.server.jobs.core;
 
 import java.util.List;
+import java.util.Map;
 import org.caosdb.server.CaosDBServer;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.wrapper.Property;
@@ -36,26 +37,19 @@ public class MakeStateMessage extends EntityStateJob {
         List<Property> stateProperties = getStateProperties(true);
 
         // only add the State during Retrieve. In all other cases, the State is already present.
-        if (stateProperties != null && getTransaction() instanceof Retrieve) {
-          String sparse =
-              getTransaction().getContainer().getFlags().getOrDefault(SPARSE_FLAG, "false");
-          if ("true".equals(sparse)) {
+        if (stateProperties != null
+            && stateProperties.size() > 0
+            && getTransaction() instanceof Retrieve) {
+          if (isSparse()) {
             for (Property s : stateProperties) {
-              getEntity()
-                  .addMessage(
-                      new ToElementable() {
-                        @Override
-                        public void addToElement(Element ret) {
-                          Element state = new Element(STATE_XML_TAG);
-                          state.setAttribute(STATE_ATTRIBUTE_ID, s.getValue().toString());
-                          ret.addContent(state);
-                        }
-                      });
+              getEntity().addMessage(getSparseStateMessage(s));
             }
           } else {
             for (Property s : stateProperties) {
               State stateMessage = createState(s);
-              stateMessage.getStateModel();
+              stateMessage
+                  .getStateModel(); // trigger retrieval of state model because when the XML Writer
+              // calls the addToElement method, it is to late.
               getEntity().addMessage(stateMessage);
             }
           }
@@ -65,4 +59,23 @@ public class MakeStateMessage extends EntityStateJob {
       }
     }
   }
+
+  private ToElementable getSparseStateMessage(Property s) {
+    return new ToElementable() {
+      @Override
+      public void addToElement(Element ret) {
+        Element state = new Element(STATE_XML_TAG);
+        state.setAttribute(STATE_ATTRIBUTE_ID, s.getValue().toString());
+        ret.addContent(state);
+      }
+    };
+  }
+
+  private boolean isSparse() {
+    Map<String, String> flags = getTransaction().getContainer().getFlags();
+    if (flags != null) {
+      return "true".equals(flags.getOrDefault(SPARSE_FLAG, "false"));
+    }
+    return false;
+  }
 }