diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
index cf07cde..6dc3216 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
@@ -406,7 +406,7 @@ public class Oak {
 
         if (asyncIndexing) {
             Runnable task = new AsyncIndexUpdate("async", store, indexEditors);
-            WhiteboardUtils.scheduleWithFixedDelay(whiteboard, task, 5);
+            WhiteboardUtils.scheduleWithFixedDelay(whiteboard, task, 5, true);
         }
 
         // FIXME: OAK-810 move to proper workspace initialization
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java
index 32aa13b..39b2d62 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java
@@ -32,6 +32,7 @@ import com.google.common.base.Objects;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.value.Conversions;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.EditorDiff;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
@@ -58,6 +59,12 @@ public class AsyncIndexUpdate implements Runnable {
     private static final CommitFailedException CONCURRENT_UPDATE = new CommitFailedException(
             "Async", 1, "Concurrent update detected");
 
+    /**
+     * Timeout in minutes after which an async job would be considered as timed out. Another
+     * node in cluster would wait for timeout before taking over a running job
+     */
+    private static final int ASYNC_TIMEOUT = 15;
+
     private final String name;
 
     private final NodeStore store;
@@ -86,6 +93,11 @@ public class AsyncIndexUpdate implements Runnable {
             return;
         }
 
+        if(isAlreadyRunning(store)){
+            log.debug("Async job found to be already running. Skipping");
+            return;
+        }
+
         preAsyncRun(store);
 
         NodeBuilder builder = store.getRoot().builder();
@@ -151,6 +163,32 @@ public class AsyncIndexUpdate implements Runnable {
         }
     }
 
+    private boolean isAlreadyRunning(NodeStore store) {
+        NodeState indexState = store.getRoot().getChildNode(IndexConstants.INDEX_DEFINITIONS_NAME);
+
+        //Probably the first run
+        if (!indexState.exists()) {
+            return false;
+        }
+
+        if ("running".equals(indexState.getString("async-status"))) {
+            PropertyState startTime = indexState.getProperty("async-start");
+            Calendar start = Conversions.convert(startTime.getValue(Type.DATE)).toCalendar();
+            Calendar now = Calendar.getInstance();
+            long delta = now.getTimeInMillis() - start.getTimeInMillis();
+
+            //Check if the job has timedout and we need to take over
+            if (TimeUnit.MILLISECONDS.toMinutes(delta) > ASYNC_TIMEOUT) {
+                log.info("Async job found which stated on {} has timed out in {} minutes. " +
+                        "This node would take over the job.",
+                        startTime.getValue(Type.DATE), ASYNC_TIMEOUT);
+                return false;
+            }
+            return true;
+        }
+        return false;
+    }
+
     private static void preAsyncRunStatus(NodeBuilder builder) {
         builder.getChildNode(IndexConstants.INDEX_DEFINITIONS_NAME)
                 .setProperty("async-status", "running")
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtils.java oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtils.java
index ed259db..6980a65 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtils.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtils.java
@@ -29,12 +29,21 @@ public class WhiteboardUtils {
     private static final AtomicLong COUNTER = new AtomicLong();
 
     public static Registration scheduleWithFixedDelay(
-            Whiteboard whiteboard, Runnable runnable, long delay) {
+            Whiteboard whiteboard, Runnable runnable, long delayInSeconds) {
+        return scheduleWithFixedDelay(whiteboard, runnable, delayInSeconds, false);
+    }
+
+    public static Registration scheduleWithFixedDelay(
+            Whiteboard whiteboard, Runnable runnable, long delayInSeconds, boolean runOnSingleClusterNode) {
+        ImmutableMap.Builder builder = ImmutableMap.builder()
+                .put("scheduler.period", delayInSeconds)
+                .put("scheduler.concurrent", false);
+        if(runOnSingleClusterNode){
+            //Make use of feature while running in Sling SLING-2979
+            builder.put("scheduler.runOn", "SINGLE");
+        }
         return whiteboard.register(
-                Runnable.class, runnable, ImmutableMap.builder()
-                    .put("scheduler.period", delay)
-                    .put("scheduler.concurrent", false)
-                    .build());
+                Runnable.class, runnable, builder.build());
     }
 
     public static <T> Registration registerMBean(
