diff --git a/src/Entity.js b/src/Entity.js
index 8ebdae9e7b54ec13b0ad5583d4645a1208663b2b..cd62dc1e47d2af77a526b71e83120f7937b6cfd4 100644
--- a/src/Entity.js
+++ b/src/Entity.js
@@ -39,7 +39,7 @@ function _getRoleString(role) {
     case roles.ENTITY_ROLE_FILE:
         return "FILE";
     default:
-        throw `Unknown role ${role}.`;
+        throw new Error(`Unknown role ${role}.`);
     }
 }
 
@@ -53,6 +53,14 @@ export class Entity {
         return this.wrappedEntity.getDescription();
     }
 
+    getFilePath() {
+        if (!this.isFile()) {
+            throw new Error(`Only FILE entities can have a file path.`);
+        }
+        const fileDescriptor = this.wrappedEntity.getFileDescriptor();
+        return fileDescriptor.getPath();
+    }
+
     getId() {
         return this.wrappedEntity.getId();
     }
@@ -90,4 +98,8 @@ export class Entity {
     isRecord() {
         return this.wrappedEntity.getRole() === api.v1.EntityRole.ENTITY_ROLE_RECORD;
     }
+
+    isFile() {
+        return this.wrappedEntity.getRole() === api.v1.EntityRole.ENTITY_ROLE_FILE;
+    }
 }
diff --git a/src/Property.js b/src/Property.js
index 2fa7a5c232bc8bbbbb4fd6bd7cae1990f3199448..e22cf36481b080ce019c0634278185b22f701c0d 100644
--- a/src/Property.js
+++ b/src/Property.js
@@ -37,7 +37,7 @@ function _getScalarValue(value) {
     case valueCases.SPECIAL_VALUE:
         return value.getSpecialValue();
     default:
-        throw `Unkown value type ${value.getScalarValueCase()}.`;
+        throw new Error(`Unkown value type ${value.getScalarValueCase()}.`);
     }
 }
 
@@ -78,12 +78,17 @@ export class Property {
         case valueCases.LIST_VALUES:
             return _getListValue(wrappedValue.getListValues().getValuesList());
         default:
-            throw `Unknown value type ${wrappedValue.getValueCase()}.`;
+            throw new Error(`Unknown value type ${wrappedValue.getValueCase()}.`);
         }
     }
 
+    isList() {
+        const dtypeCase = this.wrappedProperty.getDataType().getDataTypeCase();
+        return dtypeCase === api.v1.DataType.DataTypeCase.LIST_DATA_TYPE;
+    }
+
     isReference() {
-        const wrappedDataType = this.wrappedProperty.getDataType()
+        const wrappedDataType = this.wrappedProperty.getDataType();
         const dtypeCase = wrappedDataType.getDataTypeCase();
         return (
             (dtypeCase === api.v1.DataType.DataTypeCase.REFERENCE_DATA_TYPE) ||
diff --git a/src/TransactionService.js b/src/TransactionService.js
index cfe1328990d3327f6fb1acb7d9105290817990a3..53e5cd5688e154cdf882557d0d654aa93c1f8c36 100644
--- a/src/TransactionService.js
+++ b/src/TransactionService.js
@@ -27,13 +27,19 @@ export class TransactionService {
         this.uri = uri || "/api";
     }
 
-    _PrepareTransaction(retrieveRequest) {
+    _PrepareTransaction(retrieveRequests) {
 
+        if (!(Array.isArray(retrieveRequests))) {
+            retrieveRequests = [retrieveRequests];
+        }
         const client = new api.v1.EntityTransactionServiceClient(this.uri, null, null);
-        var transactionRequest = new api.v1.TransactionRequest();
-        transactionRequest.setRetrieveRequest(retrieveRequest);
         var request = new api.v1.MultiTransactionRequest();
-        request.addRequests(transactionRequest);
+        var transactionRequest;
+        for (let retrieveRequest of retrieveRequests) {
+            transactionRequest = new api.v1.TransactionRequest();
+            transactionRequest.setRetrieveRequest(retrieveRequest);
+            request.addRequests(transactionRequest);
+        }
 
         const headers = {};
         return (res_cb, err_cb) => {
@@ -66,9 +72,12 @@ export class TransactionService {
         return query_request;
     }
 
-    async retrieve(id) {
-        const retrieveRequest = this._CreateRetrieveRequest(id);
-        return new Promise(this._PrepareTransaction(retrieveRequest));
+    async retrieve(ids) {
+        if (!(Array.isArray(ids))) {
+            ids = [ids]
+        }
+        const retrieveRequests = ids.map(id => this._CreateRetrieveRequest(id));
+        return new Promise(this._PrepareTransaction(retrieveRequests));
     }
 
     async executeQuery(query) {