diff --git a/src/backend/common/Hashrate.cpp b/src/backend/common/Hashrate.cpp
index c7ef90fbf..88709102d 100644
--- a/src/backend/common/Hashrate.cpp
+++ b/src/backend/common/Hashrate.cpp
@@ -39,7 +39,7 @@
 inline static const char *format(double h, char *buf, size_t size)
 {
     if (std::isnormal(h)) {
-        snprintf(buf, size, "%03.1f", h);
+        snprintf(buf, size, (h < 100.0) ? "%04.2f" : "%03.1f", h);
         return buf;
     }
 
diff --git a/src/backend/cuda/CudaBackend.cpp b/src/backend/cuda/CudaBackend.cpp
index b31cec1db..a96da485e 100644
--- a/src/backend/cuda/CudaBackend.cpp
+++ b/src/backend/cuda/CudaBackend.cpp
@@ -45,6 +45,8 @@
 #include "base/tools/String.h"
 #include "core/config/Config.h"
 #include "core/Controller.h"
+#include "crypto/kawpow/KPCache.h"
+#include "crypto/kawpow/KPHash.h"
 
 
 #ifdef XMRIG_ALGO_ASTROBWT
@@ -205,7 +207,7 @@ public:
     }
 
 
-    inline void start(const Job &)
+    inline void start(const Job &job)
     {
         LOG_INFO("%s use profile " BLUE_BG(WHITE_BOLD_S " %s ") WHITE_BOLD_S " (" CYAN_BOLD("%zu") WHITE_BOLD(" thread%s)") " scratchpad " CYAN_BOLD("%zu KB"),
                  Tags::nvidia(),
@@ -215,7 +217,7 @@ public:
                  algo.l3() / 1024
                  );
 
-        Log::print(WHITE_BOLD("|  # | GPU |  BUS ID |    I |   T |   B | BF |  BS |  MEM | NAME"));
+        Log::print(WHITE_BOLD("|  # | GPU |  BUS ID |        I |   W | SI | MC |  U |  MEM | NAME"));
 
         size_t algo_l3 = algo.l3();
 
@@ -227,7 +229,16 @@ public:
 
         size_t i = 0;
         for (const auto &data : threads) {
-            Log::print("|" CYAN_BOLD("%3zu") " |" CYAN_BOLD("%4u") " |" YELLOW(" %7s") " |" CYAN_BOLD("%5d") " |" CYAN_BOLD("%4d") " |"
+            size_t mem_used = (data.thread.threads() * data.thread.blocks()) * algo_l3 / oneMiB;
+
+#           ifdef XMRIG_ALGO_KAWPOW
+            if (algo.family() == Algorithm::KAWPOW) {
+                const uint32_t epoch = job.height() / KPHash::EPOCH_LENGTH;
+                mem_used = (KPCache::cache_size(epoch) + KPCache::dag_size(epoch)) / oneMiB;
+            }
+#           endif
+
+            Log::print("|" CYAN_BOLD("%3zu") " |" CYAN_BOLD("%4u") " |" YELLOW(" %7s") " |" CYAN_BOLD("%9d") " |" CYAN_BOLD("%4d") " |"
                        CYAN_BOLD("%4d") " |" CYAN_BOLD("%3d") " |" CYAN_BOLD("%4d") " |" CYAN("%5zu") " | " GREEN("%s"),
                        i,
                        data.thread.index(),
@@ -237,7 +248,7 @@ public:
                        data.thread.blocks(),
                        data.thread.bfactor(),
                        data.thread.bsleep(),
-                       (data.thread.threads() * data.thread.blocks()) * algo_l3 / oneMiB,
+                       mem_used,
                        data.device.name().data()
                        );
 
@@ -368,18 +379,30 @@ void xmrig::CudaBackend::printHashrate(bool details)
         return;
     }
 
-    char num[8 * 3] = { 0 };
+    char num[16 * 3] = { 0 };
 
-    Log::print(WHITE_BOLD_S "|   CUDA # | AFFINITY | 10s H/s | 60s H/s | 15m H/s |");
+    const double hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
+    const double hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
+    const double hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
+
+    double scale = 1.0;
+    const char* h = " H/s";
+
+    if ((hashrate_short >= 1e6) || (hashrate_medium >= 1e6) || (hashrate_large >= 1e6)) {
+        scale = 1e-6;
+        h = "MH/s";
+    }
+
+    Log::print(WHITE_BOLD_S "|   CUDA # | AFFINITY | 10s %s | 60s %s | 15m %s |", h, h, h);
 
     size_t i = 0;
     for (const auto &data : d_ptr->threads) {
-         Log::print("| %8zu | %8" PRId64 " | %7s | %7s | %7s |" CYAN_BOLD(" #%u") YELLOW(" %s") GREEN(" %s"),
+         Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") GREEN(" %s"),
                     i,
                     data.thread.affinity(),
-                    Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval),  num,         sizeof num / 3),
-                    Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval), num + 8,     sizeof num / 3),
-                    Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval),  num + 8 * 2, sizeof num / 3),
+                    Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval)  * scale, num,          sizeof num / 3),
+                    Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval) * scale, num + 16,     sizeof num / 3),
+                    Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval)  * scale, num + 16 * 2, sizeof num / 3),
                     data.device.index(),
                     data.device.topology().toString().data(),
                     data.device.name().data()
