diff --git a/caosdb-proto b/caosdb-proto
index dd9abe3499367c4eded4774ade1acbc90ef048b3..12f072263c05208464b80c0124bde0396b100d86 160000
--- a/caosdb-proto
+++ b/caosdb-proto
@@ -1 +1 @@
-Subproject commit dd9abe3499367c4eded4774ade1acbc90ef048b3
+Subproject commit 12f072263c05208464b80c0124bde0396b100d86
diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
index 1ca75f9cde9bbe4ad74eb337abcda4775be94f0c..3d7df68a50a170fe930807014f36c24bf086820d 100644
--- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
+++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
@@ -1,20 +1,192 @@
 package org.caosdb.server.grpc;
 
 import io.grpc.stub.StreamObserver;
+import java.util.Iterator;
+import java.util.UUID;
+import org.apache.shiro.SecurityUtils;
+import org.caosdb.api.entity.v1alpha1.ByIdRequest;
 import org.caosdb.api.entity.v1alpha1.Entity;
+import org.caosdb.api.entity.v1alpha1.Entity.Builder;
 import org.caosdb.api.entity.v1alpha1.EntityTransactionServiceGrpc.EntityTransactionServiceImplBase;
+import org.caosdb.api.entity.v1alpha1.Parent;
 import org.caosdb.api.entity.v1alpha1.RetrieveRequest;
 import org.caosdb.api.entity.v1alpha1.RetrieveResponse;
+import org.caosdb.api.entity.v1alpha1.Version;
+import org.caosdb.server.entity.EntityInterface;
+import org.caosdb.server.entity.MagicTypes;
+import org.caosdb.server.entity.RetrieveEntity;
+import org.caosdb.server.entity.container.ParentContainer;
+import org.caosdb.server.entity.container.PropertyContainer;
+import org.caosdb.server.entity.container.RetrieveContainer;
+import org.caosdb.server.entity.wrapper.Property;
+import org.caosdb.server.transaction.Retrieve;
+import org.caosdb.server.utils.EntityStatus;
 
 public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBase {
 
+  public String getStringUnit(final EntityInterface entity) {
+    for (final Property p : entity.getProperties()) {
+      if (MagicTypes.UNIT.getId() == p.getId()) {
+        p.setEntityStatus(EntityStatus.IGNORE);
+        return p.getValue().toString();
+      }
+    }
+    return null;
+  }
+
+  public Entity convert(final EntityInterface from) {
+    final Builder builder = Entity.newBuilder();
+
+    if (from.getRole() != null) {
+      builder.setRole(from.getRole().toString());
+    }
+    if (from.hasId()) {
+      builder.setId(from.getId().toString());
+    }
+    if (from.hasVersion()) {
+      builder.setVersion(convert(from.getVersion()));
+    }
+    if (from.hasName()) {
+      builder.setName(from.getName());
+    }
+    if (from.hasDescription()) {
+      builder.setDescription(from.getDescription());
+    }
+    if (from.hasDatatype()) {
+      builder.setDatatype(from.getDatatype().getName());
+    }
+    if (from.hasUnit()) {
+      builder.setUnit(getStringUnit(from));
+    }
+    if (from.hasProperties()) {
+      builder.addAllProperties(convert(from.getProperties()));
+    }
+    if (from.hasParents()) {
+      builder.addAllParents(convert(from.getParents()));
+    }
+
+    return builder.build();
+  }
+
+  public Version convert(final org.caosdb.server.entity.Version from) {
+    final org.caosdb.api.entity.v1alpha1.Version.Builder builder = Version.newBuilder();
+
+    builder.setId(from.getId());
+    return builder.build();
+  }
+
+  public Parent convert(final org.caosdb.server.entity.wrapper.Parent from) {
+    final org.caosdb.api.entity.v1alpha1.Parent.Builder builder = Parent.newBuilder();
+    if (from.hasId()) {
+      builder.setId(from.getId().toString());
+    }
+    if (from.hasName()) {
+      builder.setName(from.getName());
+    }
+    if (from.hasDescription()) {
+      builder.setDescription(from.getDescription());
+    }
+
+    return builder.build();
+  }
+
+  public org.caosdb.api.entity.v1alpha1.Property convert(final Property from) {
+    final org.caosdb.api.entity.v1alpha1.Property.Builder builder =
+        org.caosdb.api.entity.v1alpha1.Property.newBuilder();
+
+    if (from.hasId()) {
+      builder.setId(from.getId().toString());
+    }
+    if (from.hasName()) {
+      builder.setName(from.getName());
+    }
+    if (from.hasDescription()) {
+      builder.setDescription(from.getDescription());
+    }
+    if (from.hasDatatype()) {
+      builder.setDatatype(from.getDatatype().getName());
+    }
+    if (from.hasUnit()) {
+      builder.setUnit(getStringUnit(from));
+    }
+    if (from.hasValue()) {
+      builder.setValue(from.getValue().toString());
+    }
+    builder.setImportance(from.getStatementStatus().toString());
+    return builder.build();
+  }
+
+  public Iterable<? extends org.caosdb.api.entity.v1alpha1.Property> convert(
+      final PropertyContainer from) {
+    final Iterator<org.caosdb.server.entity.wrapper.Property> iterator = from.iterator();
+    return () ->
+        new Iterator<>() {
+
+          @Override
+          public boolean hasNext() {
+            return iterator.hasNext();
+          }
+
+          @Override
+          public org.caosdb.api.entity.v1alpha1.Property next() {
+            return convert(iterator.next());
+          }
+        };
+  }
+
+  public Iterable<? extends Parent> convert(final ParentContainer from) {
+    final Iterator<org.caosdb.server.entity.wrapper.Parent> iterator = from.iterator();
+    return () ->
+        new Iterator<>() {
+
+          @Override
+          public boolean hasNext() {
+            return iterator.hasNext();
+          }
+
+          @Override
+          public Parent next() {
+            return convert(iterator.next());
+          }
+        };
+  }
+
+  public Integer getId(final ByIdRequest request) {
+    return Integer.parseInt(request.getId());
+  }
+
+  public Entity retrieve(final RetrieveRequest request) throws Exception {
+
+    final RetrieveContainer container =
+        new RetrieveContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null);
+    final RetrieveEntity entity = new RetrieveEntity(getId(request.getById()));
+    container.add(entity);
+
+    final Retrieve transaction = new Retrieve(container);
+    transaction.execute();
+    return convert(transaction.getContainer().get(0));
+  }
+
+  private String getSRID() {
+    return UUID.randomUUID().toString();
+  }
+
+  private Long getTimestamp() {
+    return System.currentTimeMillis();
+  }
+
   @Override
   public void retrieve(
       final RetrieveRequest request, final StreamObserver<RetrieveResponse> responseObserver) {
-    final Entity entity = Entity.newBuilder().setDescription("This is an entity").build();
-    final RetrieveResponse response = RetrieveResponse.newBuilder().setEntity(entity).build();
+    try {
+      final Entity entity = retrieve(request);
+      final RetrieveResponse response = RetrieveResponse.newBuilder().setEntity(entity).build();
+      responseObserver.onNext(response);
+      responseObserver.onCompleted();
 
-    responseObserver.onNext(response);
-    responseObserver.onCompleted();
+    } catch (final Exception e) {
+      e.printStackTrace();
+      responseObserver.onError(e);
+    }
   }
 }
