diff --git a/jstests/sharding/replmonitor_cannot_refresh.js b/jstests/sharding/replmonitor_cannot_refresh.js
new file mode 100644
index 0000000..3b5431c
--- /dev/null
+++ b/jstests/sharding/replmonitor_cannot_refresh.js
@@ -0,0 +1,118 @@
+var NUM_NODES = 2;
+var replProperty = { nodes: NUM_NODES, oplogSize: 10, verbose: 1 };
+var st = new ShardingTest({ shards: { rs0: replProperty }, verbose: 2 });
+st.stopBalancer();
+
+st.printShardingStatus();
+
+var testDB = st.s.getDB('test');
+testDB.user.insert({ x: 1 });
+testDB.runCommand({ getLastError: 1, w: NUM_NODES });
+
+var changeConfig = function(replTest) {
+    replTest.add();
+    replTest.add();
+
+    var localDB = replTest.getPrimary().getDB('local');
+    var confDoc = localDB.system.replset.findOne();
+    var localConfDoc = replTest.getReplSetConfig();
+
+    localConfDoc.version = confDoc.version + 1;
+    localConfDoc.members[1].priority = 0;
+    localConfDoc.members[2].priority = 0;
+    localConfDoc.members[3].priority = 99;
+
+    // New config with 2 new members
+    try {
+        localDB.adminCommand({ replSetReconfig: localConfDoc });
+    } catch (x) {
+        print('Caught exception on reconfig: ' + tojson(x));
+    }
+
+    replTest.awaitSecondaryNodes();
+    replTest.stop(0);
+
+    var otherHost = localConfDoc.members[2].host;
+    var newPrimaryHost = localConfDoc.members[3].host;
+
+    // Remove the 2 original host from config
+    localConfDoc.members.shift();
+    localConfDoc.members.shift();
+    localConfDoc.version++;
+
+    var newPriConn = new Mongo(newPrimaryHost);
+    localDB = newPriConn.getDB('local');
+
+    assert.soon(function() {
+        var isMaster = localDB.adminCommand({ isMaster: 1 });
+        return isMaster.ismaster;
+    });
+
+    // New config with 2 new members
+    try {
+        var res = localDB.adminCommand({ replSetReconfig: localConfDoc });
+    } catch (x) {
+        print('Caught exception on reconfig again: ' + tojson(x));
+    }
+
+    assert.soon(function() {
+        var isMaster = localDB.adminCommand({ isMaster: 1 });
+        return isMaster.ok && isMaster.ismaster;
+    });
+
+    var otherConn = new Mongo(otherHost);
+    assert.soon(function() {
+        var localDB = otherConn.getDB('local');
+        var isMaster = localDB.adminCommand({ isMaster: 1 });
+        return isMaster.ok && isMaster.secondary;
+    });
+
+print('REN: stat: ' + tojson(localDB.adminCommand({ isMaster: 1 })));
+
+    return localConfDoc;
+};
+
+testDB.adminCommand({ configureFailPoint: 'rsmWatcherFreeze', mode: 'alwaysOn' });
+var rsConf = changeConfig(st.rs0);
+testDB.adminCommand({ configureFailPoint: 'rsmWatcherFreeze', mode: 'off' });
+
+var checkConf = function(mongos, confDoc) {
+    var configDB = mongos.getDB('config');
+    assert.soon(function() {
+        var shardDoc = configDB.shards.findOne({ _id: new RegExp('^' + confDoc._id) });
+        var hostList = shardDoc.host.split('/')[1];
+        var hosts = hostList.split(',');
+
+        jsTest.log('Current shard doc: ' + tojson(shardDoc));
+
+        if (hosts.length != confDoc.members.length) {
+            return false;
+        }
+        else {
+            for (var x = 0; x < confDoc.members.length; x++) {
+                var match = false;
+                for (var y = 0; y < hosts.length; y++) {
+                    if (hosts[y] == confDoc.members[x].host) {
+                        match = true;
+                        break;
+                    }
+                }
+
+                if (!match) {
+                    return false;
+                }
+            }
+
+            return true;
+        }
+    });
+};
+
+while(true) {
+    sleep(10000);
+    print(new Date());
+    st.printShardingStatus();
+}
+
+st.stop();
+
diff --git a/src/mongo/client/dbclient_rs.cpp b/src/mongo/client/dbclient_rs.cpp
index b0a7a75..5fb6801 100644
--- a/src/mongo/client/dbclient_rs.cpp
+++ b/src/mongo/client/dbclient_rs.cpp
@@ -31,10 +31,13 @@
 #include "mongo/db/jsobj.h"
 #include "mongo/db/json.h"
 #include "mongo/util/background.h"
+#include "mongo/util/fail_point_service.h"
 #include "mongo/util/scopeguard.h"
 #include "mongo/util/timer.h"
 
 namespace mongo {
+    MONGO_FP_DECLARE(rsmWatcherFreeze);
+
     /*
      * Set of commands that can be used with $readPreference
      */
@@ -308,6 +311,12 @@ namespace mongo {
             log() << "starting" << endl;
             while ( ! inShutdown() ) {
                 sleepsecs( 10 );
+
+                if (rsmWatcherFreeze.shouldFail()) {
+                    log() << "fp skil rsm refresh" << endl;
+                    continue;
+                }
+
                 try {
                     ReplicaSetMonitor::checkAll( true );
                 }
