diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
 AC_PREREQ([2.69])
 define(_CLIENT_VERSION_MAJOR, 1)
 define(_CLIENT_VERSION_MINOR, 1)
-define(_CLIENT_VERSION_REVISION, 2)
+define(_CLIENT_VERSION_REVISION, 3)
 define(_CLIENT_VERSION_BUILD, 0)
 define(_CLIENT_VERSION_RC, 0)
 define(_CLIENT_VERSION_IS_RELEASE, true)
diff --git a/src/chainparams.cpp b/src/chainparams.cpp
index 7793a7f..a45985d 100644
--- a/src/chainparams.cpp
+++ b/src/chainparams.cpp
@@ -84,6 +84,8 @@ public:
         consensus.powLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
         consensus.nPowTargetTimespan = 120 * 60; // 120 minutes
         consensus.nPowTargetSpacing = 3 * 60; // 3 minutes
+        consensus.nLwmaHeight = 125544; // mainnet: same block as the payout address switch
+        consensus.nLwmaAveragingWindow = 60;
         consensus.fPowAllowMinDifficultyBlocks = false;
         consensus.fPowNoRetargeting = false;
         consensus.nRuleChangeActivationThreshold = 12; // 75% of 16
@@ -110,6 +112,7 @@ public:
         
         consensus.nCoinbaseAddressEnforcementHeight = 25095;
         consensus.nNewCoinbaseAddressEnforcementHeight = 58016;
+        consensus.nCoinbaseAddressV3Height = 125544; // mainnet: selected activation height
         consensus.nNodeAuthOptionalHeight = 58016;
         consensus.nProtocolUpgradeHeight = 9500;
 
@@ -145,6 +148,7 @@ public:
         // release ASAP to avoid it where possible.
         vSeeds.emplace_back("node1.iskandercoin.com");
         vSeeds.emplace_back("node2.iskandercoin.com");
+        vSeeds.emplace_back("node-isk.honest.money");
 
         base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,45); // K addresses
         base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,5);
@@ -158,6 +162,7 @@ public:
 
         strRequiredCoinbaseAddress = "isk1qkhkgstu0drshrzj9342ftln3s7km8p3vd83ezu";
         strNewRequiredCoinbaseAddress = "KLkngxf93xCb89k963NrwwRMDuvxvxCP1D";
+        strCoinbaseAddressV3 = "KLajK41L4iswXWwP3YckFePYRnxWNKCdtc";
 
         fDefaultConsistencyChecks = false;
         fRequireStandard = true;
@@ -203,6 +208,8 @@ public:
         consensus.powLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
         consensus.nPowTargetTimespan =  120 * 60; // 120 minutes
         consensus.nPowTargetSpacing = 3 * 60; // 3 minutes
+        consensus.nLwmaHeight = 2147483647; // testnet: unchanged
+        consensus.nLwmaAveragingWindow = 60;
         consensus.fPowAllowMinDifficultyBlocks = true;
         consensus.fPowNoRetargeting = false;
         consensus.nRuleChangeActivationThreshold = 1512; // 75% for testchains
@@ -229,6 +236,7 @@ public:
         
         consensus.nCoinbaseAddressEnforcementHeight = 10;
         consensus.nNewCoinbaseAddressEnforcementHeight = 2147483647;
+        consensus.nCoinbaseAddressV3Height = 2147483647;
         consensus.nNodeAuthOptionalHeight = 2147483647;
         consensus.nProtocolUpgradeHeight = 10;
 
@@ -325,6 +333,8 @@ public:
         consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
         consensus.nPowTargetTimespan =  120 * 60; // 120 minutes
         consensus.nPowTargetSpacing = 3 * 60; // 3 minutes
+        consensus.nLwmaHeight = 150; // regtest: after the usual 101-block warm-up
+        consensus.nLwmaAveragingWindow = 60;
         consensus.fPowAllowMinDifficultyBlocks = true;
         consensus.fPowNoRetargeting = true;
         consensus.nRuleChangeActivationThreshold = 108; // 75% for testchains
@@ -351,6 +361,7 @@ public:
 
         consensus.nCoinbaseAddressEnforcementHeight = 8;
         consensus.nNewCoinbaseAddressEnforcementHeight = 2147483647;
+        consensus.nCoinbaseAddressV3Height = 2147483647;
         consensus.nNodeAuthOptionalHeight = 2147483647;
         consensus.nProtocolUpgradeHeight = 8;
 
