diff --git a/dist/index.d.ts b/dist/index.d.ts
index c116b57ea3b5d35efc783c395e9c6dcd01b755bd..ec88b41fb0067f9c86c0122335dbb7205a16e0c4 100644
--- a/dist/index.d.ts
+++ b/dist/index.d.ts
@@ -1,5 +1,6 @@
 export * from "./types";
 export * from "./utils/common";
+export { default as getMerkleTreeRootHash } from "./utils/getMerkleTreeRootHash";
 export { default as CloudflareService } from "./services/CloudflareService";
 export { default as VerificationService } from "./services/VerificationService";
 export { default as StatusesService } from "./services/StatusesService";
diff --git a/dist/index.js b/dist/index.js
index 72d2d74973809087f2cfe7be991f07f7d536d536..0143f9a797d7fef5e8799f82215b11d2a312aa93 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -17,9 +17,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.QrCodeTemplate = exports.VerificationError = exports.CryptoService = exports.IPFSService = exports.QrCodeDataService = exports.CommonUtils = exports.StatusesService = exports.VerificationService = exports.CloudflareService = void 0;
+exports.QrCodeTemplate = exports.VerificationError = exports.CryptoService = exports.IPFSService = exports.QrCodeDataService = exports.CommonUtils = exports.StatusesService = exports.VerificationService = exports.CloudflareService = exports.getMerkleTreeRootHash = void 0;
 __exportStar(require("./types"), exports);
 __exportStar(require("./utils/common"), exports);
+var getMerkleTreeRootHash_1 = require("./utils/getMerkleTreeRootHash");
+Object.defineProperty(exports, "getMerkleTreeRootHash", { enumerable: true, get: function () { return __importDefault(getMerkleTreeRootHash_1).default; } });
 var CloudflareService_1 = require("./services/CloudflareService");
 Object.defineProperty(exports, "CloudflareService", { enumerable: true, get: function () { return __importDefault(CloudflareService_1).default; } });
 var VerificationService_1 = require("./services/VerificationService");
diff --git a/dist/services/CryptoService/index.js b/dist/services/CryptoService/index.js
index 5405c3e09c38920b8948c36167f3410dc3b30817..449752907df27b28e1438efa16041476592dec9d 100644
--- a/dist/services/CryptoService/index.js
+++ b/dist/services/CryptoService/index.js
@@ -14,11 +14,12 @@ class CryptoServiceProxy {
         // this._target = typeof crypto !== "undefined" && crypto.subtle
         //     ? new CryptoServiceWeb()
         //     : new CryptoServiceNode();
-        if (typeof document !== 'undefined') {
+        if (typeof document !== "undefined") {
             // I'm on the web!
             console.log("I'm on the web!");
         }
-        else if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
+        else if (typeof navigator !== "undefined" &&
+            navigator.product === "ReactNative") {
             // I'm in react-native
             console.log("I'm in react-native");
         }
diff --git a/dist/services/QrCodeDataService.js b/dist/services/QrCodeDataService.js
index 1c668db6c7598507da2882538839fcad47506bd2..049d590053f1774e724166a01d75bb325a289a3b 100644
--- a/dist/services/QrCodeDataService.js
+++ b/dist/services/QrCodeDataService.js
@@ -8,10 +8,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
         step((generator = generator.apply(thisArg, _arguments || [])).next());
     });
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
 const qrcode_data_pb_1 = require("../generated/qrcode_data_pb");
 const common_1 = require("../utils/common");
-const index_1 = require("../index");
+const CryptoService_1 = __importDefault(require("./CryptoService"));
 const EmailDataMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.EmailData_V1;
 const KeyDataMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.KeyData_V1;
 const WrapperDataMessage = qrcode_data_pb_1.vereign.protobuf.qrcode_data.WrapperData;
