diff --git a/src/main/java/io/mifos/core/test/servicestarter/Microservice.java b/src/main/java/io/mifos/core/test/servicestarter/Microservice.java
index baf247f..52d0920 100644
--- a/src/main/java/io/mifos/core/test/servicestarter/Microservice.java
+++ b/src/main/java/io/mifos/core/test/servicestarter/Microservice.java
@@ -29,7 +29,6 @@
 import java.io.IOException;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
 
 /**
  * @author Myrle Krantz
@@ -37,6 +36,8 @@
 @SuppressWarnings({"unused", "WeakerAccess"})
 public class Microservice<T> extends ExternalResource {
 
+  private static final long MAX_WAIT_DEFAULT = 150;
+
   private final Class<T> clazz;
   private final String artifactName;
   private final String artifactVersion;
@@ -47,6 +48,7 @@
   private Process process;
   private T api;
   private String debuggingParams = null;
+  private long maxWait = MAX_WAIT_DEFAULT;
 
   public Microservice(
           final Class<T> clazz,
@@ -90,17 +92,42 @@
     return this;
   }
 
-  public void waitTillRegistered(final DiscoveryClient discoveryClient, final Microservice... dependentOnServices) {
-    if (discoveryClient != null) {
-      Stream.concat(Stream.of(applicationName), Stream.of(dependentOnServices).map(Microservice::name))
-              .forEach(x -> {
-                boolean found = false;
-                while (!found) {
-                  final List<ServiceInstance> thisApp = discoveryClient.getInstances(x);
-                  found = !thisApp.isEmpty();
-                }
-              });
+  public Microservice<T> maxWait(final long maxWait) {
+    this.maxWait = maxWait;
+    return this;
+  }
+
+  public Microservice<T> setApiFactory(final ApiFactory newValue)
+  {
+    this.apiFactory = newValue;
+    return this;
+  }
+
+  public boolean waitTillRegistered(final DiscoveryClient discoveryClient) throws InterruptedException {
+    if (discoveryClient == null) {
+      return false;
     }
+
+    long nextWait = 1;
+    long sumWait = 0;
+
+    boolean found = false;
+
+    while (!found) {
+      final List<ServiceInstance> thisApp = discoveryClient.getInstances(applicationName);
+      found = !thisApp.isEmpty();
+      if (!found) {
+        TimeUnit.SECONDS.sleep(nextWait);
+        sumWait += nextWait;
+        nextWait = nextWait * 2;
+
+        if (sumWait > maxWait) {
+          return false;
+        }
+      }
+    }
+
+    return true;
   }
 
   @Override
@@ -145,11 +172,6 @@
     return process.exitValue();
   }
 
-  public void setApiFactory(final ApiFactory newValue)
-  {
-    this.apiFactory = newValue;
-  }
-
   public T api() {
     if (this.api == null) {
       this.api = this.apiFactory.create(clazz, processEnvironment.serverURI());
