diff --git a/Gopkg.toml b/Gopkg.toml
index 349b503370d11addf17bca0a46703d4e5aa98825..6f91ea14aafc20ad5c61798af9f5b81bb3ec204a 100644
--- a/Gopkg.toml
+++ b/Gopkg.toml
@@ -25,7 +25,7 @@
 #   unused-packages = true
 
 [[constraint]]
-  branch = "master"
+  branch = "19-get-access-token-for-specific-resource-and-passport"
   name = "code.vereign.com/code/restful-api"
 
 [prune]
diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js
index 8a67381fb7b4cbce471db29d48b063a62bae6c85..b8ca39f3c408d09753cb95862e499f86e9101139 100644
--- a/javascript/src/iframe/viamapi-iframe.js
+++ b/javascript/src/iframe/viamapi-iframe.js
@@ -1623,7 +1623,7 @@ const connection = Penpal.connectToParent({
       return response.data;
     },
 
-    wopiCreateDocument: async (passportUUID, path, contentType, title) => {
+    wopiCreateDocument: async (passportUUID, path, title) => {
       const authenticationPublicKey = localStorage.getItem(
         "authenticatedIdentity"
       );
@@ -1639,23 +1639,56 @@ const connection = Penpal.connectToParent({
         headers: {
           path,
           passportuuid: passportUUID,
-          contentType,
           title
         }
       };
-      const executeResult = await executeRestfulFunction(
+      const createDocumentResult = await executeRestfulFunction(
         "private",
         window.viamApi,
         window.viamApi.documentCreateDocument,
         config
       );
-      if (executeResult.code !== "200") return executeResult;
-      const resourceID = executeResult.data;
-      const passports = await wopiAPI.getPassports(resourceID, contentType);
-      return passports;
+
+      if (createDocumentResult.code !== "200") {
+        return createDocumentResult;
+      }
+
+      const resourceID = createDocumentResult.data;
+
+      const accessTokenResponse = await wopiAPI.getAccessToken(passportUUID, resourceID);
+
+      if (accessTokenResponse.data.code !== "200") {
+        return accessTokenResponse.data;
+      }
+
+      const accessToken = accessTokenResponse.data.data;
+
+      const result = {
+        resourceID,
+        accessToken
+      };
+
+      return encodeResponse("200", result, "ok");
+    },
+
+    wopiGetAccessToken: async (passportUUID, resourceID, contentType) => {
+      const authenticationPublicKey = localStorage.getItem(
+        "authenticatedIdentity"
+      );
+
+      if (
+        !authenticationPublicKey ||
+        !window.loadedIdentities[authenticationPublicKey] ||
+        !extendPinCodeTtl(authenticationPublicKey)
+      ) {
+        return encodeResponse("400", "", "Identity not authenticated");
+      }
+
+      const response = await wopiAPI.getAccessToken(passportUUID, resourceID, contentType);
+      return response.data;
     },
 
-    wopiPutFile: async (path, accessToken, file) => {
+    wopiPutFile: async (resourceID, accessToken, file) => {
       const authenticationPublicKey = localStorage.getItem(
         "authenticatedIdentity"
       );
@@ -1668,7 +1701,7 @@ const connection = Penpal.connectToParent({
         return encodeResponse("400", "", "Identity not authenticated");
       }
 
-      const response = await wopiAPI.putDocument(path, accessToken, file);
+      const response = await wopiAPI.putDocument(resourceID, accessToken, file);
       return response.data;
     }
   }
diff --git a/javascript/src/iframe/wopiapi-iframe.js b/javascript/src/iframe/wopiapi-iframe.js
index 9de61de7ce47792039a5944cd2e76ae4c68aa7f1..1cde86a87053d5fa061c45179ea632014bc893e6 100644
--- a/javascript/src/iframe/wopiapi-iframe.js
+++ b/javascript/src/iframe/wopiapi-iframe.js
@@ -47,6 +47,38 @@ WopiAPI.prototype.getPassports = function(fileID) {
   return axios(requestConfig);
 };
 
+// contentType is optional.
+// When not specified, function returns token, which can write multiple files and only read the last one.
+// When specified, function returns read-write token for the specified contentType.
+WopiAPI.prototype.getAccessToken = function(passportUUID, resourceID, contentType = "") {
+  const {
+    publicKey,
+    uuid,
+    token,
+    deviceHash
+  } = window.viamApi.getConfig().headers;
+
+  if (!contentType) {
+    contentType = "";
+  }
+
+  const requestConfig = {
+    url: `${window.WOPI_URL}getAccessToken`,
+    method: "POST",
+    headers: {
+      publicKey,
+      uuid,
+      token,
+      deviceHash,
+      passportUUID: encodeURI(passportUUID),
+      resourceID: encodeURI(resourceID),
+      contentType: encodeURI(contentType)
+    }
+  };
+
+  return axios(requestConfig);
+}
+
 WopiAPI.prototype.putDocument = function(resourceID, accessToken, file) {
   const {
     publicKey,