diff --git a/javascript/package.json b/javascript/package.json
index 1cc608b267fb1be5d7df4e7551dca5cb29716d6b..bab32fc9af6cad2dda7cab5aa4307bebd8a0a301 100644
--- a/javascript/package.json
+++ b/javascript/package.json
@@ -28,6 +28,7 @@
     "data-uri-to-blob": "^0.0.4",
     "libmime": "^4.0.1",
     "libqp": "^1.1.0",
+    "lodash": "^4.17.11",
     "penpal": "^3.0.3",
     "pkijs": "^2.1.69",
     "pvutils": "^1.0.16",
diff --git a/javascript/src/constants/statuses.js b/javascript/src/constants/statuses.js
new file mode 100644
index 0000000000000000000000000000000000000000..64fe340b5b9cbac714070c61ae1a3bceba23af3e
--- /dev/null
+++ b/javascript/src/constants/statuses.js
@@ -0,0 +1 @@
+export const STATUS_DEVICE_REVOKED = "Device revoked";
diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js
index de04abf626655b9c0e45880c5e6045eedc090a8e..eee7100927f43fbef23db2c8f733d0ea5d79fcef 100644
--- a/javascript/src/iframe/viamapi-iframe.js
+++ b/javascript/src/iframe/viamapi-iframe.js
@@ -18,6 +18,7 @@ import {
 } from '../utilities/signingUtilities';
 import CryptoData from '../CryptoData';
 import Identity from '../Identity';
+import {STATUS_DEVICE_REVOKED} from '../constants/statuses';
 
 const penpalMethods = require('../../temp/penpal-methods').default;
 const WopiAPI = require('./wopiapi-iframe');