@@ -388,10 +411,10 @@ void xmrig::CudaBackend::printHashrate(bool details)
          i++;
     }
 
-    Log::print(WHITE_BOLD_S "|        - |        - | %7s | %7s | %7s |",
-               Hashrate::format(hashrate()->calc(Hashrate::ShortInterval),  num,         sizeof num / 3),
-               Hashrate::format(hashrate()->calc(Hashrate::MediumInterval), num + 8,     sizeof num / 3),
-               Hashrate::format(hashrate()->calc(Hashrate::LargeInterval),  num + 8 * 2, sizeof num / 3)
+    Log::print(WHITE_BOLD_S "|        - |        - | %8s | %8s | %8s |",
+               Hashrate::format(hashrate()->calc(Hashrate::ShortInterval)  * scale, num,          sizeof num / 3),
+               Hashrate::format(hashrate()->calc(Hashrate::MediumInterval) * scale, num + 16,     sizeof num / 3),
+               Hashrate::format(hashrate()->calc(Hashrate::LargeInterval)  * scale, num + 16 * 2, sizeof num / 3)
                );
 }
 
diff --git a/src/backend/opencl/OclBackend.cpp b/src/backend/opencl/OclBackend.cpp
index e473a3662..ae8bce85a 100644
--- a/src/backend/opencl/OclBackend.cpp
+++ b/src/backend/opencl/OclBackend.cpp
@@ -47,6 +47,8 @@
 #include "base/tools/String.h"
 #include "core/config/Config.h"
 #include "core/Controller.h"
+#include "crypto/kawpow/KPCache.h"
+#include "crypto/kawpow/KPHash.h"
 
 
 #ifdef XMRIG_FEATURE_API
@@ -201,7 +203,7 @@ public:
                  algo.l3() / 1024
                  );
 
-        Log::print(WHITE_BOLD("|  # | GPU |  BUS ID |    I |  W | SI | MC |  U |  MEM | NAME"));
+        Log::print(WHITE_BOLD("|  # | GPU |  BUS ID |        I |   W | SI | MC |  U |  MEM | NAME"));
 
         size_t algo_l3 = algo.l3();
 
