diff --git a/src/main/java/org/caosdb/server/database/DatabaseUtils.java b/src/main/java/org/caosdb/server/database/DatabaseUtils.java
index d5910eb9a93003106369f87f50bec1c0013a61bf..4f6a58a4fc50fa91170fad6139384bccb413fa81 100644
--- a/src/main/java/org/caosdb/server/database/DatabaseUtils.java
+++ b/src/main/java/org/caosdb/server/database/DatabaseUtils.java
@@ -216,10 +216,7 @@ public class DatabaseUtils {
     ret.fileSize = rs.getLong("FileSize");
     ret.fileHash = bytes2UTF8(rs.getBytes("FileHash"));
 
-    ret.version = bytes2UTF8(rs.getBytes("Version"));
-    ret.versionSeconds = rs.getLong("VersionSeconds");
-    ret.versionNanos = rs.getInt("VersionNanos");
-
+    ret.versionId = bytes2UTF8(rs.getBytes("Version"));
     return ret;
   }
 
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertSparseEntity.java
index 1f1f32c69a260d374ea930ba4e1be63e34cf9ca9..1b945acf566db938f12847f758636dbfddeac3d1 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertSparseEntity.java
@@ -57,7 +57,7 @@ public class MySQLInsertSparseEntity extends MySQLTransaction implements InsertS
       try (final ResultSet rs = insertEntityStmt.executeQuery()) {
         if (rs.next()) {
           entity.id = rs.getInt("EntityID");
-          entity.version = DatabaseUtils.bytes2UTF8(rs.getBytes("Version"));
+          entity.versionId = DatabaseUtils.bytes2UTF8(rs.getBytes("Version"));
         } else {
           throw new TransactionException("Didn't get new EntityID back.");
         }
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java
index a3c87ae6e97d3b26a99126b61d1d29db1ef6206a..7ecfbfb7ac70a4a5ec248eb0e2be2c590f0676aa 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java
@@ -61,12 +61,16 @@ public class MySQLRetrieveVersionHistory extends MySQLTransaction
         String parentId = DatabaseUtils.bytes2UTF8(rs.getBytes("parent"));
         Long childSeconds = rs.getLong("child_seconds");
         Integer childNanos = rs.getInt("child_nanos");
+        String childUsername = DatabaseUtils.bytes2UTF8(rs.getBytes("child_username"));
+        String childRealm = DatabaseUtils.bytes2UTF8(rs.getBytes("child_realm"));
         VersionHistoryItem v = result.get(childId);
         if (v == null) {
           v = new VersionHistoryItem();
           v.id = childId;
           v.seconds = childSeconds;
           v.nanos = childNanos;
+          v.username = childUsername;
+          v.realm = childRealm;
           result.put(childId, v);
         }
 
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java
index 18b59ef9121bd2f488efcb657a3bf158b6e14308..1c8039253b4c5e74a8054dfa937fec23c55440e8 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java
@@ -80,7 +80,7 @@ public class MySQLUpdateSparseEntity extends MySQLTransaction implements UpdateS
       ResultSet rs = updateEntityStmt.executeQuery();
 
       if (rs.next()) {
-        spe.version = DatabaseUtils.bytes2UTF8(rs.getBytes("Version"));
+        spe.versionId = DatabaseUtils.bytes2UTF8(rs.getBytes("Version"));
       }
 
     } catch (final SQLIntegrityConstraintViolationException e) {
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 1800168ebd2cd6ef4180e23046f95066597086e5..7e95d1c2012d00df0e6081583d21dc718fc65e12 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
@@ -69,6 +69,6 @@ public class InsertSparseEntity extends BackendTransaction {
               public void cleanUp() {}
             });
     this.entity.setId(e.id);
