diff --git a/caosdb-proto b/caosdb-proto
index 4845aa8e479b85b50a130530bbc96a0cab4f8688..8febce70a96b3322d61a74e4567ade8b33f75369 160000
--- a/caosdb-proto
+++ b/caosdb-proto
@@ -1 +1 @@
-Subproject commit 4845aa8e479b85b50a130530bbc96a0cab4f8688
+Subproject commit 8febce70a96b3322d61a74e4567ade8b33f75369
diff --git a/pom.xml b/pom.xml
index 0b3121bda423d81306bb4ee91aef9fdced2886d4..f3ab3fc572e2d7d50a31198ed295ad6439a030c6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,7 +25,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.caosdb</groupId>
   <artifactId>caosdb-server</artifactId>
-  <version>0.5.0-GRPC0.0.6</version>
+  <version>0.5.0-GRPC0.0.7</version>
   <packaging>jar</packaging>
   <name>CaosDB Server</name>
   <scm>
diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
index b92974c53a90e12d20637cb602f40fd0fbd94e89..bc26f539e04ebc9d3d696d731f57654fe7a7ddcc 100644
--- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
+++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
@@ -6,24 +6,35 @@ import java.util.LinkedList;
 import java.util.List;
 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.FullEntityRequest;
+import org.caosdb.api.entity.v1alpha1.IdResponse;
 import org.caosdb.api.entity.v1alpha1.MessageCode;
+import org.caosdb.api.entity.v1alpha1.MultiTransactionRequest;
+import org.caosdb.api.entity.v1alpha1.MultiTransactionResponse;
 import org.caosdb.api.entity.v1alpha1.Parent;
-import org.caosdb.api.entity.v1alpha1.RetrieveRequest;
+import org.caosdb.api.entity.v1alpha1.QueryOrIdRequest;
 import org.caosdb.api.entity.v1alpha1.RetrieveResponse;
+import org.caosdb.api.entity.v1alpha1.TransactionRequest;
+import org.caosdb.api.entity.v1alpha1.TransactionRequest.WrappedRequestsCase;
+import org.caosdb.api.entity.v1alpha1.TransactionResponse;
 import org.caosdb.api.entity.v1alpha1.Version;
+import org.caosdb.server.entity.DeleteEntity;
 import org.caosdb.server.entity.EntityInterface;
+import org.caosdb.server.entity.InsertEntity;
 import org.caosdb.server.entity.MagicTypes;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.RetrieveEntity;
+import org.caosdb.server.entity.Role;
 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.container.WritableContainer;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.transaction.Retrieve;
+import org.caosdb.server.transaction.WriteTransaction;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
 
@@ -69,15 +80,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
     if (from.hasParents()) {
       builder.addAllParents(convert(from.getParents()));
     }
-    if (from.hasMessage(Message.MessageType.Error.toString())) {
-      builder.addAllErrors(convert(from.getMessages(Message.MessageType.Error.toString())));
-    }
-    if (from.hasMessage(Message.MessageType.Warning.toString())) {
-      builder.addAllErrors(convert(from.getMessages(Message.MessageType.Warning.toString())));
-    }
-    if (from.hasMessage(Message.MessageType.Info.toString())) {
-      builder.addAllErrors(convert(from.getMessages(Message.MessageType.Info.toString())));
-    }
+    appendMessages(from, builder);
 
     return builder.build();
   }
@@ -104,6 +107,8 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
     // TODO move to Message class.
     if (m.equals(ServerMessages.ENTITY_DOES_NOT_EXIST)) {
       return MessageCode.MESSAGE_CODE_ENTITY_DOES_NOT_EXIST;
+    } else if (m.equals(ServerMessages.ENTITY_HAS_NO_PROPERTIES)) {
+      return MessageCode.MESSAGE_CODE_ENTITY_HAS_NO_PROPERTIES;
     }
     throw new UnsupportedOperationException("Unkown message code: " + m.toString());
   }
@@ -191,11 +196,11 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
         };
   }
 
