diff --git a/src/main/java/org/apache/sling/testing/clients/SlingClient.java b/src/main/java/org/apache/sling/testing/clients/SlingClient.java
index bee5b40..8359bf2 100644
--- a/src/main/java/org/apache/sling/testing/clients/SlingClient.java
+++ b/src/main/java/org/apache/sling/testing/clients/SlingClient.java
@@ -589,6 +589,11 @@
             return this;
         }
 
+        public InternalBuilder<T> setPreemptiveAuth(boolean isPreemptiveAuth) {
+            this.configBuilder.setPreemptiveAuth(isPreemptiveAuth);
+            return this;
+        }
+
         public InternalBuilder<T> setCookieStore(CookieStore cs) {
             this.configBuilder.setCookieStore(cs);
             return this;
diff --git a/src/main/java/org/apache/sling/testing/clients/SlingClientConfig.java b/src/main/java/org/apache/sling/testing/clients/SlingClientConfig.java
index 58d380c..531d7e1 100644
--- a/src/main/java/org/apache/sling/testing/clients/SlingClientConfig.java
+++ b/src/main/java/org/apache/sling/testing/clients/SlingClientConfig.java
@@ -69,11 +69,13 @@
      */
     protected final AuthCache authCache;
 
+
     /**
      * Extra values to be used in interceptors, custom auth mechanisms, etc.
      */
     protected final Map<String, String> values;
 
+
     protected SlingClientConfig(URI url, String user, String password,
                                 CookieStore cookieStore,
                                 CredentialsProvider credentialsProvider, AuthCache authCache) {
@@ -153,6 +155,8 @@
 
         protected AuthCache authCache;
 
+        protected boolean preeemptiveAuth;
+
         protected Builder() {
         }
 
@@ -193,6 +197,11 @@
             return this;
         }
 
+        public Builder setPreemptiveAuth(boolean preemptiveAuth) {
+            this.preeemptiveAuth = preemptiveAuth;
+            return this;
+        }
+
         public Builder setCookieStore(CookieStore cookieStore) {
             this.cookieStore = cookieStore;
             return this;
@@ -209,13 +218,18 @@
                 }
             }
 
-            // Create default AuthCache if not set
+            // Create default AuthCache for basic if not set
             if (authCache == null) {
                 BasicScheme basicScheme = new BasicScheme();
                 authCache = new BasicAuthCache();
                 authCache.put(URIUtils.extractHost(url), basicScheme);
             }
 
+            // if preemptive auth is disabled, force auth cache to be null
+            if (!this.preeemptiveAuth) {
+                authCache = null;
+            }
+
             // Create default CookieStore if not set
             if (cookieStore == null) {
                 cookieStore = new BasicCookieStore();
diff --git a/src/main/java/org/apache/sling/testing/clients/interceptors/FormBasedAuthInterceptor.java b/src/main/java/org/apache/sling/testing/clients/interceptors/FormBasedAuthInterceptor.java
new file mode 100644
index 0000000..0f78425
--- /dev/null
+++ b/src/main/java/org/apache/sling/testing/clients/interceptors/FormBasedAuthInterceptor.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.sling.testing.clients.interceptors;
+
+import org.apache.http.*;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.cookie.Cookie;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.protocol.HttpContext;
+import org.apache.sling.testing.clients.ClientException;
+import org.apache.sling.testing.clients.SlingClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.LinkedList;
+import java.util.List;
+
+public class FormBasedAuthInterceptor implements HttpRequestInterceptor {
+    static final Logger LOG = LoggerFactory.getLogger(FormBasedAuthInterceptor.class);
+
+    private final String loginPath = "j_security_check";
+    private final String loginTokenName;
+
+    public FormBasedAuthInterceptor(String loginTokenName) {
+        this.loginTokenName = loginTokenName;
+    }
+
+    public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
+        final URI uri = URI.create(request.getRequestLine().getUri());
+        if (uri.getPath().endsWith(loginPath)) {
+            LOG.debug("Request ends with {} so I'm not intercepting the request", loginPath);
+            return;
+        }
+
+        Cookie loginCookie = getLoginCookie(context, loginTokenName);
+        if (loginCookie != null) {
+            LOG.debug("Request has cookie {}={} so I'm not intercepting the request", loginCookie.getName(), loginCookie.getValue());
+            return;
+        }
+
+        // get host
+        final HttpHost host = HttpClientContext.adapt(context).getTargetHost();
+
+        // get the username and password from the credentials provider
+        final CredentialsProvider credsProvider = HttpClientContext.adapt(context).getCredentialsProvider();
+        final AuthScope scope = new AuthScope(host.getHostName(), host.getPort());
+        final String username = credsProvider.getCredentials(scope).getUserPrincipal().getName();
+        final String password = credsProvider.getCredentials(scope).getPassword();
+
+        List<NameValuePair> parameters = new LinkedList<>();
+        parameters.add(new BasicNameValuePair("j_username", username));
+        parameters.add(new BasicNameValuePair("j_password", password));
+        HttpEntity httpEntity = new UrlEncodedFormEntity(parameters, "utf-8");
+
+        HttpPost loginPost = new HttpPost(URI.create(request.getRequestLine().getUri()).resolve(loginPath));
+        loginPost.setEntity(httpEntity);
+        final CloseableHttpClient client = HttpClientBuilder.create().disableRedirectHandling().build();
+
+        client.execute(host, loginPost, context);
+
+    }
+
+    /** Get login token cookie or null if not found */
+    private Cookie getLoginCookie(HttpContext context, String loginTokenName) {
+        for (Cookie cookie : HttpClientContext.adapt(context).getCookieStore().getCookies()) {
+            if (cookie.getName().equalsIgnoreCase(loginTokenName)) {
+                return cookie;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/org/apache/sling/testing/clients/interceptors/package-info.java b/src/main/java/org/apache/sling/testing/clients/interceptors/package-info.java
index 0f097b5..25c711d 100644
--- a/src/main/java/org/apache/sling/testing/clients/interceptors/package-info.java
+++ b/src/main/java/org/apache/sling/testing/clients/interceptors/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("1.0.1")
+@Version("1.1.0")
 package org.apache.sling.testing.clients.interceptors;
 
 import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/testing/clients/package-info.java b/src/main/java/org/apache/sling/testing/clients/package-info.java
index 991d7e5..9970e37 100644
--- a/src/main/java/org/apache/sling/testing/clients/package-info.java
+++ b/src/main/java/org/apache/sling/testing/clients/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("1.3.0")
+@Version("1.4.0")
 package org.apache.sling.testing.clients;
 
 import org.osgi.annotation.versioning.Version;
