diff --git a/src/main/java/caosdb/datetime/UTCDateTime.java b/src/main/java/caosdb/datetime/UTCDateTime.java
index 215de67befe403aa6a202ed178244b3de898d23e..db66ef0ad08abf0d52a8f3b1b97c6a20cc613c8a 100644
--- a/src/main/java/caosdb/datetime/UTCDateTime.java
+++ b/src/main/java/caosdb/datetime/UTCDateTime.java
@@ -296,7 +296,7 @@ public class UTCDateTime implements Interval {
     throw new NullPointerException("toString method!!!");
   }
 
-  public static UTCDateTime UTCSeconds(final Long utcseconds, final Integer nanosecond) {
+  public static UTCDateTime UTCSeconds(final Long utcseconds, final Integer nanoseconds) {
     if (LEAP_SECONDS.isEmpty()) {
       initLeapSeconds();
     }
@@ -310,10 +310,10 @@ public class UTCDateTime implements Interval {
     if (leapSeconds2 != leapSeconds && LEAP_SECONDS.contains(systemSeconds)) {
       gc.add(Calendar.SECOND, -1);
       return new UTCDateTime(
-          systemSeconds, leapSeconds, nanosecond, new LeapSecondDateTimeStringStrategy(gc, 1));
+          systemSeconds, leapSeconds, nanoseconds, new LeapSecondDateTimeStringStrategy(gc, 1));
     } else {
       return new UTCDateTime(
-          systemSeconds, leapSeconds, nanosecond, new GregorianCalendarDateTimeStringStrategy(gc));
+          systemSeconds, leapSeconds, nanoseconds, new GregorianCalendarDateTimeStringStrategy(gc));
     }
   }
 