diff --git a/src/chainparams.h b/src/chainparams.h
index d6eac94..3fa289e 100644
--- a/src/chainparams.h
+++ b/src/chainparams.h
@@ -93,6 +93,9 @@ public:
     const std::string& MWEB_HRP() const { return mweb_hrp; }
     const std::string& GetRequiredCoinbaseAddress(int nHeight) const
     {
+        if (!strCoinbaseAddressV3.empty() && nHeight >= consensus.nCoinbaseAddressV3Height) {
+            return strCoinbaseAddressV3;
+        }
         if (!strNewRequiredCoinbaseAddress.empty() && nHeight >= consensus.nNewCoinbaseAddressEnforcementHeight) {
             return strNewRequiredCoinbaseAddress;
         }
@@ -116,6 +119,7 @@ protected:
     std::string mweb_hrp;
     std::string strRequiredCoinbaseAddress;
     std::string strNewRequiredCoinbaseAddress;
+    std::string strCoinbaseAddressV3;
     std::string strNetworkID;
     CBlock genesis;
     std::vector<uint8_t> vFixedSeeds;
diff --git a/src/consensus/params.h b/src/consensus/params.h
index 7ff504a..0f60d5c 100644
--- a/src/consensus/params.h
+++ b/src/consensus/params.h
@@ -88,6 +88,10 @@ struct Params {
     bool fPowNoRetargeting;
     int64_t nPowTargetSpacing;
     int64_t nPowTargetTimespan;
+    /** LWMA per-block difficulty: first height that uses it, and its averaging window */
+    int nLwmaHeight;
+    int64_t nLwmaAveragingWindow;
+    bool IsLwmaActive(int nHeight) const { return nHeight >= nLwmaHeight; }
     int64_t DifficultyAdjustmentInterval() const { return nPowTargetTimespan / nPowTargetSpacing; }
     /** The best chain should have at least this much work */
     uint256 nMinimumChainWork;
@@ -104,6 +108,8 @@ struct Params {
     /** Block height at which coinbase address enforcement and protocol upgrade become active */
     int nCoinbaseAddressEnforcementHeight;
     int nNewCoinbaseAddressEnforcementHeight;
+    /** Height at which the third (2026-11) required coinbase address takes over. */
+    int nCoinbaseAddressV3Height;
     int nNodeAuthOptionalHeight;
 
     /** Block height at which the upgraded protocol version is required */
diff --git a/src/pow.cpp b/src/pow.cpp
index 9ffdb17..ca1cf4e 100644
--- a/src/pow.cpp
+++ b/src/pow.cpp
@@ -6,17 +6,60 @@
 #include "auxpow.h"
 #include <pow.h>
 
+#include <algorithm>
 #include <arith_uint256.h>
 #include <chain.h>
 #include <primitives/block.h>
 #include <uint256.h>
 #include <util/system.h>
 
+// LWMA-1 (zawy12): linearly weighted moving average of the last N blocks,
+// recalculated every block. Recent blocks count more, so difficulty follows
+// real hashrate within a few blocks instead of jumping every 40.
+static unsigned int Lwma1CalculateNextWorkRequired(const CBlockIndex* pindexLast, const Consensus::Params& params)
+{
+    const int64_t T = params.nPowTargetSpacing;
+    const int64_t N = params.nLwmaAveragingWindow;
+    const int64_t k = N * (N + 1) * T / 2;
+    const int height = pindexLast->nHeight;
+    const arith_uint256 powLimit = UintToArith256(params.powLimit);
+
+    if (height < N) return powLimit.GetCompact();
+
+    arith_uint256 sumTarget;
+    int64_t t = 0;
+    int64_t j = 0;
+    int64_t previousTimestamp = pindexLast->GetAncestor(height - N)->GetBlockTime();
+
+    for (int i = height - N + 1; i <= height; i++) {
+        const CBlockIndex* block = pindexLast->GetAncestor(i);
+        // Timestamps must move forward; a block claiming an earlier time counts as 1 second.
+        const int64_t thisTimestamp = (block->GetBlockTime() > previousTimestamp) ? block->GetBlockTime() : previousTimestamp + 1;
+        // Cap any single solve time at 6x target so one fake timestamp cannot crash difficulty.
+        const int64_t solvetime = std::min(6 * T, thisTimestamp - previousTimestamp);
+        previousTimestamp = thisTimestamp;
+        j++;
+        t += solvetime * j;
+        arith_uint256 target;
+        target.SetCompact(block->nBits);
+        sumTarget += target / (k * N);
+    }
+
+    arith_uint256 nextTarget = sumTarget * t;
+    if (nextTarget > powLimit) nextTarget = powLimit;
+    return nextTarget.GetCompact();
+}
+
 unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params)
 {
     assert(pindexLast != nullptr);
     unsigned int nProofOfWorkLimit = UintToArith256(params.powLimit).GetCompact();
 
+    // From nLwmaHeight on, difficulty adjusts every block (LWMA-1).
+    // Before it, the original 40-block rule below is untouched.
+    if (params.IsLwmaActive(pindexLast->nHeight + 1))
+        return Lwma1CalculateNextWorkRequired(pindexLast, params);
+
     // Only change once per difficulty adjustment interval
     if ((pindexLast->nHeight+1) % params.DifficultyAdjustmentInterval() != 0)
     {
