diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java
index e1acfbdc1cecf7eeb54f778be01d79ffc9b2cb53..843449ce833cdf4634435204ed33e9af59c0529f 100644
--- a/src/main/java/org/caosdb/server/entity/Entity.java
+++ b/src/main/java/org/caosdb/server/entity/Entity.java
@@ -47,7 +47,6 @@ import org.caosdb.server.datatype.Value;
 import org.caosdb.server.entity.Message.MessageType;
 import org.caosdb.server.entity.container.ParentContainer;
 import org.caosdb.server.entity.container.PropertyContainer;
-import org.caosdb.server.entity.wrapper.Domain;
 import org.caosdb.server.entity.wrapper.Parent;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.entity.xml.EntityToElementStrategy;
@@ -849,23 +848,6 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
     }
   }
 
-  @Override
-  public void setReplacement(final Domain d) {
-    this.replacement = d;
-  }
-
-  @Override
-  public boolean hasReplacement() {
-    return this.replacement != null;
-  }
-
-  @Override
-  public Domain getReplacement() {
-    return this.replacement;
-  }
-
-  private Domain replacement = null;
-
   private final HashMap<String, String> flags = new HashMap<String, String>();
 
   @Override
diff --git a/src/main/java/org/caosdb/server/entity/EntityInterface.java b/src/main/java/org/caosdb/server/entity/EntityInterface.java
index f967b307a1ea13a16d7e9225cb038a15f6883727..d97970ded1cea441c833922ee131e4bdd2cbc97a 100644
--- a/src/main/java/org/caosdb/server/entity/EntityInterface.java
+++ b/src/main/java/org/caosdb/server/entity/EntityInterface.java
@@ -31,7 +31,6 @@ import org.caosdb.server.datatype.AbstractDatatype;
 import org.caosdb.server.datatype.Value;
 import org.caosdb.server.entity.container.ParentContainer;
 import org.caosdb.server.entity.container.PropertyContainer;
-import org.caosdb.server.entity.wrapper.Domain;
 import org.caosdb.server.entity.wrapper.Parent;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.entity.xml.SerializeFieldStrategy;
@@ -127,12 +126,6 @@ public interface EntityInterface
 
   public abstract void setProperties(PropertyContainer properties);
 
-  public abstract void setReplacement(Domain d);
-
-  public abstract boolean hasReplacement();
-
-  public abstract Domain getReplacement();
-
   public abstract EntityInterface setDescOverride(boolean b);
 
   public abstract boolean isDescOverride();
diff --git a/src/main/java/org/caosdb/server/entity/wrapper/Domain.java b/src/main/java/org/caosdb/server/entity/wrapper/Domain.java
deleted file mode 100644
index 146706efd2caa74ff1399568bf499f37683bfdbe..0000000000000000000000000000000000000000
--- a/src/main/java/org/caosdb/server/entity/wrapper/Domain.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * ** header v3.0
- * This file is a part of the CaosDB Project.
- *
- * Copyright (C) 2018 Research Group Biomedical Physics,
- * Max-Planck-Institute for Dynamics and Self-Organization Göttingen
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- * ** end header
- */
-package org.caosdb.server.entity.wrapper;
-
-import org.caosdb.server.datatype.AbstractDatatype;
-import org.caosdb.server.datatype.Value;
-import org.caosdb.server.entity.Entity;
-import org.caosdb.server.entity.EntityInterface;
-import org.caosdb.server.entity.Role;
-import org.caosdb.server.entity.container.PropertyContainer;
-
-public class Domain extends Entity {
-
-  private boolean descO;
-
-  public Domain(
-      final PropertyContainer properties,
-      final AbstractDatatype datatype,
-      final Value value,
-      final org.caosdb.server.entity.StatementStatus statementStatus) {
-
-    setRole(Role.Domain);
-    setProperties(properties);
-    setDatatype(datatype);
-    setValue(value);
-    setStatementStatus(statementStatus);
-  }
-
-  @Override
-  public EntityInterface setDescOverride(final boolean b) {
-    this.descO = b;
-    return this;
-  }
-
-  @Override
-  public boolean isDescOverride() {
-    return this.descO;
-  }
-}
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 7da945738ac966114a020098171c049a6fa387a3..f23408df30fb9f56c72a0f319f7b4b7a52e8214e 100644
--- a/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java
+++ b/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java
@@ -376,21 +376,6 @@ public abstract class EntityWrapper implements EntityInterface {
     this.entity.setProperties(properties);
   }
 