-    this.entity.setVersion(new Version(e.version));
+    this.entity.setVersion(new Version(e.versionId));
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveTransactionHistory.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveTransactionHistory.java
index 632ce20cfe71d0e116bbe3987a60c45b11085eec..d013b296ba5fe4a747a07af448b167f225a9166f 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveTransactionHistory.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveTransactionHistory.java
@@ -1,59 +1,59 @@
 /*
- * ** header v3.0
- * This file is a part of the CaosDB Project.
+ * ** 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
- * Copyright (C) 2019 IndiScale GmbH
- * Copyright (C) 2019 Timm Fitschen (t.fitschen@indiscale.com)
+ * Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
+ * Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
  *
- * 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 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.
+ * 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/>.
+ * 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.database.backend.transaction;
 
-import java.util.ArrayList;
+import java.util.HashMap;
 import org.caosdb.datetime.UTCDateTime;
-import org.caosdb.server.database.BackendTransaction;
-import org.caosdb.server.database.backend.interfaces.RetrieveTransactionHistoryImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
-import org.caosdb.server.database.proto.ProtoTransactionLogMessage;
+import org.caosdb.server.database.proto.VersionHistoryItem;
 import org.caosdb.server.entity.EntityInterface;
-import org.caosdb.server.utils.TransactionLogMessage;
+import org.caosdb.server.entity.Version;
 
-public class RetrieveTransactionHistory extends BackendTransaction {
+public class RetrieveTransactionHistory extends RetrieveVersionHistory {
 
-  private final EntityInterface entity;
-
-  public RetrieveTransactionHistory(final EntityInterface entity) {
-    this.entity = entity;
+  public RetrieveTransactionHistory(EntityInterface e) {
+    super(e);
   }
 
   @Override
-  protected void execute() {
-    final RetrieveTransactionHistoryImpl t =
-        getImplementation(RetrieveTransactionHistoryImpl.class);
-    process(t.execute(entity.getId()));
+  protected void process(HashMap<String, VersionHistoryItem> map) throws TransactionException {
+    super.process(map);
+    if (!map.isEmpty()) getEntity().setVersion(getHistory());
   }
 
-  private void process(final ArrayList<ProtoTransactionLogMessage> l) throws TransactionException {
-    for (final ProtoTransactionLogMessage t : l) {
-      final UTCDateTime dateTime = UTCDateTime.UTCSeconds(t.seconds, t.nanos);
-
-      this.entity.addTransactionLog(
-          new TransactionLogMessage(t.transaction, this.entity, t.username, dateTime));
+  @Override
+  protected Version getVersion(String id) {
+    Version v = new Version(id);
+    VersionHistoryItem i = getHistoryItems().get(v.getId());
+    if (i != null) {
+      v.setDate(UTCDateTime.UTCSeconds(i.seconds, i.nanos));
+      v.setUsername(i.username);
+      v.setRealm(i.realm);
     }
+    return v;
+  }
+
+  private Version getHistory() {
+    Version v = getVersion(getEntity().getVersion().getId());
+    v.setSuccessors(getSuccessors(v.getId(), true));
+    v.setPredecessors(getPredecessors(v.getId(), true));
+    return v;
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionHistory.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionHistory.java
index 6077d6491fda93b96262b48783092578af37f4f8..53ff3a0858616a0915639cf1dd29a707d55e5eca 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionHistory.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionHistory.java
@@ -22,29 +22,34 @@
  */
 package org.caosdb.server.database.backend.transaction;
 
-import java.util.Collection;
 import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import org.apache.commons.jcs.access.behavior.ICacheAccess;
+import org.caosdb.server.caching.Cache;
 import org.caosdb.server.database.CacheableBackendTransaction;
 import org.caosdb.server.database.backend.interfaces.RetrieveVersionHistoryImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.VersionHistoryItem;
 import org.caosdb.server.entity.EntityInterface;
+import org.caosdb.server.entity.Version;
 
 public abstract class RetrieveVersionHistory
     extends CacheableBackendTransaction<Integer, HashMap<String, VersionHistoryItem>> {
 
-  // TODO
-  // private static final ICacheAccess<String, Version> cache =
-  // Cache.getCache("BACKEND_RetrieveVersionHistory");
+  private static final ICacheAccess<Integer, HashMap<String, VersionHistoryItem>> cache =
+      Cache.getCache("BACKEND_RetrieveVersionHistory");
   private EntityInterface entity;
-  private HashMap<String, VersionHistoryItem> map;
+
+  /** A map of all history items which belong to this entity. The keys are the version ids. */
+  private HashMap<String, VersionHistoryItem> historyItems;
 
   public static void removeCached(Integer entityId) {
-    // TODO
+    cache.remove(entityId);
   }
 
   public RetrieveVersionHistory(EntityInterface e) {
-    super(null); // TODO caching
+    super(cache);
     this.entity = e;
   }
 
@@ -57,7 +62,7 @@ public abstract class RetrieveVersionHistory
   /** After this method call, the version map is available to the object. */
   @Override
   protected void process(HashMap<String, VersionHistoryItem> map) throws TransactionException {
-    this.map = map;
+    this.historyItems = map;
   }
 
   @Override
@@ -65,15 +70,48 @@ public abstract class RetrieveVersionHistory
     return entity.getId();
   }
 
