diff --git a/lib/mutex-common.js b/lib/mutex-common.js
new file mode 100644
index 0000000..494d609
--- /dev/null
+++ b/lib/mutex-common.js
@@ -0,0 +1,57 @@
+const DEBUGMODE = (process.env.NODE_ENV !== 'production') || process.env.DEBUG_MUTEX;
+
+const locks = require('locks');
+const logger = require('komodo-sdk/logger');
+
+const locksList = {};
+const lockBy = {};
+
+exports.lock = function lock(lockName, label, cb) {
+    if (DEBUGMODE) logger.verbose('Locking MUTEX', { lockName, label });
+    return new Promise((resolve) => {
+        if (!locksList[lockName]) {
+            locksList[lockName] = locks.createMutex();
+        }
+
+        locksList[lockName].lock(() => {
+            lockBy[lockName] = label;
+            if (DEBUGMODE) logger.verbose('MUTEX locked', { lockName, label });
+            resolve(true);
+            if (typeof cb === 'function') cb();
+        });
+    });
+};
+
+exports.tryLock = function tryLock(lockName, label) {
+    if (DEBUGMODE) logger.verbose('Trying to enter MUTEX if not locked', { lockName, label });
+
+    if (!locksList[lockName]) {
+        locksList[lockName] = locks.createMutex();
+    }
+
+    const result = locksList[lockName].tryLock();
+    if (DEBUGMODE && result) logger.verbose('MUTEX entered', { lockName, label });
+    if (DEBUGMODE && !result) logger.verbose('MUTEX not entered', { lockName, label });
+    return result;
+};
+
+
+exports.unlock = function unlock(lockName, label) {
+    if (DEBUGMODE) logger.verbose('Unlocking MUTEX', { lockName, label });
+
+    if (!locksList[lockName]) {
+        logger.warn('Try to unlock undefined MUTEX', { lockName, label });
+        return;
+    }
+
+    try {
+        if (locksList[lockName]) locksList[lockName].unlock();
+        if (DEBUGMODE) logger.verbose('MUTEX unlocked', { lockName, label });
+    } catch (e) {
+        logger.warn('Exception on unlocking MUTEX', { lockName, label, e });
+    }
+};
+
+exports.getLockBy = function getLockBy(lockName) {
+    return lockBy[lockName];
+};