-  @Override
-  public void setReplacement(final Domain d) {
-    this.entity.setReplacement(d);
-  }
-
-  @Override
-  public boolean hasReplacement() {
-    return this.entity.hasReplacement();
-  }
-
-  @Override
-  public Domain getReplacement() {
-    return this.entity.getReplacement();
-  }
-
   @Override
   public Map<String, String> getFlags() {
     return this.entity.getFlags();
diff --git a/src/test/java/org/caosdb/server/database/InsertTest.java b/src/test/java/org/caosdb/server/database/InsertTest.java
index e385d6cb2038496b5c90715347cd34e88b8c60c8..0484e623d914cd29b8a4527bbec9ec200e12af7f 100644
--- a/src/test/java/org/caosdb/server/database/InsertTest.java
+++ b/src/test/java/org/caosdb/server/database/InsertTest.java
@@ -31,6 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.LinkedList;
+import java.util.List;
 import org.caosdb.server.datatype.CollectionValue;
 import org.caosdb.server.datatype.GenericValue;
 import org.caosdb.server.datatype.ReferenceValue;
@@ -154,7 +155,7 @@ public class InsertTest {
     assertEquals("V4", ((SingleValue) stage1Inserts.get(2).getValue()).toDatabaseString());
 
     assertTrue(stage1Inserts.get(3) instanceof Replacement);
-    assertEquals(5, stage1Inserts.get(3).getId().toInteger());
+    assertEquals(-1, stage1Inserts.get(3).getId().toInteger());
     assertEquals("V5", ((SingleValue) stage1Inserts.get(3).getValue()).toDatabaseString());
 
     assertFalse(stage1Inserts.get(4) instanceof Replacement);
@@ -162,11 +163,11 @@ public class InsertTest {
     assertEquals("V7", ((SingleValue) stage1Inserts.get(4).getValue()).toDatabaseString());
 
     assertTrue(stage1Inserts.get(5) instanceof Replacement);
-    assertEquals(8, stage1Inserts.get(5).getId().toInteger());
+    assertEquals(-2, stage1Inserts.get(5).getId().toInteger());
     assertEquals("V8", ((SingleValue) stage1Inserts.get(5).getValue()).toDatabaseString());
 
     assertTrue(stage1Inserts.get(6) instanceof Replacement);
-    assertEquals(9, stage1Inserts.get(6).getId().toInteger());
+    assertEquals(-3, stage1Inserts.get(6).getId().toInteger());
     assertEquals("V9", ((SingleValue) stage1Inserts.get(6).getValue()).toDatabaseString());
 
     assertEquals(6, stage2Inserts.size());
@@ -239,7 +240,7 @@ public class InsertTest {
 
     assertTrue(stage1Inserts.get(1) instanceof Replacement);
     assertEquals("V1-2", ((SingleValue) stage1Inserts.get(1).getValue()).toDatabaseString());
-    assertEquals(new EntityID(1), stage1Inserts.get(1).getId());
+    assertEquals(new EntityID(-1), stage1Inserts.get(1).getId());
 
     assertFalse(stage1Inserts.get(2) instanceof Replacement);
     assertEquals(new EntityID(-1), stage1Inserts.get(2).getId());
@@ -294,7 +295,7 @@ public class InsertTest {
 
     assertEquals(4, stage1Inserts.size());
     assertTrue(stage1Inserts.get(0) instanceof Replacement);
-    assertEquals(new EntityID(1), stage1Inserts.get(0).getId());
+    assertEquals(new EntityID(-1), stage1Inserts.get(0).getId());
     assertEquals(null, stage1Inserts.get(0).getValue());
 
     assertFalse(stage1Inserts.get(1) instanceof Replacement);
@@ -359,11 +360,10 @@ public class InsertTest {
 
     assertFalse(stage1Inserts.get(0) instanceof Replacement);
     assertEquals(new EntityID(1), stage1Inserts.get(0).getId());
-    assertFalse(stage1Inserts.get(0).hasReplacement());
     assertEquals("V1", ((SingleValue) stage1Inserts.get(0).getValue()).toDatabaseString());
 
     assertTrue(stage1Inserts.get(1) instanceof Replacement);
-    assertEquals(new EntityID(2), stage1Inserts.get(1).getId());
+    assertEquals(new EntityID(-1), stage1Inserts.get(1).getId());
     assertTrue(stage1Inserts.get(1).getValue() instanceof CollectionValue);
 
     assertFalse(stage1Inserts.get(2) instanceof Replacement);
@@ -376,4 +376,128 @@ public class InsertTest {
 
     assertEquals(0, stage2Inserts.size());
   }
+
+  /** Deeply nested properties without any values, with overridden name and description */
+  @Test
+  public void testTransformation5() {
+    final Entity r = new InsertEntity("Test", Role.RecordType);
+    final Property p1 = new Property(new RetrieveEntity(new EntityID(1)));
+    p1.setRole("Property");
+    p1.setDatatype("TEXT");
+    p1.setDescription("desc1");
+    p1.setDescOverride(true);
+    p1.setName("P1");
+    p1.setNameOverride(true);
+    p1.setStatementStatus(StatementStatus.RECOMMENDED);
+    r.addProperty(p1);
+
+    final Property p2 = new Property(new RetrieveEntity(new EntityID(2)));
+    p2.setRole("Property");
+    p2.setDatatype("TEXT");
+    p2.setDescription("desc2");
+    p2.setDescOverride(true);
+    p2.setName("P2");
+    p2.setNameOverride(true);
+    p2.setStatementStatus(StatementStatus.RECOMMENDED);
+    r.addProperty(p2);
+
+    final Property p21 = new Property(new RetrieveEntity(new EntityID(1)));
+    p21.setRole("Property");
+    p21.setDatatype("TEXT");
+    p21.setDescription("desc21");
+    p21.setDescOverride(true);
+    p21.setName("P21");
+    p21.setNameOverride(true);
+    p21.setStatementStatus(StatementStatus.FIX);
+    p2.addProperty(p21);
+
+    final Property p22 = new Property(new RetrieveEntity(new EntityID(2)));
+    p22.setRole("Property");
+    p22.setDatatype("TEXT");
+    p22.setDescription("desc22");
+    p22.setDescOverride(true);
+    p22.setName("P22");
+    p22.setNameOverride(true);
+    p22.setStatementStatus(StatementStatus.FIX);
+    p2.addProperty(p22);
+
+    final Property p3 = new Property(new RetrieveEntity(new EntityID(3)));
+    p3.setRole("Property");
+    p3.setDatatype("TEXT");
+    p3.setDescription("desc3");
+    p3.setDescOverride(true);
+    p3.setName("P3");
+    p3.setNameOverride(true);
+    p3.setStatementStatus(StatementStatus.RECOMMENDED);
+    r.addProperty(p3);
+
+    final Property p31 = new Property(new RetrieveEntity(new EntityID(1)));
+    p31.setRole("Property");
+    p31.setDatatype("TEXT");
+    p31.setDescription("desc31");
+    p31.setDescOverride(true);
+    p31.setName("P31");
+    p31.setNameOverride(true);
+    p31.setStatementStatus(StatementStatus.FIX);
+    p3.addProperty(p31);
+
+    final Property p32 = new Property(new RetrieveEntity(new EntityID(2)));
+    p32.setRole("Property");
+    p32.setDatatype("TEXT");
+    p32.setDescription("desc32");
+    p32.setDescOverride(true);
+    p32.setName("P32");
+    p32.setNameOverride(true);
+    p32.setStatementStatus(StatementStatus.FIX);
+    p3.addProperty(p32);
+
+    final Property p321 = new Property(new RetrieveEntity(new EntityID(1)));
+    p321.setRole("Property");
+    p321.setDatatype("TEXT");
+    p321.setDescription("desc321");
+    p321.setDescOverride(true);
+    p321.setName("P321");
+    p321.setNameOverride(true);
+    p321.setStatementStatus(StatementStatus.FIX);
+    p32.addProperty(p321);
+
+    final Property p322 = new Property(new RetrieveEntity(new EntityID(2)));
+    p322.setRole("Property");
+    p322.setDatatype("TEXT");
+    p322.setDescription("desc322");
+    p322.setDescOverride(true);
+    p322.setName("P322");
+    p322.setNameOverride(true);
+    p322.setStatementStatus(StatementStatus.FIX);
+    p32.addProperty(p322);
+
+    final Property p323 = new Property(new RetrieveEntity(new EntityID(3)));
+    p323.setRole("Property");
+    p323.setDatatype("TEXT");
+    p323.setDescription("desc323");
+    p323.setDescOverride(true);
+    p323.setName("P323");
+    p323.setNameOverride(true);
+    p323.setStatementStatus(StatementStatus.FIX);
+    p32.addProperty(p323);
+
+    final Property p33 = new Property(new RetrieveEntity(new EntityID(3)));
+    p33.setRole("Property");
+    p33.setDatatype("TEXT");
+    p33.setDescription("desc33");
+    p33.setDescOverride(true);
+    p33.setName("P33");
+    p33.setNameOverride(true);
+    p33.setStatementStatus(StatementStatus.FIX);
+    p3.addProperty(p33);
+
+    List<Property> stage1Inserts = new LinkedList<>();
+    List<Property> stage2Inserts = new LinkedList<>();
+    int c = DatabaseUtils.deriveStage1Inserts(stage1Inserts, r);
+    DatabaseUtils.deriveStage2Inserts(stage2Inserts, stage1Inserts, registerReplacementIds(c), r);
+
+    assertEquals(4, c);
+    assertEquals(7, stage1Inserts.size());
+    assertEquals(8, stage2Inserts.size());
+  }
 }
diff --git a/src/test/java/org/caosdb/server/database/InsertTest2.java b/src/test/java/org/caosdb/server/database/InsertTest2.java
deleted file mode 100644
index 58cc58503dbef7e8ee1c300d67888f4d2ff37a7a..0000000000000000000000000000000000000000
--- a/src/test/java/org/caosdb/server/database/InsertTest2.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package org.caosdb.server.database;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.LinkedList;
-import java.util.List;
-import org.caosdb.server.entity.Entity;
-import org.caosdb.server.entity.EntityID;
-import org.caosdb.server.entity.InsertEntity;
-import org.caosdb.server.entity.RetrieveEntity;
-import org.caosdb.server.entity.Role;
-import org.caosdb.server.entity.StatementStatus;
-import org.caosdb.server.entity.wrapper.Property;
-import org.junit.jupiter.api.Test;
-
-public class InsertTest2 {
-
-  private Deque<EntityID> registerReplacementIds(int count) {
-    Deque<EntityID> replacementIds = new ArrayDeque<>();
-    for (int i = 1; i < count + 1; i++) {
-      replacementIds.add(new EntityID(-i));
-    }
-    return replacementIds;
-  }
-
-  @Test
-  public void transformation5() {
-    final Entity r = new InsertEntity("Test", Role.RecordType);
-    final Property p1 = new Property(new RetrieveEntity(new EntityID(1)));
-    p1.setRole("Property");
-    p1.setDatatype("TEXT");
-    p1.setDescription("desc1");
-    p1.setDescOverride(true);
-    p1.setName("P1");
-    p1.setNameOverride(true);
-    p1.setStatementStatus(StatementStatus.RECOMMENDED);
-    r.addProperty(p1);
-
-    final Property p2 = new Property(new RetrieveEntity(new EntityID(2)));
-    p2.setRole("Property");
-    p2.setDatatype("TEXT");
-    p2.setDescription("desc2");
-    p2.setDescOverride(true);
-    p2.setName("P2");
-    p2.setNameOverride(true);
-    p2.setStatementStatus(StatementStatus.RECOMMENDED);
-    r.addProperty(p2);
-
-    final Property p21 = new Property(new RetrieveEntity(new EntityID(1)));
-    p21.setRole("Property");
-    p21.setDatatype("TEXT");
-    p21.setDescription("desc21");
-    p21.setDescOverride(true);
-    p21.setName("P21");
-    p21.setNameOverride(true);
-    p21.setStatementStatus(StatementStatus.RECOMMENDED);
-    p2.addProperty(p21);
-
-    final Property p22 = new Property(new RetrieveEntity(new EntityID(2)));
-    p22.setRole("Property");
-    p22.setDatatype("TEXT");
-    p22.setDescription("desc22");
-    p22.setDescOverride(true);
-    p22.setName("P22");
-    p22.setNameOverride(true);
-    p22.setStatementStatus(StatementStatus.RECOMMENDED);
-    p2.addProperty(p22);
-
-    final Property p3 = new Property(new RetrieveEntity(new EntityID(3)));
-    p3.setRole("Property");
-    p3.setDatatype("TEXT");
-    p3.setDescription("desc3");
-    p3.setDescOverride(true);
-    p3.setName("P3");
-    p3.setNameOverride(true);
-    p3.setStatementStatus(StatementStatus.RECOMMENDED);
-    r.addProperty(p3);
-
-    final Property p31 = new Property(new RetrieveEntity(new EntityID(1)));
-    p31.setRole("Property");
-    p31.setDatatype("TEXT");
-    p31.setDescription("desc31");
-    p31.setDescOverride(true);
-    p31.setName("P31");
-    p31.setNameOverride(true);
-    p31.setStatementStatus(StatementStatus.RECOMMENDED);
-    p3.addProperty(p31);
-
-    final Property p32 = new Property(new RetrieveEntity(new EntityID(2)));
-    p32.setRole("Property");
-    p32.setDatatype("TEXT");
-    p32.setDescription("desc32");
-    p32.setDescOverride(true);
-    p32.setName("P32");
-    p32.setNameOverride(true);
-    p32.setStatementStatus(StatementStatus.RECOMMENDED);
-    p3.addProperty(p32);
-
-    final Property p321 = new Property(new RetrieveEntity(new EntityID(1)));
-    p321.setRole("Property");
-    p321.setDatatype("TEXT");
-    p321.setDescription("desc321");
-    p321.setDescOverride(true);
-    p321.setName("P321");
-    p321.setNameOverride(true);
-    p321.setStatementStatus(StatementStatus.RECOMMENDED);
-    p32.addProperty(p321);
-
-    final Property p322 = new Property(new RetrieveEntity(new EntityID(2)));
-    p322.setRole("Property");
-    p322.setDatatype("TEXT");
-    p322.setDescription("desc322");
-    p322.setDescOverride(true);
-    p322.setName("P322");
-    p322.setNameOverride(true);
-    p322.setStatementStatus(StatementStatus.RECOMMENDED);
-    p32.addProperty(p322);
-
-    final Property p323 = new Property(new RetrieveEntity(new EntityID(3)));
-    p323.setRole("Property");
-    p323.setDatatype("TEXT");
-    p323.setDescription("desc323");
-    p323.setDescOverride(true);
-    p323.setName("P323");
-    p323.setNameOverride(true);
-    p323.setStatementStatus(StatementStatus.RECOMMENDED);
-    p32.addProperty(p323);
-
-    final Property p33 = new Property(new RetrieveEntity(new EntityID(3)));
-    p33.setRole("Property");
-    p33.setDatatype("TEXT");
-    p33.setDescription("desc33");
-    p33.setDescOverride(true);
-    p33.setName("P33");
-    p33.setNameOverride(true);
-    p33.setStatementStatus(StatementStatus.RECOMMENDED);
-    p3.addProperty(p33);
-
-    List<Property> stage1Inserts = new LinkedList<>();
-    List<Property> stage2Inserts = new LinkedList<>();
-    int c = DatabaseUtils.deriveStage1Inserts(stage1Inserts, r);
-    DatabaseUtils.deriveStage2Inserts(stage2Inserts, stage1Inserts, registerReplacementIds(c), r);
-    assertEquals(7, stage1Inserts.size());
-    assertEquals(8, stage2Inserts.size());
-  }
-}