-  public HashMap<String, VersionHistoryItem> getMap() {
-    return this.map;
+  public HashMap<String, VersionHistoryItem> getHistoryItems() {
+    return this.historyItems;
   }
 
   public EntityInterface getEntity() {
     return this.entity;
   }
 
-  public Collection<VersionHistoryItem> getList() {
-    return this.map.values();
+  /** Return a list of direct predecessors which have their direct predecessors attached */
+  protected List<Version> getPredecessors(String id, boolean transitive) {
+    LinkedList<Version> result = new LinkedList<>();
+    if (getHistoryItems().containsKey(id) && getHistoryItems().get(id).parents != null)
+      for (String p : getHistoryItems().get(id).parents) {
+        Version predecessor = getVersion(p);
+        if (transitive) {
+          predecessor.setPredecessors(getPredecessors(p, transitive));
+        }
+        result.add(predecessor);
+      }
+    return result;
+  }
+
+  protected abstract Version getVersion(String version);
+
+  /** Return a list of direct successors which have their direct successors attached */
+  protected List<Version> getSuccessors(String id, boolean transitive) {
+    LinkedList<Version> result = new LinkedList<>();
+
+    outer:
+    for (VersionHistoryItem i : getHistoryItems().values()) {
+      if (i.parents != null)
+        for (String p : i.parents) {
+          if (id.equals(p)) {
+            Version successor = getVersion(i.id);
+            result.add(successor);
+            if (transitive) {
+              successor.setSuccessors(getSuccessors(i.id, transitive));
+            }
+            continue outer;
+          }
+        }
+    }
+    return result;
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java
index 7d9fe5fd7ea42cf3d6aa29a127a7f82f7ec1764c..e2218b1dc1190bc07796b462c0d7f2b5dab54538 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java
@@ -23,8 +23,6 @@
 package org.caosdb.server.database.backend.transaction;
 
 import java.util.HashMap;
-import java.util.LinkedList;
-import org.caosdb.datetime.UTCDateTime;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.VersionHistoryItem;
 import org.caosdb.server.entity.EntityInterface;
@@ -39,46 +37,18 @@ public class RetrieveVersionInfo extends RetrieveVersionHistory {
   @Override
   protected void process(HashMap<String, VersionHistoryItem> map) throws TransactionException {
     super.process(map); // Make the map available to the object.
-    if (!map.isEmpty()) getVersion();
+    if (!map.isEmpty()) getEntity().setVersion(getVersion());
   }
 
-  public Version getVersion() {
-    Version v = getEntity().getVersion();
-    VersionHistoryItem i = getMap().get(v.getId());
-    if (i != null) v.setDate(UTCDateTime.UTCSeconds(i.seconds, i.nanos));
-
-    v.setPredecessors(getPredecessors(v.getId()));
-    v.setSuccessors(getSuccessors(v.getId()));
-    return v;
-  }
-
-  /** Return a list of direct children. */
-  private LinkedList<Version> getSuccessors(String id) {
-    LinkedList<Version> result = new LinkedList<>();
-
-    outer:
-    for (VersionHistoryItem i : getList()) {
-      if (i.parents != null)
-        for (String p : i.parents) {
-          if (id.equals(p)) {
-            Version successor = new Version(i.id, i.seconds, i.nanos);
-            result.add(successor);
-            continue outer;
-          }
-        }
-    }
-    return result;
+  @Override
+  protected Version getVersion(String id) {
+    return new Version(id);
   }
 
-  /** Return a list of direct parents. */
-  private LinkedList<Version> getPredecessors(String id) {
-    LinkedList<Version> result = new LinkedList<>();
-    if (getMap().containsKey(id) && getMap().get(id).parents != null)
-      for (String p : getMap().get(id).parents) {
-        VersionHistoryItem i = getMap().get(p);
-        Version predecessor = new Version(i.id, i.seconds, i.nanos);
-        result.add(predecessor);
-      }
-    return result;
+  public Version getVersion() {
+    Version v = getVersion(getEntity().getVersion().getId());
+    v.setPredecessors(getPredecessors(v.getId(), false));
+    v.setSuccessors(getSuccessors(v.getId(), false));
+    return v;
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/UpdateEntity.java b/src/main/java/org/caosdb/server/database/backend/transaction/UpdateEntity.java
index 9c20cb1d2d112e8d64ce5be2cfa8a7f8da20fe10..60fd34c77f1e70184dfc50c1a5644f3503ac9630 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/UpdateEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/UpdateEntity.java
@@ -54,6 +54,7 @@ public class UpdateEntity extends BackendTransaction {
 
         execute(new InsertEntityProperties(e));
 
+        RetrieveVersionHistory.removeCached(e.getId());
         execute(new RetrieveVersionInfo(e));
       }
     }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/UpdateSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/transaction/UpdateSparseEntity.java
index 2385ec843a3d499d1184b58eca06f8ae05cbe4f8..8548fb0477de9d8b52b18b8132af15295dbc9353 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/UpdateSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/UpdateSparseEntity.java
@@ -52,6 +52,6 @@ public class UpdateSparseEntity extends BackendTransaction {
 
     t.execute(spe);
 
-    this.entity.setVersion(new Version(spe.version));
+    this.entity.setVersion(new Version(spe.versionId));
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/proto/SparseEntity.java b/src/main/java/org/caosdb/server/database/proto/SparseEntity.java
index 3d5a29c9c4a69670d49347864b7ed885e758192f..d2292c58825ac6807e24f3ad3d086b29dd8a6e7e 100644
--- a/src/main/java/org/caosdb/server/database/proto/SparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/proto/SparseEntity.java
@@ -38,9 +38,7 @@ public class SparseEntity extends VerySparseEntity {
   public String filePath = null;
   public Long fileSize = null;
   public Long fileChecked = null;
-  public String version = null;
-  public Long versionSeconds = null;
-  public Integer versionNanos = null;
+  public String versionId = null;
 
   @Override
   public String toString() {
@@ -54,9 +52,7 @@ public class SparseEntity extends VerySparseEntity {
         .append(this.fileHash)
         .append(this.filePath)
         .append(this.fileSize)
-        .append(this.version)
-        .append(this.versionSeconds)
-        .append(this.versionNanos)
+        .append(this.versionId)
         .toString();
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/proto/VersionHistoryItem.java b/src/main/java/org/caosdb/server/database/proto/VersionHistoryItem.java
index 26109760ecde53ea20405bd02095cd951818677d..f76b3bc61b3c92ad0639cf265d8283cd48f5373b 100644
--- a/src/main/java/org/caosdb/server/database/proto/VersionHistoryItem.java
+++ b/src/main/java/org/caosdb/server/database/proto/VersionHistoryItem.java
@@ -5,9 +5,16 @@ import java.util.LinkedList;
 
 public class VersionHistoryItem implements Serializable {
 
-  private static final long serialVersionUID = 6319362462701459355L;
+  private static final long serialVersionUID = 428030617967255942L;
   public String id = null;
   public LinkedList<String> parents = null;
   public Long seconds = null;
   public Integer nanos = null;
+  public String username = null;
+  public String realm = null;
+
+  @Override
+  public String toString() {
+    return id;
+  }
 }
diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java
index 8578191c40c229ae1b9f0e873d35690c55cf2bfc..845bb25a3cee665fd8f0985c6969f53dfc868025 100644
--- a/src/main/java/org/caosdb/server/entity/Entity.java
+++ b/src/main/java/org/caosdb/server/entity/Entity.java
@@ -34,7 +34,6 @@ import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.AuthorizationException;
 import org.apache.shiro.authz.Permission;
 import org.apache.shiro.subject.Subject;
-import org.caosdb.datetime.UTCDateTime;
 import org.caosdb.server.CaosDBException;
 import org.caosdb.server.database.proto.SparseEntity;
 import org.caosdb.server.database.proto.VerySparseEntity;
@@ -1079,11 +1078,9 @@ public class Entity extends AbstractObservable implements EntityInterface {
     setId(spe.id);
     this.setRole(spe.role);
     setEntityACL(spe.acl);
-    UTCDateTime versionDate = null;
-    if (spe.versionSeconds != null) {
-      versionDate = UTCDateTime.UTCSeconds(spe.versionSeconds, spe.versionNanos);
+    if (spe.versionId != null) {
+      this.version = new Version(spe.versionId);
     }
-    this.version = new Version(spe.version, versionDate);
 
     if (!isNameOverride()) {
       setName(spe.name);
diff --git a/src/main/java/org/caosdb/server/entity/Version.java b/src/main/java/org/caosdb/server/entity/Version.java
index 3f9e148583686887fab39038aa427bccf1c69b25..693e912eab13d80412a11a3bf3284424bfd5d55a 100644
--- a/src/main/java/org/caosdb/server/entity/Version.java
+++ b/src/main/java/org/caosdb/server/entity/Version.java
@@ -20,7 +20,7 @@
 
 package org.caosdb.server.entity;
 
-import java.util.LinkedList;
+import java.util.List;
 import org.caosdb.datetime.UTCDateTime;
 
 /**
@@ -31,25 +31,33 @@ import org.caosdb.datetime.UTCDateTime;
 public class Version {
 
   private String id = null;
-  private LinkedList<Version> predecessors = null;
-  private LinkedList<Version> successors = null;
+  private String username = null;
+  private String realm = null;
+  private List<Version> predecessors = null;
+  private List<Version> successors = null;
   private UTCDateTime date = null;
 
   public Version(String id, long seconds, int nanos) {
-    this(id, UTCDateTime.UTCSeconds(seconds, nanos));
+    this(id, UTCDateTime.UTCSeconds(seconds, nanos), null, null);
   }
 
-  public Version(String id, UTCDateTime date) {
+  public Version(String id, UTCDateTime date, String username, String realm) {
     this.id = id;
     this.date = date;
+    this.username = username;
+    this.realm = realm;
   }
 
   public Version(String id) {
-    this(id, null);
+    this(id, null, null, null);
   }
 
   public Version() {}
 
+  public Version(String id, UTCDateTime timestamp) {
+    this(id, timestamp, null, null);
+  }
+
   public UTCDateTime getDate() {
     return date;
   }
@@ -66,19 +74,39 @@ public class Version {
     this.id = id;
   }
 
-  public LinkedList<Version> getSuccessors() {
+  public List<Version> getSuccessors() {
     return successors;
   }
 
-  public void setSuccessors(LinkedList<Version> successors) {
+  public void setSuccessors(List<Version> successors) {
     this.successors = successors;
   }
 
-  public LinkedList<Version> getPredecessors() {
+  public List<Version> getPredecessors() {
     return predecessors;
   }
 
-  public void setPredecessors(LinkedList<Version> predecessors) {
+  public void setPredecessors(List<Version> predecessors) {
     this.predecessors = predecessors;
   }
+
+  public String getRealm() {
+    return realm;
+  }
+
+  public void setRealm(String realm) {
+    this.realm = realm;
+  }
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+
+  public void setDate(Long timestamp) {
+    this.date = UTCDateTime.SystemMillisToUTCDateTime(timestamp);
+  }
 }
diff --git a/src/main/java/org/caosdb/server/entity/xml/VersionXMLSerializer.java b/src/main/java/org/caosdb/server/entity/xml/VersionXMLSerializer.java
index 65ec9880dfef43a4e460bba692ece6c9f87faa7e..d43fe378b47996c22f6caa5f0e244ae58c8d5eb2 100644
--- a/src/main/java/org/caosdb/server/entity/xml/VersionXMLSerializer.java
+++ b/src/main/java/org/caosdb/server/entity/xml/VersionXMLSerializer.java
@@ -30,28 +30,37 @@ import org.jdom2.Element;
  * @author Timm Fitschen <t.fitschen@indiscale.com>
  */
 class VersionXMLSerializer {
+
   public Element toElement(Version version) {
-    Element result = new Element("Version");
-    result.setAttribute("id", version.getId());
-    if (version.getDate() != null) {
-      result.setAttribute("date", version.getDate().toDateTimeString(TimeZone.getDefault()));
-    }
+    return toElement(version, "Version");
+  }
+
+  private Element toElement(Version version, String tag) {
+    Element element = new Element(tag);
+    setAttributes(version, element);
     if (version.getPredecessors() != null) {
       for (Version p : version.getPredecessors()) {
-        Element predecessor = new Element("Predecessor");
-        predecessor.setAttribute("id", p.getId());
-        predecessor.setAttribute("date", p.getDate().toDateTimeString(TimeZone.getDefault()));
-        result.addContent(predecessor);
+        element.addContent(toElement(p, "Predecessor"));
       }
     }
     if (version.getSuccessors() != null) {
       for (Version s : version.getSuccessors()) {
-        Element successor = new Element("Successor");
-        successor.setAttribute("id", s.getId());
-        successor.setAttribute("date", s.getDate().toDateTimeString(TimeZone.getDefault()));
-        result.addContent(successor);
+        element.addContent(toElement(s, "Successor"));
       }
     }
-    return result;
+    return element;
+  }
+
+  private void setAttributes(Version version, Element element) {
+    element.setAttribute("id", version.getId());
+    if (version.getUsername() != null) {
+      element.setAttribute("username", version.getUsername());
+    }
+    if (version.getRealm() != null) {
+      element.setAttribute("realm", version.getRealm());
+    }
+    if (version.getDate() != null) {
+      element.setAttribute("date", version.getDate().toDateTimeString(TimeZone.getDefault()));
+    }
   }
 }
diff --git a/src/main/java/org/caosdb/server/jobs/core/History.java b/src/main/java/org/caosdb/server/jobs/core/History.java
index a7c58979f49b2a7abdc313924dc8fb6b86bbffd4..87e9f69d0de18779268b8fc43b228d604dfe5133 100644
--- a/src/main/java/org/caosdb/server/jobs/core/History.java
+++ b/src/main/java/org/caosdb/server/jobs/core/History.java
@@ -24,6 +24,7 @@ package org.caosdb.server.jobs.core;
 
 import org.apache.shiro.authz.AuthorizationException;
 import org.caosdb.server.database.backend.transaction.RetrieveTransactionHistory;
+import org.caosdb.server.database.backend.transaction.RetrieveVersionHistory;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
@@ -42,7 +43,7 @@ public class History extends FlagJob {
         if (entity.getId() != null && entity.getId() > 0) {
           try {
             entity.checkPermission(EntityPermission.RETRIEVE_HISTORY);
-            final RetrieveTransactionHistory t = new RetrieveTransactionHistory(entity);
+            final RetrieveVersionHistory t = new RetrieveTransactionHistory(entity);
             execute(t);
           } catch (final AuthorizationException e) {
             entity.setEntityStatus(EntityStatus.UNQUALIFIED);
diff --git a/src/main/java/org/caosdb/server/transaction/Insert.java b/src/main/java/org/caosdb/server/transaction/Insert.java
index f60fc1286ae909eb7fd999aa3af1f8379dd331ff..d37f7ce516f36252466555ea18fe249f2730fea1 100644
--- a/src/main/java/org/caosdb/server/transaction/Insert.java
+++ b/src/main/java/org/caosdb/server/transaction/Insert.java
@@ -27,7 +27,6 @@ import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.transaction.InsertEntity;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.FileProperties;
-import org.caosdb.server.entity.Version;
 import org.caosdb.server.entity.container.InsertContainer;
 import org.caosdb.server.entity.container.TransactionContainer;
 import org.caosdb.server.permissions.EntityACL;
@@ -104,10 +103,6 @@ public class Insert extends WriteTransaction<InsertContainer> {
   public void insert(final TransactionContainer container, final Access access) throws Exception {
     if (container.getStatus().ordinal() >= EntityStatus.QUALIFIED.ordinal()) {
       execute(new InsertEntity(container), access);
-      for (EntityInterface e : container) {
-        // TODO move to InsertEntity transaction
-        e.setVersion(new Version(e.getVersion().getId(), this.getTimestamp()));
-      }
     }
   }