diff --git a/jstests/libs/election_timing_test.js b/jstests/libs/election_timing_test.js
index 51d0889..80815a2 100644
--- a/jstests/libs/election_timing_test.js
+++ b/jstests/libs/election_timing_test.js
@@ -29,6 +29,9 @@ var ElectionTimingTest = function(opts) {
     // A function that runs after the ReplSetTest is initialized.
     this.testSetup = opts.testSetup || Function.prototype;
 
+    // A function that starts a workload prior to the test loop.
+    this.runWorkload = opts.runWorkload || Function.prototype;
+
     // A function that triggers election, default is to kill the mongod process.
     this.electionTrigger = opts.electionTrigger || this.stopPrimary;
 
@@ -52,7 +55,7 @@ ElectionTimingTest.prototype._runTimingTest = function() {
         var cycleData = {testRun: run, results: []};
 
         jsTestLog("Starting ReplSetTest for test " + this.name + " run: " + run);
-        this.rst = new ReplSetTest({name: this.name, nodes: this.nodes, nodeOptions: {verbose:""}});
+        this.rst = new ReplSetTest({name: this.name, nodes: this.nodes, nodeOptions: {verbose: "", wiredTigerCacheSizeGB: 4}});
         this.rst.startSet();
 
         // Get the replset config and apply the settings object.
@@ -80,6 +83,7 @@ ElectionTimingTest.prototype._runTimingTest = function() {
         var coll = primary.getCollection(collectionName);
         var secondary = this.rst.getSecondary();
 
+        // This is just to seed the initial replication.
         for (var i = 0; i < 100; i++) {
             assert.writeOK(coll.insert({_id: i,
                                         x: i * 3,
@@ -95,6 +99,9 @@ ElectionTimingTest.prototype._runTimingTest = function() {
             jsTestLog("Starting test: " + this.name + " run: " + run + " cycle: " + cycle);
             var oldElectionId = primary.getDB("admin").isMaster().electionId;
 
+            // Start the provided workload.
+            this.runWorkload();
+
             // Time the new election.
             var stepDownTime = Date.now();
 
@@ -115,14 +122,17 @@ ElectionTimingTest.prototype._runTimingTest = function() {
                     }),
                     "node " + secondary.host + " failed to become primary"
                 );
+                connected = true;
             } catch (e) {
                 // If we didn"t find a primary, save the error, break so this
-                // ReplSetTest is stopped. We can"t continue from a flaky state.
+                // ReplSetTest is stopped. We can't continue from a flaky state.
                 this.testErrors.push({testRun: run,
                                       cycle: cycle,
                                       status: "waitForMemberState(PRIMARY) failed: " +
-                                               secondary.host,
+                                         secondary.host,
+                                      rsStatus: this.rst.status(),
                                       error: e});
+                                      printjson(this.rst.status());
                 break;
             }
 
diff --git a/jstests/replsets/election_timing_workload.js b/jstests/replsets/election_timing_workload.js
new file mode 100644
index 0000000..f1dbcbc
--- /dev/null
+++ b/jstests/replsets/election_timing_workload.js
@@ -0,0 +1,151 @@
+(function() {
+    "use strict";
+    load("jstests/libs/election_timing_test.js");
+    load('jstests/libs/parallelTester.js');
+    var testStart = Date.now();
+
+
+    function workload(port) {
+        var conn = new Mongo(port);
+
+        while (true) {
+            var coll = conn.getDB('test').vehicles;
+            var bulk = coll.initializeUnorderedBulkOp();
+
+            for (var i = 0; i < 1000; i++) {
+                var doc = {
+                    dateandtime: Date.now(),
+                    vehicleIdentNum: Random.randInt(1000),
+                    vehicleMake: Random.randInt(100000),
+                    vehicleModel: Random.randInt(10000),
+                    price: ((Random.rand() * 500) + Random.randInt(100000)) / 100
+                };
+                bulk.insert(doc);
+            }
+            bulk.execute({w: "majority"});
+            sleep(Random.randInt(15));
+        }
+    }
+
+    var runWorkload = function () {
+        var primary = this.rst.getPrimary();
+        var coll = primary.getDB("test").vehicles;
+        coll.drop();
+        coll.ensureIndex({price: 1, vehicleMake: 1});
+        coll.ensureIndex({vehicleIdentNum: 1, price: 1, vehicleMake: 1});
+        coll.ensureIndex({price: 1, dateandtime: 1, vehicleMake: 1});
+
+        // create workload threads
+        this.threads = [];
+        for (var i = 0; i < 30; i++) {
+            var t = new ScopedThread(workload, primary.host);
+            this.threads.push(t);
+            t.start();
+        }
+        sleep(20 * 1000);
+    };
+
+    var testReset = function () {
+        this.threads.forEach(function(t) {
+            t.join();
+        });
+        this.stopPrimaryReset();
+        // Make sure the secondaries are up.
+        this.rst.awaitSecondaryNodes();
+    };
+
+    var hardStop = function() {
+        this.originalPrimary = this.rst.getNodeId(this.rst.getPrimary());
+        this.rst.stop(this.originalPrimary, 9);
+    };
+
+    var testCases = [
+        {
+            name: "loadedStop",
+            description: "pv1 under load, primary is stopped",
+            protocolVersion: 1,
+            // testRuns is the number of times a new ReplSetTest will be used.
+            testRuns: 5,
+            // testCycles is the number of election cycles that will be run per ReplSetTest lifespan.
+            testCycles: 5,
+            // testSetup is run after the replSet is initiated.
+            // Function.prototype is the default.
+            testSetup: Function.prototype,
+            // Function that puts load on the primary.
+            runWorkload: runWorkload,
+            // Trigger an election by stepping down, stopping, or partitioning the primary.
+            // stopPrimary is the default.
+            electionTrigger: ElectionTimingTest.prototype.stopPrimary,
+            // After the election has completed, make the old primary available again.
+            // stopPrimaryReset is the default.
+            testReset: testReset
+        },
+        {
+            name: "loadedStop1500",
+            description: "pv1 under load, primary is stopped, electionTimeoutMillis 1500",
+            protocolVersion: 1,
+            testRuns: 5,
+            testCycles: 5,
+            settings: {electionTimeoutMillis: 1500},
+            testSetup: Function.prototype,
+            runWorkload: runWorkload,
+            electionTrigger: ElectionTimingTest.prototype.stopPrimary,
+            testReset: testReset
+        },
+        {
+            name: "loadedHardStop",
+            description: "pv1 under load, primary is stopped",
+            protocolVersion: 1,
+            testRuns: 5,
+            testCycles: 5,
+            testSetup: Function.prototype,
+            runWorkload: runWorkload,
+            electionTrigger: hardStop,
+            testReset: testReset
+        },
+        {
+            name: "loadedHardStop1500",
+            description: "pv1 under load, primary is stopped, electionTimeoutMillis 1500",
+            protocolVersion: 1,
+            testRuns: 5,
+            testCycles: 5,
+            settings: {electionTimeoutMillis: 1500},
+            testSetup: Function.prototype,
+            runWorkload: runWorkload,
+            electionTrigger: hardStop, 
+            testReset: testReset
+        }];
+
+        testCases.forEach(function (tc) {
+            var testRun = new ElectionTimingTest(tc);
+            tc.testResults = testRun.testResults;
+
+            if (testRun.testErrors.length) {
+                // Stop tests if we encounter an error.
+                // Dump available information for debugging.
+                jsTestLog("Errors from: " + tc.name);
+                printjson(tc);
+                printjson(testRun.testErrors);
+                throw new Error(testRun.testErrors[0].status);
+            }
+            // Print results of current test in case
+            // we need to analyze a failed test later.
+            jsTestLog("Raw Results: " + tc.name);
+            printjson(tc.testResults);
+        });
+
+        testCases.forEach(function (tc) {
+            var allResults = [];
+            tc.testResults.forEach(function (tr) {
+                allResults = allResults.concat(tr.results);
+            });
+
+            var resAvg = Array.avg(allResults);
+            var resMin = Math.min(...allResults);
+            var resMax = Math.max(...allResults);
+            jsTestLog("Results: " + tc.name +
+                      " Average over " +  allResults.length + " runs: " + resAvg +
+                          " Min: " +  resMin + " Max: " + resMax);
+        });
+
+})();