@@ -74,13 +77,13 @@ const assembleQrCodeData = (head, tail) => {
     return Buffer.concat([Buffer.from(head), Buffer.from(tail)]);
 };
 const calculateQRCodeSignature = (accountPrivateKey, qrCodeHash) => __awaiter(void 0, void 0, void 0, function* () {
-    const signature = yield index_1.CryptoService.signRSA(accountPrivateKey, Buffer.from(qrCodeHash));
+    const signature = yield CryptoService_1.default.signRSA(accountPrivateKey, Buffer.from(qrCodeHash));
     return (0, common_1.arrayBufferToBase64)(signature);
 });
 const verifyQrCodeSignature = (publicKey, qrCodeSignature, recipientQRCodeHash) => __awaiter(void 0, void 0, void 0, function* () {
     const qrCodeSignatureAsBuffer = (0, common_1.base64ToArrayBuffer)(qrCodeSignature);
     const recipientQRCodeHashAsBuffer = Buffer.from(recipientQRCodeHash);
-    const result = yield index_1.CryptoService.verifyRSASignature(publicKey, recipientQRCodeHashAsBuffer, qrCodeSignatureAsBuffer);
+    const result = yield CryptoService_1.default.verifyRSASignature(publicKey, recipientQRCodeHashAsBuffer, qrCodeSignatureAsBuffer);
     return result;
 });
 exports.default = {
diff --git a/dist/services/VerificationService/VerificationService.js b/dist/services/VerificationService/VerificationService.js
index 1fab029b9dab146e4a585fea013d6533213695e9..d9b0a3305666f7a4cbe0a1f574f945ad85343976 100644
--- a/dist/services/VerificationService/VerificationService.js
+++ b/dist/services/VerificationService/VerificationService.js
@@ -13,7 +13,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.BLOCK_DATA_RETRIEVED = exports.STATUS_BATCH_VERIFIED = exports.TRANSACTION_RETRIEVED = void 0;
-const index_1 = require("../../index");
+const CryptoService_1 = __importDefault(require("../CryptoService"));
+const common_1 = require("../../utils/common");
+const getMerkleTreeRootHash_1 = __importDefault(require("../../utils/getMerkleTreeRootHash"));
 const EventEmitter = require("eventemitter2");
 const AeternityService_1 = __importDefault(require("../AeternityService/AeternityService"));
 const CloudflareService_1 = __importDefault(require("../CloudflareService"));
@@ -184,14 +186,14 @@ class VerificationService extends EventEmitter {
     }
     verifyStatusSHA256Batch(status, statusesBatchData) {
         return __awaiter(this, void 0, void 0, function* () {
-            const statusSha256 = (0, index_1.arrayBufferToBase64)(yield index_1.CryptoService.SHA256(status, "base64"));
+            const statusSha256 = (0, common_1.arrayBufferToBase64)(yield CryptoService_1.default.SHA256(status, "base64"));
             let verified = false;
             const statusPosition = statusesBatchData.items.indexOf(statusSha256) + 1;
             if (statusPosition > 0) {
                 const bytesToHash = [];
                 let hashesTotalByteLength = 0;
                 for (const statusHash of statusesBatchData.items) {
-                    const statusHashBytes = (0, index_1.base64ToArrayBuffer)(statusHash);
+                    const statusHashBytes = (0, common_1.base64ToArrayBuffer)(statusHash);
                     hashesTotalByteLength += statusHashBytes.byteLength;
                     bytesToHash.push(new Uint8Array(statusHashBytes));
                 }
@@ -201,7 +203,7 @@ class VerificationService extends EventEmitter {
                     batchBytes.set(statusHashBytes, bytesOffset);
                     bytesOffset += statusHashBytes.byteLength;
                 });
-                const batchHash = (0, index_1.arrayBufferToBase64)(yield index_1.CryptoService.SHA256(batchBytes));
+                const batchHash = (0, common_1.arrayBufferToBase64)(yield CryptoService_1.default.SHA256(batchBytes));
                 verified = batchHash === statusesBatchData.hash;
             }
             else {
@@ -218,8 +220,8 @@ class VerificationService extends EventEmitter {
     }
     verifyStatusesMerkleTree(nodeToVerify, merkleTree) {
         return __awaiter(this, void 0, void 0, function* () {
-            const leaves = yield Promise.all(merkleTree.items.map((x) => __awaiter(this, void 0, void 0, function* () { return Buffer.from(yield index_1.CryptoService.SHA256(x)); })));
-            const rootHash = (yield (0, index_1.getMerkleTreeRootHash)(leaves)).toString("base64");
+            const leaves = yield Promise.all(merkleTree.items.map((x) => __awaiter(this, void 0, void 0, function* () { return Buffer.from(yield CryptoService_1.default.SHA256(x)); })));
+            const rootHash = (yield (0, getMerkleTreeRootHash_1.default)(leaves)).toString("base64");
             const verified = rootHash === merkleTree.hash;
             if (!verified) {
                 throw new VerificationError_1.default(`Merkle tree not verified.`);
diff --git a/dist/utils/common.d.ts b/dist/utils/common.d.ts
index 068ccd68e178219e1d5f156122a353dde1c885a7..77609cbf71dbacca462ea86a60ba0224848b546c 100644
--- a/dist/utils/common.d.ts
+++ b/dist/utils/common.d.ts
@@ -1,4 +1,3 @@
-/// <reference types="node" />
 export declare const arrayBufferToBase64: (buffer: ArrayBuffer) => string;
 export declare const base64ToArrayBuffer: (base64: string) => ArrayBuffer;
 export declare const ensureBase64: (data: string | ArrayBuffer) => string;
@@ -9,7 +8,6 @@ export declare const decompressData: (binary: string | ArrayBuffer) => ArrayBuff
 export declare const arrayBufferToHex: (buffer: ArrayBuffer) => string;
 export declare const encodeBase64Url: (base64: string) => string;
 export declare const decodeBase64URL: (input: string) => string;
-export declare const getMerkleTreeRootHash: (leaves: Buffer[]) => Promise<Buffer>;
 export declare const isNode: boolean;
 declare const _default: {
     compressData: (binary: string | ArrayBuffer) => ArrayBuffer;
diff --git a/dist/utils/common.js b/dist/utils/common.js
index 86fbc868c752fad0bb056fd8c8249aa1f7a2ae61..d1f4af0d9549428f7045e9b032310ee4f61d9b74 100644
--- a/dist/utils/common.js
+++ b/dist/utils/common.js
@@ -22,19 +22,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
     __setModuleDefault(result, mod);
     return result;
 };
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.isNode = exports.getMerkleTreeRootHash = exports.decodeBase64URL = exports.encodeBase64Url = exports.arrayBufferToHex = exports.decompressData = exports.compressData = exports.ensureUint8Array = exports.ensureArrayBuffer = exports.ensureBase64 = exports.base64ToArrayBuffer = exports.arrayBufferToBase64 = void 0;
+exports.isNode = exports.decodeBase64URL = exports.encodeBase64Url = exports.arrayBufferToHex = exports.decompressData = exports.compressData = exports.ensureUint8Array = exports.ensureArrayBuffer = exports.ensureBase64 = exports.base64ToArrayBuffer = exports.arrayBufferToBase64 = void 0;
 const fflate = __importStar(require("fflate"));
-const index_1 = require("../index");
 const arrayBufferToBase64 = (buffer) => {
     return Buffer.from(buffer).toString("base64");
 };
@@ -83,30 +73,6 @@ const decodeBase64URL = (input) => {
     return input.replace(/_/g, "/").replace(/-/g, "+");
 };
 exports.decodeBase64URL = decodeBase64URL;
-const getMerkleTreeRootHash = (leaves) => __awaiter(void 0, void 0, void 0, function* () {
-    let hashes = [...leaves];
-    while (hashes.length != 1) {
-        let pair;
-        const newHashes = [];
-        for (let i = 0; i < hashes.length; i++) {
-            const hash = hashes[i];
-            pair = pair ? Buffer.concat([pair, hash]) : hash;
-            if (i % 2) {
-                newHashes.push(yield index_1.CryptoService.SHA256(pair));
-                pair = null;
-            }
-            else {
-                // If array has odd items, transfer the last one to the upper level of the tree
-                if (i === hashes.length - 1) {
-                    newHashes.push(hash);
-                }
-            }
-        }
-        hashes = newHashes;
-    }
-    return hashes[0];
-});
-exports.getMerkleTreeRootHash = getMerkleTreeRootHash;
 exports.isNode = typeof process !== "undefined" &&
     process.versions != null &&
     process.versions.node != null;
diff --git a/dist/utils/getMerkleTreeRootHash.d.ts b/dist/utils/getMerkleTreeRootHash.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1f2888022b2e3bef5f43928c79cd68f81ff27444
--- /dev/null
+++ b/dist/utils/getMerkleTreeRootHash.d.ts
@@ -0,0 +1,3 @@
+/// <reference types="node" />
+declare const getMerkleTreeRootHash: (leaves: Buffer[]) => Promise<Buffer>;
+export default getMerkleTreeRootHash;
diff --git a/dist/utils/getMerkleTreeRootHash.js b/dist/utils/getMerkleTreeRootHash.js
new file mode 100644
index 0000000000000000000000000000000000000000..4d2fdb90e3b488eebe4ef012abd2c795f9a5bc83
--- /dev/null
+++ b/dist/utils/getMerkleTreeRootHash.js
@@ -0,0 +1,39 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const CryptoService_1 = __importDefault(require("../services/CryptoService"));
+const getMerkleTreeRootHash = (leaves) => __awaiter(void 0, void 0, void 0, function* () {
+    let hashes = [...leaves];
+    while (hashes.length != 1) {
+        let pair;
+        const newHashes = [];
+        for (let i = 0; i < hashes.length; i++) {
+            const hash = hashes[i];
+            pair = pair ? Buffer.concat([pair, hash]) : hash;
+            if (i % 2) {
+                newHashes.push(yield CryptoService_1.default.SHA256(pair));
+                pair = null;
+            }
+            else {
+                // If array has odd items, transfer the last one to the upper level of the tree
+                if (i === hashes.length - 1) {
+                    newHashes.push(hash);
+                }
+            }
+        }
+        hashes = newHashes;
+    }
+    return hashes[0];
+});
+exports.default = getMerkleTreeRootHash;
diff --git a/src/index.ts b/src/index.ts
index c116b57ea3b5d35efc783c395e9c6dcd01b755bd..ec88b41fb0067f9c86c0122335dbb7205a16e0c4 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,5 +1,6 @@
 export * from "./types";
 export * from "./utils/common";
+export { default as getMerkleTreeRootHash } from "./utils/getMerkleTreeRootHash";
 export { default as CloudflareService } from "./services/CloudflareService";
 export { default as VerificationService } from "./services/VerificationService";
 export { default as StatusesService } from "./services/StatusesService";
diff --git a/src/services/QrCodeDataService.ts b/src/services/QrCodeDataService.ts
index 03bc827ef1452d97d5059839e28c31167d668879..b7e6feb92e03449d7e0433f2d9816950cb7aa5dc 100644
--- a/src/services/QrCodeDataService.ts
+++ b/src/services/QrCodeDataService.ts
@@ -7,7 +7,7 @@ import {
   ensureUint8Array,
 } from "../utils/common";
 
-import { CryptoService } from "../index";
+import CryptoService from "./CryptoService";
 
 const EmailDataMessageV1 = vereign.protobuf.qrcode_data.EmailData_V1;
 const KeyDataMessageV1 = vereign.protobuf.qrcode_data.KeyData_V1;
diff --git a/src/services/VerificationService/VerificationService.ts b/src/services/VerificationService/VerificationService.ts
index 5bc1a3c8131264a3879a4ccbe4d1865a8b00998a..4db6bacca25ee5c9a7c283a6ae61c6f50d20ca54 100644
--- a/src/services/VerificationService/VerificationService.ts
+++ b/src/services/VerificationService/VerificationService.ts
@@ -1,10 +1,7 @@
-import {
-  arrayBufferToBase64,
-  base64ToArrayBuffer,
-  CryptoService,
-  DecodedCallData,
-  getMerkleTreeRootHash,
-} from "../../index";
+import CryptoService from "../CryptoService";
+import { arrayBufferToBase64, base64ToArrayBuffer } from "../../utils/common";
+import getMerkleTreeRootHash from "../../utils/getMerkleTreeRootHash";
+import { DecodedCallData } from "../../types";
 
 const EventEmitter = require("eventemitter2");
 import AeternityService from "../AeternityService/AeternityService";
@@ -118,21 +115,17 @@ class VerificationService extends EventEmitter {
       let statusVerified;
       let statusPosition = -1;
       if (verificationMethod === VERIFICATION_METHOD_MERKLE_TREE) {
-        ({
-          verified: statusVerified,
-          statusPosition,
-        } = await this.verifyStatusesMerkleTree(
-          statusData.statusRaw,
-          statusBatchData
-        ));
+        ({ verified: statusVerified, statusPosition } =
+          await this.verifyStatusesMerkleTree(
+            statusData.statusRaw,
+            statusBatchData
+          ));
       } else if (verificationMethod === VERIFICATION_METHOD_SHA256_BATCH) {
-        ({
-          verified: statusVerified,
-          statusPosition,
-        } = await this.verifyStatusSHA256Batch(
-          statusData.statusRaw,
-          statusBatchData
-        ));
+        ({ verified: statusVerified, statusPosition } =
+          await this.verifyStatusSHA256Batch(
+            statusData.statusRaw,
+            statusBatchData
+          ));
       }
 
       batchVerificationDetails = {
diff --git a/src/utils/common.ts b/src/utils/common.ts
index b74f072010809c6785e1c1460a03dde5f842fd66..bc33f49a01b05d05756e041313f9184782c6c5e6 100644
--- a/src/utils/common.ts
+++ b/src/utils/common.ts
@@ -1,5 +1,4 @@
 import * as fflate from "fflate";
-import { CryptoService } from "../index";
 
 export const arrayBufferToBase64 = (buffer: ArrayBuffer): string => {
   return Buffer.from(buffer).toString("base64");
@@ -51,35 +50,6 @@ export const decodeBase64URL = (input: string): string => {
   return input.replace(/_/g, "/").replace(/-/g, "+");
 };
 
-export const getMerkleTreeRootHash = async (
-  leaves: Buffer[]
-): Promise<Buffer> => {
-  let hashes = [...leaves];
-  while (hashes.length != 1) {
-    let pair: Buffer;
-
-    const newHashes = [];
-    for (let i = 0; i < hashes.length; i++) {
-      const hash = hashes[i];
-      pair = pair ? Buffer.concat([pair, hash]) : hash;
-
-      if (i % 2) {
-        newHashes.push(await CryptoService.SHA256(pair));
-        pair = null;
-      } else {
-        // If array has odd items, transfer the last one to the upper level of the tree
-        if (i === hashes.length - 1) {
-          newHashes.push(hash);
-        }
-      }
-    }
-
-    hashes = newHashes;
-  }
-
-  return hashes[0];
-};
-
 export const isNode =
   typeof process !== "undefined" &&
   process.versions != null &&
diff --git a/src/utils/getMerkleTreeRootHash.ts b/src/utils/getMerkleTreeRootHash.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fecb0893b528af17436bad43bb70461dcb4c4401
--- /dev/null
+++ b/src/utils/getMerkleTreeRootHash.ts
@@ -0,0 +1,30 @@
+import CryptoService from "../services/CryptoService";
+
+const getMerkleTreeRootHash = async (leaves: Buffer[]): Promise<Buffer> => {
+  let hashes = [...leaves];
+  while (hashes.length != 1) {
+    let pair: Buffer;
+
+    const newHashes = [];
+    for (let i = 0; i < hashes.length; i++) {
+      const hash = hashes[i];
+      pair = pair ? Buffer.concat([pair, hash]) : hash;
+
+      if (i % 2) {
+        newHashes.push(await CryptoService.SHA256(pair));
+        pair = null;
+      } else {
+        // If array has odd items, transfer the last one to the upper level of the tree
+        if (i === hashes.length - 1) {
+          newHashes.push(hash);
+        }
+      }
+    }
+
+    hashes = newHashes;
+  }
+
+  return hashes[0];
+};
+
+export default getMerkleTreeRootHash;