diff --git a/src/main/java/org/caosdb/server/transaction/Retrieve.java b/src/main/java/org/caosdb/server/transaction/Retrieve.java
index 250df0423869ae97a766da2fc54131e04d5257ca..45647c1d554d38ab2b90e91f9516305265d370b8 100644
--- a/src/main/java/org/caosdb/server/transaction/Retrieve.java
+++ b/src/main/java/org/caosdb/server/transaction/Retrieve.java
@@ -54,14 +54,14 @@ public class Retrieve extends Transaction<RetrieveContainer> {
     {
       final ResolveNames r = new ResolveNames();
       r.init(JobFailureSeverity.WARN, null, this);
-      ScheduledJob scheduledJob = getSchedule().add(r);
+      final ScheduledJob scheduledJob = getSchedule().add(r);
       getSchedule().runJob(scheduledJob);
     }
 
     {
       final RemoveDuplicates job = new RemoveDuplicates();
       job.init(JobFailureSeverity.ERROR, null, this);
-      ScheduledJob scheduledJob = getSchedule().add(job);
+      final ScheduledJob scheduledJob = getSchedule().add(job);
       getSchedule().runJob(scheduledJob);
     }
 
diff --git a/src/main/java/org/caosdb/server/transaction/Transaction.java b/src/main/java/org/caosdb/server/transaction/Transaction.java
index fe0b63f333e0151aed161ce3fa3914794e5f3d52..028afdd695652cbe912e1c48dd0ac2491ec59c3a 100644
--- a/src/main/java/org/caosdb/server/transaction/Transaction.java
+++ b/src/main/java/org/caosdb/server/transaction/Transaction.java
@@ -91,7 +91,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
    *
    * <p>E.g. in {@link Retrieve} and {@link WriteTransaction}.
    */
-  protected void makeSchedule() throws Exception {
+  protected void makeSchedule() {
     // load flag jobs
     final Job loadContainerFlags =
         Job.getJob("LoadContainerFlagJobs", JobFailureSeverity.ERROR, null, this);