@@ -213,7 +215,16 @@ public:
 
         size_t i = 0;
         for (const auto &data : threads) {
-            Log::print("|" CYAN_BOLD("%3zu") " |" CYAN_BOLD("%4u") " |" YELLOW(" %7s") " |" CYAN_BOLD("%5u") " |" CYAN_BOLD("%3u") " |"
+            size_t mem_used = data.thread.intensity() * algo_l3 / oneMiB;
+
+#           ifdef XMRIG_ALGO_KAWPOW
+            if (algo.family() == Algorithm::KAWPOW) {
+                const uint32_t epoch = job.height() / KPHash::EPOCH_LENGTH;
+                mem_used = (KPCache::cache_size(epoch) + KPCache::dag_size(epoch)) / oneMiB;
+            }
+#           endif
+
+            Log::print("|" CYAN_BOLD("%3zu") " |" CYAN_BOLD("%4u") " |" YELLOW(" %7s") " |" CYAN_BOLD("%9u") " |" CYAN_BOLD("%4u") " |"
                        CYAN_BOLD("%3u") " |" CYAN_BOLD("%3s") " |" CYAN_BOLD("%3u") " |" CYAN("%5zu") " | %s",
                        i,
                        data.thread.index(),
@@ -223,7 +234,7 @@ public:
                        data.thread.stridedIndex(),
                        data.thread.stridedIndex() == 2 ? std::to_string(data.thread.memChunk()).c_str() : "-",
                        data.thread.unrollFactor(),
-                       data.thread.intensity() * algo_l3 / oneMiB,
+                       mem_used,
                        data.device.printableName().data()
                        );
 
@@ -349,18 +360,30 @@ void xmrig::OclBackend::printHashrate(bool details)
         return;
     }
 
-    char num[8 * 3] = { 0 };
+    char num[16 * 3] = { 0 };
 
-    Log::print(WHITE_BOLD_S "| OPENCL # | AFFINITY | 10s H/s | 60s H/s | 15m H/s |");
+    const double hashrate_short  = hashrate()->calc(Hashrate::ShortInterval);
+    const double hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
+    const double hashrate_large  = hashrate()->calc(Hashrate::LargeInterval);
+
+    double scale = 1.0;
+    const char* h = " H/s";
+
+    if ((hashrate_short >= 1e6) || (hashrate_medium >= 1e6) || (hashrate_large >= 1e6)) {
+        scale = 1e-6;
+        h = "MH/s";
+    }
+
+    Log::print(WHITE_BOLD_S "| OPENCL # | AFFINITY | 10s %s | 60s %s | 15m %s |", h, h, h);
 
     size_t i = 0;
     for (const auto &data : d_ptr->threads) {
-         Log::print("| %8zu | %8" PRId64 " | %7s | %7s | %7s |" CYAN_BOLD(" #%u") YELLOW(" %s") " %s",
+         Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") " %s",
                     i,
                     data.affinity,
-                    Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval),  num,         sizeof num / 3),
-                    Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval), num + 8,     sizeof num / 3),
-                    Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval),  num + 8 * 2, sizeof num / 3),
+                    Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval)  * scale, num,          sizeof num / 3),
+                    Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval) * scale, num + 16,     sizeof num / 3),
+                    Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval)  * scale, num + 16 * 2, sizeof num / 3),
                     data.device.index(),
                     data.device.topology().toString().data(),
                     data.device.printableName().data()
@@ -369,10 +392,10 @@ void xmrig::OclBackend::printHashrate(bool details)
          i++;
     }
 
-    Log::print(WHITE_BOLD_S "|        - |        - | %7s | %7s | %7s |",
-               Hashrate::format(hashrate()->calc(Hashrate::ShortInterval),  num,         sizeof num / 3),
-               Hashrate::format(hashrate()->calc(Hashrate::MediumInterval), num + 8,     sizeof num / 3),
-               Hashrate::format(hashrate()->calc(Hashrate::LargeInterval),  num + 8 * 2, sizeof num / 3)
+    Log::print(WHITE_BOLD_S "|        - |        - | %8s | %8s | %8s |",
+               Hashrate::format(hashrate()->calc(Hashrate::ShortInterval)  * scale, num,          sizeof num / 3),
+               Hashrate::format(hashrate()->calc(Hashrate::MediumInterval) * scale, num + 16,     sizeof num / 3),
+               Hashrate::format(hashrate()->calc(Hashrate::LargeInterval)  * scale, num + 16 * 2, sizeof num / 3)
                );
 }
 
diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp
index 8d9d66493..7d74d96a5 100644
--- a/src/core/Miner.cpp
+++ b/src/core/Miner.cpp
@@ -259,12 +259,20 @@ public:
             backend->printHashrate(details);
         }
 
-        LOG_INFO("%s " WHITE_BOLD("speed") " 10s/60s/15m " CYAN_BOLD("%s") CYAN(" %s %s ") CYAN_BOLD("H/s") " max " CYAN_BOLD("%s H/s"),
+        double scale = 1.0;
+        const char* h = "H/s";
+
+        if ((speed[0] >= 1e6) || (speed[1] >= 1e6) || (speed[2] >= 1e6) || (maxHashrate[algorithm] >= 1e6)) {
+            scale = 1e-6;
+            h = "MH/s";
+        }
+
+        LOG_INFO("%s " WHITE_BOLD("speed") " 10s/60s/15m " CYAN_BOLD("%s") CYAN(" %s %s ") CYAN_BOLD("%s") " max " CYAN_BOLD("%s %s"),
                  Tags::miner(),
-                 Hashrate::format(speed[0],                 num,          sizeof(num) / 4),
-                 Hashrate::format(speed[1],                 num + 16,     sizeof(num) / 4),
-                 Hashrate::format(speed[2],                 num + 16 * 2, sizeof(num) / 4 ),
-                 Hashrate::format(maxHashrate[algorithm],   num + 16 * 3, sizeof(num) / 4)
+                 Hashrate::format(speed[0] * scale,                 num,          sizeof(num) / 4),
+                 Hashrate::format(speed[1] * scale,                 num + 16,     sizeof(num) / 4),
+                 Hashrate::format(speed[2] * scale,                 num + 16 * 2, sizeof(num) / 4), h,
+                 Hashrate::format(maxHashrate[algorithm] * scale,   num + 16 * 3, sizeof(num) / 4), h
                  );
     }
 
diff --git a/src/crypto/kawpow/KPCache.cpp b/src/crypto/kawpow/KPCache.cpp
index fa2b9a2e4..d50ecff78 100644
--- a/src/crypto/kawpow/KPCache.cpp
+++ b/src/crypto/kawpow/KPCache.cpp
@@ -114,6 +114,16 @@ static inline uint32_t clz(uint32_t a)
 }
 
 