diff --git a/src/main/java/caosdb/server/database/backend/implementation/MySQL/DatabaseConnectionPool.java b/src/main/java/caosdb/server/database/backend/implementation/MySQL/DatabaseConnectionPool.java
index 86918e37c279f4ab5decb9c59c5311e1747f1a0f..fc17dd1066cfa57660d44dbb6a521d3177e5fc72 100644
--- a/src/main/java/caosdb/server/database/backend/implementation/MySQL/DatabaseConnectionPool.java
+++ b/src/main/java/caosdb/server/database/backend/implementation/MySQL/DatabaseConnectionPool.java
@@ -86,9 +86,6 @@ class DatabaseConnectionPool {
             + "/"
             + CaosDBServer.getServerProperty(ServerProperties.KEY_MYSQL_DATABASE_NAME)
             + "?noAccessToProcedureBodies=true&autoReconnect=true&serverTimezone=UTC&characterEncoding=UTF-8";
-    //            +
-    // "?noAccessToProcedureBodies=true&cacheCallableStmts=true&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&connectionCollation=utf8_unicode_ci&characterSetResults=utf8&serverTimezone=CET";
-    // + "?profileSQL=true&characterSetResults=utf8";
     final String user = CaosDBServer.getServerProperty(ServerProperties.KEY_MYSQL_USER_NAME);
     final String pwd = CaosDBServer.getServerProperty(ServerProperties.KEY_MYSQL_USER_PASSWORD);
     final ConnectionPool pool = new ConnectionPool("MySQL Pool", 2, 5, 0, 0, url, user, pwd);
diff --git a/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLHelper.java b/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLHelper.java
index dca689c0414726a424e224ff5eed9ea27f740cfc..b443c54507e415ed4171fcf0ac99c3da762fb506 100644
--- a/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLHelper.java
+++ b/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLHelper.java
@@ -50,6 +50,11 @@ public class MySQLHelper implements DBHelper {
 
   private Logger logger = LoggerFactory.getLogger(getClass());
 
+  /**
+   * Initialize a transaction by calling the corresponding SQL procedure.
+   *
+   * <p>In the database, this adds a row to the transaction table with SRID, user and timestamp.
+   */
   public void initTransaction(Connection connection, WriteTransaction<?> transaction)
       throws SQLException {
     try (CallableStatement call = connection.prepareCall("CALL set_transaction(?,?,?,?,?)")) {
@@ -152,7 +157,7 @@ public class MySQLHelper implements DBHelper {
         try (Statement s = connection.createStatement()) {
           s.execute("SET @SRID = NULL");
         } catch (SQLException e) {
-          logger.error("Exception during resetting the @SRID variable.", e);
+          logger.error("Exception while resetting the @SRID variable.", e);
         }
 
         // close all cached statements (if possible)
@@ -162,7 +167,7 @@ public class MySQLHelper implements DBHelper {
               stmt.close();
             }
           } catch (final SQLException e) {
-            logger.warn("Exception during closing a prepared statement.", e);
+            logger.warn("Exception while closing a prepared statement.", e);
           }
         }
 
diff --git a/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java b/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java
index 30497b2d759e91622025cbaf0425dcdff7f64036..73c589fade317586cc1b5bfb4b796578f9e819ba 100644
--- a/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java
+++ b/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java
@@ -64,8 +64,8 @@ public class MySQLUpdateSparseEntity extends MySQLTransaction implements UpdateS
       }
       updateFilePropsStmt.execute();
 
-      final PreparedStatement updateEntityStmt = prepareStatement(STMT_UPDATE_ENTITY);
       // very sparse entity
+      final PreparedStatement updateEntityStmt = prepareStatement(STMT_UPDATE_ENTITY);
       updateEntityStmt.setInt(1, spe.id);
       updateEntityStmt.setString(2, spe.name);
       updateEntityStmt.setString(3, spe.description);
diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveParents.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveParents.java
index eac5aa7f0a0bd506514cdbca2efe989541dd5e3a..d33d5e96d978fe86d6eb965113726eb79bb60d40 100644
--- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveParents.java
+++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveParents.java
@@ -38,10 +38,10 @@ import org.apache.commons.jcs.access.behavior.ICacheAccess;
 // When an old entity version has a parent which is deleted, the name is
 // still in the cached VerySparseEntity. This can be resolved by using a
 // similar strategy as in RetrieveProperties.java where the name etc. are
-// retrieved in a second step. Thus the deletion doesn't slips through
+// retrieved in a second step. Thus the deletion doesn't slip through
 // unnoticed.
 //
-// Changes are to be made in the backend-api, i.e. mysqlbackend and the
+// Changes are necessary in the backend-api, i.e. mysqlbackend and the
 // interfaces as well.
 //
 // See also a failing test in caosdb-pyinttest:
diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java
index 77f282d08e2b054f079013a1dd47d112592fa16e..1daab0504cafbd05e9e03dff78b2c230a0438ccd 100644
--- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java
+++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java
@@ -38,7 +38,7 @@ public class RetrieveVersionInfo extends RetrieveVersionHistory {
 
   @Override
   protected void process(HashMap<String, VersionHistoryItem> map) throws TransactionException {
-    super.process(map);
+    super.process(map); // Make the map available to the object.
     if (!map.isEmpty()) getVersion();
   }
 
@@ -52,6 +52,7 @@ public class RetrieveVersionInfo extends RetrieveVersionHistory {
     return v;
   }
 
+  /** Return a list of direct children. */
   private LinkedList<Version> getSuccessors(String id) {
     LinkedList<Version> result = new LinkedList<>();
 
@@ -69,6 +70,7 @@ public class RetrieveVersionInfo extends RetrieveVersionHistory {
     return result;
   }
 
+  /** 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)
diff --git a/src/main/java/caosdb/server/datatype/ReferenceValue.java b/src/main/java/caosdb/server/datatype/ReferenceValue.java
index 41c475bfac1153b87c7e63db80c1ec173fdb1c98..77f7aa8c56d97b8dc5abf914c0b6c88749683d69 100644
--- a/src/main/java/caosdb/server/datatype/ReferenceValue.java
+++ b/src/main/java/caosdb/server/datatype/ReferenceValue.java
@@ -31,6 +31,14 @@ import caosdb.server.utils.ServerMessages;
 import java.util.Objects;
 import org.jdom2.Element;
 
+/**
+ * A ReferenceValue represents the value of a reference property to another entity.
+ *
+ * <p>Differently from other properties, they may be versioned, i.e. they may reference to a
+ * specific version of an entity.
+ *
+ * <p>TODO: Ways to specify a reference value, what are the consequences of versioned references?
+ */
 public class ReferenceValue implements SingleValue {
   private EntityInterface entity = null;
   private String name = null;
@@ -61,6 +69,11 @@ public class ReferenceValue implements SingleValue {
     }
   }
 
+  /**
+   * Split a reference string into an entity part and a version part, if there is a version part.
+   *
+   * <p>If parsing the entity ID part to an integer fails, a NumberFormatException may be thrown.
+   */
   public static ReferenceValue parseIdVersion(String str) {
     String[] split = str.split("@", 2);
     if (split.length == 2) {
@@ -70,6 +83,12 @@ public class ReferenceValue implements SingleValue {
     }
   }
 
+  /**
+   * Create a ReferenceValue from a string.
+   *
+   * <p>If the string looks like a valid "entityID@version" string, the result will have the
+   * corresponding entity and version parts.
+   */
   public static ReferenceValue parseFromString(String str) {
     try {
       return parseIdVersion(str);
@@ -78,18 +97,28 @@ public class ReferenceValue implements SingleValue {
     }
   }
 
+  /**
+   * Produce a nice but short string:
+   *
+   * <p>Case 1 "versioned" (reference to an entity without specifying that entity's version):
+   * Produces a string like "1234" or "Experiment". Note that referencing via name is never
+   * versioned.
+   *
+   * <p>Case 2 "unversioned" (reference to an entity with a specified version): Produces a string
+   * like "1234@ab987f".
+   */
   @Override
   public String toString() {
-    if (this.entity != null && versioned) {
-      return this.entity.getIdVersion().toString();
-    } else if (this.entity != null) {
+    if (this.entity != null && versioned) { // Was specified as "versioned", with resolved entity
+      return this.entity.getIdVersion();
+    } else if (this.entity != null) { // resolved, but unversioned
       return this.entity.getId().toString();
-    } else if (this.id == null && this.name != null) {
+    } else if (this.id == null
+        && this.name != null) { // Only name is available, no id (and thus no resolved entity)
       return this.name;
-    } else if (this.version != null) {
-      return getIdVersion();
     }
-    return this.id.toString();
+    // Specification via id is the only remaining possibility
+    return getIdVersion(); // if version is null, returns ID only
   }
 
   public String getIdVersion() {
@@ -105,14 +134,16 @@ public class ReferenceValue implements SingleValue {
   }
 
   public ReferenceValue(final Integer id) {
-    this.id = id;
+    this(id, null);
   }
 
   public ReferenceValue(final Integer id, final String version) {
     this.id = id;
     this.version = version;
+    this.versioned = version != null;
   }
 
+  /** If the reference is given by name, versioning is not possible (at the moment). */
   public ReferenceValue(final String name) {
     this.name = name;
   }
diff --git a/src/main/java/caosdb/server/entity/Entity.java b/src/main/java/caosdb/server/entity/Entity.java
index e2f9b6d818813296e31f812d4ddfa6ac289de409..16f4f508e2d97a4c0f58c1775e95db9efbf4ffba 100644
--- a/src/main/java/caosdb/server/entity/Entity.java
+++ b/src/main/java/caosdb/server/entity/Entity.java
@@ -804,7 +804,7 @@ public class Entity extends AbstractObservable implements EntityInterface {
     int pidx = 0;
     for (final Element pe : element.getChildren()) {
       if (pe.getName().equalsIgnoreCase("Version")) {
-        // IGNORE: When it is allowed for clients to set a version id, parsing
+        // IGNORE: Once it becomes allowed for clients to set a version id, parsing
         // the Version element would be done here. Until this is the case, the
         // Version tag is ignored.
       } else if (pe.getName().equalsIgnoreCase("EmptyString")) {
@@ -1147,6 +1147,7 @@ public class Entity extends AbstractObservable implements EntityInterface {
     this.version = version;
   }
 
+  /** Return "id@version" if there is versioning information, else only "id". */
   @Override
   public String getIdVersion() {
     if (!this.hasId()) {
diff --git a/src/main/java/caosdb/server/entity/xml/SetFieldStrategy.java b/src/main/java/caosdb/server/entity/xml/SetFieldStrategy.java
index 07c9fe67a667cbd8ef5087f87b731e71ede6fafe..7a4a29a16cc545ca5316c7b086a8b1ec46cfcfc3 100644
--- a/src/main/java/caosdb/server/entity/xml/SetFieldStrategy.java
+++ b/src/main/java/caosdb/server/entity/xml/SetFieldStrategy.java
@@ -112,7 +112,7 @@ public class SetFieldStrategy {
        * are actually used, e.g ["a.b.c.d1", "a.b.c.d2"].
        */
       return new SetFieldStrategy() {
-        // Always-true-strategy
+        // Return true for everything except version fields.
         @Override
         public boolean isToBeSet(String field) {
           return field == null || !field.equalsIgnoreCase("version");
diff --git a/src/main/java/caosdb/server/transaction/WriteTransaction.java b/src/main/java/caosdb/server/transaction/WriteTransaction.java
index dd2a581716fb5261ff63e026957bc37805b47147..ec37d19d6f5a4663c0af0adda186c282215a302b 100644
--- a/src/main/java/caosdb/server/transaction/WriteTransaction.java
+++ b/src/main/java/caosdb/server/transaction/WriteTransaction.java
@@ -37,9 +37,6 @@ public abstract class WriteTransaction<C extends TransactionContainer> extends T
     // acquire strong access. No other thread can have access until
     // it this strong access is released.
     setAccess(getMonitor().acquireStrongAccess(this));
-
-    // set SRID
-
   }
 
   @Override