diff --git a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java
index 3cf08cd9417dbfe7ac3e7297d57f4aa623e0da89..af40f7358b695e8943ce7cea69ff1012406b571b 100644
--- a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java
+++ b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java
@@ -611,44 +611,66 @@ public class CaosDBToGrpcConverters {
 
     SelectQueryRow.Builder result = SelectQueryRow.newBuilder();
     for (Selection s : selections) {
-      org.caosdb.api.entity.v1.Value.Builder value = getValue(s, e);
+      org.caosdb.api.entity.v1.Value.Builder value = getSelectedValue(s, e);
       result.addCells(value);
     }
     return result;
   }
-
-  private org.caosdb.api.entity.v1.Value.Builder getValue(Selection s, EntityInterface e) {
+  
+  private org.caosdb.api.entity.v1.Value.Builder getSelectedValue(Selection s, EntityInterface e) {
     org.caosdb.api.entity.v1.Value.Builder result = org.caosdb.api.entity.v1.Value.newBuilder();
     String selector = s.getSelector();
     switch (selector) {
+      case "value":
+        if(e.hasValue()) {
+          result = convert(e.getValue());
+        }
+        break;
       case "name":
         if (e.hasName()) {
-          result.setScalarValue(ScalarValue.newBuilder().setStringValue(e.getName()));
+          result.setScalarValue(convertStringValue(e.getName()));
         }
         break;
 
       case "id":
-        result.setScalarValue(ScalarValue.newBuilder().setStringValue(e.getId().toString()));
+        result.setScalarValue(convertStringValue(e.getId().toString()));
         break;
 
       case "description":
         if (e.hasDescription()) {
-          result.setScalarValue(ScalarValue.newBuilder().setStringValue(e.getDescription()));
+          result.setScalarValue(convertStringValue(e.getDescription()));
         }
         break;
 
       case "unit":
         if (e.hasUnit()) {
           final String unit = getStringUnit(e);
-          result.setScalarValue(ScalarValue.newBuilder().setStringValue(unit));
+          result.setScalarValue(convertStringValue(unit));
+        }
+        break;
+      case "datatype":
+        if (e.hasDatatype()) {
+          result.setScalarValue(convertStringValue(e.getDatatype().toString()));
         }
         break;
 
-        // TODO path, hash
+      case "path":
+        if (e.hasFileProperties() && e.getFileProperties().hasPath()) {
+          result.setScalarValue(convertStringValue(e.getFileProperties().getPath()));
+        }
+      case "parent":
+        if (e.hasParents()) {
+          CollectionValues.Builder parents = CollectionValues.newBuilder();
+          for (org.caosdb.server.entity.wrapper.Parent p : e.getParents()) {
+            parents.addValues(ScalarValue.newBuilder().setStringValue(p.getName()));
+          }
+          result.setListValues(parents);
+        }
 
       default:
         // selector for a normal property
         for (Property p : e.getProperties()) {
+          // TODO(tf) - handle multiple matching properties
           if (p.getName() != null && p.getName().equals(selector)) {
             if (s.getSubselection() == null) {
               // no subselection -> just return the actual value
@@ -657,44 +679,54 @@ public class CaosDBToGrpcConverters {
               } catch (Message m) {
                 throw new TransactionException(m);
               }
-              if (!p.hasValue()) {
-                continue;
-              } else if (p.getValue() instanceof CollectionValue) {
-
-              } else if (p.getValue() instanceof GenericValue) {
-                if (((GenericValue) p.getValue()).getValue() instanceof Double) {
-                  result.setScalarValue(
-                      ScalarValue.newBuilder()
-                          .setDoubleValue((Double) ((GenericValue) p.getValue()).getValue()));
-                } else if (((GenericValue) p.getValue()).getValue() instanceof Integer) {
-                  result.setScalarValue(
-                      ScalarValue.newBuilder()
-                          .setIntegerValue((Integer) ((GenericValue) p.getValue()).getValue()));
-                } else {
-                  result.setScalarValue(
-                      ScalarValue.newBuilder().setStringValue(p.getValue().toString()));
-                }
-              } else if (p.getValue() instanceof BooleanValue) {
-                result.setScalarValue(
-                    ScalarValue.newBuilder()
-                        .setBooleanValue(((BooleanValue) p.getValue()).getValue()));
-
-              } else {
-                result.setScalarValue(
-                    ScalarValue.newBuilder().setStringValue(p.getValue().toString()));
-              }
+
+              result = convert(p.getValue());
             } else {
               // with subselection, e.g. p1.unit, site.geolocation.longitude
               switch (s.getSubselection().getSelector()) {
+                case "name":
+                  if (p.hasName()) {
+                    result.setScalarValue(convertStringValue(p.getName()));
+                  }
+                  break;
+
+                case "id":
+                  result.setScalarValue(convertStringValue(p.getId().toString()));
+                  break;
+
+                case "description":
+                  if (p.hasDescription()) {
+                    result.setScalarValue(convertStringValue(p.getDescription()));
+                  }
+                  break;
+
                 case "unit":
                   final String unit = getStringUnit(p);
                   if (unit != null) {
-                    result.setScalarValue(ScalarValue.newBuilder().setStringValue(unit));
+                    result.setScalarValue(convertStringValue(unit));
                   }
                   break;
 
-                  // TODO name, description, id
+                case "datatype":
+                  if (p.hasDatatype()) {
+                    result.setScalarValue(convertStringValue(p.getDatatype().toString()));
+                  }
+                  break;
+                case "value":
+                  if(p.hasValue()) {
+                    result = convert(p.getValue());
+                  }
+                  break;
                 default:
+                  // normal property
+                  Value v = p.getValue();
+
+                  if (v instanceof ReferenceValue) {
+                    EntityInterface referenced_entity = ((ReferenceValue) v).getEntity();
+                    return getSelectedValue(s.getSubselection(), referenced_entity);
+                  } else if (v instanceof CollectionValue) {
+                    // TODO(tf)
+                  }
                   break;
               }
             }
@@ -702,7 +734,6 @@ public class CaosDBToGrpcConverters {
         }
         break;
     }
-    // TODO Auto-generated method stub
     return result;
   }