+uint64_t KPCache::cache_size(uint32_t epoch)
+{
+    if (epoch >= sizeof(cache_sizes) / sizeof(cache_sizes[0])) {
+        return 0;
+    }
+
+    return cache_sizes[epoch];
+}
+
+
 uint64_t KPCache::dag_size(uint32_t epoch)
 {
     if (epoch >= sizeof(dag_sizes) / sizeof(dag_sizes[0])) {
diff --git a/src/crypto/kawpow/KPCache.h b/src/crypto/kawpow/KPCache.h
index 009520a10..3f18b0f50 100644
--- a/src/crypto/kawpow/KPCache.h
+++ b/src/crypto/kawpow/KPCache.h
@@ -59,6 +59,7 @@ public:
 
     const uint32_t* l1_cache() const { return m_l1Cache; }
 
+    static uint64_t cache_size(uint32_t epoch);
     static uint64_t dag_size(uint32_t epoch);
 
     static void calculate_fast_mod_data(uint32_t divisor, uint32_t &reciprocal, uint32_t &increment, uint32_t& shift);
diff --git a/src/net/Network.cpp b/src/net/Network.cpp
index 271e6ff68..6176621c7 100644
--- a/src/net/Network.cpp
+++ b/src/net/Network.cpp
@@ -192,15 +192,32 @@ void xmrig::Network::onPause(IStrategy *strategy)
 }
 
 
+static void scale_diff(uint64_t& diff, const char* &scale)
+{
+    if (diff >= 100000000) {
+        diff /= 1000000;
+        scale = "M";
+    }
+    else if (diff >= 1000000) {
+        diff /= 1000;
+        scale = "K";
+    }
+}
+
+
 void xmrig::Network::onResultAccepted(IStrategy *, IClient *, const SubmitResult &result, const char *error)
 {
+    uint64_t diff = result.diff;
+    const char* scale = "";
+    scale_diff(diff, scale);
+
     if (error) {
-        LOG_INFO("%s " RED_BOLD("rejected") " (%" PRId64 "/%" PRId64 ") diff " WHITE_BOLD("%" PRIu64) " " RED("\"%s\"") " " BLACK_BOLD("(%" PRIu64 " ms)"),
-                 backend_tag(result.backend), m_state->accepted(), m_state->rejected(), result.diff, error, result.elapsed);
+        LOG_INFO("%s " RED_BOLD("rejected") " (%" PRId64 "/%" PRId64 ") diff " WHITE_BOLD("%" PRIu64 "%s") " " RED("\"%s\"") " " BLACK_BOLD("(%" PRIu64 " ms)"),
+                 backend_tag(result.backend), m_state->accepted(), m_state->rejected(), diff, scale, error, result.elapsed);
     }
     else {
-        LOG_INFO("%s " GREEN_BOLD("accepted") " (%" PRId64 "/%" PRId64 ") diff " WHITE_BOLD("%" PRIu64) " " BLACK_BOLD("(%" PRIu64 " ms)"),
-                 backend_tag(result.backend), m_state->accepted(), m_state->rejected(), result.diff, result.elapsed);
+        LOG_INFO("%s " GREEN_BOLD("accepted") " (%" PRId64 "/%" PRId64 ") diff " WHITE_BOLD("%" PRIu64 "%s") " " BLACK_BOLD("(%" PRIu64 " ms)"),
+                 backend_tag(result.backend), m_state->accepted(), m_state->rejected(), diff, scale, result.elapsed);
     }
 }
 
@@ -230,13 +247,17 @@ void xmrig::Network::onRequest(IApiRequest &request)
 
 void xmrig::Network::setJob(IClient *client, const Job &job, bool donate)
 {
+    uint64_t diff = job.diff();
+    const char* scale = "";
+    scale_diff(diff, scale);
+
     if (job.height()) {
-        LOG_INFO("%s " MAGENTA_BOLD("new job") " from " WHITE_BOLD("%s:%d") " diff " WHITE_BOLD("%" PRIu64) " algo " WHITE_BOLD("%s") " height " WHITE_BOLD("%" PRIu64),
-                 Tags::network(), client->pool().host().data(), client->pool().port(), job.diff(), job.algorithm().shortName(), job.height());
+        LOG_INFO("%s " MAGENTA_BOLD("new job") " from " WHITE_BOLD("%s:%d") " diff " WHITE_BOLD("%" PRIu64 "%s") " algo " WHITE_BOLD("%s") " height " WHITE_BOLD("%" PRIu64),
+                 Tags::network(), client->pool().host().data(), client->pool().port(), diff, scale, job.algorithm().shortName(), job.height());
     }
     else {
-        LOG_INFO("%s " MAGENTA_BOLD("new job") " from " WHITE_BOLD("%s:%d") " diff " WHITE_BOLD("%" PRIu64) " algo " WHITE_BOLD("%s"),
-                 Tags::network(), client->pool().host().data(), client->pool().port(), job.diff(), job.algorithm().shortName());
+        LOG_INFO("%s " MAGENTA_BOLD("new job") " from " WHITE_BOLD("%s:%d") " diff " WHITE_BOLD("%" PRIu64 "%s") " algo " WHITE_BOLD("%s"),
+                 Tags::network(), client->pool().host().data(), client->pool().port(), diff, scale, job.algorithm().shortName());
     }
 
     if (!donate && m_donate) {