diff --git a/src/base/kernel/Platform.h b/src/base/kernel/Platform.h
index 293cedc7f..f38804896 100644
--- a/src/base/kernel/Platform.h
+++ b/src/base/kernel/Platform.h
@@ -49,6 +49,7 @@ public:
     static inline const String &userAgent() { return m_userAgent; }
 
     static bool isOnBatteryPower();
+    static bool isUserActive();
 
 private:
     static char *createUserAgent();
diff --git a/src/base/kernel/Platform_unix.cpp b/src/base/kernel/Platform_unix.cpp
index bbded9f65..cf7d37ca3 100644
--- a/src/base/kernel/Platform_unix.cpp
+++ b/src/base/kernel/Platform_unix.cpp
@@ -158,3 +158,10 @@ bool xmrig::Platform::isOnBatteryPower()
     }
     return false;
 }
+
+
+bool xmrig::Platform::isUserActive()
+{
+    // TODO
+    return false;
+}
diff --git a/src/base/kernel/Platform_win.cpp b/src/base/kernel/Platform_win.cpp
index a487e17b9..7667691b0 100644
--- a/src/base/kernel/Platform_win.cpp
+++ b/src/base/kernel/Platform_win.cpp
@@ -161,3 +161,16 @@ bool xmrig::Platform::isOnBatteryPower()
     }
     return false;
 }
+
+
+bool xmrig::Platform::isUserActive()
+{
+    LASTINPUTINFO info;
+    info.cbSize = sizeof(LASTINPUTINFO);
+
+    if (!GetLastInputInfo(&info)) {
+        return false;
+    }
+
+    return static_cast<int>(GetTickCount() - info.dwTime) < 60 * 1000;
+}
diff --git a/src/base/kernel/config/BaseConfig.cpp b/src/base/kernel/config/BaseConfig.cpp
index 27aa2ce90..c2f4196e3 100644
--- a/src/base/kernel/config/BaseConfig.cpp
+++ b/src/base/kernel/config/BaseConfig.cpp
@@ -62,6 +62,7 @@ const char *BaseConfig::kDryRun         = "dry-run";
 const char *BaseConfig::kHttp           = "http";
 const char *BaseConfig::kLogFile        = "log-file";
 const char *BaseConfig::kPauseOnBattery = "pause-on-battery";
+const char *BaseConfig::kPauseOnActive  = "pause-on-active";
 const char *BaseConfig::kPrintTime      = "print-time";
 const char *BaseConfig::kSyslog         = "syslog";
 const char *BaseConfig::kTitle          = "title";
@@ -92,6 +93,7 @@ bool xmrig::BaseConfig::read(const IJsonReader &reader, const char *fileName)
     m_syslog            = reader.getBool(kSyslog, m_syslog);
     m_watch             = reader.getBool(kWatch, m_watch);
     m_pauseOnBattery    = reader.getBool(kPauseOnBattery, m_pauseOnBattery);
+    m_pauseOnActive     = reader.getBool(kPauseOnActive, m_pauseOnActive);
     m_logFile           = reader.getString(kLogFile);
     m_userAgent         = reader.getString(kUserAgent);
     m_printTime         = std::min(reader.getUint(kPrintTime, m_printTime), 3600U);
diff --git a/src/base/kernel/config/BaseConfig.h b/src/base/kernel/config/BaseConfig.h
index f97a711bb..4f28cadf6 100644
--- a/src/base/kernel/config/BaseConfig.h
+++ b/src/base/kernel/config/BaseConfig.h
@@ -56,6 +56,7 @@ public:
     static const char *kHttp;
     static const char *kLogFile;
     static const char *kPauseOnBattery;
+    static const char *kPauseOnActive;
     static const char *kPrintTime;
     static const char *kSyslog;
     static const char *kTitle;
@@ -73,6 +74,7 @@ public:
     inline bool isBackground() const                        { return m_background; }
     inline bool isDryRun() const                            { return m_dryRun; }
     inline bool isPauseOnBattery() const                    { return m_pauseOnBattery; }
+    inline bool isPauseOnActive() const                     { return m_pauseOnActive; }
     inline bool isSyslog() const                            { return m_syslog; }
     inline const char *logFile() const                      { return m_logFile.data(); }
     inline const char *userAgent() const                    { return m_userAgent.data(); }
@@ -101,6 +103,7 @@ protected:
     bool m_background       = false;
     bool m_dryRun           = false;
     bool m_pauseOnBattery   = false;
+    bool m_pauseOnActive    = false;
     bool m_syslog           = false;
     bool m_upgrade          = false;
     bool m_watch            = true;
diff --git a/src/base/kernel/config/BaseTransform.cpp b/src/base/kernel/config/BaseTransform.cpp
index 119fa679c..7df0a7952 100644
--- a/src/base/kernel/config/BaseTransform.cpp
+++ b/src/base/kernel/config/BaseTransform.cpp
@@ -262,6 +262,7 @@ void xmrig::BaseTransform::transform(rapidjson::Document &doc, int key, const ch
     case IConfig::DaemonKey:      /* --daemon */
     case IConfig::VerboseKey:     /* --verbose */
     case IConfig::PauseOnBatteryKey: /* --pause-on-battery */
+    case IConfig::PauseOnActiveKey:  /* --pause-on-active */
         return transformBoolean(doc, key, true);
 
     case IConfig::ColorKey:          /* --no-color */
@@ -323,6 +324,9 @@ void xmrig::BaseTransform::transformBoolean(rapidjson::Document &doc, int key, b
     case IConfig::PauseOnBatteryKey: /* --pause-on-battery */
         return set(doc, BaseConfig::kPauseOnBattery, enable);
 
+    case IConfig::PauseOnActiveKey: /* --pause-on-active */
+        return set(doc, BaseConfig::kPauseOnActive, enable);
+
     default:
         break;
     }
diff --git a/src/base/kernel/interfaces/IConfig.h b/src/base/kernel/interfaces/IConfig.h
index ba022fa3c..d5fdb5c92 100644
--- a/src/base/kernel/interfaces/IConfig.h
+++ b/src/base/kernel/interfaces/IConfig.h
@@ -86,6 +86,7 @@ public:
         BenchTokenKey        = 1048,
         DmiKey               = 1049,
         HugePageSizeKey      = 1050,
+        PauseOnActiveKey     = 1051,
 
         // xmrig common
         CPUPriorityKey       = 1021,
diff --git a/src/config.json b/src/config.json
index 8b5532d5e..7722d19b3 100644
--- a/src/config.json
+++ b/src/config.json
@@ -96,5 +96,6 @@
     "user-agent": null,
     "verbose": 0,
     "watch": true,
-    "pause-on-battery": false
+    "pause-on-battery": false,
+    "pause-on-active": false
 }
diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp
index 8d0263e22..6b3a74ba8 100644
--- a/src/core/Miner.cpp
+++ b/src/core/Miner.cpp
@@ -352,6 +352,7 @@ public:
     Algorithms algorithms;
     bool active         = false;
     bool battery_power  = false;
+    bool user_active    = false;
     bool enabled        = true;
     bool reset          = true;
     Controller *controller;
@@ -629,18 +630,32 @@ void xmrig::Miner::onTimer(const Timer *)
 
     if (d_ptr->controller->config()->isPauseOnBattery()) {
         const bool battery_power = Platform::isOnBatteryPower();
-        if (battery_power && d_ptr->enabled) {
+        if (battery_power && !d_ptr->battery_power) {
             LOG_INFO("%s " YELLOW_BOLD("on battery power"), Tags::miner());
             d_ptr->battery_power = true;
-            setEnabled(false);
         }
-        else if (!battery_power && !d_ptr->enabled && d_ptr->battery_power) {
+        else if (!battery_power && d_ptr->battery_power) {
             LOG_INFO("%s " GREEN_BOLD("on AC power"), Tags::miner());
             d_ptr->battery_power = false;
-            setEnabled(true);
         }
     }
 
+    if (d_ptr->controller->config()->isPauseOnActive()) {
+        const bool user_active = Platform::isUserActive();
+        if (user_active && !d_ptr->user_active) {
+            LOG_INFO("%s " YELLOW_BOLD("user active"), Tags::miner());
+            d_ptr->user_active = true;
+        }
+        else if (!user_active && d_ptr->user_active) {
+            LOG_INFO("%s " GREEN_BOLD("user inactive"), Tags::miner());
+            d_ptr->user_active = false;
+        }
+    }
+
+    const bool batteryEnabled = !(d_ptr->controller->config()->isPauseOnBattery() && d_ptr->battery_power);
+    const bool userActiveEnabled = !(d_ptr->controller->config()->isPauseOnActive() && d_ptr->user_active);
+    setEnabled(batteryEnabled && userActiveEnabled);
+
     if (stopMiner) {
         stop();
     }
diff --git a/src/core/config/Config.cpp b/src/core/config/Config.cpp
index f8b7bb858..f2a0c4a93 100644
--- a/src/core/config/Config.cpp
+++ b/src/core/config/Config.cpp
@@ -270,4 +270,5 @@ void xmrig::Config::getJSON(rapidjson::Document &doc) const
     doc.AddMember(StringRef(kVerbose),                  Log::verbose(), allocator);
     doc.AddMember(StringRef(kWatch),                    m_watch, allocator);
     doc.AddMember(StringRef(kPauseOnBattery),           isPauseOnBattery(), allocator);
+    doc.AddMember(StringRef(kPauseOnActive),            isPauseOnActive(), allocator);
 }
diff --git a/src/core/config/Config_default.h b/src/core/config/Config_default.h
index dd7a20832..c16d421ee 100644
--- a/src/core/config/Config_default.h
+++ b/src/core/config/Config_default.h
@@ -126,7 +126,8 @@ R"===(
     "user-agent": null,
     "verbose": 0,
     "watch": true,
-    "pause-on-battery": false
+    "pause-on-battery": false,
+    "pause-on-active": false
 }
 )===";
 #endif
diff --git a/src/core/config/Config_platform.h b/src/core/config/Config_platform.h
index 28b1e2bda..d1b17345f 100644
--- a/src/core/config/Config_platform.h
+++ b/src/core/config/Config_platform.h
@@ -98,6 +98,7 @@ static const option options[] = {
     { "title",                 1, nullptr, IConfig::TitleKey              },
     { "no-title",              0, nullptr, IConfig::NoTitleKey            },
     { "pause-on-battery",      0, nullptr, IConfig::PauseOnBatteryKey     },
+    { "pause-on-active",       0, nullptr, IConfig::PauseOnActiveKey     },
 #   ifdef XMRIG_FEATURE_BENCHMARK
     { "stress",                0, nullptr, IConfig::StressKey             },
     { "bench",                 1, nullptr, IConfig::BenchKey              },
diff --git a/src/core/config/usage.h b/src/core/config/usage.h
index a30ea1331..bf9088481 100644
--- a/src/core/config/usage.h
+++ b/src/core/config/usage.h
@@ -181,6 +181,7 @@ static inline const std::string &usage()
     u += "      --no-title                disable setting console window title\n";
 #   endif
     u += "      --pause-on-battery        pause mine on battery power\n";
+    u += "      --pause-on-active         pause mine when mouse or keyboard is touched\n";
 
 #   ifdef XMRIG_FEATURE_BENCHMARK
     u += "      --stress                  run continuous stress test to check system stability\n";