@@ -97,7 +98,7 @@ function setIdentityInLocalStorage(identityToStore, extendKey = true) {
 function getProfileData(identity) {
   return new Penpal.Promise(executeResultUpper => {
     executeRestfulFunction("private", viamApi,
-      viamApi.identityGetIdentityProfileData).then(executeResult => {
+      viamApi.identityGetIdentityProfileData, null).then(executeResult => {
       if(executeResult.code === "200") {
         var listItem = {};
 
@@ -193,6 +194,34 @@ function createEvent(actionId, type, payloads) {
   }
 }
 
+const destroyAuthentication = () => {
+  const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
+
+  window.viamApi.setIdentity("");
+  window.viamApi.setSessionData("", "");
+
+  clearPinCodeTtl(authenticationPublicKey);
+
+  localStorage.removeItem("uuid");
+  localStorage.removeItem("token");
+  localStorage.removeItem("authenticatedIdentity");
+
+  window.currentlyAuthenticatedIdentity = null;
+  window.lastTimeGetProfile = 0;
+};
+
+const destroyIdentity = () => {
+  destroyAuthentication();
+
+  if (window.currentlyLoadedIdentity) {
+    const { publicKey } = window.currentlyLoadedIdentity.authentication;
+
+    delete window.loadedIdentities[publicKey];
+    window.currentlyLoadedIdentity = null;
+    destroyIdentityFromLocalStorage(publicKey);
+  }
+};
+
 window.loadedIdentities = {};
 window.wopiAPI = new WopiAPI();
 window.collaboraApi = new CollaboraAPI();
@@ -202,6 +231,8 @@ window.currentlyAuthenticatedIdentity = null;
 window.currentlyLoadedIdentity = null;
 window.lastTimeGetProfile = 0;
 
+let iframeParent = null;
+
 const handleIdentityLogin = (identity, uuid, token) => {
   const { loadedIdentities, viamApi } = window;
   const { publicKey } = identity.authentication;
@@ -215,14 +246,24 @@ const handleIdentityLogin = (identity, uuid, token) => {
   setKeyForUUID(uuid, publicKey);
 };
 
-async function executeRestfulFunction(type, that, fn, ...args) {
+async function executeRestfulFunction(type, that, fn, config, ...args) {
   const { currentlyAuthenticatedIdentity, viamApi, currentlyLoadedIdentity } = window;
-  const response = await fn.apply(that, args);
+  const response = await fn.apply(that, [config, ...args]);
 
   const identity = currentlyAuthenticatedIdentity || currentlyLoadedIdentity;
-  const badSession = type === "private" && identity && response.data.code === "400" &&
-    response.data.status === "Bad session";
+  const { code, status } = response.data;
+
+  const deviceRevoked = type === "private" && code === "401" && status === STATUS_DEVICE_REVOKED;
+  if (deviceRevoked) {
+    destroyIdentity();
+
+    const event = createEvent("", "DeviceRevoked");
+    iframeParent.onEvent(event);
+
+    return response.data;
+  }
 
+  const badSession = type === "private" && identity && code === "400" && status === "Bad session";
   if (!badSession) return response.data;
 
   const loginResponse = await viamApi.identityLogin("previousaddeddevice");
@@ -231,7 +272,7 @@ async function executeRestfulFunction(type, that, fn, ...args) {
   const uuid = loginResponse.data.data["Uuid"];
   const token = loginResponse.data.data["Session"];
   handleIdentityLogin(identity, uuid, token);
-  const { data } = await fn.apply(that, args);
+  const { data } = await fn.apply(that, [config, ...args]);
   return data;
 }
 
@@ -336,7 +377,7 @@ function getCertificateForPassport(passportUUID, internal) {
         var certificate = keys["certificatePEM"];
         //download("passportCertificateBeforeSigning.crt", "text/plain", certificate)
         //cryptoData.setx509Certificate(keys["certificate"])
-        executeRestfulFunction("private", viamApi, viamApi.signSignCertificate, btoa(certificate), passportUUID).then(executeResult => {
+        executeRestfulFunction("private", viamApi, viamApi.signSignCertificate, null, btoa(certificate), passportUUID).then(executeResult => {
           if(executeResult.code === "200") {
             var signedCertificate = atob(executeResult.data["SignedCertificate"]);
             //download("passportCertificateAfterSigning.crt", "text/plain", signedCertificate)
@@ -423,6 +464,7 @@ const connection = Penpal.connectToParent({
       window.WOPI_URL = wopiUrl.charAt(wopiUrl.length - 1) === "/" ? wopiUrl : wopiUrl + "/";
       window.COLLABORA_URL = collaboraUrl.charAt(collaboraUrl.length - 1) === "/" ? collaboraUrl : collaboraUrl + "/";
     },
+    ...penpalMethods,
     createIdentity(pinCode) {
       return new Penpal.Promise(result => {
         createPassportCertificate(makeid()).then(function(keys){
@@ -495,7 +537,7 @@ const connection = Penpal.connectToParent({
       return new Penpal.Promise(result => {
         viamApi.setIdentity(identity.authentication.publicKey);
 
-        executeRestfulFunction("public", viamApi, viamApi.identityConfirmIdentificator,confirmationCodeArg).then(executeResult => {
+        executeRestfulFunction("public", viamApi, viamApi.identityConfirmIdentificator, null, confirmationCodeArg).then(executeResult => {
           result(executeResult);
         });
       });
@@ -504,7 +546,7 @@ const connection = Penpal.connectToParent({
       return new Penpal.Promise(result => {
         viamApi.setIdentity(identity.authentication.publicKey);
 
-        executeRestfulFunction("public", viamApi, viamApi.identityGetIdentificatorByRegisterToken,tokenArg).then(executeResult => {
+        executeRestfulFunction("public", viamApi, viamApi.identityGetIdentificatorByRegisterToken, null, tokenArg).then(executeResult => {
           result(executeResult);
         });
       });
@@ -513,7 +555,7 @@ const connection = Penpal.connectToParent({
       return new Penpal.Promise(result => {
         viamApi.setIdentity(identity.authentication.publicKey);
 
-        executeRestfulFunction("public", viamApi, viamApi.identitySubmitIdentificator,identificatorArg, registerToken).then(executeResult => {
+        executeRestfulFunction("public", viamApi, viamApi.identitySubmitIdentificator, null, identificatorArg, registerToken).then(executeResult => {
           result(executeResult);
         });
       });
@@ -522,7 +564,7 @@ const connection = Penpal.connectToParent({
       return new Penpal.Promise(result => {
         viamApi.setIdentity(identity.authentication.publicKey);
 
-        executeRestfulFunction("public", viamApi, viamApi.identitySubmitRegisterClaims,givennameArg,familynameArg,emailArg,phonenumberArg).then(executeResult => {
+        executeRestfulFunction("public", viamApi, viamApi.identitySubmitRegisterClaims, null, givennameArg,familynameArg,emailArg,phonenumberArg).then(executeResult => {
           result(executeResult);
         });
       });
@@ -531,7 +573,7 @@ const connection = Penpal.connectToParent({
       return new Penpal.Promise(result => {
         viamApi.setIdentity(registerIdentity.authentication.publicKey);
 
-        executeRestfulFunction("public", viamApi, viamApi.identityAgreeOnRegistration).then(executeResult => {
+        executeRestfulFunction("public", viamApi, viamApi.identityAgreeOnRegistration, null).then(executeResult => {
           let sequence = Promise.resolve();
           if (executeResult.code === "200") {
             sequence = sequence.then(() => {
@@ -555,7 +597,7 @@ const connection = Penpal.connectToParent({
       return new Penpal.Promise(result => {
         viamApi.setIdentity(identity.authentication.publicKey);
 
-        executeRestfulFunction("public", viamApi, viamApi.identityResendConfirmationCode,identificatorArg).then(executeResult => {
+        executeRestfulFunction("public", viamApi, viamApi.identityResendConfirmationCode, null, identificatorArg).then(executeResult => {
           result(executeResult);
         });
       });
@@ -578,6 +620,7 @@ const connection = Penpal.connectToParent({
           "public",
           window.viamApi,
           window.viamApi.identityLogin,
+          null,
           mode, requestCode,
           requestActionID
         );
@@ -601,6 +644,19 @@ const connection = Penpal.connectToParent({
 
       return responseToClient;
     },
+    identityPullAvatarFromGravatar: async () => {
+      const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
+
+      if (
+        !authenticationPublicKey ||
+        !window.loadedIdentities[authenticationPublicKey] ||
+        !extendPinCodeTtl(authenticationPublicKey)
+      ) {
+        return encodeResponse("400", "", "Identity not authenticated");
+      }
+
+      return await executeRestfulFunction("private", viamApi, viamApi.identityPullAvatarFromGravatar);
+    },
     identityAddNewDevice() {
       return new Penpal.Promise(result => {
         const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
@@ -628,7 +684,7 @@ const connection = Penpal.connectToParent({
           })
         }
 
-        executeRestfulFunction("private", viamApi, viamApi.identityAddNewDevice).then(executeResult => {
+        executeRestfulFunction("private", viamApi, viamApi.identityAddNewDevice, null).then(executeResult => {
           if (executeResult.code === "200") {
             var actionID = executeResult.data["ActionID"];
             var QrCode = executeResult.data["QrCode"];
@@ -667,7 +723,7 @@ const connection = Penpal.connectToParent({
           })
         }
 
-        executeRestfulFunction("private", viamApi, viamApi.identityDestroyKeysForDevice, btoa(authenticationPublicKeyArg)).then(executeResult => {
+        executeRestfulFunction("private", viamApi, viamApi.identityDestroyKeysForDevice, null, btoa(authenticationPublicKeyArg)).then(executeResult => {
           result(executeResult);
         });
       });
@@ -685,20 +741,11 @@ const connection = Penpal.connectToParent({
       const identityLogoutResponse = await executeRestfulFunction(
         "private",
         window.viamApi,
-        window.viamApi.identityLogout
+        window.viamApi.identityLogout,
+        null
       );
 
-      window.viamApi.setIdentity("");
-      window.viamApi.setSessionData("", "");
-      clearPinCodeTtl(authenticationPublicKey);
-
-      localStorage.removeItem("uuid");
-      localStorage.removeItem("token");
-      localStorage.removeItem("authenticatedIdentity");
-      delete window.loadedIdentities[authenticationPublicKey];
-      window.currentlyLoadedIdentity = null;
-      window.currentlyAuthenticatedIdentity = null;
-      window.lastTimeGetProfile = 0;
+      destroyAuthentication();
 
       return identityLogoutResponse;
     },
@@ -706,7 +753,7 @@ const connection = Penpal.connectToParent({
       return new Penpal.Promise(result => {
         viamApi.setIdentity(restoreAccessIdentity.authentication.publicKey);
 
-        executeRestfulFunction("public", viamApi, viamApi.identityRestoreAccess, identificator).then(executeResult => {
+        executeRestfulFunction("public", viamApi, viamApi.identityRestoreAccess, null, identificator).then(executeResult => {
             result(executeResult);
         });
       });
@@ -871,7 +918,7 @@ const connection = Penpal.connectToParent({
       passportChain.push(passportCertificate);
 
       response = await executeRestfulFunction(
-        "private", window.viamApi, window.viamApi.passportGetEmailWithHeaderByPassport, passportUUID, emailMessage);
+        "private", window.viamApi, window.viamApi.passportGetEmailWithHeaderByPassport, null, passportUUID, emailMessage);
 
       if (response.code !== "200") {
         return encodeResponse("400", "", response.status);
@@ -880,7 +927,7 @@ const connection = Penpal.connectToParent({
       const signedEmail = await signEmail(response.data, certificateOneTime, passportChain, privateKeyOneTime);
 
       response = await executeRestfulFunction(
-        "private", window.viamApi, window.viamApi.signResignEmail, passportUUID, signedEmail);
+        "private", window.viamApi, window.viamApi.signResignEmail, null, passportUUID, signedEmail);
 
       if (response.code !== "200") {
         return encodeResponse("400", "", response.status);
@@ -888,6 +935,51 @@ const connection = Penpal.connectToParent({
 
       return encodeResponse("200", response.data, "Email signed");
     },
+    documentCreateDocument: async (path, passportUUID, contenttype) => {
+      const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
+      if (
+        !authenticationPublicKey ||
+        !window.loadedIdentities[authenticationPublicKey] ||
+        !extendPinCodeTtl(authenticationPublicKey)
+      ) {
+        return encodeResponse("400", "", "Identity not authenticated");
+      }
+
+      const config = {
+        headers: {
+          path,
+          passportuuid: passportUUID,
+          contenttype
+        }
+      };
+      const response = await executeRestfulFunction("private", window.viamApi, window.viamApi.documentCreateDocument,
+        config);
+
+      return encodeResponse("200", response.data, "Document created");
+    },
+    documentPutDocument: async (passportUUID, resourceid, file) => {
+      const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
+      if (
+        !authenticationPublicKey ||
+        !window.loadedIdentities[authenticationPublicKey] ||
+        !extendPinCodeTtl(authenticationPublicKey)
+      ) {
+        return encodeResponse("400", "", "Identity not authenticated");
+      }
+
+      const config = {
+        headers: {
+          'Content-Type': 'multipart/form-data',
+          passportuuid: passportUUID,
+          resourceid
+        }
+      };
+
+      const response = await executeRestfulFunction(
+        "private", window.viamApi, window.viamApi.documentPutDocument, config, file);
+
+      return encodeResponse("200", response.data, "Document created");
+    },
     hasSession() {
       return new Penpal.Promise(result => {
         const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
@@ -913,7 +1005,7 @@ const connection = Penpal.connectToParent({
           })
         }
 
-        executeRestfulFunction("private", viamApi, viamApi.identityHasSession).then(executeResult => {
+        executeRestfulFunction("private", viamApi, viamApi.identityHasSession, null).then(executeResult => {
           result(executeResult);
         });
       });
@@ -922,7 +1014,7 @@ const connection = Penpal.connectToParent({
       return new Penpal.Promise(result => {
         viamApi.setIdentity("marketingapppublickey");
 
-        executeRestfulFunction("public", viamApi, viamApi.marketingSignUpIdentificator, identificator, reference).then(executeResult => {
+        executeRestfulFunction("public", viamApi, viamApi.marketingSignUpIdentificator, null, identificator, reference).then(executeResult => {
           viamApi.setIdentity("");
           viamApi.setSessionData("", "");
           result(executeResult);
@@ -933,7 +1025,7 @@ const connection = Penpal.connectToParent({
       return new Penpal.Promise(result => {
         viamApi.setIdentity("marketingapppublickey");
 
-        executeRestfulFunction("public", viamApi, viamApi.marketingGetIdentificatorProfile, identificator, pincode).then(executeResult => {
+        executeRestfulFunction("public", viamApi, viamApi.marketingGetIdentificatorProfile, null, identificator, pincode).then(executeResult => {
           viamApi.setIdentity("");
           viamApi.setSessionData("", "");
           result(executeResult);
@@ -944,7 +1036,7 @@ const connection = Penpal.connectToParent({
       return new Penpal.Promise(result => {
         viamApi.setIdentity("marketingapppublickey");
 
-        executeRestfulFunction("public", viamApi, viamApi.marketingExecuteEventForIdentificator, identificator, pincode, event).then(executeResult => {
+        executeRestfulFunction("public", viamApi, viamApi.marketingExecuteEventForIdentificator, null, identificator, pincode, event).then(executeResult => {
           viamApi.setIdentity("");
           viamApi.setSessionData("", "");
           result(executeResult);
@@ -1025,14 +1117,48 @@ const connection = Penpal.connectToParent({
         result(res)
       })
     },
+
+    // Collabora APIs
     collaboraDiscovery() {
       return collaboraApi.discovery().then(apps => apps);
     },
-    ...penpalMethods
+
+    // WOPI
+    getPassports: async fileId => {
+      const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
+
+      if (
+        !authenticationPublicKey ||
+        !window.loadedIdentities[authenticationPublicKey] ||
+        !extendPinCodeTtl(authenticationPublicKey)
+      ) {
+        return encodeResponse("400", "", "Identity not authenticated");
+      }
+
+      const response = await wopiAPI.getPassports(fileId);
+      return response.data;
+    },
+
+    wopiPutFile: async (path, accessToken, file) => {
+      const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
+
+      if (
+        !authenticationPublicKey ||
+        !window.loadedIdentities[authenticationPublicKey] ||
+        !extendPinCodeTtl(authenticationPublicKey)
+      ) {
+        return encodeResponse("400", "", "Identity not authenticated");
+      }
+
+      const response = await wopiAPI.putDocument(path, accessToken, file);
+      return response.data;
+    }
   }
 });
 
 connection.promise.then(parent => {
+  iframeParent = parent;
+
   if (!navigator.cookieEnabled) {
     console.warn("Cookie disabled. Can't start library.");
     return;
@@ -1166,7 +1292,7 @@ connection.promise.then(parent => {
     if (window.currentlyLoadedIdentity && !anynomousDeviceKeyEventsProcessing && !window.currentlyAuthenticatedIdentity) {
       anynomousDeviceKeyEventsProcessing = true;
       try {
-        const executeResult = await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventGetNewEventsWithoutSession, "devicekey");
+        const executeResult = await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventGetNewEventsWithoutSession, null, "devicekey");
         if(executeResult.code === "200") {
           const eventsLen = executeResult.data.length;
           let changedMaxDeviceKeyAnonymousEventTime = false;
@@ -1223,7 +1349,7 @@ connection.promise.then(parent => {
 
           if(changedMaxDeviceKeyAnonymousEventTime) {
             await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventUpdateLastViewedWithoutSession,
-              "devicekey", maxDeviceKeyAnonymousEventTime.toString());
+              null, "devicekey", maxDeviceKeyAnonymousEventTime.toString());
           }
         }
       } catch (e) {
@@ -1235,7 +1361,7 @@ connection.promise.then(parent => {
     if (window.currentlyAuthenticatedIdentity != null && eventsDeviceEventsProcessing === false) {
       eventsDeviceEventsProcessing = true;
       try {
-        const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, "devicekey");
+        const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "devicekey");
         if (executeResult.code === "200") {
           const eventsLen = executeResult.data.length;
           const changedMaxDeviceKeyEventTime = false;
@@ -1257,7 +1383,7 @@ connection.promise.then(parent => {
             maxDeviceKeyEventTime = Math.max(maxDeviceKeyEventTime, event.stamp);
           }
           if(changedMaxDeviceKeyEventTime) {
-            await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, "devicekey",
+            await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "devicekey",
               maxDeviceKeyEventTime.toString());
           }
         }
@@ -1270,7 +1396,7 @@ connection.promise.then(parent => {
     if (window.currentlyAuthenticatedIdentity != null && eventsEntityEventsProcessing === false) {
       eventsEntityEventsProcessing = true;
       try {
-        const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, "entity");
+        const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "entity");
 
         if (executeResult.code === "200") {
           const eventsLen = executeResult.data.length;
@@ -1296,7 +1422,7 @@ connection.promise.then(parent => {
             maxEntityEventTime = Math.max(maxEntityEventTime, event.stamp);
           }
           if(changedMaxEntityEventTime) {
-            await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, "entity",
+            await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "entity",
               maxEntityEventTime.toString());
           }
         }
diff --git a/javascript/src/iframe/wopiapi-iframe.js b/javascript/src/iframe/wopiapi-iframe.js
index 8d5b72aaab4722fc51f4167f93859253fa2901d1..c009f9ed020171a5bafc2a4ff4b97c60aff11f9f 100644
--- a/javascript/src/iframe/wopiapi-iframe.js
+++ b/javascript/src/iframe/wopiapi-iframe.js
@@ -19,4 +19,25 @@ WopiAPI.prototype.getPassports = function (fileID) {
   return axios(requestConfig);
 };
 
+WopiAPI.prototype.putDocument = function (path, accessToken, file) {
+  const { publicKey, uuid, token, deviceHash } = window.viamApi.getConfig().headers;
+  path = path[0] === "/" ? path : `/${path}`;
+  const requestConfig = {
+    url: `${window.WOPI_URL}files${path}/contents`,
+    method: 'POST',
+    headers: {
+      publicKey,
+      uuid,
+      token,
+      deviceHash
+    },
+    params: {
+      access_token: accessToken
+    },
+    data: file
+  };
+
+  return axios(requestConfig);
+};
+
 module.exports = WopiAPI;
diff --git a/main.go b/main.go
index f688ea9944a2a2475ec20e9ca8bb7fe7334b6ff5..af0efbcb69289482212e8fffe26c674d9a2f1c2a 100644
--- a/main.go
+++ b/main.go
@@ -43,7 +43,6 @@ func buildPenpalMethods() string {
 			"export default {\n"
 
 	methods := generatePenpalRemoteMethods(endPoints)
-	methods += getWopiAPIPenpalMethods()
 
 	result += methods
 
@@ -57,6 +56,7 @@ func buildViamAPI() string {
 	endPoints := server.GetEndPoints(prefixes)
 
 	result := "const axios = require('axios');\n"
+	result += "const merge = require('lodash/merge');\n"
 
 	var keys []string
 	for k := range endPoints {
@@ -78,7 +78,6 @@ func buildViamAPI() string {
 		"    }\n" +
 		"}\n\n"
 
-
 	result += "ViamAPI.prototype.setSessionData = function(uuid, token) {\n" +
 		"    this.config.headers.uuid = uuid;\n" +
 		"    this.config.headers.token = token;\n" +
@@ -103,11 +102,6 @@ func buildViamAPI() string {
 
 			packageStr := splits[len(splits)-2]
 
-			/*if !packageCreated[packageStr] {
-				result += "ViamAPI.prototype.\"" + packageStr + "\" = {}\n\n"
-				packageCreated[packageStr] = true
-			}*/
-
 			methodStr := splits[len(splits)-1]
 
 			form := endPoints[url].Form
@@ -129,7 +123,13 @@ func buildViamAPI() string {
 				}
 			}
 
-			result += "ViamAPI.prototype." + packageStr + strings.Title(methodStr) + " = function(" + args + ") {\n" +
+			lastComma := ","
+
+			if args == "" {
+				lastComma = ""
+			}
+
+			result += "ViamAPI.prototype." + packageStr + strings.Title(methodStr) + " = function(config" + lastComma + args + ") {\n" +
 				"    return axios.post(window.API_HOST + '" + packageStr + "/" + methodStr + "', {\n"
 
 			for i := 0; i < lenFields; i++ {
@@ -140,7 +140,7 @@ func buildViamAPI() string {
 				result += "\n"
 			}
 
-			result += "    }, this.config);\n" +
+			result += "    }, merge({}, this.config, config));\n" +
 				"};\n\n"
 		} else {
 			splits := strings.Split(url, "/")
@@ -154,8 +154,8 @@ func buildViamAPI() string {
 
 			methodStr := splits[len(splits)-1]
 
-			result += "ViamAPI.prototype." + packageStr + strings.Title(methodStr) + " = function() {\n" +
-				"    return axios.post(window.API_HOST + '" + packageStr + "/" + methodStr + "', {}, this.config);\n" +
+			result += "ViamAPI.prototype." + packageStr + strings.Title(methodStr) + " = function(config, data) {\n" +
+				"    return axios.post(window.API_HOST + '" + packageStr + "/" + methodStr + "', data || {}, merge({}, this.config, config));\n" +
 				"};\n\n"
 		}
 	}
@@ -589,7 +589,7 @@ func generatePenpalRemoteMethods(endPoints map[string]*server.EndPoint) string {
 
 	privateCheckSnippet := `
         const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
-	
+
 	    if (authenticationPublicKey === null) {
 		    result({
 			    "data" : "",
@@ -597,15 +597,15 @@ func generatePenpalRemoteMethods(endPoints map[string]*server.EndPoint) string {
 			    "status" : "Identity not authenticated"
 		    });
 	    }
-	
+
 	    if (loadedIdentities[authenticationPublicKey] === null) {
 		    result({
 			    "data" : "",
 			    "code" : "400",
 			    "status" : "Identity not authenticated"
 		    });
- 	    } 
-	
+ 	    }
+
 	    const success = extendPinCodeTtl(authenticationPublicKey);
 
 	    if(success === false) {
@@ -614,7 +614,7 @@ func generatePenpalRemoteMethods(endPoints map[string]*server.EndPoint) string {
 			    "status" : "Identity not authenticated"
 		    })
 		}
-		
+
 	`
 
 	for i := 0; i < keysLen; i++ {
@@ -627,7 +627,7 @@ func generatePenpalRemoteMethods(endPoints map[string]*server.EndPoint) string {
 		if url == "/identity/getIdentityProfileData" {
 			privateCheckSnippet = `
 				const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
-			
+
 				if (authenticationPublicKey === null) {
 					result({
 						"data" : "",
@@ -635,15 +635,15 @@ func generatePenpalRemoteMethods(endPoints map[string]*server.EndPoint) string {
 						"status" : "Identity not authenticated"
 					});
 				}
-			
+
 				if (loadedIdentities[authenticationPublicKey] === null) {
 					result({
 						"data" : "",
 						"code" : "400",
 						"status" : "Identity not authenticated"
 					});
-				} 
-							
+				}
+
 			`
 		}
 
@@ -652,11 +652,6 @@ func generatePenpalRemoteMethods(endPoints map[string]*server.EndPoint) string {
 
 			packageStr := splits[len(splits)-2]
 
-			/*if !packageCreated[packageStr] {
-				result += "ViamAPI.prototype.\"" + packageStr + "\" = {}\n\n"
-				packageCreated[packageStr] = true
-			}*/
-
 			methodStr := splits[len(splits)-1]
 
 			form := endPoints[url].Form
@@ -678,12 +673,6 @@ func generatePenpalRemoteMethods(endPoints map[string]*server.EndPoint) string {
 				}
 			}
 
-			/*identity_login(modeArg,codeArg,actionIDArg) {
-					return new Penpal.Promise(result => {
-						viamApi.identity_login(modeArg,codeArg,actionIDArg).then((response) => { result(response.data);});
-					});
-			}*/
-
 			snippet := ""
 
 			if endPoints[url].HandlerType == "private" {
@@ -698,7 +687,7 @@ func generatePenpalRemoteMethods(endPoints map[string]*server.EndPoint) string {
 
 			method := packageStr + strings.Title(methodStr) + ": function(" + args + ") {\n" +
 				"    return new Penpal.Promise(function(result) {\n" + snippet +
-				"    executeRestfulFunction(\"" + endPoints[url].HandlerType + "\", viamApi, viamApi." + packageStr + strings.Title(methodStr) + lastComma + args + ").then(function(executeResult) {\n" +
+				"    executeRestfulFunction(\"" + endPoints[url].HandlerType + "\", viamApi, viamApi." + packageStr + strings.Title(methodStr) + ", null" + lastComma + args + ").then(function(executeResult) {\n" +
 				"            result(executeResult);\n" +
 				"        });\n" +
 				"    });\n" +
@@ -716,11 +705,6 @@ func generatePenpalRemoteMethods(endPoints map[string]*server.EndPoint) string {
 
 			packageStr := splits[len(splits)-2]
 
-			/*if !packageCreated[packageStr] {
-				result += "ViamAPI.prototype.\"" + packageStr + "\" = {}\n\n"
-				packageCreated[packageStr] = true
-			}*/
-
 			methodStr := splits[len(splits)-1]
 
 			snippet := ""
@@ -731,7 +715,7 @@ func generatePenpalRemoteMethods(endPoints map[string]*server.EndPoint) string {
 
 			method := packageStr + strings.Title(methodStr) + ": function() {\n" +
 				"    return new Penpal.Promise(function(result) {\n" + snippet +
-				"    executeRestfulFunction(\"" + endPoints[url].HandlerType + "\", viamApi, viamApi." + packageStr + strings.Title(methodStr) + ").then(function(executeResult) {\n" +
+				"    executeRestfulFunction(\"" + endPoints[url].HandlerType + "\", viamApi, viamApi." + packageStr + strings.Title(methodStr) + ", null).then(function(executeResult) {\n" +
 				"            result(executeResult);\n" +
 				"        });\n" +
 				"    });\n" +
@@ -750,39 +734,3 @@ func generatePenpalRemoteMethods(endPoints map[string]*server.EndPoint) string {
 
 	return methods
 }
-
-func getWopiAPIPenpalMethods() string {
-	return `getPassports: function(fileID) {
-		return new Penpal.Promise(function(result) {
-			const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
-			if (authenticationPublicKey === null) {
-				result({
-					"data" : "",
-					"code" : "400",
-					"status" : "Identity not authenticated"
-				});
-			}
-			
-			if (loadedIdentities[authenticationPublicKey] === null) {
-				result({
-					"data" : "",
-					"code" : "400",
-					"status" : "Identity not authenticated"
-				});
-			}
-			
-			const success = extendPinCodeTtl(authenticationPublicKey);
-
-			if (success === false) {
-				result({"data" : "",
-					"code" : "400",
-					"status" : "Identity not authenticated"
-				});
-			}
-
-			wopiAPI.getPassports(fileID).then(function(response) {
-				result(response.data);
-			});
-		});
-	}`
-}