diff --git a/server/modules/filter/throttlefilter/throttlefilter.cc b/server/modules/filter/throttlefilter/throttlefilter.cc
index 9f04d5faea..9678d644cf 100644
--- a/server/modules/filter/throttlefilter/throttlefilter.cc
+++ b/server/modules/filter/throttlefilter/throttlefilter.cc
@@ -38,6 +38,10 @@ cfg::ParamMilliseconds s_sampling_duration(
 cfg::ParamMilliseconds s_continuous_duration(
     &s_spec, "continuous_duration", "Continuous throttling window",
     milliseconds(2000), cfg::Param::AT_RUNTIME);
+
+cfg::ParamSeconds s_max_lag(
+    &s_spec, "max_lag", "Maximum replication lag before writes are throttled",
+    0s, cfg::Param::AT_RUNTIME);
 }
 
 extern "C" MXS_MODULE* MXS_CREATE_MODULE()
@@ -74,6 +78,7 @@ ThrottleConfig::ThrottleConfig(const char* name)
     , sampling_duration(this, &s_sampling_duration)
     , throttling_duration(this, &s_throttling_duration)
     , continuous_duration(this, &s_continuous_duration)
+    , max_lag(this, &s_max_lag)
 {
 }
 
diff --git a/server/modules/filter/throttlefilter/throttlefilter.hh b/server/modules/filter/throttlefilter/throttlefilter.hh
index 9bfb9d22db..cdaa1c6dbd 100644
--- a/server/modules/filter/throttlefilter/throttlefilter.hh
+++ b/server/modules/filter/throttlefilter/throttlefilter.hh
@@ -34,6 +34,8 @@ struct ThrottleConfig : public mxs::config::Configuration
     mxs::config::Milliseconds throttling_duration;  // .. for this long before disconnect.
     mxs::config::Milliseconds continuous_duration;  // What time window is considered continuous meddling.
 
+    mxs::config::Seconds max_lag;   // Maximum replication lag before writes are throttled
+
     // Example: max 100qps and sampling 5s. As soon as more than 500 queries are made in less
     // then any 5s period throttling is triggered (because 501 > 100qps * 5 s). But also note
     // that qps can stay at 200qps for 2.5s before throttling starts.
diff --git a/server/modules/filter/throttlefilter/throttlesession.cc b/server/modules/filter/throttlefilter/throttlesession.cc
index 1a31206092..fc6495fef0 100644
--- a/server/modules/filter/throttlefilter/throttlesession.cc
+++ b/server/modules/filter/throttlefilter/throttlesession.cc
@@ -16,6 +16,7 @@
 
 #include <maxscale/ccdefs.hh>
 #include <maxscale/session.hh>
+#include <maxscale/service.hh>
 
 #include "throttlesession.hh"
 #include "throttlefilter.hh"
@@ -33,6 +34,7 @@ ThrottleSession::ThrottleSession(MXS_SESSION* mxsSession, SERVICE* service, Thro
     , m_sampling_duration(filter.config().sampling_duration.get())
     , m_throttling_duration(filter.config().throttling_duration.get())
     , m_continuous_duration(filter.config().continuous_duration.get())
+    , m_max_lag(filter.config().max_lag.get())
     , m_query_count("num-queries", m_sampling_duration)
     , m_delayed_call_id(0)
     , m_state(State::MEASURING)
@@ -51,6 +53,27 @@ int ThrottleSession::real_routeQuery(GWBUF&& buffer, bool is_delayed)
 {
     using namespace std::chrono;
 
+    if (m_max_lag > 0s && parser().type_mask_contains(parser().get_type_mask(buffer), mxs::sql::TYPE_WRITE))
+    {
+        for (SERVER* srv : m_pSession->service->reachable_servers())
+        {
+            int64_t lag = srv->replication_lag();
+            int64_t lag_diff = lag - m_max_lag.count();
+
+            if (lag_diff > 0)
+            {
+                auto cb = [this](GWBUF&& buffer){
+                    return real_routeQuery(std::move(buffer), false);
+                };
+
+                MXB_INFO("Too much lag (%lds > %lds), throttling writes for %ld seconds",
+                         lag, m_max_lag.count(), lag_diff);
+                m_pSession->delay_routing(this, std::move(buffer), seconds(lag_diff), cb);
+                return true;
+            }
+        }
+    }
+
     int count = m_query_count.count();
     // not in g++ 4.4: duration<float>(x).count(), so
     long micro = duration_cast<microseconds>(m_sampling_duration).count();
diff --git a/server/modules/filter/throttlefilter/throttlesession.hh b/server/modules/filter/throttlefilter/throttlesession.hh
index 19cac8e0a7..aa748deb06 100644
--- a/server/modules/filter/throttlefilter/throttlesession.hh
+++ b/server/modules/filter/throttlefilter/throttlesession.hh
@@ -39,6 +39,7 @@ private:
     std::chrono::milliseconds m_sampling_duration;
     std::chrono::milliseconds m_throttling_duration;
     std::chrono::milliseconds m_continuous_duration;
+    std::chrono::seconds      m_max_lag {0};
 
     maxbase::EventCount m_query_count;
     maxbase::StopWatch  m_first_sample;