-  public Integer getId(final ByIdRequest request) {
-    return Integer.parseInt(request.getId());
+  public Integer getId(final String id) {
+    return Integer.parseInt(id);
   }
 
-  public RetrieveResponse retrieve(final RetrieveRequest request) throws Exception {
+  public RetrieveResponse retrieve(final QueryOrIdRequest queryOrIdRequest) throws Exception {
 
     Entity responseEntity = null;
     final org.caosdb.api.entity.v1alpha1.RetrieveResponse.Builder builder =
@@ -203,7 +208,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
     final RetrieveContainer container =
         new RetrieveContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null);
     try {
-      final RetrieveEntity entity = new RetrieveEntity(getId(request.getById()));
+      final RetrieveEntity entity = new RetrieveEntity(getId(queryOrIdRequest.getId()));
       container.add(entity);
 
       final Retrieve transaction = new Retrieve(container);
@@ -212,7 +217,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
     } catch (final NumberFormatException e) {
       // ID wasn't an integer - the server doesn't support string id's yet, so that entity cannot
       // exist.
-      responseEntity = entityDoesNotExist(request.getById().getId());
+      responseEntity = entityDoesNotExist(queryOrIdRequest.getId());
     }
 
     builder.setEntity(responseEntity);
@@ -234,11 +239,114 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
     return System.currentTimeMillis();
   }
 
+  public MultiTransactionResponse transaction(final MultiTransactionRequest request)
+      throws Exception {
+    final TransactionResponse response = singleTransaction(request.getRequests(0));
+    return MultiTransactionResponse.newBuilder().addResponses(response).build();
+  }
+
+  public TransactionResponse singleTransaction(final TransactionRequest request) throws Exception {
+    final WrappedRequestsCase requestCase = request.getWrappedRequestsCase();
+    switch (requestCase) {
+      case RETRIEVE_REQUEST:
+        return TransactionResponse.newBuilder()
+            .setRetrieveResponse(retrieve(request.getRetrieveRequest()))
+            .build();
+      case INSERT_REQUEST:
+        return TransactionResponse.newBuilder()
+            .setInsertResponse(insert(request.getInsertRequest()))
+            .build();
+      case DELETE_REQUEST:
+        return TransactionResponse.newBuilder()
+            .setDeleteResponse(delete(request.getDeleteRequest()))
+            .build();
+      default:
+        throw new UnsupportedOperationException("Not implemented");
+    }
+  }
+
+  private IdResponse delete(final QueryOrIdRequest deleteRequest) throws Exception {
+
+    final String id = deleteRequest.getId();
+    final org.caosdb.api.entity.v1alpha1.IdResponse.Builder builder = IdResponse.newBuilder();
+    builder.setId(id);
+    final WritableContainer container =
+        new WritableContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null);
+    try {
+      final DeleteEntity entity = new DeleteEntity(getId(id));
+      container.add(entity);
+
+      final WriteTransaction transaction = new WriteTransaction(container);
+      transaction.execute();
+      appendMessages(entity, builder);
+    } catch (final NumberFormatException e) {
+      // ID wasn't an integer - the server doesn't support string id's yet, so that entity cannot
+      // exist.
+      builder.addEntityErrors(convert(ServerMessages.ENTITY_DOES_NOT_EXIST));
+    }
+
+    return builder.build();
+  }
+
+  private IdResponse insert(final FullEntityRequest insertRequest) throws Exception {
+    final Entity insertEntity = insertRequest.getEntity();
+
+    final org.caosdb.api.entity.v1alpha1.IdResponse.Builder builder = IdResponse.newBuilder();
+    final WritableContainer container =
+        new WritableContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null);
+    final InsertEntity entity = convert(insertEntity);
+    container.add(entity);
+    final WriteTransaction transaction = new WriteTransaction(container);
+    transaction.execute();
+
+    builder.setId(Integer.toString(entity.getId()));
+    appendMessages(entity, builder);
+
+    return builder.build();
+  }
+
+  private void appendMessages(
+      final EntityInterface from, final org.caosdb.api.entity.v1alpha1.Entity.Builder builder) {
+    if (from.hasMessage(Message.MessageType.Error.toString())) {
+      builder.addAllErrors(convert(from.getMessages(Message.MessageType.Error.toString())));
+    }
+    if (from.hasMessage(Message.MessageType.Warning.toString())) {
+      builder.addAllWarnings(convert(from.getMessages(Message.MessageType.Warning.toString())));
+    }
+    if (from.hasMessage(Message.MessageType.Info.toString())) {
+      builder.addAllInfos(convert(from.getMessages(Message.MessageType.Info.toString())));
+    }
+  }
+
+  private void appendMessages(
+      final EntityInterface from, final org.caosdb.api.entity.v1alpha1.IdResponse.Builder builder) {
+    if (from.hasMessage(Message.MessageType.Error.toString())) {
+      builder.addAllEntityErrors(convert(from.getMessages(Message.MessageType.Error.toString())));
+    }
+    if (from.hasMessage(Message.MessageType.Warning.toString())) {
+      builder.addAllEntityWarnings(
+          convert(from.getMessages(Message.MessageType.Warning.toString())));
+    }
+    if (from.hasMessage(Message.MessageType.Info.toString())) {
+      builder.addAllEntityInfos(convert(from.getMessages(Message.MessageType.Info.toString())));
+    }
+  }
+
+  private InsertEntity convert(final Entity insertEntity) {
+    final InsertEntity entity =
+        new InsertEntity(
+            insertEntity.getName().isEmpty() ? null : insertEntity.getName(),
+            Role.parse(insertEntity.getRole()));
+    // TODO (other basic attributes, properties, parents)
+    return entity;
+  }
+
   @Override
-  public void retrieve(
-      final RetrieveRequest request, final StreamObserver<RetrieveResponse> responseObserver) {
+  public void multiTransaction(
+      final MultiTransactionRequest request,
+      final StreamObserver<MultiTransactionResponse> responseObserver) {
     try {
-      final RetrieveResponse response = retrieve(request);
+      final MultiTransactionResponse response = transaction(request);
       responseObserver.onNext(response);
       responseObserver.onCompleted();