keycloak-uncached

Merge pull request #484 from stianst/master Refactor to

6/27/2014 5:54:31 AM

Changes

core/src/main/java/org/keycloak/provider/ProviderSession.java 20(+0 -20)

core/src/main/java/org/keycloak/provider/ProviderSessionFactory.java 14(+0 -14)

model/invalidation-cache/model-adapters/src/main/resources/META-INF/services/org.keycloak.models.cache.CacheKeycloakSessionFactory 2(+0 -2)

model/jpa/src/main/resources/META-INF/services/org.keycloak.models.KeycloakSessionFactory 1(+0 -1)

model/mongo/src/main/resources/META-INF/services/org.keycloak.models.KeycloakSessionFactory 1(+0 -1)

services/src/main/java/org/keycloak/services/DefaultProviderSession.java 71(+0 -71)

Details

diff --git a/audit/email/src/main/java/org/keycloak/audit/email/EmailAuditListener.java b/audit/email/src/main/java/org/keycloak/audit/email/EmailAuditListener.java
index 0ef510a..53a8fcd 100644
--- a/audit/email/src/main/java/org/keycloak/audit/email/EmailAuditListener.java
+++ b/audit/email/src/main/java/org/keycloak/audit/email/EmailAuditListener.java
@@ -10,10 +10,6 @@ import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
 
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 /**
@@ -23,12 +19,12 @@ public class EmailAuditListener implements AuditListener {
 
     private static final Logger log = Logger.getLogger(EmailAuditListener.class);
 
-    private KeycloakSession keycloakSession;
+    private KeycloakSession session;
     private EmailProvider emailProvider;
     private Set<EventType> includedEvents;
 
-    public EmailAuditListener(KeycloakSession keycloakSession, EmailProvider emailProvider, Set<EventType> includedEvents) {
-        this.keycloakSession = keycloakSession;
+    public EmailAuditListener(KeycloakSession session, EmailProvider emailProvider, Set<EventType> includedEvents) {
+        this.session = session;
         this.emailProvider = emailProvider;
         this.includedEvents = includedEvents;
     }
@@ -37,7 +33,7 @@ public class EmailAuditListener implements AuditListener {
     public void onEvent(Event event) {
         if (includedEvents.contains(event.getEvent())) {
             if (event.getRealmId() != null && event.getUserId() != null) {
-                RealmModel realm = keycloakSession.getRealm(event.getRealmId());
+                RealmModel realm = session.getRealm(event.getRealmId());
                 UserModel user = realm.getUserById(event.getUserId());
                 if (user != null && user.getEmail() != null && user.isEmailVerified()) {
                     try {
diff --git a/audit/email/src/main/java/org/keycloak/audit/email/EmailAuditListenerFactory.java b/audit/email/src/main/java/org/keycloak/audit/email/EmailAuditListenerFactory.java
index 7459a06..baa62eb 100644
--- a/audit/email/src/main/java/org/keycloak/audit/email/EmailAuditListenerFactory.java
+++ b/audit/email/src/main/java/org/keycloak/audit/email/EmailAuditListenerFactory.java
@@ -6,7 +6,6 @@ import org.keycloak.audit.AuditListenerFactory;
 import org.keycloak.audit.EventType;
 import org.keycloak.email.EmailProvider;
 import org.keycloak.models.KeycloakSession;
-import org.keycloak.provider.ProviderSession;
 
 import java.util.Collections;
 import java.util.HashSet;
@@ -25,10 +24,9 @@ public class EmailAuditListenerFactory implements AuditListenerFactory {
     private Set<EventType> includedEvents = new HashSet<EventType>();
 
     @Override
-    public AuditListener create(ProviderSession providerSession) {
-        KeycloakSession keycloakSession = providerSession.getProvider(KeycloakSession.class);
-        EmailProvider emailProvider = providerSession.getProvider(EmailProvider.class);
-        return new EmailAuditListener(keycloakSession, emailProvider, includedEvents);
+    public AuditListener create(KeycloakSession session) {
+        EmailProvider emailProvider = session.getProvider(EmailProvider.class);
+        return new EmailAuditListener(session, emailProvider, includedEvents);
     }
 
     @Override
diff --git a/audit/jboss-logging/pom.xml b/audit/jboss-logging/pom.xml
index b4c6487..12a0bd6 100755
--- a/audit/jboss-logging/pom.xml
+++ b/audit/jboss-logging/pom.xml
@@ -26,6 +26,12 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-model-api</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
             <artifactId>keycloak-audit-api</artifactId>
             <version>${project.version}</version>
             <scope>provided</scope>
diff --git a/audit/jboss-logging/src/main/java/org/keycloak/audit/log/JBossLoggingAuditListenerFactory.java b/audit/jboss-logging/src/main/java/org/keycloak/audit/log/JBossLoggingAuditListenerFactory.java
index 1bafa9f..7acef56 100644
--- a/audit/jboss-logging/src/main/java/org/keycloak/audit/log/JBossLoggingAuditListenerFactory.java
+++ b/audit/jboss-logging/src/main/java/org/keycloak/audit/log/JBossLoggingAuditListenerFactory.java
@@ -4,7 +4,7 @@ import org.jboss.logging.Logger;
 import org.keycloak.Config;
 import org.keycloak.audit.AuditListener;
 import org.keycloak.audit.AuditListenerFactory;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -16,7 +16,7 @@ public class JBossLoggingAuditListenerFactory implements AuditListenerFactory {
     private static final Logger logger = Logger.getLogger("org.keycloak.audit");
 
     @Override
-    public AuditListener create(ProviderSession providerSession) {
+    public AuditListener create(KeycloakSession session) {
         return new JBossLoggingAuditListener(logger);
     }
 
diff --git a/audit/jpa/pom.xml b/audit/jpa/pom.xml
index d124c39..db0a350 100755
--- a/audit/jpa/pom.xml
+++ b/audit/jpa/pom.xml
@@ -21,6 +21,12 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-model-api</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
             <artifactId>keycloak-audit-api</artifactId>
             <version>${project.version}</version>
             <scope>provided</scope>
diff --git a/audit/jpa/src/main/java/org/keycloak/audit/jpa/JpaAuditProviderFactory.java b/audit/jpa/src/main/java/org/keycloak/audit/jpa/JpaAuditProviderFactory.java
index 546b5e9..2e01171 100644
--- a/audit/jpa/src/main/java/org/keycloak/audit/jpa/JpaAuditProviderFactory.java
+++ b/audit/jpa/src/main/java/org/keycloak/audit/jpa/JpaAuditProviderFactory.java
@@ -4,7 +4,7 @@ import org.keycloak.Config;
 import org.keycloak.audit.AuditProvider;
 import org.keycloak.audit.AuditProviderFactory;
 import org.keycloak.audit.EventType;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.util.JpaUtils;
 
 import javax.persistence.EntityManagerFactory;
@@ -23,7 +23,7 @@ public class JpaAuditProviderFactory implements AuditProviderFactory {
     private Set<EventType> includedEvents = new HashSet<EventType>();
 
     @Override
-    public AuditProvider create(ProviderSession providerSession) {
+    public AuditProvider create(KeycloakSession session) {
         return new JpaAuditProvider(emf.createEntityManager(), includedEvents);
     }
 
diff --git a/audit/mongo/pom.xml b/audit/mongo/pom.xml
index 481ba0a..db80dda 100755
--- a/audit/mongo/pom.xml
+++ b/audit/mongo/pom.xml
@@ -21,6 +21,12 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-model-api</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
             <artifactId>keycloak-audit-api</artifactId>
             <version>${project.version}</version>
             <scope>provided</scope>
diff --git a/audit/mongo/src/main/java/org/keycloak/audit/mongo/MongoAuditProviderFactory.java b/audit/mongo/src/main/java/org/keycloak/audit/mongo/MongoAuditProviderFactory.java
index 5a3d95a..d27c40e 100644
--- a/audit/mongo/src/main/java/org/keycloak/audit/mongo/MongoAuditProviderFactory.java
+++ b/audit/mongo/src/main/java/org/keycloak/audit/mongo/MongoAuditProviderFactory.java
@@ -10,7 +10,7 @@ import org.keycloak.Config;
 import org.keycloak.audit.AuditProvider;
 import org.keycloak.audit.AuditProviderFactory;
 import org.keycloak.audit.EventType;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 import java.net.UnknownHostException;
 import java.util.Collections;
@@ -31,7 +31,7 @@ public class MongoAuditProviderFactory implements AuditProviderFactory {
     private Set<EventType> includedEvents = new HashSet<EventType>();
 
     @Override
-    public AuditProvider create(ProviderSession providerSession) {
+    public AuditProvider create(KeycloakSession session) {
         return new MongoAuditProvider(db.getCollection("audit"), includedEvents);
     }
 
diff --git a/audit/tests/pom.xml b/audit/tests/pom.xml
index c3efa5a..7b288c5 100755
--- a/audit/tests/pom.xml
+++ b/audit/tests/pom.xml
@@ -39,6 +39,12 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
+            <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-model-api</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>provided</scope>
diff --git a/authentication/authentication-api/src/main/java/org/keycloak/authentication/AuthenticationProviderManager.java b/authentication/authentication-api/src/main/java/org/keycloak/authentication/AuthenticationProviderManager.java
index d36cb24..20d08bb 100755
--- a/authentication/authentication-api/src/main/java/org/keycloak/authentication/AuthenticationProviderManager.java
+++ b/authentication/authentication-api/src/main/java/org/keycloak/authentication/AuthenticationProviderManager.java
@@ -1,17 +1,16 @@
 package org.keycloak.authentication;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import org.jboss.logging.Logger;
 import org.keycloak.models.AuthenticationLinkModel;
 import org.keycloak.models.AuthenticationProviderModel;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.util.ProviderLoader;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Access point to authentication SPI. It finds configured and available {@link AuthenticationProvider} instances for current realm
@@ -28,8 +27,8 @@ public class AuthenticationProviderManager {
     private final RealmModel realm;
     private final Map<String, AuthenticationProvider> delegates;
 
-    public static AuthenticationProviderManager getManager(RealmModel realm, ProviderSession providerSession) {
-        Iterable<AuthenticationProvider> providers = providerSession.getAllProviders(AuthenticationProvider.class);
+    public static AuthenticationProviderManager getManager(RealmModel realm, KeycloakSession session) {
+        Iterable<AuthenticationProvider> providers = session.getAllProviders(AuthenticationProvider.class);
 
         Map<String, AuthenticationProvider> providersMap = new HashMap<String, AuthenticationProvider>();
         for (AuthenticationProvider provider : providers) {
diff --git a/authentication/authentication-model/src/main/java/org/keycloak/authentication/model/ExternalModelAuthenticationProvider.java b/authentication/authentication-model/src/main/java/org/keycloak/authentication/model/ExternalModelAuthenticationProvider.java
index 2ff83b0..9381bb9 100644
--- a/authentication/authentication-model/src/main/java/org/keycloak/authentication/model/ExternalModelAuthenticationProvider.java
+++ b/authentication/authentication-model/src/main/java/org/keycloak/authentication/model/ExternalModelAuthenticationProvider.java
@@ -1,15 +1,14 @@
 package org.keycloak.authentication.model;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
 import org.jboss.resteasy.spi.ResteasyProviderFactory;
-import org.keycloak.models.KeycloakSession;
-import org.keycloak.models.RealmModel;
 import org.keycloak.authentication.AuthProviderConstants;
 import org.keycloak.authentication.AuthenticationProviderException;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.RealmModel;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
 
 /**
  * AbstractModelAuthenticationProvider, which delegates authentication operations to different (external) realm
@@ -18,7 +17,7 @@ import org.keycloak.provider.ProviderSession;
  */
 public class ExternalModelAuthenticationProvider extends AbstractModelAuthenticationProvider {
 
-    public ExternalModelAuthenticationProvider(ProviderSession providerSession) {
+    public ExternalModelAuthenticationProvider() {
     }
 
     @Override
diff --git a/authentication/authentication-model/src/main/java/org/keycloak/authentication/model/ExternalModelAuthenticationProviderFactory.java b/authentication/authentication-model/src/main/java/org/keycloak/authentication/model/ExternalModelAuthenticationProviderFactory.java
index 4a208c0..7f19623 100644
--- a/authentication/authentication-model/src/main/java/org/keycloak/authentication/model/ExternalModelAuthenticationProviderFactory.java
+++ b/authentication/authentication-model/src/main/java/org/keycloak/authentication/model/ExternalModelAuthenticationProviderFactory.java
@@ -4,7 +4,7 @@ import org.keycloak.Config;
 import org.keycloak.authentication.AuthProviderConstants;
 import org.keycloak.authentication.AuthenticationProvider;
 import org.keycloak.authentication.AuthenticationProviderFactory;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 /**
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@@ -12,8 +12,8 @@ import org.keycloak.provider.ProviderSession;
 public class ExternalModelAuthenticationProviderFactory implements AuthenticationProviderFactory {
 
     @Override
-    public AuthenticationProvider create(ProviderSession providerSession) {
-        return new ExternalModelAuthenticationProvider(providerSession);
+    public AuthenticationProvider create(KeycloakSession session) {
+        return new ExternalModelAuthenticationProvider();
     }
 
     @Override
diff --git a/authentication/authentication-model/src/main/java/org/keycloak/authentication/model/ModelAuthenticationProviderFactory.java b/authentication/authentication-model/src/main/java/org/keycloak/authentication/model/ModelAuthenticationProviderFactory.java
index 47ef637..ac8c393 100644
--- a/authentication/authentication-model/src/main/java/org/keycloak/authentication/model/ModelAuthenticationProviderFactory.java
+++ b/authentication/authentication-model/src/main/java/org/keycloak/authentication/model/ModelAuthenticationProviderFactory.java
@@ -4,7 +4,7 @@ import org.keycloak.Config;
 import org.keycloak.authentication.AuthProviderConstants;
 import org.keycloak.authentication.AuthenticationProvider;
 import org.keycloak.authentication.AuthenticationProviderFactory;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 /**
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@@ -12,7 +12,7 @@ import org.keycloak.provider.ProviderSession;
 public class ModelAuthenticationProviderFactory implements AuthenticationProviderFactory {
 
     @Override
-    public AuthenticationProvider create(ProviderSession providerSession) {
+    public AuthenticationProvider create(KeycloakSession session) {
         return new ModelAuthenticationProvider();
     }
 
diff --git a/authentication/authentication-picketlink/src/main/java/org/keycloak/authentication/picketlink/PicketlinkAuthenticationProviderFactory.java b/authentication/authentication-picketlink/src/main/java/org/keycloak/authentication/picketlink/PicketlinkAuthenticationProviderFactory.java
index 29cdb6f..f7a18e7 100644
--- a/authentication/authentication-picketlink/src/main/java/org/keycloak/authentication/picketlink/PicketlinkAuthenticationProviderFactory.java
+++ b/authentication/authentication-picketlink/src/main/java/org/keycloak/authentication/picketlink/PicketlinkAuthenticationProviderFactory.java
@@ -4,8 +4,8 @@ import org.keycloak.Config;
 import org.keycloak.authentication.AuthProviderConstants;
 import org.keycloak.authentication.AuthenticationProvider;
 import org.keycloak.authentication.AuthenticationProviderFactory;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.picketlink.IdentityManagerProvider;
-import org.keycloak.provider.ProviderSession;
 
 /**
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@@ -13,8 +13,8 @@ import org.keycloak.provider.ProviderSession;
 public class PicketlinkAuthenticationProviderFactory implements AuthenticationProviderFactory {
 
     @Override
-    public AuthenticationProvider create(ProviderSession providerSession) {
-        return new PicketlinkAuthenticationProvider(providerSession.getProvider(IdentityManagerProvider.class));
+    public AuthenticationProvider create(KeycloakSession session) {
+        return new PicketlinkAuthenticationProvider(session.getProvider(IdentityManagerProvider.class));
     }
 
     @Override
diff --git a/core/src/main/java/org/keycloak/Config.java b/core/src/main/java/org/keycloak/Config.java
index 16a320c..f26c851 100755
--- a/core/src/main/java/org/keycloak/Config.java
+++ b/core/src/main/java/org/keycloak/Config.java
@@ -16,7 +16,12 @@ public class Config {
     }
 
     public static String getProvider(String spi) {
-        return configProvider.getProvider(spi);
+        String provider = configProvider.getProvider(spi);
+        if (provider == null || provider.trim().equals("")) {
+            return null;
+        } else {
+            return provider;
+        }
     }
 
     public static Scope scope(String... scope) {
diff --git a/examples/providers/audit-listener-sysout/pom.xml b/examples/providers/audit-listener-sysout/pom.xml
index d24711c..e02f858 100755
--- a/examples/providers/audit-listener-sysout/pom.xml
+++ b/examples/providers/audit-listener-sysout/pom.xml
@@ -21,6 +21,11 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-model-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
             <artifactId>keycloak-audit-api</artifactId>
             <version>${project.version}</version>
         </dependency>
diff --git a/examples/providers/audit-listener-sysout/src/main/java/org/keycloak/examples/providers/audit/SysoutAuditListenerFactory.java b/examples/providers/audit-listener-sysout/src/main/java/org/keycloak/examples/providers/audit/SysoutAuditListenerFactory.java
index 2871f50..368446c 100644
--- a/examples/providers/audit-listener-sysout/src/main/java/org/keycloak/examples/providers/audit/SysoutAuditListenerFactory.java
+++ b/examples/providers/audit-listener-sysout/src/main/java/org/keycloak/examples/providers/audit/SysoutAuditListenerFactory.java
@@ -4,7 +4,7 @@ import org.keycloak.Config;
 import org.keycloak.audit.AuditListener;
 import org.keycloak.audit.AuditListenerFactory;
 import org.keycloak.audit.EventType;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -17,7 +17,7 @@ public class SysoutAuditListenerFactory implements AuditListenerFactory {
     private Set<EventType> excludedEvents;
 
     @Override
-    public AuditListener create(ProviderSession providerSession) {
+    public AuditListener create(KeycloakSession session) {
         return new SysoutAuditListener(excludedEvents);
     }
 
diff --git a/examples/providers/audit-provider-mem/pom.xml b/examples/providers/audit-provider-mem/pom.xml
index 5cbc31a..a53776b 100755
--- a/examples/providers/audit-provider-mem/pom.xml
+++ b/examples/providers/audit-provider-mem/pom.xml
@@ -21,6 +21,11 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-model-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
             <artifactId>keycloak-audit-api</artifactId>
             <version>${project.version}</version>
         </dependency>
diff --git a/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemAuditProviderFactory.java b/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemAuditProviderFactory.java
index 3ca05fc..948bfbc 100644
--- a/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemAuditProviderFactory.java
+++ b/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemAuditProviderFactory.java
@@ -5,7 +5,7 @@ import org.keycloak.audit.AuditProvider;
 import org.keycloak.audit.AuditProviderFactory;
 import org.keycloak.audit.Event;
 import org.keycloak.audit.EventType;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 import java.util.Collections;
 import java.util.HashSet;
@@ -23,7 +23,7 @@ public class MemAuditProviderFactory implements AuditProviderFactory {
     private Set<EventType> excludedEvents;
 
     @Override
-    public AuditProvider create(ProviderSession providerSession) {
+    public AuditProvider create(KeycloakSession session) {
         return new MemAuditProvider(events, excludedEvents);
     }
 
diff --git a/examples/providers/authentication-properties/src/main/java/org/keycloak/examples/providers/authentication/PropertiesAuthenticationProviderFactory.java b/examples/providers/authentication-properties/src/main/java/org/keycloak/examples/providers/authentication/PropertiesAuthenticationProviderFactory.java
index a62cf51..5712a32 100644
--- a/examples/providers/authentication-properties/src/main/java/org/keycloak/examples/providers/authentication/PropertiesAuthenticationProviderFactory.java
+++ b/examples/providers/authentication-properties/src/main/java/org/keycloak/examples/providers/authentication/PropertiesAuthenticationProviderFactory.java
@@ -11,7 +11,7 @@ import org.jboss.logging.Logger;
 import org.keycloak.Config;
 import org.keycloak.authentication.AuthenticationProvider;
 import org.keycloak.authentication.AuthenticationProviderFactory;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 /**
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@@ -24,7 +24,7 @@ public class PropertiesAuthenticationProviderFactory implements AuthenticationPr
     private String propsFileLocation;
 
     @Override
-    public AuthenticationProvider create(ProviderSession providerSession) {
+    public AuthenticationProvider create(KeycloakSession session) {
         return new PropertiesAuthenticationProvider(properties);
     }
 
diff --git a/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ExportImportProvider.java b/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ExportImportProvider.java
index 9798370..d53f1fa 100644
--- a/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ExportImportProvider.java
+++ b/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ExportImportProvider.java
@@ -1,12 +1,12 @@
 package org.keycloak.exportimport;
 
-import org.keycloak.provider.ProviderSessionFactory;
+import org.keycloak.models.KeycloakSessionFactory;
 
 /**
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
  */
 public interface ExportImportProvider {
 
-    void checkExportImport(ProviderSessionFactory identitySessionFactory);
+    void checkExportImport(KeycloakSessionFactory sessionFactory);
 
 }
diff --git a/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ExportImportProviderImpl.java b/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ExportImportProviderImpl.java
index de84633..1064201 100644
--- a/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ExportImportProviderImpl.java
+++ b/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ExportImportProviderImpl.java
@@ -5,9 +5,8 @@ import org.keycloak.exportimport.io.ExportImportIOProvider;
 import org.keycloak.exportimport.io.ExportWriter;
 import org.keycloak.exportimport.io.ImportReader;
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.KeycloakTransaction;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.provider.ProviderSessionFactory;
 import org.keycloak.util.ProviderLoader;
 
 /**
@@ -21,7 +20,7 @@ public class ExportImportProviderImpl implements ExportImportProvider {
     public static final String ACTION_IMPORT = "import";
 
     @Override
-    public void checkExportImport(ProviderSessionFactory providerSessionFactory) {
+    public void checkExportImport(KeycloakSessionFactory sessionFactory) {
         String exportImportAction = ExportImportConfig.getAction();
 
         boolean export = false;
@@ -35,8 +34,7 @@ public class ExportImportProviderImpl implements ExportImportProvider {
         }
 
         if (export || importt) {
-            ProviderSession providerSession = providerSessionFactory.createSession();
-            KeycloakSession session = providerSession.getProvider(KeycloakSession.class);
+            KeycloakSession session = sessionFactory.create();
             KeycloakTransaction transaction = session.getTransaction();
             try {
                 transaction.begin();
@@ -64,7 +62,7 @@ public class ExportImportProviderImpl implements ExportImportProvider {
                 }
                 throw new RuntimeException(e);
             } finally {
-                providerSession.close();
+                session.close();
             }
         }
     }
diff --git a/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ModelExporter.java b/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ModelExporter.java
index c82d9d2..eb6b363 100755
--- a/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ModelExporter.java
+++ b/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ModelExporter.java
@@ -43,24 +43,24 @@ public class ModelExporter {
     private ExportWriter exportWriter;
     private ExportImportPropertiesManager propertiesManager;
 
-    public void exportModel(KeycloakSession keycloakSession, ExportWriter exportWriter) {
+    public void exportModel(KeycloakSession session, ExportWriter exportWriter) {
         // Initialize needed objects
         this.exportWriter = exportWriter;
         this.propertiesManager = new ExportImportPropertiesManager();
 
         // Create separate files for "realms", "applications", "oauthClients", "roles" and finally "users". Users may be done in more files (pagination)
-        exportRealms(keycloakSession, "realms.json");
-        exportApplications(keycloakSession, "applications.json");
-        exportOAuthClients(keycloakSession, "oauthClients.json");
-        exportRoles(keycloakSession, "roles.json");
-        exportUsers(keycloakSession, "users.json");
-        exportUserFailures(keycloakSession, "userFailures.json");
+        exportRealms(session, "realms.json");
+        exportApplications(session, "applications.json");
+        exportOAuthClients(session, "oauthClients.json");
+        exportRoles(session, "roles.json");
+        exportUsers(session, "users.json");
+        exportUserFailures(session, "userFailures.json");
 
         this.exportWriter.closeExportWriter();
     }
 
-    protected void exportRealms(KeycloakSession keycloakSession, String fileName) {
-        List<RealmModel> realms = keycloakSession.getRealms();
+    protected void exportRealms(KeycloakSession session, String fileName) {
+        List<RealmModel> realms = session.getRealms();
 
         // Convert models to entities, which will be written into JSON file
         List<RealmEntity> result = new LinkedList<RealmEntity>();
@@ -106,8 +106,8 @@ public class ModelExporter {
         logger.infof("Realms exported: " + result);
     }
 
-    protected void exportApplications(KeycloakSession keycloakSession, String fileName) {
-        List<ApplicationModel> allApplications = getAllApplications(keycloakSession);
+    protected void exportApplications(KeycloakSession session, String fileName) {
+        List<ApplicationModel> allApplications = getAllApplications(session);
 
         List<ApplicationEntity> result = new LinkedList<ApplicationEntity>();
         for (ApplicationModel appModel : allApplications) {
@@ -129,8 +129,8 @@ public class ModelExporter {
         logger.infof("Applications exported: " + result);
     }
 
-    protected void exportOAuthClients(KeycloakSession keycloakSession, String fileName) {
-        List<RealmModel> realms = keycloakSession.getRealms();
+    protected void exportOAuthClients(KeycloakSession session, String fileName) {
+        List<RealmModel> realms = session.getRealms();
         List<OAuthClientModel> allClients = new ArrayList<OAuthClientModel>();
         for (RealmModel realmModel : realms) {
             allClients.addAll(realmModel.getOAuthClients());
@@ -156,8 +156,8 @@ public class ModelExporter {
         logger.infof("OAuth clients exported: " + result);
     }
 
-    protected void exportRoles(KeycloakSession keycloakSession, String fileName) {
-        List<RoleModel> allRoles = getAllRoles(keycloakSession);
+    protected void exportRoles(KeycloakSession session, String fileName) {
+        List<RoleModel> allRoles = getAllRoles(session);
 
         List<RoleEntity> result = new LinkedList<RoleEntity>();
         for (RoleModel roleModel : allRoles) {
@@ -198,8 +198,8 @@ public class ModelExporter {
         }
     }
 
-    protected void exportUsers(KeycloakSession keycloakSession, String fileName) {
-        List<RealmModel> realms = keycloakSession.getRealms();
+    protected void exportUsers(KeycloakSession session, String fileName) {
+        List<RealmModel> realms = session.getRealms();
         List<UserEntity> result = new LinkedList<UserEntity>();
 
         for (RealmModel realm : realms) {
@@ -277,8 +277,8 @@ public class ModelExporter {
 
 
      // Does it makes sense to export user failures ?
-    protected void exportUserFailures(KeycloakSession keycloakSession, String fileName) {
-        List<RealmModel> realms = keycloakSession.getRealms();
+    protected void exportUserFailures(KeycloakSession session, String fileName) {
+        List<RealmModel> realms = session.getRealms();
         List<UsernameLoginFailureModel> allFailures = new ArrayList<UsernameLoginFailureModel>();
         for (RealmModel realmModel : realms) {
             allFailures.addAll(realmModel.getAllUserLoginFailures());
@@ -306,8 +306,8 @@ public class ModelExporter {
         return scopeIds;
     }
 
-    private List<ApplicationModel> getAllApplications(KeycloakSession keycloakSession) {
-        List<RealmModel> realms = keycloakSession.getRealms();
+    private List<ApplicationModel> getAllApplications(KeycloakSession session) {
+        List<RealmModel> realms = session.getRealms();
         List<ApplicationModel> allApplications = new ArrayList<ApplicationModel>();
         for (RealmModel realmModel : realms) {
             allApplications.addAll(realmModel.getApplications());
@@ -315,15 +315,15 @@ public class ModelExporter {
         return allApplications;
     }
 
-    private List<RoleModel> getAllRoles(KeycloakSession keycloakSession) {
+    private List<RoleModel> getAllRoles(KeycloakSession session) {
         List<RoleModel> allRoles = new ArrayList<RoleModel>();
 
-        List<RealmModel> realms = keycloakSession.getRealms();
+        List<RealmModel> realms = session.getRealms();
         for (RealmModel realmModel : realms) {
             allRoles.addAll(realmModel.getRoles());
         }
 
-        List<ApplicationModel> allApplications = getAllApplications(keycloakSession);
+        List<ApplicationModel> allApplications = getAllApplications(session);
         for (ApplicationModel appModel : allApplications) {
             allRoles.addAll(appModel.getRoles());
         }
diff --git a/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ModelImporter.java b/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ModelImporter.java
index 7e67c91..6ff1fa9 100755
--- a/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ModelImporter.java
+++ b/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ModelImporter.java
@@ -47,34 +47,34 @@ public class ModelImporter {
     private ImportReader importReader;
     private ExportImportPropertiesManager propertiesManager;
 
-    public void importModel(KeycloakSession keycloakSession, ImportReader importReader) {
+    public void importModel(KeycloakSession session, ImportReader importReader) {
         // Initialize needed objects
         this.importReader = importReader;
         this.propertiesManager = new ExportImportPropertiesManager();
 
         // Delete all the data from current model
-        keycloakSession.removeAllData();
+        session.removeAllData();
 
-        importRealms(keycloakSession, "realms.json");
-        importApplications(keycloakSession, "applications.json");
-        importRoles(keycloakSession, "roles.json");
+        importRealms(session, "realms.json");
+        importApplications(session, "applications.json");
+        importRoles(session, "roles.json");
 
         // Now we have all realms,applications and roles filled. So fill other objects (default roles, scopes etc)
-        importRealmsStep2(keycloakSession, "realms.json");
-        importApplicationsStep2(keycloakSession, "applications.json");
+        importRealmsStep2(session, "realms.json");
+        importApplicationsStep2(session, "applications.json");
 
-        importOAuthClients(keycloakSession, "oauthClients.json");
-        importUsers(keycloakSession, "users.json");
-        importUserFailures(keycloakSession, "userFailures.json");
+        importOAuthClients(session, "oauthClients.json");
+        importUsers(session, "users.json");
+        importUserFailures(session, "userFailures.json");
 
         this.importReader.closeImportReader();
     }
 
-    protected void importRealms(KeycloakSession keycloakSession, String fileName) {
+    protected void importRealms(KeycloakSession session, String fileName) {
         List<RealmEntity> realms =  this.importReader.readEntities(fileName, RealmEntity.class);
 
         for (RealmEntity realmEntity : realms) {
-            RealmModel realm = keycloakSession.createRealm(realmEntity.getId(), realmEntity.getName());
+            RealmModel realm = session.createRealm(realmEntity.getId(), realmEntity.getName());
 
             this.propertiesManager.setBasicPropertiesToModel(realm, realmEntity);
 
@@ -103,10 +103,10 @@ public class ModelImporter {
         logger.infof("Realms imported: " + realms);
     }
 
-    protected void importApplications(KeycloakSession keycloakSession, String fileName) {
+    protected void importApplications(KeycloakSession session, String fileName) {
         List<ApplicationEntity> apps =  this.importReader.readEntities(fileName, ApplicationEntity.class);
         for (ApplicationEntity appEntity : apps) {
-            RealmModel realm = keycloakSession.getRealm(appEntity.getRealmId());
+            RealmModel realm = session.getRealm(appEntity.getRealmId());
             ApplicationModel app = realm.addApplication(appEntity.getId(), appEntity.getName());
 
             this.propertiesManager.setBasicPropertiesToModel(app , appEntity);
@@ -117,7 +117,7 @@ public class ModelImporter {
         logger.infof("Applications imported: " + apps);
     }
 
-    protected void importRoles(KeycloakSession keycloakSession, String fileName) {
+    protected void importRoles(KeycloakSession session, String fileName) {
         // helper map for composite roles
         Map<String, RoleEntity> rolesMap = new HashMap<String, RoleEntity>();
 
@@ -125,10 +125,10 @@ public class ModelImporter {
         for (RoleEntity roleEntity : roles) {
             RoleModel role = null;
             if (roleEntity.getRealmId() != null) {
-                RealmModel realm = keycloakSession.getRealm(roleEntity.getRealmId());
+                RealmModel realm = session.getRealm(roleEntity.getRealmId());
                 role = realm.addRole(roleEntity.getId(), roleEntity.getName());
             } else if (roleEntity.getApplicationId() != null) {
-                ApplicationModel app = findApplicationById(keycloakSession, roleEntity.getApplicationId());
+                ApplicationModel app = findApplicationById(session, roleEntity.getApplicationId());
                 role = app.addRole(roleEntity.getId(), roleEntity.getName());
             } else {
                 throw new IllegalStateException("Role " + roleEntity.getId() + " doesn't have realmId nor applicationId");
@@ -140,7 +140,7 @@ public class ModelImporter {
         }
 
         // All roles were added. Fill composite roles now
-        for (RealmModel realm : keycloakSession.getRealms()) {
+        for (RealmModel realm : session.getRealms()) {
 
             // realm roles
             fillCompositeRoles(rolesMap, realm, realm);
@@ -172,12 +172,12 @@ public class ModelImporter {
         }
     }
 
-    protected void importRealmsStep2(KeycloakSession keycloakSession, String fileName) {
+    protected void importRealmsStep2(KeycloakSession session, String fileName) {
         List<RealmEntity> realms =  this.importReader.readEntities(fileName, RealmEntity.class);
-        RealmModel adminRealm = keycloakSession.getRealm(Config.getAdminRealm());
+        RealmModel adminRealm = session.getRealm(Config.getAdminRealm());
 
         for (RealmEntity realmEntity : realms) {
-            RealmModel realm = keycloakSession.getRealm(realmEntity.getId());
+            RealmModel realm = session.getRealm(realmEntity.getId());
 
             // admin app
             String adminAppId = realmEntity.getAdminAppId();
@@ -190,10 +190,10 @@ public class ModelImporter {
         }
     }
 
-    protected void importApplicationsStep2(KeycloakSession keycloakSession, String fileName) {
+    protected void importApplicationsStep2(KeycloakSession session, String fileName) {
         List<ApplicationEntity> apps =  this.importReader.readEntities(fileName, ApplicationEntity.class);
         for (ApplicationEntity appEntity : apps) {
-            RealmModel realm = keycloakSession.getRealm(appEntity.getRealmId());
+            RealmModel realm = session.getRealm(appEntity.getRealmId());
             ApplicationModel application = realm.getApplicationById(appEntity.getId());
 
             // Default roles
@@ -211,10 +211,10 @@ public class ModelImporter {
         }
     }
 
-    protected void importOAuthClients(KeycloakSession keycloakSession, String fileName) {
+    protected void importOAuthClients(KeycloakSession session, String fileName) {
         List<OAuthClientEntity> clients =  this.importReader.readEntities(fileName, OAuthClientEntity.class);
         for (OAuthClientEntity clientEntity : clients) {
-            RealmModel realm = keycloakSession.getRealm(clientEntity.getRealmId());
+            RealmModel realm = session.getRealm(clientEntity.getRealmId());
             OAuthClientModel client = realm.addOAuthClient(clientEntity.getId(), clientEntity.getName());
 
             this.propertiesManager.setBasicPropertiesToModel(client, clientEntity);
@@ -228,8 +228,8 @@ public class ModelImporter {
         logger.info("OAuth clients imported: " + clients);
     }
 
-    protected ApplicationModel findApplicationById(KeycloakSession keycloakSession, String applicationId) {
-        for (RealmModel realm : keycloakSession.getRealms()) {
+    protected ApplicationModel findApplicationById(KeycloakSession session, String applicationId) {
+        for (RealmModel realm : session.getRealms()) {
             ApplicationModel appModel = realm.getApplicationById(applicationId);
             if (appModel != null) {
                 return appModel;
@@ -239,10 +239,10 @@ public class ModelImporter {
         return null;
     }
 
-    public void importUsers(KeycloakSession keycloakSession, String fileName) {
+    public void importUsers(KeycloakSession session, String fileName) {
         List<UserEntity> users = this.importReader.readEntities(fileName, UserEntity.class);
         for (UserEntity userEntity : users) {
-            RealmModel realm = keycloakSession.getRealm(userEntity.getRealmId());
+            RealmModel realm = session.getRealm(userEntity.getRealmId());
             UserModel user = realm.addUser(userEntity.getId(), userEntity.getLoginName());
 
             // We need to remove defaultRoles here as realm.addUser is automatically adding them. We may add them later during roles mapping processing
@@ -313,10 +313,10 @@ public class ModelImporter {
         }
     }
 
-    public void importUserFailures(KeycloakSession keycloakSession, String fileName) {
+    public void importUserFailures(KeycloakSession session, String fileName) {
         List<UsernameLoginFailureEntity> userFailures = this.importReader.readEntities(fileName, UsernameLoginFailureEntity.class);
         for (UsernameLoginFailureEntity entity : userFailures) {
-            RealmModel realm = keycloakSession.getRealm(entity.getRealmId());
+            RealmModel realm = session.getRealm(entity.getRealmId());
             UsernameLoginFailureModel model = realm.addUserLoginFailure(entity.getUsername());
 
             this.propertiesManager.setBasicPropertiesToModel(model , entity);
diff --git a/export-import/export-import-impl/src/test/java/org/keycloak/exportimport/ExportImportTestBase.java b/export-import/export-import-impl/src/test/java/org/keycloak/exportimport/ExportImportTestBase.java
index 49817c7..9dc4cd8 100644
--- a/export-import/export-import-impl/src/test/java/org/keycloak/exportimport/ExportImportTestBase.java
+++ b/export-import/export-import-impl/src/test/java/org/keycloak/exportimport/ExportImportTestBase.java
@@ -6,9 +6,8 @@ import org.junit.Test;
 import org.keycloak.model.test.AbstractModelTest;
 import org.keycloak.model.test.ImportTest;
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.RealmModel;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.provider.ProviderSessionFactory;
 import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.services.managers.ApplianceBootstrap;
 import org.keycloak.services.managers.RealmManager;
@@ -22,10 +21,9 @@ import java.util.Iterator;
  */
 public abstract class ExportImportTestBase {
 
-    protected ProviderSessionFactory factory;
+    protected KeycloakSessionFactory factory;
 
-    protected ProviderSession providerSession;
-    protected KeycloakSession identitySession;
+    protected KeycloakSession session;
     protected RealmManager realmManager;
 
     @After
@@ -37,17 +35,17 @@ public abstract class ExportImportTestBase {
     public void testExportImport() throws Exception {
         // Init JPA model
         System.setProperty("keycloak.model.provider", getExportModelProvider());
-        factory = KeycloakApplication.createProviderSessionFactory();
+        factory = KeycloakApplication.createSessionFactory();
 
         // Bootstrap admin realm
         beginTransaction();
-        new ApplianceBootstrap().bootstrap(identitySession, "/auth");
+        new ApplianceBootstrap().bootstrap(session, "/auth");
         commitTransaction();
 
         // Classic import of realm to JPA model
         beginTransaction();
         RealmRepresentation rep = AbstractModelTest.loadJson("testrealm.json");
-        realmManager = new RealmManager(identitySession);
+        realmManager = new RealmManager(session);
         RealmModel realm = realmManager.createRealm("demo", rep.getRealm());
         realmManager.importRealm(rep, realm);
 
@@ -57,7 +55,7 @@ public abstract class ExportImportTestBase {
         exportModel(factory);
 
         beginTransaction();
-        realm = identitySession.getRealm("demo");
+        realm = session.getRealm("demo");
         String wburkeId = realm.getUser("wburke").getId();
         String appId = realm.getApplicationByName("Application").getId();
 
@@ -67,14 +65,14 @@ public abstract class ExportImportTestBase {
 
         // Bootstrap mongo session and factory
         System.setProperty("keycloak.model.provider", getImportModelProvider());
-        factory = KeycloakApplication.createProviderSessionFactory();
+        factory = KeycloakApplication.createSessionFactory();
 
         // Full import of previous export into mongo
         importModel(factory);
 
         // Verify it's imported in mongo (reusing ImportTest)
         beginTransaction();
-        RealmModel importedRealm = identitySession.getRealm("demo");
+        RealmModel importedRealm = session.getRealm("demo");
         System.out.println("Exported realm: " + realm + ", Imported realm: " + importedRealm);
 
         Assert.assertEquals(wburkeId, importedRealm.getUser("wburke").getId());
@@ -90,20 +88,19 @@ public abstract class ExportImportTestBase {
 
     protected abstract String getImportModelProvider();
 
-    protected abstract void exportModel(ProviderSessionFactory factory);
+    protected abstract void exportModel(KeycloakSessionFactory factory);
 
-    protected abstract void importModel(ProviderSessionFactory factory);
+    protected abstract void importModel(KeycloakSessionFactory factory);
 
     protected void beginTransaction() {
-        providerSession = factory.createSession();
-        identitySession = providerSession.getProvider(KeycloakSession.class);
-        identitySession.getTransaction().begin();
-        realmManager = new RealmManager(identitySession);
+        session = factory.create();
+        session.getTransaction().begin();
+        realmManager = new RealmManager(session);
     }
 
     protected void commitTransaction() {
-        identitySession.getTransaction().commit();
-        providerSession.close();
+        session.getTransaction().commit();
+        session.close();
     }
 
     protected ExportImportProvider getExportImportProvider() {
diff --git a/export-import/export-import-impl/src/test/java/org/keycloak/exportimport/JPAToMongoExportImportTest.java b/export-import/export-import-impl/src/test/java/org/keycloak/exportimport/JPAToMongoExportImportTest.java
index 52ee054..8cc6a17 100644
--- a/export-import/export-import-impl/src/test/java/org/keycloak/exportimport/JPAToMongoExportImportTest.java
+++ b/export-import/export-import-impl/src/test/java/org/keycloak/exportimport/JPAToMongoExportImportTest.java
@@ -1,7 +1,7 @@
 package org.keycloak.exportimport;
 
 import org.keycloak.exportimport.io.directory.TmpDirExportImportIOProvider;
-import org.keycloak.provider.ProviderSessionFactory;
+import org.keycloak.models.KeycloakSessionFactory;
 
 /**
  * Test for full export of data from JPA and import them to Mongo. Using "directory" provider
@@ -21,14 +21,14 @@ public class JPAToMongoExportImportTest extends ExportImportTestBase {
     }
 
     @Override
-    protected void exportModel(ProviderSessionFactory factory) {
+    protected void exportModel(KeycloakSessionFactory factory) {
         ExportImportConfig.setAction(ExportImportProviderImpl.ACTION_EXPORT);
         ExportImportConfig.setProvider(TmpDirExportImportIOProvider.PROVIDER_ID);
         getExportImportProvider().checkExportImport(factory);
     }
 
     @Override
-    protected void importModel(ProviderSessionFactory factory) {
+    protected void importModel(KeycloakSessionFactory factory) {
         ExportImportConfig.setAction(ExportImportProviderImpl.ACTION_IMPORT);
         ExportImportConfig.setProvider(TmpDirExportImportIOProvider.PROVIDER_ID);
         getExportImportProvider().checkExportImport(factory);
diff --git a/export-import/export-import-impl/src/test/java/org/keycloak/exportimport/MongoToJPAExportImportTest.java b/export-import/export-import-impl/src/test/java/org/keycloak/exportimport/MongoToJPAExportImportTest.java
index 849c388..5fe08f7 100644
--- a/export-import/export-import-impl/src/test/java/org/keycloak/exportimport/MongoToJPAExportImportTest.java
+++ b/export-import/export-import-impl/src/test/java/org/keycloak/exportimport/MongoToJPAExportImportTest.java
@@ -2,7 +2,7 @@ package org.keycloak.exportimport;
 
 import org.junit.Assert;
 import org.keycloak.exportimport.io.zip.EncryptedZIPIOProvider;
-import org.keycloak.provider.ProviderSessionFactory;
+import org.keycloak.models.KeycloakSessionFactory;
 
 import java.io.File;
 
@@ -26,7 +26,7 @@ public class MongoToJPAExportImportTest extends ExportImportTestBase {
     }
 
     @Override
-    protected void exportModel(ProviderSessionFactory factory) {
+    protected void exportModel(KeycloakSessionFactory factory) {
         ExportImportConfig.setAction(ExportImportProviderImpl.ACTION_EXPORT);
         ExportImportConfig.setProvider(EncryptedZIPIOProvider.PROVIDER_ID);
         File zipFile = getZipFile();
@@ -41,7 +41,7 @@ public class MongoToJPAExportImportTest extends ExportImportTestBase {
     }
 
     @Override
-    protected void importModel(ProviderSessionFactory factory) {
+    protected void importModel(KeycloakSessionFactory factory) {
         ExportImportConfig.setAction(ExportImportProviderImpl.ACTION_IMPORT);
         ExportImportConfig.setProvider(EncryptedZIPIOProvider.PROVIDER_ID);
         File zipFile = getZipFile();
diff --git a/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/FreeMarkerAccountProvider.java b/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/FreeMarkerAccountProvider.java
index ca77182..e7d9636 100755
--- a/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/FreeMarkerAccountProvider.java
+++ b/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/FreeMarkerAccountProvider.java
@@ -17,11 +17,10 @@ import org.keycloak.freemarker.ExtendingThemeManager;
 import org.keycloak.freemarker.FreeMarkerException;
 import org.keycloak.freemarker.FreeMarkerUtil;
 import org.keycloak.freemarker.Theme;
-import org.keycloak.freemarker.ThemeProvider;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.UserSessionModel;
-import org.keycloak.provider.ProviderSession;
 
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
@@ -50,7 +49,7 @@ public class FreeMarkerAccountProvider implements AccountProvider {
     private boolean social;
     private boolean audit;
     private boolean passwordUpdateSupported;
-    private ProviderSession session;
+    private KeycloakSession session;
     private FreeMarkerUtil freeMarker;
 
     public static enum MessageType {SUCCESS, WARNING, ERROR}
@@ -60,7 +59,7 @@ public class FreeMarkerAccountProvider implements AccountProvider {
     private String message;
     private MessageType messageType;
 
-    public FreeMarkerAccountProvider(ProviderSession session, FreeMarkerUtil freeMarker) {
+    public FreeMarkerAccountProvider(KeycloakSession session, FreeMarkerUtil freeMarker) {
         this.session = session;
         this.freeMarker = freeMarker;
     }
diff --git a/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/FreeMarkerAccountProviderFactory.java b/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/FreeMarkerAccountProviderFactory.java
index 0e70002..2bd8ee6 100644
--- a/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/FreeMarkerAccountProviderFactory.java
+++ b/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/FreeMarkerAccountProviderFactory.java
@@ -4,9 +4,7 @@ import org.keycloak.Config;
 import org.keycloak.account.AccountProvider;
 import org.keycloak.account.AccountProviderFactory;
 import org.keycloak.freemarker.FreeMarkerUtil;
-import org.keycloak.provider.ProviderSession;
-
-import javax.ws.rs.core.UriInfo;
+import org.keycloak.models.KeycloakSession;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -16,8 +14,8 @@ public class FreeMarkerAccountProviderFactory implements AccountProviderFactory 
     private FreeMarkerUtil freeMarker;
 
     @Override
-    public AccountProvider create(ProviderSession providerSession) {
-        return new FreeMarkerAccountProvider(providerSession, freeMarker);
+    public AccountProvider create(KeycloakSession session) {
+        return new FreeMarkerAccountProvider(session, freeMarker);
     }
 
     @Override
diff --git a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ExtendingThemeManager.java b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ExtendingThemeManager.java
index aad8fcb..c407b5f 100644
--- a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ExtendingThemeManager.java
+++ b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ExtendingThemeManager.java
@@ -1,7 +1,7 @@
 package org.keycloak.freemarker;
 
 import org.keycloak.Config;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -24,10 +24,10 @@ public class ExtendingThemeManager implements ThemeProvider {
     private String defaultTheme;
     private int staticMaxAge;
 
-    public ExtendingThemeManager(ProviderSession providerSession) {
+    public ExtendingThemeManager(KeycloakSession session) {
         providers = new LinkedList();
 
-        for (ThemeProvider p : providerSession.getAllProviders(ThemeProvider.class)) {
+        for (ThemeProvider p : session.getAllProviders(ThemeProvider.class)) {
             if (!p.getClass().equals(ExtendingThemeManager.class)) {
                 providers.add(p);
             }
diff --git a/forms/common-themes/src/main/java/org/keycloak/theme/DefaultKeycloakThemeProviderFactory.java b/forms/common-themes/src/main/java/org/keycloak/theme/DefaultKeycloakThemeProviderFactory.java
index 4c3515d..4158679 100644
--- a/forms/common-themes/src/main/java/org/keycloak/theme/DefaultKeycloakThemeProviderFactory.java
+++ b/forms/common-themes/src/main/java/org/keycloak/theme/DefaultKeycloakThemeProviderFactory.java
@@ -3,7 +3,7 @@ package org.keycloak.theme;
 import org.keycloak.Config;
 import org.keycloak.freemarker.ThemeProvider;
 import org.keycloak.freemarker.ThemeProviderFactory;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -13,7 +13,7 @@ public class DefaultKeycloakThemeProviderFactory implements ThemeProviderFactory
     private DefaultKeycloakThemeProvider themeProvider;
 
     @Override
-    public ThemeProvider create(ProviderSession providerSession) {
+    public ThemeProvider create(KeycloakSession session) {
         return themeProvider;
     }
 
diff --git a/forms/common-themes/src/main/java/org/keycloak/theme/FolderThemeProviderFactory.java b/forms/common-themes/src/main/java/org/keycloak/theme/FolderThemeProviderFactory.java
index ff9dd2e..d85f289 100644
--- a/forms/common-themes/src/main/java/org/keycloak/theme/FolderThemeProviderFactory.java
+++ b/forms/common-themes/src/main/java/org/keycloak/theme/FolderThemeProviderFactory.java
@@ -3,7 +3,7 @@ package org.keycloak.theme;
 import org.keycloak.Config;
 import org.keycloak.freemarker.ThemeProvider;
 import org.keycloak.freemarker.ThemeProviderFactory;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 import java.io.File;
 
@@ -15,7 +15,7 @@ public class FolderThemeProviderFactory implements ThemeProviderFactory {
     private FolderThemeProvider themeProvider;
 
     @Override
-    public ThemeProvider create(ProviderSession providerSession) {
+    public ThemeProvider create(KeycloakSession sessions) {
         return themeProvider;
     }
 
diff --git a/forms/email-freemarker/src/main/java/org/keycloak/email/freemarker/FreeMarkerEmailProvider.java b/forms/email-freemarker/src/main/java/org/keycloak/email/freemarker/FreeMarkerEmailProvider.java
index 9a7d37c..f0ad4d8 100644
--- a/forms/email-freemarker/src/main/java/org/keycloak/email/freemarker/FreeMarkerEmailProvider.java
+++ b/forms/email-freemarker/src/main/java/org/keycloak/email/freemarker/FreeMarkerEmailProvider.java
@@ -8,16 +8,15 @@ import org.keycloak.email.freemarker.beans.EventBean;
 import org.keycloak.freemarker.ExtendingThemeManager;
 import org.keycloak.freemarker.FreeMarkerUtil;
 import org.keycloak.freemarker.Theme;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
-import org.keycloak.provider.ProviderSession;
 
 import javax.mail.Message;
 import javax.mail.Session;
 import javax.mail.Transport;
 import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
-
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
@@ -29,12 +28,12 @@ public class FreeMarkerEmailProvider implements EmailProvider {
 
     private static final Logger log = Logger.getLogger(FreeMarkerEmailProvider.class);
 
-    private ProviderSession session;
+    private KeycloakSession session;
     private FreeMarkerUtil freeMarker;
     private RealmModel realm;
     private UserModel user;
 
-    public FreeMarkerEmailProvider(ProviderSession session, FreeMarkerUtil freeMarker) {
+    public FreeMarkerEmailProvider(KeycloakSession session, FreeMarkerUtil freeMarker) {
         this.session = session;
         this.freeMarker = freeMarker;
     }
diff --git a/forms/email-freemarker/src/main/java/org/keycloak/email/freemarker/FreeMarkerEmailProviderFactory.java b/forms/email-freemarker/src/main/java/org/keycloak/email/freemarker/FreeMarkerEmailProviderFactory.java
index 1caf677..7e1fcaf 100644
--- a/forms/email-freemarker/src/main/java/org/keycloak/email/freemarker/FreeMarkerEmailProviderFactory.java
+++ b/forms/email-freemarker/src/main/java/org/keycloak/email/freemarker/FreeMarkerEmailProviderFactory.java
@@ -4,7 +4,7 @@ import org.keycloak.Config;
 import org.keycloak.email.EmailProvider;
 import org.keycloak.email.EmailProviderFactory;
 import org.keycloak.freemarker.FreeMarkerUtil;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -14,8 +14,8 @@ public class FreeMarkerEmailProviderFactory implements EmailProviderFactory {
     private FreeMarkerUtil freeMarker;
 
     @Override
-    public EmailProvider create(ProviderSession providerSession) {
-        return new FreeMarkerEmailProvider(providerSession, freeMarker);
+    public EmailProvider create(KeycloakSession session) {
+        return new FreeMarkerEmailProvider(session, freeMarker);
     }
 
     @Override
diff --git a/forms/login-api/src/main/java/org/keycloak/login/LoginFormsProviderFactory.java b/forms/login-api/src/main/java/org/keycloak/login/LoginFormsProviderFactory.java
index 0d9db65..f4e58df 100755
--- a/forms/login-api/src/main/java/org/keycloak/login/LoginFormsProviderFactory.java
+++ b/forms/login-api/src/main/java/org/keycloak/login/LoginFormsProviderFactory.java
@@ -1,7 +1,6 @@
 package org.keycloak.login;
 
 import org.keycloak.provider.ProviderFactory;
-import org.keycloak.provider.ProviderSession;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
diff --git a/forms/login-api/src/main/java/org/keycloak/login/LoginFormsSpi.java b/forms/login-api/src/main/java/org/keycloak/login/LoginFormsSpi.java
index e3fffea..74f5b4a 100644
--- a/forms/login-api/src/main/java/org/keycloak/login/LoginFormsSpi.java
+++ b/forms/login-api/src/main/java/org/keycloak/login/LoginFormsSpi.java
@@ -10,7 +10,7 @@ import org.keycloak.provider.Spi;
 public class LoginFormsSpi implements Spi {
     @Override
     public String getName() {
-        return "login-forms";
+        return "login";
     }
 
     @Override
diff --git a/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/FreeMarkerLoginFormsProvider.java b/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/FreeMarkerLoginFormsProvider.java
index 78b1a74..dfbfb9b 100755
--- a/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/FreeMarkerLoginFormsProvider.java
+++ b/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/FreeMarkerLoginFormsProvider.java
@@ -8,9 +8,8 @@ import org.keycloak.freemarker.ExtendingThemeManager;
 import org.keycloak.freemarker.FreeMarkerException;
 import org.keycloak.freemarker.FreeMarkerUtil;
 import org.keycloak.freemarker.Theme;
-import org.keycloak.freemarker.ThemeProvider;
-import org.keycloak.login.LoginFormsProvider;
 import org.keycloak.login.LoginFormsPages;
+import org.keycloak.login.LoginFormsProvider;
 import org.keycloak.login.freemarker.model.CodeBean;
 import org.keycloak.login.freemarker.model.LoginBean;
 import org.keycloak.login.freemarker.model.MessageBean;
@@ -22,10 +21,10 @@ import org.keycloak.login.freemarker.model.SocialBean;
 import org.keycloak.login.freemarker.model.TotpBean;
 import org.keycloak.login.freemarker.model.UrlBean;
 import org.keycloak.models.ClientModel;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RoleModel;
 import org.keycloak.models.UserModel;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.services.messages.Messages;
 import org.keycloak.services.resources.flows.Urls;
 
@@ -62,7 +61,7 @@ public class FreeMarkerLoginFormsProvider implements LoginFormsProvider {
 
     private MultivaluedMap<String, String> formData;
 
-    private ProviderSession session;
+    private KeycloakSession session;
     private FreeMarkerUtil freeMarker;
     private RealmModel realm;
 
@@ -72,7 +71,7 @@ public class FreeMarkerLoginFormsProvider implements LoginFormsProvider {
 
     private UriInfo uriInfo;
 
-    public FreeMarkerLoginFormsProvider(ProviderSession session, FreeMarkerUtil freeMarker) {
+    public FreeMarkerLoginFormsProvider(KeycloakSession session, FreeMarkerUtil freeMarker) {
         this.session = session;
         this.freeMarker = freeMarker;
     }
diff --git a/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/FreeMarkerLoginFormsProviderFactory.java b/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/FreeMarkerLoginFormsProviderFactory.java
index 0e5905b..8257f10 100755
--- a/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/FreeMarkerLoginFormsProviderFactory.java
+++ b/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/FreeMarkerLoginFormsProviderFactory.java
@@ -4,7 +4,7 @@ import org.keycloak.Config;
 import org.keycloak.freemarker.FreeMarkerUtil;
 import org.keycloak.login.LoginFormsProvider;
 import org.keycloak.login.LoginFormsProviderFactory;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -14,8 +14,8 @@ public class FreeMarkerLoginFormsProviderFactory implements LoginFormsProviderFa
     private FreeMarkerUtil freeMarker;
 
     @Override
-    public LoginFormsProvider create(ProviderSession providerSession) {
-        return new FreeMarkerLoginFormsProvider(providerSession, freeMarker);
+    public LoginFormsProvider create(KeycloakSession session) {
+        return new FreeMarkerLoginFormsProvider(session, freeMarker);
     }
 
     @Override
diff --git a/model/api/src/main/java/org/keycloak/models/KeycloakSession.java b/model/api/src/main/java/org/keycloak/models/KeycloakSession.java
index d0e4a34..ba2c776 100755
--- a/model/api/src/main/java/org/keycloak/models/KeycloakSession.java
+++ b/model/api/src/main/java/org/keycloak/models/KeycloakSession.java
@@ -10,11 +10,19 @@ import java.util.Set;
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
  */
-public interface KeycloakSession extends Provider {
+public interface KeycloakSession {
     // Note: The reason there are so many query methods here is for layering a cache on top of an persistent KeycloakSession
 
     KeycloakTransaction getTransaction();
 
+    <T extends Provider> T getProvider(Class<T> clazz);
+
+    <T extends Provider> T getProvider(Class<T> clazz, String id);
+
+    <T extends Provider> Set<String> listProviderIds(Class<T> clazz);
+
+    <T extends Provider> Set<T> getAllProviders(Class<T> clazz);
+
     RealmModel createRealm(String name);
     RealmModel createRealm(String id, String name);
     RealmModel getRealm(String id);
diff --git a/model/api/src/main/java/org/keycloak/models/KeycloakSessionFactory.java b/model/api/src/main/java/org/keycloak/models/KeycloakSessionFactory.java
index dba6d84..582b7ea 100755
--- a/model/api/src/main/java/org/keycloak/models/KeycloakSessionFactory.java
+++ b/model/api/src/main/java/org/keycloak/models/KeycloakSessionFactory.java
@@ -1,13 +1,10 @@
 package org.keycloak.models;
 
-import org.keycloak.provider.ProviderFactory;
-import org.keycloak.provider.ProviderSession;
-
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
  */
-public interface KeycloakSessionFactory extends ProviderFactory<KeycloakSession> {
-    KeycloakSession create(ProviderSession providerSession);
+public interface KeycloakSessionFactory {
+    KeycloakSession create();
     void close();
 }
diff --git a/model/api/src/main/java/org/keycloak/models/ModelProvider.java b/model/api/src/main/java/org/keycloak/models/ModelProvider.java
index 1e166ac..8ec2580 100755
--- a/model/api/src/main/java/org/keycloak/models/ModelProvider.java
+++ b/model/api/src/main/java/org/keycloak/models/ModelProvider.java
@@ -1,11 +1,59 @@
 package org.keycloak.models;
 
+import org.keycloak.provider.Provider;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
  */
-public interface ModelProvider {
-    String getId();
+public interface ModelProvider extends Provider {
+    // Note: The reason there are so many query methods here is for layering a cache on top of an persistent KeycloakSession
+
+    KeycloakTransaction getTransaction();
+
+    RealmModel createRealm(String name);
+    RealmModel createRealm(String id, String name);
+    RealmModel getRealm(String id);
+    RealmModel getRealmByName(String name);
+
+    UserModel getUserById(String id, RealmModel realm);
+    UserModel getUserByUsername(String username, RealmModel realm);
+    UserModel getUserByEmail(String email, RealmModel realm);
+    UserModel getUserBySocialLink(SocialLinkModel socialLink, RealmModel realm);
+    List<UserModel> getUsers(RealmModel realm);
+    List<UserModel> searchForUser(String search, RealmModel realm);
+    List<UserModel> searchForUserByAttributes(Map<String, String> attributes, RealmModel realm);
+
+    Set<SocialLinkModel> getSocialLinks(UserModel user, RealmModel realm);
+    SocialLinkModel getSocialLink(UserModel user, String socialProvider, RealmModel realm);
+
+
+    RoleModel getRoleById(String id, RealmModel realm);
+    ApplicationModel getApplicationById(String id, RealmModel realm);
+    OAuthClientModel getOAuthClientById(String id, RealmModel realm);
+    List<RealmModel> getRealms();
+    boolean removeRealm(String id);
+
+    UsernameLoginFailureModel getUserLoginFailure(String username, RealmModel realm);
+    UsernameLoginFailureModel addUserLoginFailure(String username, RealmModel realm);
+    List<UsernameLoginFailureModel> getAllUserLoginFailures(RealmModel realm);
+
+    UserSessionModel createUserSession(RealmModel realm, UserModel user, String ipAddress);
+    UserSessionModel getUserSession(String id, RealmModel realm);
+    List<UserSessionModel> getUserSessions(UserModel user, RealmModel realm);
+    Set<UserSessionModel> getUserSessions(RealmModel realm, ClientModel client);
+    int getActiveUserSessions(RealmModel realm, ClientModel client);
+    void removeUserSession(UserSessionModel session);
+    void removeUserSessions(RealmModel realm, UserModel user);
+    void removeExpiredUserSessions(RealmModel realm);
+    void removeUserSessions(RealmModel realm);
+
+
+    void removeAllData();
 
-    KeycloakSessionFactory createFactory();
+    void close();
 }
diff --git a/model/api/src/main/java/org/keycloak/models/ModelProviderFactory.java b/model/api/src/main/java/org/keycloak/models/ModelProviderFactory.java
new file mode 100755
index 0000000..4842118
--- /dev/null
+++ b/model/api/src/main/java/org/keycloak/models/ModelProviderFactory.java
@@ -0,0 +1,10 @@
+package org.keycloak.models;
+
+import org.keycloak.provider.ProviderFactory;
+
+/**
+ * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+public interface ModelProviderFactory extends ProviderFactory<ModelProvider> {
+}
diff --git a/model/api/src/main/java/org/keycloak/models/ModelSpi.java b/model/api/src/main/java/org/keycloak/models/ModelSpi.java
index 42586e9..7e944ba 100644
--- a/model/api/src/main/java/org/keycloak/models/ModelSpi.java
+++ b/model/api/src/main/java/org/keycloak/models/ModelSpi.java
@@ -16,12 +16,12 @@ public class ModelSpi implements Spi {
 
     @Override
     public Class<? extends Provider> getProviderClass() {
-        return KeycloakSession.class;
+        return ModelProvider.class;
     }
 
     @Override
     public Class<? extends ProviderFactory> getProviderFactoryClass() {
-        return KeycloakSessionFactory.class;
+        return ModelProviderFactory.class;
     }
 
 }
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/ApplicationAdapter.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/ApplicationAdapter.java
index 81f608e..31e938e 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/ApplicationAdapter.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/ApplicationAdapter.java
@@ -5,9 +5,8 @@ import org.keycloak.models.ClientModel;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RoleContainerModel;
 import org.keycloak.models.RoleModel;
-import org.keycloak.models.UserSessionModel;
 import org.keycloak.models.cache.entities.CachedApplication;
-import org.keycloak.models.cache.entities.CachedClient;
+
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -20,7 +19,7 @@ public class ApplicationAdapter extends ClientAdapter implements ApplicationMode
     protected ApplicationModel updated;
     protected CachedApplication cached;
 
-    public ApplicationAdapter(RealmModel cachedRealm, CachedApplication cached, CacheKeycloakSession cacheSession, KeycloakCache cache) {
+    public ApplicationAdapter(RealmModel cachedRealm, CachedApplication cached, CacheModelProvider cacheSession, KeycloakCache cache) {
         super(cachedRealm, cached, cache, cacheSession);
         this.cached = cached;
     }
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/ClientAdapter.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/ClientAdapter.java
index 660c738..8be3d82 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/ClientAdapter.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/ClientAdapter.java
@@ -1,12 +1,10 @@
 package org.keycloak.models.cache;
 
-import org.keycloak.models.ApplicationModel;
 import org.keycloak.models.ClientModel;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RoleContainerModel;
 import org.keycloak.models.RoleModel;
 import org.keycloak.models.UserSessionModel;
-import org.keycloak.models.cache.entities.CachedApplication;
 import org.keycloak.models.cache.entities.CachedClient;
 
 import java.util.HashSet;
@@ -18,12 +16,12 @@ import java.util.Set;
  */
 public abstract class ClientAdapter implements ClientModel {
     protected CachedClient cachedClient;
-    protected CacheKeycloakSession cacheSession;
+    protected CacheModelProvider cacheSession;
     protected ClientModel updatedClient;
     protected RealmModel cachedRealm;
     protected KeycloakCache cache;
 
-    public ClientAdapter(RealmModel cachedRealm, CachedClient cached, KeycloakCache cache, CacheKeycloakSession cacheSession) {
+    public ClientAdapter(RealmModel cachedRealm, CachedClient cached, KeycloakCache cache, CacheModelProvider cacheSession) {
         this.cachedRealm = cachedRealm;
         this.cache = cache;
         this.cacheSession = cacheSession;
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedApplication.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedApplication.java
index 6aab1ac..06cc7fe 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedApplication.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedApplication.java
@@ -3,6 +3,7 @@ package org.keycloak.models.cache.entities;
 import org.keycloak.models.ApplicationModel;
 import org.keycloak.models.ClientModel;
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.ModelProvider;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RoleModel;
 import org.keycloak.models.UserModel;
@@ -28,7 +29,7 @@ public class CachedApplication extends CachedClient {
     private boolean bearerOnly;
     private Map<String, String> roles = new HashMap<String, String>();
 
-    public CachedApplication(KeycloakCache cache, KeycloakSession delegate, RealmModel realm, ApplicationModel model) {
+    public CachedApplication(KeycloakCache cache, ModelProvider delegate, RealmModel realm, ApplicationModel model) {
         super(cache, delegate, realm, model);
         surrogateAuthRequired = model.isSurrogateAuthRequired();
         managementUrl = model.getManagementUrl();
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedClient.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedClient.java
index db22668..7e62422 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedClient.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedClient.java
@@ -3,6 +3,7 @@ package org.keycloak.models.cache.entities;
 import org.keycloak.models.ApplicationModel;
 import org.keycloak.models.ClientModel;
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.ModelProvider;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RoleModel;
 import org.keycloak.models.cache.KeycloakCache;
@@ -27,7 +28,7 @@ public class CachedClient {
     protected Set<String> scope = new HashSet<String>();
     protected Set<String> webOrigins = new HashSet<String>();
 
-    public CachedClient(KeycloakCache cache, KeycloakSession delegate, RealmModel realm, ClientModel model) {
+    public CachedClient(KeycloakCache cache, ModelProvider delegate, RealmModel realm, ClientModel model) {
         id = model.getId();
         secret = model.getSecret();
         name = model.getClientId();
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedOAuthClient.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedOAuthClient.java
index c708bd4..397010f 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedOAuthClient.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedOAuthClient.java
@@ -1,6 +1,7 @@
 package org.keycloak.models.cache.entities;
 
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.ModelProvider;
 import org.keycloak.models.OAuthClientModel;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.cache.KeycloakCache;
@@ -10,7 +11,7 @@ import org.keycloak.models.cache.KeycloakCache;
  * @version $Revision: 1 $
  */
 public class CachedOAuthClient extends CachedClient {
-    public CachedOAuthClient(KeycloakCache cache, KeycloakSession delegate, RealmModel realm, OAuthClientModel model) {
+    public CachedOAuthClient(KeycloakCache cache, ModelProvider delegate, RealmModel realm, OAuthClientModel model) {
         super(cache, delegate, realm, model);
 
     }
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedRealm.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedRealm.java
index 08f9b97..ffaa6c5 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedRealm.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedRealm.java
@@ -3,6 +3,7 @@ package org.keycloak.models.cache.entities;
 import org.keycloak.models.ApplicationModel;
 import org.keycloak.models.AuthenticationProviderModel;
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.ModelProvider;
 import org.keycloak.models.OAuthClientModel;
 import org.keycloak.models.PasswordPolicy;
 import org.keycloak.models.RealmModel;
@@ -80,7 +81,7 @@ public class CachedRealm {
     public CachedRealm() {
     }
 
-    public CachedRealm(KeycloakCache cache, KeycloakSession delegate, RealmModel model) {
+    public CachedRealm(KeycloakCache cache, ModelProvider delegate, RealmModel model) {
         id = model.getId();
         name = model.getName();
         enabled = model.isEnabled();
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/OAuthClientAdapter.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/OAuthClientAdapter.java
index cc6d3d6..2831ea0 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/OAuthClientAdapter.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/OAuthClientAdapter.java
@@ -1,18 +1,9 @@
 package org.keycloak.models.cache;
 
-import org.keycloak.models.ApplicationModel;
-import org.keycloak.models.ClientModel;
 import org.keycloak.models.OAuthClientModel;
 import org.keycloak.models.RealmModel;
-import org.keycloak.models.RoleContainerModel;
-import org.keycloak.models.RoleModel;
-import org.keycloak.models.cache.entities.CachedApplication;
 import org.keycloak.models.cache.entities.CachedOAuthClient;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
@@ -21,7 +12,7 @@ public class OAuthClientAdapter extends ClientAdapter implements OAuthClientMode
     protected OAuthClientModel updated;
     protected CachedOAuthClient cached;
 
-    public OAuthClientAdapter(RealmModel cachedRealm, CachedOAuthClient cached, CacheKeycloakSession cacheSession, KeycloakCache cache) {
+    public OAuthClientAdapter(RealmModel cachedRealm, CachedOAuthClient cached, CacheModelProvider cacheSession, KeycloakCache cache) {
         super(cachedRealm, cached, cache, cacheSession);
         this.cached = cached;
     }
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmAdapter.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmAdapter.java
index 5dc2539..3b5158c 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmAdapter.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmAdapter.java
@@ -1,7 +1,6 @@
 package org.keycloak.models.cache;
 
 import org.keycloak.models.ApplicationModel;
-import org.keycloak.models.AuthenticationLinkModel;
 import org.keycloak.models.AuthenticationProviderModel;
 import org.keycloak.models.ClientModel;
 import org.keycloak.models.OAuthClientModel;
@@ -15,17 +14,13 @@ import org.keycloak.models.UserCredentialValueModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.UserSessionModel;
 import org.keycloak.models.UsernameLoginFailureModel;
-import org.keycloak.models.cache.entities.CachedApplicationRole;
 import org.keycloak.models.cache.entities.CachedRealm;
-import org.keycloak.models.cache.entities.CachedRealmRole;
-import org.keycloak.models.cache.entities.CachedRole;
 import org.keycloak.models.utils.KeycloakModelUtils;
 import org.keycloak.models.utils.Pbkdf2PasswordEncoder;
 import org.keycloak.models.utils.TimeBasedOTP;
 
 import java.security.PrivateKey;
 import java.security.PublicKey;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -39,13 +34,13 @@ import java.util.Set;
  */
 public class RealmAdapter implements RealmModel {
     protected CachedRealm cached;
-    protected CacheKeycloakSession cacheSession;
+    protected CacheModelProvider cacheSession;
     protected RealmModel updated;
     protected KeycloakCache cache;
     protected volatile transient PublicKey publicKey;
     protected volatile transient PrivateKey privateKey;
 
-    public RealmAdapter(CachedRealm cached, CacheKeycloakSession cacheSession) {
+    public RealmAdapter(CachedRealm cached, CacheModelProvider cacheSession) {
         this.cached = cached;
         this.cacheSession = cacheSession;
     }
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RoleAdapter.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RoleAdapter.java
index 06bb610..bbf2766 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RoleAdapter.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RoleAdapter.java
@@ -20,10 +20,10 @@ public class RoleAdapter implements RoleModel {
     protected RoleModel updated;
     protected CachedRole cached;
     protected KeycloakCache cache;
-    protected CacheKeycloakSession cacheSession;
+    protected CacheModelProvider cacheSession;
     protected RealmModel realm;
 
-    public RoleAdapter(CachedRole cached, KeycloakCache cache, CacheKeycloakSession session, RealmModel realm) {
+    public RoleAdapter(CachedRole cached, KeycloakCache cache, CacheModelProvider session, RealmModel realm) {
         this.cached = cached;
         this.cache = cache;
         this.cacheSession = session;
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/UserAdapter.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/UserAdapter.java
index a31f3e0..727244c 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/UserAdapter.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/UserAdapter.java
@@ -23,10 +23,10 @@ public class UserAdapter implements UserModel {
     protected UserModel updated;
     protected CachedUser cached;
     protected KeycloakCache cache;
-    protected CacheKeycloakSession cacheSession;
+    protected CacheModelProvider cacheSession;
     protected RealmModel realm;
 
-    public UserAdapter(CachedUser cached, KeycloakCache cache, CacheKeycloakSession session, RealmModel realm) {
+    public UserAdapter(CachedUser cached, KeycloakCache cache, CacheModelProvider session, RealmModel realm) {
         this.cached = cached;
         this.cache = cache;
         this.cacheSession = session;
diff --git a/model/invalidation-cache/model-adapters/src/main/resources/META-INF/services/org.keycloak.models.cache.CacheModelProviderFactory b/model/invalidation-cache/model-adapters/src/main/resources/META-INF/services/org.keycloak.models.cache.CacheModelProviderFactory
new file mode 100755
index 0000000..343a85b
--- /dev/null
+++ b/model/invalidation-cache/model-adapters/src/main/resources/META-INF/services/org.keycloak.models.cache.CacheModelProviderFactory
@@ -0,0 +1,2 @@
+org.keycloak.models.cache.SimpleCacheModelProviderFactory
+org.keycloak.models.cache.NoCacheModelProviderFactory
\ No newline at end of file
diff --git a/model/invalidation-cache/model-adapters/src/main/resources/META-INF/services/org.keycloak.provider.Spi b/model/invalidation-cache/model-adapters/src/main/resources/META-INF/services/org.keycloak.provider.Spi
index 6460d62..eb9e116 100755
--- a/model/invalidation-cache/model-adapters/src/main/resources/META-INF/services/org.keycloak.provider.Spi
+++ b/model/invalidation-cache/model-adapters/src/main/resources/META-INF/services/org.keycloak.provider.Spi
@@ -1 +1 @@
-org.keycloak.models.cache.CacheKeycloakSessionSpi
\ No newline at end of file
+org.keycloak.models.cache.CacheModelProviderSpi
\ No newline at end of file
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/RoleAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/RoleAdapter.java
index ba4d136..2b12a1b 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/RoleAdapter.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/RoleAdapter.java
@@ -1,6 +1,5 @@
 package org.keycloak.models.jpa;
 
-import org.keycloak.models.OAuthClientModel;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RoleContainerModel;
 import org.keycloak.models.RoleModel;
diff --git a/model/jpa/src/main/resources/META-INF/services/org.keycloak.models.ModelProviderFactory b/model/jpa/src/main/resources/META-INF/services/org.keycloak.models.ModelProviderFactory
new file mode 100644
index 0000000..d981d8c
--- /dev/null
+++ b/model/jpa/src/main/resources/META-INF/services/org.keycloak.models.ModelProviderFactory
@@ -0,0 +1 @@
+org.keycloak.models.jpa.JpaModelProviderFactory
\ No newline at end of file
diff --git a/model/mongo/src/main/resources/META-INF/services/org.keycloak.models.ModelProviderFactory b/model/mongo/src/main/resources/META-INF/services/org.keycloak.models.ModelProviderFactory
new file mode 100644
index 0000000..429cc08
--- /dev/null
+++ b/model/mongo/src/main/resources/META-INF/services/org.keycloak.models.ModelProviderFactory
@@ -0,0 +1 @@
+org.keycloak.models.mongo.keycloak.adapters.MongoModelProviderFactory
\ No newline at end of file
diff --git a/model/tests/src/main/java/org/keycloak/model/test/LDAPTestUtils.java b/model/tests/src/main/java/org/keycloak/model/test/LDAPTestUtils.java
index 3025fd6..55f3d88 100644
--- a/model/tests/src/main/java/org/keycloak/model/test/LDAPTestUtils.java
+++ b/model/tests/src/main/java/org/keycloak/model/test/LDAPTestUtils.java
@@ -1,9 +1,9 @@
 package org.keycloak.model.test;
 
-import org.keycloak.models.RealmModel;
 import org.keycloak.authentication.picketlink.PicketlinkAuthenticationProvider;
+import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.RealmModel;
 import org.keycloak.picketlink.IdentityManagerProvider;
-import org.keycloak.provider.ProviderSession;
 import org.picketlink.idm.IdentityManager;
 import org.picketlink.idm.credential.Password;
 import org.picketlink.idm.model.basic.BasicModel;
@@ -14,10 +14,10 @@ import org.picketlink.idm.model.basic.User;
  */
 public class LDAPTestUtils {
 
-    public static void setLdapPassword(ProviderSession providerSession, RealmModel realm, String username, String password) {
+    public static void setLdapPassword(KeycloakSession session, RealmModel realm, String username, String password) {
         // Update password directly in ldap. It's workaround, but LDIF import doesn't seem to work on windows for ApacheDS
         try {
-            IdentityManager identityManager = new PicketlinkAuthenticationProvider(providerSession.getProvider(IdentityManagerProvider.class)).getIdentityManager(realm);
+            IdentityManager identityManager = new PicketlinkAuthenticationProvider(session.getProvider(IdentityManagerProvider.class)).getIdentityManager(realm);
             User user = BasicModel.getUser(identityManager, username);
             identityManager.updateCredential(user, new Password(password.toCharArray()));
         } catch (Exception e) {
diff --git a/model/tests/src/test/java/org/keycloak/model/test/AbstractModelTest.java b/model/tests/src/test/java/org/keycloak/model/test/AbstractModelTest.java
index 3d61794..b59b1ca 100755
--- a/model/tests/src/test/java/org/keycloak/model/test/AbstractModelTest.java
+++ b/model/tests/src/test/java/org/keycloak/model/test/AbstractModelTest.java
@@ -1,89 +1,81 @@
 package org.keycloak.model.test;
 
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Set;
-
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.keycloak.Config;
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RoleModel;
-import org.keycloak.Config;
-import org.keycloak.models.cache.CacheKeycloakSession;
-import org.keycloak.models.cache.SimpleCache;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.provider.ProviderSessionFactory;
 import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.services.managers.ApplianceBootstrap;
 import org.keycloak.services.managers.RealmManager;
 import org.keycloak.services.resources.KeycloakApplication;
 import org.keycloak.util.JsonSerialization;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Set;
+
 /**
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
  */
 public class AbstractModelTest {
 
-    protected static ProviderSessionFactory providerSessionFactory;
+    protected static KeycloakSessionFactory sessionFactory;
 
-    protected KeycloakSession identitySession;
+    protected KeycloakSession session;
     protected RealmManager realmManager;
-    protected ProviderSession providerSession;
 
     @BeforeClass
     public static void beforeClass() {
-        providerSessionFactory = KeycloakApplication.createProviderSessionFactory();
+        sessionFactory = KeycloakApplication.createSessionFactory();
 
-        ProviderSession providerSession = providerSessionFactory.createSession();
-        KeycloakSession identitySession = providerSession.getProvider(CacheKeycloakSession.class, "simple");
+        KeycloakSession session = sessionFactory.create();
         try {
-            identitySession.getTransaction().begin();
-            new ApplianceBootstrap().bootstrap(identitySession, "/auth");
-            identitySession.getTransaction().commit();
+            session.getTransaction().begin();
+            new ApplianceBootstrap().bootstrap(session, "/auth");
+            session.getTransaction().commit();
         } finally {
-            providerSession.close();
+            session.close();
         }
     }
 
     @AfterClass
     public static void afterClass() {
-        providerSessionFactory.close();
+        sessionFactory.close();
     }
 
     @Before
     public void before() throws Exception {
-        providerSession = providerSessionFactory.createSession();
-
-        identitySession = providerSession.getProvider(CacheKeycloakSession.class, "simple");
-        identitySession.getTransaction().begin();
-        realmManager = new RealmManager(identitySession);
+        session = sessionFactory.create();
+        session.getTransaction().begin();
+        realmManager = new RealmManager(session);
     }
 
     @After
     public void after() throws Exception {
-        identitySession.getTransaction().commit();
-        providerSession.close();
+        session.getTransaction().commit();
+        session.close();
 
-        providerSession = providerSessionFactory.createSession();
-        identitySession = providerSession.getProvider(CacheKeycloakSession.class, "simple");
+        session = sessionFactory.create();
         try {
-            identitySession.getTransaction().begin();
+            session.getTransaction().begin();
 
-            RealmManager rm = new RealmManager(identitySession);
-            for (RealmModel realm : identitySession.getRealms()) {
+            RealmManager rm = new RealmManager(session);
+            for (RealmModel realm : session.getRealms()) {
                 if (!realm.getName().equals(Config.getAdminRealm())) {
                     rm.removeRealm(realm);
                 }
             }
 
-            identitySession.getTransaction().commit();
+            session.getTransaction().commit();
         } finally {
-            providerSession.close();
+            session.close();
         }
 
     }
@@ -94,20 +86,19 @@ public class AbstractModelTest {
 
     protected void commit(boolean rollback) {
         if (rollback) {
-            identitySession.getTransaction().rollback();
+            session.getTransaction().rollback();
         } else {
-            identitySession.getTransaction().commit();
+            session.getTransaction().commit();
         }
         resetSession();
     }
 
     protected void resetSession() {
-        providerSession.close();
+        session.close();
 
-        providerSession = providerSessionFactory.createSession();
-        identitySession = providerSession.getProvider(CacheKeycloakSession.class, "simple");
-        identitySession.getTransaction().begin();
-        realmManager = new RealmManager(identitySession);
+        session = sessionFactory.create();
+        session.getTransaction().begin();
+        realmManager = new RealmManager(session);
     }
 
     public static RealmRepresentation loadJson(String path) throws IOException {
diff --git a/model/tests/src/test/java/org/keycloak/model/test/AdapterTest.java b/model/tests/src/test/java/org/keycloak/model/test/AdapterTest.java
index f3ce4eb..e3f29ff 100755
--- a/model/tests/src/test/java/org/keycloak/model/test/AdapterTest.java
+++ b/model/tests/src/test/java/org/keycloak/model/test/AdapterTest.java
@@ -92,7 +92,7 @@ public class AdapterTest extends AbstractModelTest {
         realmModel.getId();
 
         commit();
-        List<RealmModel> realms = identitySession.getRealms();
+        List<RealmModel> realms = session.getRealms();
         Assert.assertEquals(realms.size(), 2);
     }
 
@@ -170,7 +170,7 @@ public class AdapterTest extends AbstractModelTest {
 
         commit();
 
-        realmModel = identitySession.getRealm("JUGGLER");
+        realmModel = session.getRealm("JUGGLER");
         Assert.assertTrue(realmModel.removeUser("bburke"));
         Assert.assertFalse(realmModel.removeUser("bburke"));
         assertNull(realmModel.getUser("bburke"));
@@ -226,7 +226,7 @@ public class AdapterTest extends AbstractModelTest {
         app.addScopeMapping(realmRole);
 
         commit();
-        realmModel = identitySession.getRealm("JUGGLER");
+        realmModel = session.getRealm("JUGGLER");
 
         Assert.assertTrue(realmManager.removeRealm(realmModel));
         Assert.assertFalse(realmManager.removeRealm(realmModel));
@@ -252,7 +252,7 @@ public class AdapterTest extends AbstractModelTest {
         app.addScopeMapping(realmRole);
 
         commit();
-        realmModel = identitySession.getRealm("JUGGLER");
+        realmModel = session.getRealm("JUGGLER");
         app = realmModel.getApplicationByName("test-app");
 
         Assert.assertTrue(realmModel.removeRoleById(realmRole.getId()));
@@ -504,7 +504,7 @@ public class AdapterTest extends AbstractModelTest {
 
         commit();
 
-        realmModel = identitySession.getRealmByName("JUGGLER");
+        realmModel = session.getRealmByName("JUGGLER");
         app1 = realmModel.getApplicationByName("app1");
         app2 = realmModel.getApplicationByName("app2");
         client = realmModel.getOAuthClient("client");
diff --git a/model/tests/src/test/java/org/keycloak/model/test/AuthenticationManagerTest.java b/model/tests/src/test/java/org/keycloak/model/test/AuthenticationManagerTest.java
index 24e894f..0e7511e 100755
--- a/model/tests/src/test/java/org/keycloak/model/test/AuthenticationManagerTest.java
+++ b/model/tests/src/test/java/org/keycloak/model/test/AuthenticationManagerTest.java
@@ -164,9 +164,9 @@ public class AuthenticationManagerTest extends AbstractModelTest {
         realm.setAccessTokenLifespan(1000);
         realm.addRequiredCredential(CredentialRepresentation.PASSWORD);
         realm.setAuthenticationProviders(Arrays.asList(AuthenticationProviderModel.DEFAULT_PROVIDER));
-        protector = new BruteForceProtector(providerSessionFactory);
+        protector = new BruteForceProtector(sessionFactory);
         protector.start();
-        am = new AuthenticationManager(providerSession, protector);
+        am = new AuthenticationManager(session, protector);
 
         user = realm.addUser("test");
         user.setEnabled(true);
diff --git a/model/tests/src/test/java/org/keycloak/model/test/AuthProvidersExternalModelTest.java b/model/tests/src/test/java/org/keycloak/model/test/AuthProvidersExternalModelTest.java
index 17674c4..5b04316 100755
--- a/model/tests/src/test/java/org/keycloak/model/test/AuthProvidersExternalModelTest.java
+++ b/model/tests/src/test/java/org/keycloak/model/test/AuthProvidersExternalModelTest.java
@@ -65,7 +65,7 @@ public class AuthProvidersExternalModelTest extends AbstractModelTest {
         credential.setValue("password");
         john.updateCredential(credential);
 
-        am = new AuthenticationManager(providerSession);
+        am = new AuthenticationManager(session);
     }
 
 
@@ -85,7 +85,7 @@ public class AuthProvidersExternalModelTest extends AbstractModelTest {
 
         try {
             // this is needed for externalModel provider
-            ResteasyProviderFactory.pushContext(KeycloakSession.class, identitySession);
+            ResteasyProviderFactory.pushContext(KeycloakSession.class, session);
 
             // Authenticate john in realm2 and verify that now he exists here.
             Assert.assertEquals(AuthenticationManager.AuthenticationStatus.SUCCESS, am.authenticateForm(null, realm2, formData));
@@ -119,10 +119,10 @@ public class AuthProvidersExternalModelTest extends AbstractModelTest {
 
         try {
             // this is needed for externalModel provider
-            ResteasyProviderFactory.pushContext(KeycloakSession.class, identitySession);
+            ResteasyProviderFactory.pushContext(KeycloakSession.class, session);
 
             // Change credential via realm2 and validate that they are changed also in realm1
-            AuthenticationProviderManager authProviderManager = AuthenticationProviderManager.getManager(realm2, providerSession);
+            AuthenticationProviderManager authProviderManager = AuthenticationProviderManager.getManager(realm2, session);
             try {
                 Assert.assertTrue(authProviderManager.updatePassword(john, "password-updated"));
             } catch (AuthenticationProviderException ape) {
diff --git a/model/tests/src/test/java/org/keycloak/model/test/AuthProvidersLDAPTest.java b/model/tests/src/test/java/org/keycloak/model/test/AuthProvidersLDAPTest.java
index a59a12a..a39c033 100755
--- a/model/tests/src/test/java/org/keycloak/model/test/AuthProvidersLDAPTest.java
+++ b/model/tests/src/test/java/org/keycloak/model/test/AuthProvidersLDAPTest.java
@@ -68,7 +68,7 @@ public class AuthProvidersLDAPTest extends AbstractModelTest {
         realm.addRequiredCredential(CredentialRepresentation.PASSWORD);
         this.embeddedServer.setupLdapInRealm(realm);
 
-        am = new AuthenticationManager(providerSession);
+        am = new AuthenticationManager(session);
     }
 
     @Test
@@ -76,7 +76,7 @@ public class AuthProvidersLDAPTest extends AbstractModelTest {
         MultivaluedMap<String, String> formData = AuthProvidersExternalModelTest.createFormData("johnkeycloak", "password");
 
         // Set password of user in LDAP
-        LDAPTestUtils.setLdapPassword(providerSession, realm, "johnkeycloak", "password");
+        LDAPTestUtils.setLdapPassword(session, realm, "johnkeycloak", "password");
 
         // Verify that user doesn't exists in realm2 and can't authenticate here
         Assert.assertEquals(AuthenticationManager.AuthenticationStatus.INVALID_USER, am.authenticateForm(null, realm, formData));
@@ -140,14 +140,14 @@ public class AuthProvidersLDAPTest extends AbstractModelTest {
         // Add ldap
         setupAuthenticationProviders();
 
-        LDAPTestUtils.setLdapPassword(providerSession, realm, "johnkeycloak", "password");
+        LDAPTestUtils.setLdapPassword(session, realm, "johnkeycloak", "password");
 
         // First authenticate successfully to sync john into realm
         MultivaluedMap<String, String> formData = AuthProvidersExternalModelTest.createFormData("johnkeycloak", "password");
         Assert.assertEquals(AuthenticationManager.AuthenticationStatus.SUCCESS, am.authenticateForm(null, realm, formData));
 
         // Change credential and validate that user can authenticate
-        AuthenticationProviderManager authProviderManager = AuthenticationProviderManager.getManager(realm, providerSession);
+        AuthenticationProviderManager authProviderManager = AuthenticationProviderManager.getManager(realm, session);
 
         UserModel john = realm.getUser("johnkeycloak");
         try {
diff --git a/model/tests/src/test/java/org/keycloak/model/test/MultipleRealmsTest.java b/model/tests/src/test/java/org/keycloak/model/test/MultipleRealmsTest.java
index 7f9f6b3..4ea8ab2 100755
--- a/model/tests/src/test/java/org/keycloak/model/test/MultipleRealmsTest.java
+++ b/model/tests/src/test/java/org/keycloak/model/test/MultipleRealmsTest.java
@@ -49,8 +49,8 @@ public class MultipleRealmsTest extends AbstractModelTest {
         Assert.assertEquals(2, realm1.searchForUser("user").size());
 
         commit();
-        realm1 = identitySession.getRealm("id1");
-        realm2 = identitySession.getRealm("id2");
+        realm1 = session.getRealm("id1");
+        realm2 = session.getRealm("id2");
 
         realm1.removeUser("user1");
         realm1.removeUser("user2");
@@ -60,10 +60,10 @@ public class MultipleRealmsTest extends AbstractModelTest {
 
     @Test
     public void testGetById() {
-        Assert.assertEquals(realm1, identitySession.getRealm("id1"));
-        Assert.assertEquals(realm1, identitySession.getRealmByName("realm1"));
-        Assert.assertEquals(realm2, identitySession.getRealm("id2"));
-        Assert.assertEquals(realm2, identitySession.getRealmByName("realm2"));
+        Assert.assertEquals(realm1, session.getRealm("id1"));
+        Assert.assertEquals(realm1, session.getRealmByName("realm1"));
+        Assert.assertEquals(realm2, session.getRealm("id2"));
+        Assert.assertEquals(realm2, session.getRealmByName("realm2"));
 
         ApplicationModel r1app1 = realm1.getApplicationByName("app1");
         ApplicationModel r1app2 = realm1.getApplicationByName("app2");
diff --git a/picketlink/keycloak-picketlink-realm/src/main/java/org/keycloak/picketlink/realm/RealmIdentityManagerProviderFactory.java b/picketlink/keycloak-picketlink-realm/src/main/java/org/keycloak/picketlink/realm/RealmIdentityManagerProviderFactory.java
index 236cff6..616e96d 100644
--- a/picketlink/keycloak-picketlink-realm/src/main/java/org/keycloak/picketlink/realm/RealmIdentityManagerProviderFactory.java
+++ b/picketlink/keycloak-picketlink-realm/src/main/java/org/keycloak/picketlink/realm/RealmIdentityManagerProviderFactory.java
@@ -1,9 +1,9 @@
 package org.keycloak.picketlink.realm;
 
 import org.keycloak.Config;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.picketlink.IdentityManagerProvider;
 import org.keycloak.picketlink.IdentityManagerProviderFactory;
-import org.keycloak.provider.ProviderSession;
 import org.picketlink.idm.PartitionManager;
 
 /**
@@ -16,7 +16,7 @@ public class RealmIdentityManagerProviderFactory implements IdentityManagerProvi
     private PartitionManagerRegistry partitionManagerRegistry;
 
     @Override
-    public IdentityManagerProvider create(ProviderSession providerSession) {
+    public IdentityManagerProvider create(KeycloakSession session) {
         return new RealmIdentityManagerProvider(partitionManagerRegistry);
     }
 
diff --git a/project-integrations/aerogear-ups/auth-server/src/main/java/org/aerogear/ups/security/AerogearThemeProviderFactory.java b/project-integrations/aerogear-ups/auth-server/src/main/java/org/aerogear/ups/security/AerogearThemeProviderFactory.java
index 3804315..eb153e1 100755
--- a/project-integrations/aerogear-ups/auth-server/src/main/java/org/aerogear/ups/security/AerogearThemeProviderFactory.java
+++ b/project-integrations/aerogear-ups/auth-server/src/main/java/org/aerogear/ups/security/AerogearThemeProviderFactory.java
@@ -3,7 +3,7 @@ package org.aerogear.ups.security;
 import org.keycloak.Config;
 import org.keycloak.freemarker.ThemeProvider;
 import org.keycloak.freemarker.ThemeProviderFactory;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
@@ -13,7 +13,7 @@ public class AerogearThemeProviderFactory implements ThemeProviderFactory {
     protected AerogearThemeProvider theme;
 
     @Override
-    public ThemeProvider create(ProviderSession providerSession) {
+    public ThemeProvider create(KeycloakSession session) {
         return theme;
     }
 
diff --git a/project-integrations/aerogear-ups/auth-server/src/main/java/org/aerogear/ups/security/UpsSecurityApplication.java b/project-integrations/aerogear-ups/auth-server/src/main/java/org/aerogear/ups/security/UpsSecurityApplication.java
index b7b0d56..9f322e1 100755
--- a/project-integrations/aerogear-ups/auth-server/src/main/java/org/aerogear/ups/security/UpsSecurityApplication.java
+++ b/project-integrations/aerogear-ups/auth-server/src/main/java/org/aerogear/ups/security/UpsSecurityApplication.java
@@ -4,7 +4,6 @@ import org.jboss.resteasy.core.Dispatcher;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.services.managers.RealmManager;
 import org.keycloak.services.resources.KeycloakApplication;
 
@@ -23,8 +22,8 @@ public class UpsSecurityApplication extends KeycloakApplication {
     @Override
     protected void setupDefaultRealm(String contextPath) {
         super.setupDefaultRealm(contextPath);
-        ProviderSession providerSession = providerSessionFactory.createSession();
-        KeycloakSession session = providerSession.getProvider(KeycloakSession.class);
+
+        KeycloakSession session = sessionFactory.create();
         session.getTransaction().begin();
 
         // disable master realm by deleting the admin user.
@@ -35,7 +34,7 @@ public class UpsSecurityApplication extends KeycloakApplication {
             if (admin != null) master.removeUser(admin.getLoginName());
             session.getTransaction().commit();
         } finally {
-            providerSession.close();
+            session.close();
         }
 
     }
diff --git a/project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/classes/META-INF/keycloak-server.json b/project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/classes/META-INF/keycloak-server.json
index e0dd897..752704c 100755
--- a/project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/classes/META-INF/keycloak-server.json
+++ b/project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/classes/META-INF/keycloak-server.json
@@ -8,7 +8,7 @@
     },
 
     "modelCache": {
-        "provider": "${keycloak.model.cache.provider:none}"
+        "provider": "${keycloak.model.cache.provider:}"
     },
 
     "timer": {
diff --git a/server/src/main/resources/META-INF/keycloak-server.json b/server/src/main/resources/META-INF/keycloak-server.json
index fb726ca..7e3f246 100755
--- a/server/src/main/resources/META-INF/keycloak-server.json
+++ b/server/src/main/resources/META-INF/keycloak-server.json
@@ -15,7 +15,7 @@
     },
 
     "modelCache": {
-        "provider": "${keycloak.model.cache.provider:none}"
+        "provider": "${keycloak.model.cache.provider:}"
     },
 
     "timer": {
@@ -31,7 +31,7 @@
         }
     },
 
-    "login-forms": {
+    "login": {
         "provider": "freemarker"
     },
 
diff --git a/services/src/main/java/org/keycloak/services/DefaultKeycloakSession.java b/services/src/main/java/org/keycloak/services/DefaultKeycloakSession.java
new file mode 100755
index 0000000..dce4019
--- /dev/null
+++ b/services/src/main/java/org/keycloak/services/DefaultKeycloakSession.java
@@ -0,0 +1,249 @@
+package org.keycloak.services;
+
+import org.keycloak.models.ApplicationModel;
+import org.keycloak.models.ClientModel;
+import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.KeycloakTransaction;
+import org.keycloak.models.ModelProvider;
+import org.keycloak.models.OAuthClientModel;
+import org.keycloak.models.RealmModel;
+import org.keycloak.models.RoleModel;
+import org.keycloak.models.SocialLinkModel;
+import org.keycloak.models.UserModel;
+import org.keycloak.models.UserSessionModel;
+import org.keycloak.models.UsernameLoginFailureModel;
+import org.keycloak.models.cache.CacheModelProvider;
+import org.keycloak.provider.Provider;
+import org.keycloak.provider.ProviderFactory;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
+ */
+public class DefaultKeycloakSession implements KeycloakSession {
+
+    private DefaultKeycloakSessionFactory factory;
+    private Map<Integer, Provider> providers = new HashMap<Integer, Provider>();
+    private final ModelProvider model;
+
+    public DefaultKeycloakSession(DefaultKeycloakSessionFactory factory) {
+        this.factory = factory;
+
+        if (factory.getDefaultProvider(CacheModelProvider.class) != null) {
+            model = getProvider(CacheModelProvider.class);
+        } else {
+            model = getProvider(ModelProvider.class);
+        }
+    }
+
+    @Override
+    public KeycloakTransaction getTransaction() {
+        return model.getTransaction();
+    }
+
+    public <T extends Provider> T getProvider(Class<T> clazz) {
+        Integer hash = clazz.hashCode();
+        T provider = (T) providers.get(hash);
+        if (provider == null) {
+            ProviderFactory<T> providerFactory = factory.getProviderFactory(clazz);
+            if (providerFactory != null) {
+                provider = providerFactory.create(this);
+                providers.put(hash, provider);
+            }
+        }
+        return provider;
+    }
+
+    public <T extends Provider> T getProvider(Class<T> clazz, String id) {
+        Integer hash = clazz.hashCode() + id.hashCode();
+        T provider = (T) providers.get(hash);
+        if (provider == null) {
+            ProviderFactory<T> providerFactory = factory.getProviderFactory(clazz, id);
+            if (providerFactory != null) {
+                provider = providerFactory.create(this);
+                providers.put(hash, provider);
+            }
+        }
+        return provider;
+    }
+
+    public <T extends Provider> Set<String> listProviderIds(Class<T> clazz) {
+        return factory.getAllProviderIds(clazz);
+    }
+
+    @Override
+    public <T extends Provider> Set<T> getAllProviders(Class<T> clazz) {
+        Set<T> providers = new HashSet<T>();
+        for (String id : listProviderIds(clazz)) {
+            providers.add(getProvider(clazz, id));
+        }
+        return providers;
+    }
+
+    @Override
+    public RealmModel createRealm(String name) {
+        return model.createRealm(name);
+    }
+
+    @Override
+    public RealmModel createRealm(String id, String name) {
+        return model.createRealm(id, name);
+    }
+
+    @Override
+    public RealmModel getRealm(String id) {
+        return model.getRealm(id);
+    }
+
+    @Override
+    public RealmModel getRealmByName(String name) {
+        return model.getRealmByName(name);
+    }
+
+    @Override
+    public UserModel getUserById(String id, RealmModel realm) {
+        return model.getUserById(id, realm);
+    }
+
+    @Override
+    public UserModel getUserByUsername(String username, RealmModel realm) {
+        return model.getUserByUsername(username, realm);
+    }
+
+    @Override
+    public UserModel getUserByEmail(String email, RealmModel realm) {
+        return model.getUserByEmail(email, realm);
+    }
+
+    @Override
+    public UserModel getUserBySocialLink(SocialLinkModel socialLink, RealmModel realm) {
+        return model.getUserBySocialLink(socialLink, realm);
+    }
+
+    @Override
+    public List<UserModel> getUsers(RealmModel realm) {
+        return model.getUsers(realm);
+    }
+
+    @Override
+    public List<UserModel> searchForUser(String search, RealmModel realm) {
+        return model.searchForUser(search, realm);
+    }
+
+    @Override
+    public List<UserModel> searchForUserByAttributes(Map<String, String> attributes, RealmModel realm) {
+        return model.searchForUserByAttributes(attributes, realm);
+    }
+
+    @Override
+    public Set<SocialLinkModel> getSocialLinks(UserModel user, RealmModel realm) {
+        return model.getSocialLinks(user, realm);
+    }
+
+    @Override
+    public SocialLinkModel getSocialLink(UserModel user, String socialProvider, RealmModel realm) {
+        return model.getSocialLink(user, socialProvider, realm);
+    }
+
+    @Override
+    public RoleModel getRoleById(String id, RealmModel realm) {
+        return model.getRoleById(id, realm);
+    }
+
+    @Override
+    public ApplicationModel getApplicationById(String id, RealmModel realm) {
+        return model.getApplicationById(id, realm);
+    }
+
+    @Override
+    public OAuthClientModel getOAuthClientById(String id, RealmModel realm) {
+        return model.getOAuthClientById(id, realm);
+    }
+
+    @Override
+    public List<RealmModel> getRealms() {
+        return model.getRealms();
+    }
+
+    @Override
+    public boolean removeRealm(String id) {
+        return model.removeRealm(id);
+    }
+
+    @Override
+    public UsernameLoginFailureModel getUserLoginFailure(String username, RealmModel realm) {
+        return model.getUserLoginFailure(username, realm);
+    }
+
+    @Override
+    public UsernameLoginFailureModel addUserLoginFailure(String username, RealmModel realm) {
+        return model.addUserLoginFailure(username, realm);
+    }
+
+    @Override
+    public List<UsernameLoginFailureModel> getAllUserLoginFailures(RealmModel realm) {
+        return model.getAllUserLoginFailures(realm);
+    }
+
+    @Override
+    public UserSessionModel createUserSession(RealmModel realm, UserModel user, String ipAddress) {
+        return model.createUserSession(realm, user, ipAddress);
+    }
+
+    @Override
+    public UserSessionModel getUserSession(String id, RealmModel realm) {
+        return model.getUserSession(id, realm);
+    }
+
+    @Override
+    public List<UserSessionModel> getUserSessions(UserModel user, RealmModel realm) {
+        return model.getUserSessions(user, realm);
+    }
+
+    @Override
+    public Set<UserSessionModel> getUserSessions(RealmModel realm, ClientModel client) {
+        return model.getUserSessions(realm, client);
+    }
+
+    @Override
+    public int getActiveUserSessions(RealmModel realm, ClientModel client) {
+        return model.getActiveUserSessions(realm, client);
+    }
+
+    @Override
+    public void removeUserSession(UserSessionModel session) {
+        model.removeUserSession(session);
+    }
+
+    @Override
+    public void removeUserSessions(RealmModel realm, UserModel user) {
+        model.removeUserSessions(realm, user);
+    }
+
+    @Override
+    public void removeExpiredUserSessions(RealmModel realm) {
+        model.removeExpiredUserSessions(realm);
+    }
+
+    @Override
+    public void removeUserSessions(RealmModel realm) {
+        model.removeUserSessions(realm);
+    }
+
+    @Override
+    public void removeAllData() {
+        model.removeAllData();
+    }
+
+    public void close() {
+        for (Provider p : providers.values()) {
+            p.close();
+        }
+    }
+
+}
diff --git a/services/src/main/java/org/keycloak/services/filters/KeycloakSessionServletFilter.java b/services/src/main/java/org/keycloak/services/filters/KeycloakSessionServletFilter.java
index eba6113..4115567 100755
--- a/services/src/main/java/org/keycloak/services/filters/KeycloakSessionServletFilter.java
+++ b/services/src/main/java/org/keycloak/services/filters/KeycloakSessionServletFilter.java
@@ -2,10 +2,8 @@ package org.keycloak.services.filters;
 
 import org.jboss.resteasy.spi.ResteasyProviderFactory;
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.KeycloakTransaction;
-import org.keycloak.models.cache.CacheKeycloakSession;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.provider.ProviderSessionFactory;
 
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -28,16 +26,16 @@ public class KeycloakSessionServletFilter implements Filter {
 
     @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
-        ProviderSessionFactory providerSessionFactory = (ProviderSessionFactory) servletRequest.getServletContext().getAttribute(ProviderSessionFactory.class.getName());
-        ProviderSession providerSession = providerSessionFactory.createSession();
         HttpServletRequest request = (HttpServletRequest)servletRequest;
-        ResteasyProviderFactory.pushContext(ProviderSession.class, providerSession);
 
-        KeycloakSession session = providerSession.getProvider(CacheKeycloakSession.class);
+        KeycloakSessionFactory sessionFactory = (KeycloakSessionFactory) servletRequest.getServletContext().getAttribute(KeycloakSessionFactory.class.getName());
+        KeycloakSession session = sessionFactory.create();
         ResteasyProviderFactory.pushContext(KeycloakSession.class, session);
+
         KeycloakTransaction tx = session.getTransaction();
         ResteasyProviderFactory.pushContext(KeycloakTransaction.class, tx);
         tx.begin();
+
         try {
             filterChain.doFilter(servletRequest, servletResponse);
             if (tx.isActive()) {
@@ -55,7 +53,7 @@ public class KeycloakSessionServletFilter implements Filter {
             if (tx.isActive()) tx.rollback();
             throw new RuntimeException("request path: " + request.getRequestURI(), ex);
         } finally {
-            providerSession.close();
+            session.close();
             ResteasyProviderFactory.clearContextData();
         }
 
diff --git a/services/src/main/java/org/keycloak/services/listeners/KeycloakSessionDestroyListener.java b/services/src/main/java/org/keycloak/services/listeners/KeycloakSessionDestroyListener.java
index 0c74c9d..e87a0a8 100755
--- a/services/src/main/java/org/keycloak/services/listeners/KeycloakSessionDestroyListener.java
+++ b/services/src/main/java/org/keycloak/services/listeners/KeycloakSessionDestroyListener.java
@@ -1,7 +1,6 @@
 package org.keycloak.services.listeners;
 
 import org.keycloak.models.KeycloakSessionFactory;
-import org.keycloak.provider.ProviderSessionFactory;
 import org.keycloak.services.managers.BruteForceProtector;
 
 import javax.servlet.ServletContextEvent;
@@ -22,15 +21,10 @@ public class KeycloakSessionDestroyListener implements ServletContextListener {
         if (protector != null) {
             protector.shutdown();
         }
-        ProviderSessionFactory providerSessionFactory = (ProviderSessionFactory) sce.getServletContext().getAttribute(ProviderSessionFactory.class.getName());
-        KeycloakSessionFactory kcSessionFactory = (KeycloakSessionFactory) sce.getServletContext().getAttribute(KeycloakSessionFactory.class.getName());
-        if (providerSessionFactory != null) {
-            providerSessionFactory.close();
+        KeycloakSessionFactory sessionFactory = (KeycloakSessionFactory) sce.getServletContext().getAttribute(KeycloakSessionFactory.class.getName());
+        if (sessionFactory != null) {
+            sessionFactory.close();
         }
-        if (kcSessionFactory != null) {
-            kcSessionFactory.close();
-        }
-
     }
 
 }
diff --git a/services/src/main/java/org/keycloak/services/managers/AppAuthManager.java b/services/src/main/java/org/keycloak/services/managers/AppAuthManager.java
index 64adc30..f73d30d 100755
--- a/services/src/main/java/org/keycloak/services/managers/AppAuthManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/AppAuthManager.java
@@ -2,8 +2,8 @@ package org.keycloak.services.managers;
 
 import org.jboss.logging.Logger;
 import org.jboss.resteasy.spi.UnauthorizedException;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
-import org.keycloak.provider.ProviderSession;
 
 import javax.ws.rs.core.Cookie;
 import javax.ws.rs.core.HttpHeaders;
@@ -16,8 +16,8 @@ import javax.ws.rs.core.UriInfo;
 public class AppAuthManager extends AuthenticationManager {
     protected static Logger logger = Logger.getLogger(AppAuthManager.class);
 
-    public AppAuthManager(ProviderSession providerSession) {
-        super(providerSession);
+    public AppAuthManager(KeycloakSession session) {
+        super(session);
     }
 
     @Override
diff --git a/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java b/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java
index 43b271f..8e4440c 100755
--- a/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java
+++ b/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java
@@ -1,22 +1,20 @@
 package org.keycloak.services.managers;
 
-import java.util.Arrays;
-
 import org.jboss.logging.Logger;
+import org.keycloak.Config;
 import org.keycloak.models.AdminRoles;
 import org.keycloak.models.ApplicationModel;
 import org.keycloak.models.AuthenticationProviderModel;
-import org.keycloak.Config;
 import org.keycloak.models.Constants;
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RoleModel;
 import org.keycloak.models.UserCredentialModel;
 import org.keycloak.models.UserModel;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.provider.ProviderSessionFactory;
 import org.keycloak.representations.idm.CredentialRepresentation;
 
+import java.util.Arrays;
 import java.util.Collections;
 
 /**
@@ -27,16 +25,15 @@ public class ApplianceBootstrap {
 
     private static final Logger logger = Logger.getLogger(ApplianceBootstrap.class);
 
-    public void bootstrap(ProviderSessionFactory factory, String contextPath) {
-        ProviderSession providerSession = factory.createSession();
-        KeycloakSession session = providerSession.getProvider(KeycloakSession.class);
+    public void bootstrap(KeycloakSessionFactory sessionFactory, String contextPath) {
+        KeycloakSession session = sessionFactory.create();
         session.getTransaction().begin();
 
         try {
             bootstrap(session, contextPath);
             session.getTransaction().commit();
         } finally {
-            providerSession.close();
+            session.close();
         }
     }
 
diff --git a/services/src/main/java/org/keycloak/services/managers/AuditManager.java b/services/src/main/java/org/keycloak/services/managers/AuditManager.java
index 25ae718..bc63c67 100644
--- a/services/src/main/java/org/keycloak/services/managers/AuditManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/AuditManager.java
@@ -4,9 +4,9 @@ import org.jboss.logging.Logger;
 import org.keycloak.audit.Audit;
 import org.keycloak.audit.AuditListener;
 import org.keycloak.audit.AuditProvider;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.services.ClientConnection;
-import org.keycloak.provider.ProviderSession;
 
 import java.util.LinkedList;
 import java.util.List;
@@ -19,12 +19,12 @@ public class AuditManager {
     private Logger log = Logger.getLogger(AuditManager.class);
 
     private RealmModel realm;
-    private ProviderSession providers;
+    private KeycloakSession session;
     private ClientConnection clientConnection;
 
-    public AuditManager(RealmModel realm, ProviderSession providers, ClientConnection clientConnection) {
+    public AuditManager(RealmModel realm, KeycloakSession session, ClientConnection clientConnection) {
         this.realm = realm;
-        this.providers = providers;
+        this.session = session;
         this.clientConnection = clientConnection;
     }
 
@@ -32,7 +32,7 @@ public class AuditManager {
         List<AuditListener> listeners = new LinkedList<AuditListener>();
 
         if (realm.isAuditEnabled()) {
-            AuditProvider auditProvider = providers.getProvider(AuditProvider.class);
+            AuditProvider auditProvider = session.getProvider(AuditProvider.class);
             if (auditProvider != null) {
                 listeners.add(auditProvider);
             } else {
@@ -42,7 +42,7 @@ public class AuditManager {
 
         if (realm.getAuditListeners() != null) {
             for (String id : realm.getAuditListeners()) {
-                AuditListener listener = providers.getProvider(AuditListener.class, id);
+                AuditListener listener = session.getProvider(AuditListener.class, id);
                 if (listener != null) {
                     listeners.add(listener);
                 } else {
diff --git a/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java b/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java
index dd4197e..3f40e51 100755
--- a/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java
@@ -1,27 +1,23 @@
 package org.keycloak.services.managers;
 
 import org.jboss.logging.Logger;
-import org.jboss.resteasy.spi.HttpResponse;
-import org.jboss.resteasy.spi.ResteasyProviderFactory;
 import org.keycloak.RSATokenVerifier;
 import org.keycloak.VerificationException;
-import org.keycloak.audit.Audit;
+import org.keycloak.authentication.AuthProviderStatus;
+import org.keycloak.authentication.AuthUser;
+import org.keycloak.authentication.AuthenticationProviderManager;
 import org.keycloak.jose.jws.JWSBuilder;
 import org.keycloak.models.AuthenticationLinkModel;
-import org.keycloak.models.ClientModel;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RequiredCredentialModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.UserSessionModel;
 import org.keycloak.models.utils.KeycloakModelUtils;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.representations.AccessToken;
 import org.keycloak.representations.idm.CredentialRepresentation;
 import org.keycloak.services.ClientConnection;
 import org.keycloak.services.resources.RealmsResource;
-import org.keycloak.authentication.AuthProviderStatus;
-import org.keycloak.authentication.AuthUser;
-import org.keycloak.authentication.AuthenticationProviderManager;
 import org.keycloak.services.util.CookieHelper;
 import org.keycloak.util.Time;
 
@@ -29,7 +25,6 @@ import javax.ws.rs.core.Cookie;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.NewCookie;
-import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 import java.net.URI;
 import java.util.HashSet;
@@ -50,15 +45,15 @@ public class AuthenticationManager {
     public static final String KEYCLOAK_SESSION_COOKIE = "KEYCLOAK_SESSION";
     public static final String KEYCLOAK_REMEMBER_ME = "KEYCLOAK_REMEMBER_ME";
 
-    protected ProviderSession providerSession;
+    protected KeycloakSession session;
     protected BruteForceProtector protector;
 
-    public AuthenticationManager(ProviderSession providerSession) {
-        this.providerSession = providerSession;
+    public AuthenticationManager(KeycloakSession session) {
+        this.session = session;
     }
 
-    public AuthenticationManager(ProviderSession providerSession, BruteForceProtector protector) {
-        this.providerSession = providerSession;
+    public AuthenticationManager(KeycloakSession session, BruteForceProtector protector) {
+        this.session = session;
         this.protector = protector;
     }
 
@@ -267,7 +262,7 @@ public class AuthenticationManager {
     protected AuthenticationStatus authenticateInternal(RealmModel realm, MultivaluedMap<String, String> formData, String username) {
         UserModel user = KeycloakModelUtils.findUserByNameOrEmail(realm, username);
         if (user == null) {
-            AuthUser authUser = AuthenticationProviderManager.getManager(realm, providerSession).getUser(username);
+            AuthUser authUser = AuthenticationProviderManager.getManager(realm, session).getUser(username);
             if (authUser != null) {
                 // Create new user and link him with authentication provider
                 user = realm.addUser(authUser.getUsername());
@@ -314,7 +309,7 @@ public class AuthenticationManager {
             } else {
                 logger.debug("validating password for user: " + username);
 
-                AuthProviderStatus authStatus = AuthenticationProviderManager.getManager(realm, providerSession).validatePassword(user, password);
+                AuthProviderStatus authStatus = AuthenticationProviderManager.getManager(realm, session).validatePassword(user, password);
                 if (authStatus == AuthProviderStatus.INVALID_CREDENTIALS) {
                     logger.debug("invalid password for user: " + username);
                     return AuthenticationStatus.INVALID_CREDENTIALS;
diff --git a/services/src/main/java/org/keycloak/services/managers/BruteForceProtector.java b/services/src/main/java/org/keycloak/services/managers/BruteForceProtector.java
index 80dc511..f44b752 100755
--- a/services/src/main/java/org/keycloak/services/managers/BruteForceProtector.java
+++ b/services/src/main/java/org/keycloak/services/managers/BruteForceProtector.java
@@ -6,8 +6,6 @@ import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UsernameLoginFailureModel;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.provider.ProviderSessionFactory;
 import org.keycloak.services.ClientConnection;
 
 import java.util.ArrayList;
@@ -27,7 +25,7 @@ public class BruteForceProtector implements Runnable {
 
     protected volatile boolean run = true;
     protected int maxDeltaTimeSeconds = 60 * 60 * 12; // 12 hours
-    protected ProviderSessionFactory factory;
+    protected KeycloakSessionFactory factory;
     protected CountDownLatch shutdownLatch = new CountDownLatch(1);
 
     protected volatile long failures;
@@ -75,7 +73,7 @@ public class BruteForceProtector implements Runnable {
         }
     }
 
-    public BruteForceProtector(ProviderSessionFactory factory) {
+    public BruteForceProtector(KeycloakSessionFactory factory) {
         this.factory = factory;
     }
 
@@ -163,8 +161,7 @@ public class BruteForceProtector implements Runnable {
                         events.add(take);
                         queue.drainTo(events, TRANSACTION_SIZE);
                         Collections.sort(events); // we sort to avoid deadlock due to ordered updates.  Maybe I'm overthinking this.
-                        ProviderSession providerSession = factory.createSession();
-                        KeycloakSession session = providerSession.getProvider(KeycloakSession.class);
+                        KeycloakSession session = factory.create();
                         session.getTransaction().begin();
                         try {
                             for (LoginEvent event : events) {
@@ -185,7 +182,7 @@ public class BruteForceProtector implements Runnable {
                                 }
                             }
                             events.clear();
-                            providerSession.close();
+                            session.close();
                         }
                     } catch (Exception e) {
                         logger.error("Failed processing event", e);
diff --git a/services/src/main/java/org/keycloak/services/managers/RealmManager.java b/services/src/main/java/org/keycloak/services/managers/RealmManager.java
index 248e0ae..6fae8e7 100755
--- a/services/src/main/java/org/keycloak/services/managers/RealmManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/RealmManager.java
@@ -53,7 +53,7 @@ import java.util.Map;
 public class RealmManager {
     protected static final Logger logger = Logger.getLogger(RealmManager.class);
 
-    protected KeycloakSession identitySession;
+    protected KeycloakSession session;
     protected String contextPath = "";
 
     public String getContextPath() {
@@ -64,8 +64,8 @@ public class RealmManager {
         this.contextPath = contextPath;
     }
 
-    public RealmManager(KeycloakSession identitySession) {
-        this.identitySession = identitySession;
+    public RealmManager(KeycloakSession session) {
+        this.session = session;
     }
 
     public RealmModel getKeycloakAdminstrationRealm() {
@@ -73,11 +73,11 @@ public class RealmManager {
     }
 
     public RealmModel getRealm(String id) {
-        return identitySession.getRealm(id);
+        return session.getRealm(id);
     }
 
     public RealmModel getRealmByName(String name) {
-        return identitySession.getRealmByName(name);
+        return session.getRealmByName(name);
     }
 
     public RealmModel createRealm(String name) {
@@ -86,7 +86,7 @@ public class RealmManager {
 
     public RealmModel createRealm(String id, String name) {
         if (id == null) id = KeycloakModelUtils.generateId();
-        RealmModel realm = identitySession.createRealm(id, name);
+        RealmModel realm = session.createRealm(id, name);
         realm.setName(name);
 
         // setup defaults
@@ -144,7 +144,7 @@ public class RealmManager {
     }
 
     public boolean removeRealm(RealmModel realm) {
-        boolean removed = identitySession.removeRealm(realm.getId());
+        boolean removed = session.removeRealm(realm.getId());
         if (removed) {
             getKeycloakAdminstrationRealm().removeApplication(realm.getMasterAdminApp().getId());
         }
@@ -245,11 +245,11 @@ public class RealmManager {
             RoleModel createRealmRole = realm.addRole(AdminRoles.CREATE_REALM);
             adminRole.addCompositeRole(createRealmRole);
         } else {
-            adminRealm = identitySession.getRealmByName(Config.getAdminRealm());
+            adminRealm = session.getRealmByName(Config.getAdminRealm());
             adminRole = adminRealm.getRole(AdminRoles.ADMIN);
         }
 
-        ApplicationManager applicationManager = new ApplicationManager(new RealmManager(identitySession));
+        ApplicationManager applicationManager = new ApplicationManager(new RealmManager(session));
 
         ApplicationModel realmAdminApp = applicationManager.createApplication(adminRealm, getMasterRealmAdminApplicationName(realm));
         realmAdminApp.setBearerOnly(true);
@@ -264,7 +264,7 @@ public class RealmManager {
     private void setupRealmAdminManagement(RealmModel realm) {
         if (realm.getName().equals(Config.getAdminRealm())) { return; } // don't need to do this for master realm
 
-        ApplicationManager applicationManager = new ApplicationManager(new RealmManager(identitySession));
+        ApplicationManager applicationManager = new ApplicationManager(new RealmManager(session));
 
         String realmAdminApplicationName = getRealmAdminApplicationName(realm);
         ApplicationModel realmAdminApp = realm.getApplicationByName(realmAdminApplicationName);
diff --git a/services/src/main/java/org/keycloak/services/resources/AccountService.java b/services/src/main/java/org/keycloak/services/resources/AccountService.java
index 16e08c1..aa34c27 100755
--- a/services/src/main/java/org/keycloak/services/resources/AccountService.java
+++ b/services/src/main/java/org/keycloak/services/resources/AccountService.java
@@ -41,19 +41,18 @@ import org.keycloak.models.AuthenticationLinkModel;
 import org.keycloak.models.AuthenticationProviderModel;
 import org.keycloak.models.ClientModel;
 import org.keycloak.models.Constants;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.SocialLinkModel;
 import org.keycloak.models.UserCredentialModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.utils.TimeBasedOTP;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.representations.idm.CredentialRepresentation;
 import org.keycloak.services.ForbiddenException;
 import org.keycloak.services.managers.AppAuthManager;
 import org.keycloak.services.managers.Auth;
 import org.keycloak.services.managers.AuthenticationManager;
 import org.keycloak.services.managers.ModelToRepresentation;
-import org.keycloak.services.managers.TokenManager;
 import org.keycloak.services.messages.Messages;
 import org.keycloak.services.resources.flows.Flows;
 import org.keycloak.services.resources.flows.OAuthRedirect;
@@ -79,7 +78,6 @@ import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.core.Variant;
 import java.net.URI;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -120,7 +118,7 @@ public class AccountService {
     private UriInfo uriInfo;
 
     @Context
-    private ProviderSession providers;
+    private KeycloakSession session;
 
     private final AppAuthManager authManager;
     private final ApplicationModel application;
@@ -133,13 +131,13 @@ public class AccountService {
         this.realm = realm;
         this.application = application;
         this.audit = audit;
-        this.authManager = new AppAuthManager(providers);
+        this.authManager = new AppAuthManager(session);
     }
 
     public void init() {
-        auditProvider = providers.getProvider(AuditProvider.class);
+        auditProvider = session.getProvider(AuditProvider.class);
 
-        account = providers.getProvider(AccountProvider.class).setRealm(realm).setUriInfo(uriInfo);
+        account = session.getProvider(AccountProvider.class).setRealm(realm).setUriInfo(uriInfo);
 
         boolean passwordUpdateSupported = false;
         AuthenticationManager.AuthResult authResult = authManager.authenticateIdentityCookie(realm, uriInfo, headers);
@@ -183,7 +181,7 @@ public class AccountService {
             try {
                 require(AccountRoles.MANAGE_ACCOUNT);
             } catch (ForbiddenException e) {
-                return Flows.forms(providers, realm, uriInfo).setError("No access").createErrorPage();
+                return Flows.forms(session, realm, uriInfo).setError("No access").createErrorPage();
             }
 
             String[] referrer = getReferrer();
@@ -445,7 +443,7 @@ public class AccountService {
             return account.setError(Messages.INVALID_PASSWORD_CONFIRM).createResponse(AccountPages.PASSWORD);
         }
 
-        AuthenticationProviderManager authProviderManager = AuthenticationProviderManager.getManager(realm, providers);
+        AuthenticationProviderManager authProviderManager = AuthenticationProviderManager.getManager(realm, session);
         if (Validation.isEmpty(password)) {
             return account.setError(Messages.MISSING_PASSWORD).createResponse(AccountPages.PASSWORD);
         } else if (authProviderManager.validatePassword(user, password) != AuthProviderStatus.SUCCESS) {
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java b/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java
index 3f2d0ed..8976f2b 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java
@@ -8,7 +8,6 @@ import org.jboss.resteasy.spi.HttpResponse;
 import org.jboss.resteasy.spi.NotFoundException;
 import org.keycloak.freemarker.ExtendingThemeManager;
 import org.keycloak.freemarker.Theme;
-import org.keycloak.freemarker.ThemeProvider;
 import org.keycloak.models.AdminRoles;
 import org.keycloak.models.ApplicationModel;
 import org.keycloak.models.Constants;
@@ -16,7 +15,6 @@ import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RoleModel;
 import org.keycloak.models.UserModel;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.services.managers.AppAuthManager;
 import org.keycloak.services.managers.ApplicationManager;
 import org.keycloak.services.managers.AuthenticationManager;
@@ -73,9 +71,6 @@ public class AdminConsole {
     protected Providers providers;
 
     @Context
-    protected ProviderSession providerSession;
-
-    @Context
     protected KeycloakApplication keycloak;
 
     protected AppAuthManager authManager;
@@ -83,7 +78,7 @@ public class AdminConsole {
 
     public AdminConsole(RealmModel realm) {
         this.realm = realm;
-        this.authManager = new AppAuthManager(providerSession);
+        this.authManager = new AppAuthManager(session);
     }
 
     public static class WhoAmI {
@@ -315,7 +310,7 @@ public class AdminConsole {
         }
 
         try {
-            ExtendingThemeManager themeManager = new ExtendingThemeManager(providerSession);
+            ExtendingThemeManager themeManager = new ExtendingThemeManager(session);
             Theme theme = themeManager.createTheme(realm.getAdminTheme(), Theme.Type.ADMIN);
             InputStream resource = theme.getResourceAsStream(path);
             if (resource != null) {
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java b/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java
index ae0a2e4..deb3513 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java
@@ -1,23 +1,17 @@
 package org.keycloak.services.resources.admin;
 
 import org.jboss.logging.Logger;
-import org.jboss.resteasy.spi.DefaultOptionsMethodException;
 import org.jboss.resteasy.spi.HttpRequest;
 import org.jboss.resteasy.spi.HttpResponse;
 import org.jboss.resteasy.spi.NotFoundException;
 import org.jboss.resteasy.spi.ResteasyProviderFactory;
 import org.jboss.resteasy.spi.UnauthorizedException;
 import org.keycloak.jose.jws.JWSInput;
-import org.keycloak.models.ApplicationModel;
 import org.keycloak.models.ClientModel;
-import org.keycloak.models.Constants;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
-import org.keycloak.models.UserModel;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.representations.AccessToken;
 import org.keycloak.services.managers.AppAuthManager;
-import org.keycloak.services.managers.Auth;
 import org.keycloak.services.managers.AuthenticationManager;
 import org.keycloak.services.managers.RealmManager;
 import org.keycloak.services.managers.TokenManager;
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
index 0a6059e..1009812 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
@@ -13,7 +13,6 @@ import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.ModelDuplicateException;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserSessionModel;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.representations.adapters.action.SessionStats;
 import org.keycloak.representations.idm.RealmAuditRepresentation;
 import org.keycloak.representations.idm.RealmRepresentation;
@@ -53,18 +52,10 @@ public class RealmAdminResource {
     protected RealmModel realm;
     private TokenManager tokenManager;
 
-    /*
-    @Context
-    protected ResourceContext resourceContext;
-    */
-
     @Context
     protected KeycloakSession session;
 
     @Context
-    protected ProviderSession providers;
-
-    @Context
     protected UriInfo uriInfo;
 
     public RealmAdminResource(RealmAuth auth, RealmModel realm, TokenManager tokenManager) {
@@ -174,7 +165,7 @@ public class RealmAdminResource {
      */
     @Path("users")
     public UsersResource users() {
-        UsersResource users = new UsersResource(providers, realm, auth, tokenManager);
+        UsersResource users = new UsersResource(realm, auth, tokenManager);
         ResteasyProviderFactory.getInstance().injectProperties(users);
         //resourceContext.initResource(users);
         return users;
@@ -323,7 +314,7 @@ public class RealmAdminResource {
                                 @QueryParam("ipAddress") String ipAddress, @QueryParam("first") Integer firstResult, @QueryParam("max") Integer maxResults) {
         auth.init(RealmAuth.Resource.AUDIT).requireView();
 
-        AuditProvider audit = providers.getProvider(AuditProvider.class);
+        AuditProvider audit = session.getProvider(AuditProvider.class);
 
         EventQuery query = audit.createQuery().realm(realm.getId());
         if (client != null) {
@@ -357,7 +348,7 @@ public class RealmAdminResource {
     public void clearAudit() {
         auth.init(RealmAuth.Resource.AUDIT).requireManage();
 
-        AuditProvider audit = providers.getProvider(AuditProvider.class);
+        AuditProvider audit = session.getProvider(AuditProvider.class);
         audit.clear(realm.getId());
     }
 
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java
index 9c5549a..c669dbe 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java
@@ -1,20 +1,17 @@
 package org.keycloak.services.resources.admin;
 
 import org.keycloak.audit.AuditListener;
+import org.keycloak.authentication.AuthenticationProvider;
 import org.keycloak.freemarker.ExtendingThemeManager;
 import org.keycloak.freemarker.Theme;
-import org.keycloak.freemarker.ThemeProvider;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.social.SocialProvider;
-import org.keycloak.authentication.AuthenticationProvider;
-import org.keycloak.authentication.AuthenticationProviderManager;
 import org.keycloak.util.ProviderLoader;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.core.Context;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -26,7 +23,7 @@ import java.util.Set;
 public class ServerInfoAdminResource {
 
     @Context
-    private ProviderSession providers;
+    private KeycloakSession session;
 
     /**
      * Returns a list of themes, social providers, auth providers, and audit listeners available on this server
@@ -44,7 +41,7 @@ public class ServerInfoAdminResource {
     }
 
     private void setThemes(ServerInfoRepresentation info) {
-        ExtendingThemeManager themeManager = new ExtendingThemeManager(providers);
+        ExtendingThemeManager themeManager = new ExtendingThemeManager(session);
         info.themes = new HashMap<String, List<String>>();
 
         for (Theme.Type type : Theme.Type.values()) {
@@ -65,7 +62,7 @@ public class ServerInfoAdminResource {
 
     private void setAuthProviders(ServerInfoRepresentation info) {
         info.authProviders = new HashMap<String, List<String>>();
-        Iterable<AuthenticationProvider> authProviders = providers.getAllProviders(AuthenticationProvider.class);
+        Iterable<AuthenticationProvider> authProviders = session.getAllProviders(AuthenticationProvider.class);
         for (AuthenticationProvider authProvider : authProviders) {
             info.authProviders.put(authProvider.getName(), authProvider.getAvailableOptions());
         }
@@ -74,7 +71,7 @@ public class ServerInfoAdminResource {
     private void setAuditListeners(ServerInfoRepresentation info) {
         info.auditListeners = new LinkedList<String>();
 
-        Set<String> providers = this.providers.listProviderIds(AuditListener.class);
+        Set<String> providers = session.listProviderIds(AuditListener.class);
         if (providers != null) {
             info.auditListeners.addAll(providers);
         }
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java
index 5f0fc27..788cc56 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java
@@ -17,7 +17,6 @@ import org.keycloak.models.SocialLinkModel;
 import org.keycloak.models.UserCredentialModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.UserSessionModel;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.representations.adapters.action.UserStats;
 import org.keycloak.representations.idm.ApplicationMappingsRepresentation;
 import org.keycloak.representations.idm.CredentialRepresentation;
@@ -68,30 +67,23 @@ public class UsersResource {
 
     protected RealmModel realm;
 
-    private ProviderSession providerSession;
     private RealmAuth auth;
-    private TokenManager tokenManager;
-
-    public UsersResource(ProviderSession providerSession, RealmModel realm, RealmAuth auth, TokenManager tokenManager) {
-        this.providerSession = providerSession;
-        this.auth = auth;
-        this.realm = realm;
-        this.tokenManager = tokenManager;
 
-        auth.init(RealmAuth.Resource.USER);
-    }
+    private TokenManager tokenManager;
 
     @Context
     protected UriInfo uriInfo;
 
-    /*
-    @Context
-    protected ResourceContext resourceContext;
-    */
-
     @Context
     protected KeycloakSession session;
 
+    public UsersResource(RealmModel realm, RealmAuth auth, TokenManager tokenManager) {
+        this.auth = auth;
+        this.realm = realm;
+        this.tokenManager = tokenManager;
+
+        auth.init(RealmAuth.Resource.USER);
+    }
 
     /**
      * Update the user
@@ -835,7 +827,7 @@ public class UsersResource {
             String link = builder.build(realm.getName()).toString();
             long expiration = TimeUnit.SECONDS.toMinutes(realm.getAccessCodeLifespanUserAction());
 
-            providerSession.getProvider(EmailProvider.class).setRealm(realm).setUser(user).sendPasswordReset(link, expiration);
+            session.getProvider(EmailProvider.class).setRealm(realm).setUser(user).sendPasswordReset(link, expiration);
 
             return Response.ok().build();
         } catch (EmailException e) {
diff --git a/services/src/main/java/org/keycloak/services/resources/flows/Flows.java b/services/src/main/java/org/keycloak/services/resources/flows/Flows.java
index c83d6f9..4f96bdd 100755
--- a/services/src/main/java/org/keycloak/services/resources/flows/Flows.java
+++ b/services/src/main/java/org/keycloak/services/resources/flows/Flows.java
@@ -23,8 +23,8 @@ package org.keycloak.services.resources.flows;
 
 import org.jboss.resteasy.spi.HttpRequest;
 import org.keycloak.login.LoginFormsProvider;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.services.managers.AuthenticationManager;
 import org.keycloak.services.managers.TokenManager;
 import org.keycloak.social.SocialProvider;
@@ -39,11 +39,11 @@ public class Flows {
     private Flows() {
     }
 
-    public static LoginFormsProvider forms(ProviderSession session, RealmModel realm, UriInfo uriInfo) {
+    public static LoginFormsProvider forms(KeycloakSession session, RealmModel realm, UriInfo uriInfo) {
         return session.getProvider(LoginFormsProvider.class).setRealm(realm).setUriInfo(uriInfo);
     }
 
-    public static OAuthFlows oauth(ProviderSession session, RealmModel realm, HttpRequest request, UriInfo uriInfo, AuthenticationManager authManager,
+    public static OAuthFlows oauth(KeycloakSession session, RealmModel realm, HttpRequest request, UriInfo uriInfo, AuthenticationManager authManager,
             TokenManager tokenManager) {
         return new OAuthFlows(session, realm, request, uriInfo, authManager, tokenManager);
     }
diff --git a/services/src/main/java/org/keycloak/services/resources/flows/OAuthFlows.java b/services/src/main/java/org/keycloak/services/resources/flows/OAuthFlows.java
index 97122dc..6571037 100755
--- a/services/src/main/java/org/keycloak/services/resources/flows/OAuthFlows.java
+++ b/services/src/main/java/org/keycloak/services/resources/flows/OAuthFlows.java
@@ -30,28 +30,24 @@ import org.keycloak.audit.Details;
 import org.keycloak.audit.EventType;
 import org.keycloak.models.ApplicationModel;
 import org.keycloak.models.ClientModel;
-import org.keycloak.models.Constants;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RequiredCredentialModel;
 import org.keycloak.models.RoleModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.UserModel.RequiredAction;
 import org.keycloak.models.UserSessionModel;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.representations.AccessToken;
 import org.keycloak.representations.idm.CredentialRepresentation;
 import org.keycloak.services.managers.AccessCodeEntry;
 import org.keycloak.services.managers.AuthenticationManager;
 import org.keycloak.services.managers.TokenManager;
-import org.keycloak.util.MultivaluedHashMap;
-import org.keycloak.util.Time;
 
 import javax.ws.rs.core.Cookie;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriInfo;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -66,7 +62,7 @@ public class OAuthFlows {
 
     private static final Logger log = Logger.getLogger(OAuthFlows.class);
 
-    private final ProviderSession providerSession;
+    private final KeycloakSession session;
 
     private final RealmModel realm;
 
@@ -78,9 +74,9 @@ public class OAuthFlows {
 
     private final TokenManager tokenManager;
 
-    OAuthFlows(ProviderSession providerSession, RealmModel realm, HttpRequest request, UriInfo uriInfo, AuthenticationManager authManager,
+    OAuthFlows(KeycloakSession session, RealmModel realm, HttpRequest request, UriInfo uriInfo, AuthenticationManager authManager,
             TokenManager tokenManager) {
-        this.providerSession = providerSession;
+        this.session = session;
         this.realm = realm;
         this.request = request;
         this.uriInfo = uriInfo;
@@ -142,7 +138,7 @@ public class OAuthFlows {
                 audit.clone().event(EventType.SEND_VERIFY_EMAIL).detail(Details.EMAIL, accessCode.getUser().getEmail()).success();
             }
 
-            return Flows.forms(providerSession, realm, uriInfo).setAccessCode(accessCode.getCode()).setUser(user)
+            return Flows.forms(this.session, realm, uriInfo).setAccessCode(accessCode.getCode()).setUser(user)
                     .createResponse(action);
         }
 
@@ -171,7 +167,7 @@ public class OAuthFlows {
                     }
                 }
             }
-            return Flows.forms(providerSession, realm, uriInfo).setAccessCode(accessCode.getCode()).
+            return Flows.forms(this.session, realm, uriInfo).setAccessCode(accessCode.getCode()).
                     setAccessRequest(realmRolesRequested, appRolesRequested).
                     setClient(client).createOAuthGrant();
         }
@@ -185,7 +181,7 @@ public class OAuthFlows {
     }
 
     public Response forwardToSecurityFailure(String message) {
-        return Flows.forms(providerSession, realm, uriInfo).setError(message).createErrorPage();
+        return Flows.forms(session, realm, uriInfo).setError(message).createErrorPage();
     }
 
     private void isTotpConfigurationRequired(UserModel user) {
diff --git a/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java b/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java
index af42022..c868e3f 100755
--- a/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java
+++ b/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java
@@ -9,11 +9,10 @@ import org.keycloak.Config;
 import org.keycloak.SkeletonKeyContextResolver;
 import org.keycloak.exportimport.ExportImportProvider;
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.RealmModel;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.provider.ProviderSessionFactory;
 import org.keycloak.representations.idm.RealmRepresentation;
-import org.keycloak.services.DefaultProviderSessionFactory;
+import org.keycloak.services.DefaultKeycloakSessionFactory;
 import org.keycloak.services.managers.ApplianceBootstrap;
 import org.keycloak.services.managers.BruteForceProtector;
 import org.keycloak.services.managers.RealmManager;
@@ -54,22 +53,22 @@ public class KeycloakApplication extends Application {
     protected Set<Object> singletons = new HashSet<Object>();
     protected Set<Class<?>> classes = new HashSet<Class<?>>();
 
-    protected ProviderSessionFactory providerSessionFactory;
+    protected KeycloakSessionFactory sessionFactory;
     protected String contextPath;
 
     public KeycloakApplication(@Context ServletContext context, @Context Dispatcher dispatcher) {
         loadConfig();
 
-        this.providerSessionFactory = createProviderSessionFactory();
+        this.sessionFactory = createSessionFactory();
 
         dispatcher.getDefaultContextObjects().put(KeycloakApplication.class, this);
         this.contextPath = context.getContextPath();
-        BruteForceProtector protector = new BruteForceProtector(providerSessionFactory);
+        BruteForceProtector protector = new BruteForceProtector(sessionFactory);
         dispatcher.getDefaultContextObjects().put(BruteForceProtector.class, protector);
         ResteasyProviderFactory.pushContext(BruteForceProtector.class, protector); // for injection
         protector.start();
         context.setAttribute(BruteForceProtector.class.getName(), protector);
-        context.setAttribute(ProviderSessionFactory.class.getName(), this.providerSessionFactory);
+        context.setAttribute(KeycloakSessionFactory.class.getName(), this.sessionFactory);
 
         TokenManager tokenManager = new TokenManager();
 
@@ -86,7 +85,7 @@ public class KeycloakApplication extends Application {
 
         setupDefaultRealm(context.getContextPath());
 
-        setupScheduledTasks(providerSessionFactory);
+        setupScheduledTasks(sessionFactory);
         importRealms(context);
     }
 
@@ -135,25 +134,25 @@ public class KeycloakApplication extends Application {
     }
 
     protected void setupDefaultRealm(String contextPath) {
-        new ApplianceBootstrap().bootstrap(providerSessionFactory, contextPath);
+        new ApplianceBootstrap().bootstrap(sessionFactory, contextPath);
     }
 
-    public static DefaultProviderSessionFactory createProviderSessionFactory() {
-        DefaultProviderSessionFactory factory = new DefaultProviderSessionFactory();
+    public static KeycloakSessionFactory createSessionFactory() {
+        DefaultKeycloakSessionFactory factory = new DefaultKeycloakSessionFactory();
         factory.init();
         return factory;
     }
 
-    public static void setupScheduledTasks(final ProviderSessionFactory providerSessionFactory) {
+    public static void setupScheduledTasks(final KeycloakSessionFactory sessionFactory) {
         long interval = Config.scope("scheduled").getLong("interval", 60L) * 1000;
 
-        TimerProvider timer = providerSessionFactory.createSession().getProvider(TimerProvider.class);
-        timer.schedule(new ScheduledTaskRunner(providerSessionFactory, new ClearExpiredAuditEvents()), interval);
-        timer.schedule(new ScheduledTaskRunner(providerSessionFactory, new ClearExpiredUserSessions()), interval);
+        TimerProvider timer = sessionFactory.create().getProvider(TimerProvider.class);
+        timer.schedule(new ScheduledTaskRunner(sessionFactory, new ClearExpiredAuditEvents()), interval);
+        timer.schedule(new ScheduledTaskRunner(sessionFactory, new ClearExpiredUserSessions()), interval);
     }
 
-    public ProviderSessionFactory getProviderSessionFactory() {
-        return providerSessionFactory;
+    public KeycloakSessionFactory getSessionFactory() {
+        return sessionFactory;
     }
 
     @Override
@@ -201,8 +200,7 @@ public class KeycloakApplication extends Application {
     }
 
     public void importRealm(RealmRepresentation rep, String from) {
-        ProviderSession providerSession = providerSessionFactory.createSession();
-        KeycloakSession session = providerSession.getProvider(KeycloakSession.class);
+        KeycloakSession session = sessionFactory.create();
         try {
             session.getTransaction().begin();
             RealmManager manager = new RealmManager(session);
@@ -225,7 +223,7 @@ public class KeycloakApplication extends Application {
 
             session.getTransaction().commit();
         } finally {
-            providerSession.close();
+            session.close();
         }
     }
 
@@ -242,7 +240,7 @@ public class KeycloakApplication extends Application {
 
         if (providers.hasNext()) {
             ExportImportProvider exportImport = providers.next();
-            exportImport.checkExportImport(providerSessionFactory);
+            exportImport.checkExportImport(sessionFactory);
         } else {
             log.warn("No ExportImportProvider found!");
         }
diff --git a/services/src/main/java/org/keycloak/services/resources/RealmsResource.java b/services/src/main/java/org/keycloak/services/resources/RealmsResource.java
index ee87557..1e15cf4 100755
--- a/services/src/main/java/org/keycloak/services/resources/RealmsResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/RealmsResource.java
@@ -12,7 +12,6 @@ import org.keycloak.models.ClientModel;
 import org.keycloak.models.Constants;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.services.ClientConnection;
 import org.keycloak.services.managers.AuditManager;
 import org.keycloak.services.managers.AuthenticationManager;
@@ -57,9 +56,6 @@ public class RealmsResource {
     protected KeycloakSession session;
 
     @Context
-    protected ProviderSession providers;
-
-    @Context
     protected ClientConnection clientConnection;
 
     @Context
@@ -98,7 +94,7 @@ public class RealmsResource {
                                        @QueryParam("client_id") String client_id,
                                        @QueryParam("origin") String origin) {
         logger.info("getLoginStatusIframe");
-        AuthenticationManager auth = new AuthenticationManager(providers);
+        AuthenticationManager auth = new AuthenticationManager(session);
 
         //logger.info("getting login-status-iframe.html for client_id: " + client_id);
         RealmManager realmManager = new RealmManager(session);
@@ -151,8 +147,8 @@ public class RealmsResource {
     public TokenService getTokenService(final @PathParam("realm") String name) {
         RealmManager realmManager = new RealmManager(session);
         RealmModel realm = locateRealm(name, realmManager);
-        Audit audit = new AuditManager(realm, providers, clientConnection).createAudit();
-        AuthenticationManager authManager = new AuthenticationManager(providers, protector);
+        Audit audit = new AuditManager(realm, session, clientConnection).createAudit();
+        AuthenticationManager authManager = new AuthenticationManager(session, protector);
         TokenService tokenService = new TokenService(realm, tokenManager, audit, authManager);
         ResteasyProviderFactory.getInstance().injectProperties(tokenService);
         //resourceContext.initResource(tokenService);
@@ -178,7 +174,7 @@ public class RealmsResource {
             throw new NotFoundException("account management not enabled");
         }
 
-        Audit audit = new AuditManager(realm, providers, clientConnection).createAudit();
+        Audit audit = new AuditManager(realm, session, clientConnection).createAudit();
         AccountService accountService = new AccountService(realm, application, audit);
         ResteasyProviderFactory.getInstance().injectProperties(accountService);
         //resourceContext.initResource(accountService);
diff --git a/services/src/main/java/org/keycloak/services/resources/RequiredActionsService.java b/services/src/main/java/org/keycloak/services/resources/RequiredActionsService.java
index 8f1150f..0247410 100755
--- a/services/src/main/java/org/keycloak/services/resources/RequiredActionsService.java
+++ b/services/src/main/java/org/keycloak/services/resources/RequiredActionsService.java
@@ -32,13 +32,13 @@ import org.keycloak.email.EmailException;
 import org.keycloak.email.EmailProvider;
 import org.keycloak.login.LoginFormsProvider;
 import org.keycloak.models.ClientModel;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserCredentialModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.UserModel.RequiredAction;
 import org.keycloak.models.UserSessionModel;
 import org.keycloak.models.utils.TimeBasedOTP;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.representations.idm.CredentialRepresentation;
 import org.keycloak.services.ClientConnection;
 import org.keycloak.services.managers.AccessCodeEntry;
@@ -91,7 +91,7 @@ public class RequiredActionsService {
     protected Providers providers;
 
     @Context
-    protected ProviderSession providerSession;
+    protected KeycloakSession session;
 
     private TokenManager tokenManager;
 
@@ -118,7 +118,7 @@ public class RequiredActionsService {
 
         String error = Validation.validateUpdateProfileForm(formData);
         if (error != null) {
-            return Flows.forms(providerSession, realm, uriInfo).setUser(user).setError(error).createResponse(RequiredAction.UPDATE_PROFILE);
+            return Flows.forms(session, realm, uriInfo).setUser(user).setError(error).createResponse(RequiredAction.UPDATE_PROFILE);
         }
 
         user.setFirstName(formData.getFirst("firstName"));
@@ -158,7 +158,7 @@ public class RequiredActionsService {
         String totp = formData.getFirst("totp");
         String totpSecret = formData.getFirst("totpSecret");
 
-        LoginFormsProvider loginForms = Flows.forms(providerSession, realm, uriInfo).setUser(user);
+        LoginFormsProvider loginForms = Flows.forms(session, realm, uriInfo).setUser(user);
         if (Validation.isEmpty(totp)) {
             return loginForms.setError(Messages.MISSING_TOTP).createResponse(RequiredAction.CONFIGURE_TOTP);
         } else if (!new TimeBasedOTP().validate(totp, totpSecret.getBytes())) {
@@ -199,7 +199,7 @@ public class RequiredActionsService {
         String passwordNew = formData.getFirst("password-new");
         String passwordConfirm = formData.getFirst("password-confirm");
 
-        LoginFormsProvider loginForms = Flows.forms(providerSession, realm, uriInfo).setUser(user);
+        LoginFormsProvider loginForms = Flows.forms(session, realm, uriInfo).setUser(user);
         if (Validation.isEmpty(passwordNew)) {
             return loginForms.setError(Messages.MISSING_PASSWORD).createResponse(RequiredAction.UPDATE_PASSWORD);
         } else if (!passwordNew.equals(passwordConfirm)) {
@@ -207,7 +207,7 @@ public class RequiredActionsService {
         }
 
         try {
-            boolean updateSuccessful = AuthenticationProviderManager.getManager(realm, providerSession).updatePassword(user, passwordNew);
+            boolean updateSuccessful = AuthenticationProviderManager.getManager(realm, session).updatePassword(user, passwordNew);
             if (!updateSuccessful) {
                 return loginForms.setError("Password update failed").createResponse(RequiredAction.UPDATE_PASSWORD);
             }
@@ -259,7 +259,7 @@ public class RequiredActionsService {
             initAudit(accessCode);
             //audit.clone().event(EventType.SEND_VERIFY_EMAIL).detail(Details.EMAIL, accessCode.getUser().getEmail()).success();
 
-            return Flows.forms(providerSession, realm, uriInfo).setAccessCode(accessCode.getCode()).setUser(accessCode.getUser())
+            return Flows.forms(session, realm, uriInfo).setAccessCode(accessCode.getCode()).setUser(accessCode.getUser())
                     .createResponse(RequiredAction.VERIFY_EMAIL);
         }
     }
@@ -275,9 +275,9 @@ public class RequiredActionsService {
                 return unauthorized();
             }
 
-            return Flows.forms(providerSession, realm, uriInfo).setAccessCode(accessCode.getCode()).createResponse(RequiredAction.UPDATE_PASSWORD);
+            return Flows.forms(session, realm, uriInfo).setAccessCode(accessCode.getCode()).createResponse(RequiredAction.UPDATE_PASSWORD);
         } else {
-            return Flows.forms(providerSession, realm, uriInfo).createPasswordReset();
+            return Flows.forms(session, realm, uriInfo).createPasswordReset();
         }
     }
 
@@ -292,15 +292,15 @@ public class RequiredActionsService {
         String redirect = uriInfo.getQueryParameters().getFirst(OAuth2Constants.REDIRECT_URI);
         String clientId = uriInfo.getQueryParameters().getFirst(OAuth2Constants.CLIENT_ID);
 
-        AuthenticationManager authManager = new AuthenticationManager(providerSession);
+        AuthenticationManager authManager = new AuthenticationManager(session);
 
         ClientModel client = realm.findClient(clientId);
         if (client == null) {
-            return Flows.oauth(providerSession, realm, request, uriInfo, authManager, tokenManager).forwardToSecurityFailure(
+            return Flows.oauth(session, realm, request, uriInfo, authManager, tokenManager).forwardToSecurityFailure(
                     "Unknown login requester.");
         }
         if (!client.isEnabled()) {
-            return Flows.oauth(providerSession, realm, request, uriInfo, authManager, tokenManager).forwardToSecurityFailure(
+            return Flows.oauth(session, realm, request, uriInfo, authManager, tokenManager).forwardToSecurityFailure(
                     "Login requester not enabled.");
         }
 
@@ -337,16 +337,16 @@ public class RequiredActionsService {
                 String link = builder.build(realm.getName()).toString();
                 long expiration = TimeUnit.SECONDS.toMinutes(realm.getAccessCodeLifespanUserAction());
 
-                providerSession.getProvider(EmailProvider.class).setRealm(realm).setUser(user).sendPasswordReset(link, expiration);
+                this.session.getProvider(EmailProvider.class).setRealm(realm).setUser(user).sendPasswordReset(link, expiration);
 
                 audit.user(user).detail(Details.EMAIL, user.getEmail()).detail(Details.CODE_ID, accessCode.getCodeId()).success();
             } catch (EmailException e) {
                 logger.error("Failed to send password reset email", e);
-                return Flows.forms(providerSession, realm, uriInfo).setError("emailSendError").createErrorPage();
+                return Flows.forms(this.session, realm, uriInfo).setError("emailSendError").createErrorPage();
             }
         }
 
-        return Flows.forms(providerSession, realm, uriInfo).setSuccess("emailSent").createPasswordReset();
+        return Flows.forms(session, realm, uriInfo).setSuccess("emailSent").createPasswordReset();
     }
 
     private AccessCodeEntry getAccessCodeEntry(RequiredAction requiredAction) {
@@ -387,24 +387,24 @@ public class RequiredActionsService {
 
         Set<RequiredAction> requiredActions = user.getRequiredActions();
         if (!requiredActions.isEmpty()) {
-            return Flows.forms(providerSession, realm, uriInfo).setAccessCode(accessCode.getCode()).setUser(user)
+            return Flows.forms(session, realm, uriInfo).setAccessCode(accessCode.getCode()).setUser(user)
                     .createResponse(requiredActions.iterator().next());
         } else {
             logger.debugv("redirectOauth: redirecting to: {0}", accessCode.getRedirectUri());
             accessCode.resetExpiration();
 
-            AuthenticationManager authManager = new AuthenticationManager(providerSession);
+            AuthenticationManager authManager = new AuthenticationManager(session);
 
             UserSessionModel session = realm.getUserSession(accessCode.getSessionState());
             if (!AuthenticationManager.isSessionValid(realm, session)) {
                 AuthenticationManager.logout(realm, session, uriInfo);
-                return Flows.oauth(providerSession, realm, request, uriInfo, authManager, tokenManager).redirectError(accessCode.getClient(), "access_denied", accessCode.getState(), accessCode.getRedirectUri());
+                return Flows.oauth(this.session, realm, request, uriInfo, authManager, tokenManager).redirectError(accessCode.getClient(), "access_denied", accessCode.getState(), accessCode.getRedirectUri());
             }
             audit.session(session);
 
             audit.success();
 
-            return Flows.oauth(providerSession, realm, request, uriInfo, authManager, tokenManager).redirectAccessCode(accessCode,
+            return Flows.oauth(this.session, realm, request, uriInfo, authManager, tokenManager).redirectAccessCode(accessCode,
                     session, accessCode.getState(), accessCode.getRedirectUri());
         }
     }
@@ -425,7 +425,7 @@ public class RequiredActionsService {
     }
 
     private Response unauthorized() {
-        return Flows.forms(providerSession, realm, uriInfo).setError("Unauthorized request").createErrorPage();
+        return Flows.forms(session, realm, uriInfo).setError("Unauthorized request").createErrorPage();
     }
 
 }
diff --git a/services/src/main/java/org/keycloak/services/resources/SocialResource.java b/services/src/main/java/org/keycloak/services/resources/SocialResource.java
index 08073ec..c59c8f6 100755
--- a/services/src/main/java/org/keycloak/services/resources/SocialResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/SocialResource.java
@@ -29,7 +29,6 @@ import org.keycloak.audit.Audit;
 import org.keycloak.audit.Details;
 import org.keycloak.audit.Errors;
 import org.keycloak.audit.EventType;
-import org.keycloak.jose.jws.JWSBuilder;
 import org.keycloak.jose.jws.JWSInput;
 import org.keycloak.models.AccountRoles;
 import org.keycloak.models.ClientModel;
@@ -40,7 +39,6 @@ import org.keycloak.models.SocialLinkModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.UserSessionModel;
 import org.keycloak.models.utils.KeycloakModelUtils;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.services.ClientConnection;
 import org.keycloak.services.managers.AuditManager;
 import org.keycloak.services.managers.AuthenticationManager;
@@ -49,7 +47,6 @@ import org.keycloak.services.managers.TokenManager;
 import org.keycloak.services.resources.flows.Flows;
 import org.keycloak.services.resources.flows.OAuthFlows;
 import org.keycloak.services.resources.flows.Urls;
-import org.keycloak.services.util.CookieHelper;
 import org.keycloak.social.AuthCallback;
 import org.keycloak.social.SocialAccessDeniedException;
 import org.keycloak.social.SocialLoader;
@@ -94,15 +91,9 @@ public class SocialResource {
     private HttpRequest request;
 
     @Context
-    protected ProviderSession providerSession;
-
-    @Context
     protected KeycloakSession session;
 
     @Context
-    protected ProviderSession providers;
-
-    @Context
     protected ClientConnection clientConnection;
 
     private TokenManager tokenManager;
@@ -119,7 +110,7 @@ public class SocialResource {
             initialRequest = new JWSInput(encodedState).readJsonContent(State.class);
         } catch (Throwable t) {
             logger.warn("Invalid social callback", t);
-            return Flows.forms(providerSession, null, uriInfo).setError("Unexpected callback").createErrorPage();
+            return Flows.forms(session, null, uriInfo).setError("Unexpected callback").createErrorPage();
         }
 
         SocialProvider provider = SocialLoader.load(initialRequest.getProvider());
@@ -129,13 +120,13 @@ public class SocialResource {
         RealmManager realmManager = new RealmManager(session);
         RealmModel realm = realmManager.getRealmByName(realmName);
 
-        Audit audit = new AuditManager(realm, providers, clientConnection).createAudit()
+        Audit audit = new AuditManager(realm, session, clientConnection).createAudit()
                 .event(EventType.LOGIN)
                 .detail(Details.RESPONSE_TYPE, initialRequest.get(OAuth2Constants.RESPONSE_TYPE))
                 .detail(Details.AUTH_METHOD, "social@" + provider.getId());
 
-        AuthenticationManager authManager = new AuthenticationManager(providers);
-        OAuthFlows oauth = Flows.oauth(providerSession, realm, request, uriInfo, authManager, tokenManager);
+        AuthenticationManager authManager = new AuthenticationManager(session);
+        OAuthFlows oauth = Flows.oauth(session, realm, request, uriInfo, authManager, tokenManager);
 
         if (!realm.isEnabled()) {
             audit.error(Errors.REALM_DISABLED);
@@ -182,7 +173,7 @@ public class SocialResource {
             queryParms.putSingle(OAuth2Constants.RESPONSE_TYPE, responseType);
 
             audit.error(Errors.REJECTED_BY_USER);
-            return  Flows.forms(providerSession, realm, uriInfo).setQueryParams(queryParms).setWarning("Access denied").createLogin();
+            return  Flows.forms(session, realm, uriInfo).setQueryParams(queryParms).setWarning("Access denied").createLogin();
         } catch (SocialProviderException e) {
             logger.error("Failed to process social callback", e);
             return oauth.forwardToSecurityFailure("Failed to process social callback");
@@ -275,7 +266,7 @@ public class SocialResource {
         RealmManager realmManager = new RealmManager(session);
         RealmModel realm = realmManager.getRealmByName(realmName);
 
-        Audit audit = new AuditManager(realm, providers, clientConnection).createAudit()
+        Audit audit = new AuditManager(realm, session, clientConnection).createAudit()
                 .event(EventType.LOGIN).client(clientId)
                 .detail(Details.REDIRECT_URI, redirectUri)
                 .detail(Details.RESPONSE_TYPE, "code")
@@ -284,25 +275,25 @@ public class SocialResource {
         SocialProvider provider = SocialLoader.load(providerId);
         if (provider == null) {
             audit.error(Errors.SOCIAL_PROVIDER_NOT_FOUND);
-            return Flows.forms(providerSession, realm, uriInfo).setError("Social provider not found").createErrorPage();
+            return Flows.forms(session, realm, uriInfo).setError("Social provider not found").createErrorPage();
         }
 
         ClientModel client = realm.findClient(clientId);
         if (client == null) {
             audit.error(Errors.CLIENT_NOT_FOUND);
             logger.warn("Unknown login requester: " + clientId);
-            return Flows.forms(providerSession, realm, uriInfo).setError("Unknown login requester.").createErrorPage();
+            return Flows.forms(session, realm, uriInfo).setError("Unknown login requester.").createErrorPage();
         }
 
         if (!client.isEnabled()) {
             audit.error(Errors.CLIENT_DISABLED);
             logger.warn("Login requester not enabled.");
-            return Flows.forms(providerSession, realm, uriInfo).setError("Login requester not enabled.").createErrorPage();
+            return Flows.forms(session, realm, uriInfo).setError("Login requester not enabled.").createErrorPage();
         }
         redirectUri = TokenService.verifyRedirectUri(uriInfo, redirectUri, realm, client);
         if (redirectUri == null) {
             audit.error(Errors.INVALID_REDIRECT_URI);
-            return Flows.forms(providerSession, realm, uriInfo).setError("Invalid redirect_uri.").createErrorPage();
+            return Flows.forms(session, realm, uriInfo).setError("Invalid redirect_uri.").createErrorPage();
         }
 
         try {
@@ -315,7 +306,7 @@ public class SocialResource {
                     .redirectToSocialProvider();
         } catch (Throwable t) {
             logger.error("Failed to redirect to social auth", t);
-            return Flows.forms(providerSession, realm, uriInfo).setError("Failed to redirect to social auth").createErrorPage();
+            return Flows.forms(session, realm, uriInfo).setError("Failed to redirect to social auth").createErrorPage();
         }
     }
 
diff --git a/services/src/main/java/org/keycloak/services/resources/ThemeResource.java b/services/src/main/java/org/keycloak/services/resources/ThemeResource.java
index 55509d9..a9637a2 100755
--- a/services/src/main/java/org/keycloak/services/resources/ThemeResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/ThemeResource.java
@@ -3,8 +3,7 @@ package org.keycloak.services.resources;
 import org.jboss.logging.Logger;
 import org.keycloak.freemarker.ExtendingThemeManager;
 import org.keycloak.freemarker.Theme;
-import org.keycloak.freemarker.ThemeProvider;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 
 import javax.activation.FileTypeMap;
 import javax.activation.MimetypesFileTypeMap;
@@ -29,7 +28,7 @@ public class ThemeResource {
     private static FileTypeMap mimeTypes = MimetypesFileTypeMap.getDefaultFileTypeMap();
 
     @Context
-    private ProviderSession providerSession;
+    private KeycloakSession session;
 
     /**
      * Get theme content
@@ -43,7 +42,7 @@ public class ThemeResource {
     @Path("/{themeType}/{themeName}/{path:.*}")
     public Response getResource(@PathParam("themeType") String themType, @PathParam("themeName") String themeName, @PathParam("path") String path) {
         try {
-            ExtendingThemeManager themeManager = new ExtendingThemeManager(providerSession);
+            ExtendingThemeManager themeManager = new ExtendingThemeManager(session);
             Theme theme = themeManager.createTheme(themeName, Theme.Type.valueOf(themType.toUpperCase()));
             InputStream resource = theme.getResourceAsStream(path);
             if (resource != null) {
diff --git a/services/src/main/java/org/keycloak/services/resources/TokenService.java b/services/src/main/java/org/keycloak/services/resources/TokenService.java
index 468358a..93949d1 100755
--- a/services/src/main/java/org/keycloak/services/resources/TokenService.java
+++ b/services/src/main/java/org/keycloak/services/resources/TokenService.java
@@ -28,7 +28,6 @@ import org.keycloak.models.UserCredentialModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.UserSessionModel;
 import org.keycloak.models.utils.KeycloakModelUtils;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.representations.AccessToken;
 import org.keycloak.representations.AccessTokenResponse;
 import org.keycloak.representations.idm.CredentialRepresentation;
@@ -103,8 +102,6 @@ public class TokenService {
     protected KeycloakTransaction transaction;
     @Context
     protected ClientConnection clientConnection;
-    @Context
-    protected ProviderSession providerSession;
 
     /*
     @Context
@@ -384,7 +381,7 @@ public class TokenService {
             audit.detail(Details.REMEMBER_ME, "true");
         }
 
-        OAuthFlows oauth = Flows.oauth(providerSession, realm, request, uriInfo, authManager, tokenManager);
+        OAuthFlows oauth = Flows.oauth(session, realm, request, uriInfo, authManager, tokenManager);
 
         if (!checkSsl()) {
             return oauth.forwardToSecurityFailure("HTTPS required");
@@ -437,18 +434,18 @@ public class TokenService {
                 return oauth.processAccessCode(scopeParam, state, redirect, client, user, session, username, remember, "form", audit);
             case ACCOUNT_TEMPORARILY_DISABLED:
                 audit.error(Errors.USER_TEMPORARILY_DISABLED);
-                return Flows.forms(providerSession, realm, uriInfo).setError(Messages.ACCOUNT_TEMPORARILY_DISABLED).setFormData(formData).createLogin();
+                return Flows.forms(this.session, realm, uriInfo).setError(Messages.ACCOUNT_TEMPORARILY_DISABLED).setFormData(formData).createLogin();
             case ACCOUNT_DISABLED:
                 audit.error(Errors.USER_DISABLED);
-                return Flows.forms(providerSession, realm, uriInfo).setError(Messages.ACCOUNT_DISABLED).setFormData(formData).createLogin();
+                return Flows.forms(this.session, realm, uriInfo).setError(Messages.ACCOUNT_DISABLED).setFormData(formData).createLogin();
             case MISSING_TOTP:
-                return Flows.forms(providerSession, realm, uriInfo).setFormData(formData).createLoginTotp();
+                return Flows.forms(this.session, realm, uriInfo).setFormData(formData).createLoginTotp();
             case INVALID_USER:
                 audit.error(Errors.USER_NOT_FOUND);
-                return Flows.forms(providerSession, realm, uriInfo).setError(Messages.INVALID_USER).setFormData(formData).createLogin();
+                return Flows.forms(this.session, realm, uriInfo).setError(Messages.INVALID_USER).setFormData(formData).createLogin();
             default:
                 audit.error(Errors.INVALID_USER_CREDENTIALS);
-                return Flows.forms(providerSession, realm, uriInfo).setError(Messages.INVALID_USER).setFormData(formData).createLogin();
+                return Flows.forms(this.session, realm, uriInfo).setError(Messages.INVALID_USER).setFormData(formData).createLogin();
         }
     }
 
@@ -488,7 +485,7 @@ public class TokenService {
                 .detail(Details.EMAIL, email)
                 .detail(Details.REGISTER_METHOD, "form");
 
-        OAuthFlows oauth = Flows.oauth(providerSession, realm, request, uriInfo, authManager, tokenManager);
+        OAuthFlows oauth = Flows.oauth(session, realm, request, uriInfo, authManager, tokenManager);
 
         if (!realm.isEnabled()) {
             logger.warn("Realm not enabled");
@@ -533,15 +530,15 @@ public class TokenService {
 
         if (error != null) {
             audit.error(Errors.INVALID_REGISTRATION);
-            return Flows.forms(providerSession, realm, uriInfo).setError(error).setFormData(formData).createRegistration();
+            return Flows.forms(session, realm, uriInfo).setError(error).setFormData(formData).createRegistration();
         }
 
-        AuthenticationProviderManager authenticationProviderManager = AuthenticationProviderManager.getManager(realm, providerSession);
+        AuthenticationProviderManager authenticationProviderManager = AuthenticationProviderManager.getManager(realm, session);
 
         // Validate that user with this username doesn't exist in realm or any authentication provider
         if (realm.getUser(username) != null || authenticationProviderManager.getUser(username) != null) {
             audit.error(Errors.USERNAME_IN_USE);
-            return Flows.forms(providerSession, realm, uriInfo).setError(Messages.USERNAME_EXISTS).setFormData(formData).createRegistration();
+            return Flows.forms(session, realm, uriInfo).setError(Messages.USERNAME_EXISTS).setFormData(formData).createRegistration();
         }
 
         UserModel user = realm.addUser(username);
@@ -559,7 +556,7 @@ public class TokenService {
             boolean passwordUpdateSuccessful;
             String passwordUpdateError;
             try {
-                passwordUpdateSuccessful = AuthenticationProviderManager.getManager(realm, providerSession).updatePassword(user, formData.getFirst("password"));
+                passwordUpdateSuccessful = AuthenticationProviderManager.getManager(realm, session).updatePassword(user, formData.getFirst("password"));
                 passwordUpdateError = "Password update failed";
             } catch (AuthenticationProviderException ape) {
                 passwordUpdateSuccessful = false;
@@ -569,7 +566,7 @@ public class TokenService {
             // User already registered, but force him to update password
             if (!passwordUpdateSuccessful) {
                 user.addRequiredAction(UserModel.RequiredAction.UPDATE_PASSWORD);
-                return Flows.forms(providerSession, realm, uriInfo).setError(passwordUpdateError).createResponse(UserModel.RequiredAction.UPDATE_PASSWORD);
+                return Flows.forms(session, realm, uriInfo).setError(passwordUpdateError).createResponse(UserModel.RequiredAction.UPDATE_PASSWORD);
             }
         }
 
@@ -790,7 +787,7 @@ public class TokenService {
 
         audit.event(EventType.LOGIN).client(clientId).detail(Details.REDIRECT_URI, redirect).detail(Details.RESPONSE_TYPE, "code");
 
-        OAuthFlows oauth = Flows.oauth(providerSession, realm, request, uriInfo, authManager, tokenManager);
+        OAuthFlows oauth = Flows.oauth(session, realm, request, uriInfo, authManager, tokenManager);
 
         if (!checkSsl()) {
             return oauth.forwardToSecurityFailure("HTTPS required");
@@ -842,7 +839,7 @@ public class TokenService {
             return oauth.redirectError(client, "access_denied", state, redirect);
         }
         logger.info("createLogin() now...");
-        return Flows.forms(providerSession, realm, uriInfo).createLogin();
+        return Flows.forms(session, realm, uriInfo).createLogin();
     }
 
     /**
@@ -864,7 +861,7 @@ public class TokenService {
 
         audit.event(EventType.REGISTER).client(clientId).detail(Details.REDIRECT_URI, redirect).detail(Details.RESPONSE_TYPE, "code");
 
-        OAuthFlows oauth = Flows.oauth(providerSession, realm, request, uriInfo, authManager, tokenManager);
+        OAuthFlows oauth = Flows.oauth(session, realm, request, uriInfo, authManager, tokenManager);
 
         if (!checkSsl()) {
             return oauth.forwardToSecurityFailure("HTTPS required");
@@ -902,7 +899,7 @@ public class TokenService {
 
         authManager.expireIdentityCookie(realm, uriInfo);
 
-        return Flows.forms(providerSession, realm, uriInfo).createRegistration();
+        return Flows.forms(session, realm, uriInfo).createRegistration();
     }
 
     /**
@@ -967,7 +964,7 @@ public class TokenService {
     public Response processOAuth(final MultivaluedMap<String, String> formData) {
         audit.event(EventType.LOGIN).detail(Details.RESPONSE_TYPE, "code");
 
-        OAuthFlows oauth = Flows.oauth(providerSession, realm, request, uriInfo, authManager, tokenManager);
+        OAuthFlows oauth = Flows.oauth(session, realm, request, uriInfo, authManager, tokenManager);
 
         if (!checkSsl()) {
             return oauth.forwardToSecurityFailure("HTTPS required");
@@ -1018,7 +1015,7 @@ public class TokenService {
     @Path("oauth/oob")
     @GET
     public Response installedAppUrnCallback(final @QueryParam("code") String code, final @QueryParam("error") String error, final @QueryParam("error_description") String errorDescription) {
-        LoginFormsProvider forms = Flows.forms(providerSession, realm, uriInfo);
+        LoginFormsProvider forms = Flows.forms(session, realm, uriInfo);
         if (code != null) {
             return forms.setAccessCode(code).createCode();
         } else {
diff --git a/services/src/main/java/org/keycloak/services/scheduled/ClearExpiredAuditEvents.java b/services/src/main/java/org/keycloak/services/scheduled/ClearExpiredAuditEvents.java
index c12ea04..5884f49 100644
--- a/services/src/main/java/org/keycloak/services/scheduled/ClearExpiredAuditEvents.java
+++ b/services/src/main/java/org/keycloak/services/scheduled/ClearExpiredAuditEvents.java
@@ -3,7 +3,6 @@ package org.keycloak.services.scheduled;
 import org.keycloak.audit.AuditProvider;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
-import org.keycloak.provider.ProviderSession;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -11,10 +10,10 @@ import org.keycloak.provider.ProviderSession;
 public class ClearExpiredAuditEvents implements ScheduledTask {
 
     @Override
-    public void run(KeycloakSession keycloakSession, ProviderSession providerSession) {
-        AuditProvider audit = providerSession.getProvider(AuditProvider.class);
+    public void run(KeycloakSession session) {
+        AuditProvider audit = session.getProvider(AuditProvider.class);
         if (audit != null) {
-            for (RealmModel realm : keycloakSession.getRealms()) {
+            for (RealmModel realm : session.getRealms()) {
                 if (realm.isAuditEnabled() && realm.getAuditExpiration() > 0) {
                     long olderThan = System.currentTimeMillis() - realm.getAuditExpiration() * 1000;
                     audit.clear(realm.getId(), olderThan);
diff --git a/services/src/main/java/org/keycloak/services/scheduled/ClearExpiredUserSessions.java b/services/src/main/java/org/keycloak/services/scheduled/ClearExpiredUserSessions.java
index cd770b6..b6b5f99 100755
--- a/services/src/main/java/org/keycloak/services/scheduled/ClearExpiredUserSessions.java
+++ b/services/src/main/java/org/keycloak/services/scheduled/ClearExpiredUserSessions.java
@@ -2,7 +2,6 @@ package org.keycloak.services.scheduled;
 
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
-import org.keycloak.provider.ProviderSession;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -10,8 +9,8 @@ import org.keycloak.provider.ProviderSession;
 public class ClearExpiredUserSessions implements ScheduledTask {
 
     @Override
-    public void run(KeycloakSession keycloakSession, ProviderSession providerSession) {
-        for (RealmModel realm : keycloakSession.getRealms()) {
+    public void run(KeycloakSession session) {
+        for (RealmModel realm : session.getRealms()) {
             realm.removeExpiredUserSessions();
         }
     }
diff --git a/services/src/main/java/org/keycloak/services/scheduled/ScheduledTask.java b/services/src/main/java/org/keycloak/services/scheduled/ScheduledTask.java
index e47f8b9..4e03152 100644
--- a/services/src/main/java/org/keycloak/services/scheduled/ScheduledTask.java
+++ b/services/src/main/java/org/keycloak/services/scheduled/ScheduledTask.java
@@ -1,13 +1,12 @@
 package org.keycloak.services.scheduled;
 
 import org.keycloak.models.KeycloakSession;
-import org.keycloak.provider.ProviderSession;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
  */
 public interface ScheduledTask {
 
-    public void run(KeycloakSession keycloakSession, ProviderSession providerSession);
+    public void run(KeycloakSession session);
 
 }
diff --git a/services/src/main/java/org/keycloak/services/scheduled/ScheduledTaskRunner.java b/services/src/main/java/org/keycloak/services/scheduled/ScheduledTaskRunner.java
index 275b43b..f997d27 100644
--- a/services/src/main/java/org/keycloak/services/scheduled/ScheduledTaskRunner.java
+++ b/services/src/main/java/org/keycloak/services/scheduled/ScheduledTaskRunner.java
@@ -3,8 +3,6 @@ package org.keycloak.services.scheduled;
 import org.jboss.resteasy.logging.Logger;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.KeycloakSessionFactory;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.provider.ProviderSessionFactory;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -13,31 +11,30 @@ public class ScheduledTaskRunner implements Runnable {
 
     private static final Logger logger = Logger.getLogger(ScheduledTaskRunner.class);
 
-    private final ProviderSessionFactory providerSessionFactory;
+    private final KeycloakSessionFactory sessionFactory;
     private final ScheduledTask task;
 
-    public ScheduledTaskRunner(ProviderSessionFactory providerSessionFactory, ScheduledTask task) {
-        this.providerSessionFactory = providerSessionFactory;
+    public ScheduledTaskRunner(KeycloakSessionFactory sessionFactory, ScheduledTask task) {
+        this.sessionFactory = sessionFactory;
         this.task = task;
     }
 
     @Override
     public void run() {
-        ProviderSession providerSession = providerSessionFactory.createSession();
-        KeycloakSession keycloakSession = providerSession.getProvider(KeycloakSession.class);
+        KeycloakSession session = sessionFactory.create();
         try {
-            keycloakSession.getTransaction().begin();
-            task.run(keycloakSession, providerSession);
-            keycloakSession.getTransaction().commit();
+            session.getTransaction().begin();
+            task.run(session);
+            session.getTransaction().commit();
 
             logger.debug("Executed scheduled task " + task.getClass().getSimpleName());
         } catch (Throwable t) {
             logger.error("Failed to run scheduled task " + task.getClass().getSimpleName(), t);
 
-            keycloakSession.getTransaction().rollback();
+            session.getTransaction().rollback();
         } finally {
             try {
-                providerSession.close();
+                session.close();
             } catch (Throwable t) {
                 logger.error("Failed to close ProviderSession", t);
             }
diff --git a/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java b/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java
index 8e4db51..e867087 100755
--- a/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java
+++ b/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java
@@ -31,10 +31,9 @@ import org.jboss.logging.Logger;
 import org.jboss.resteasy.plugins.server.undertow.UndertowJaxrsServer;
 import org.jboss.resteasy.spi.ResteasyDeployment;
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.provider.ProviderSessionFactory;
 import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.services.filters.ClientConnectionFilter;
 import org.keycloak.services.filters.KeycloakSessionServletFilter;
@@ -163,7 +162,7 @@ public class KeycloakServer {
 
     private KeycloakServerConfig config;
 
-    private ProviderSessionFactory providerSessionFactory;
+    private KeycloakSessionFactory sessionFactory;
 
     private UndertowJaxrsServer server;
 
@@ -175,8 +174,8 @@ public class KeycloakServer {
         this.config = config;
     }
 
-    public ProviderSessionFactory getProviderSessionFactory() {
-        return providerSessionFactory;
+    public KeycloakSessionFactory getSessionFactory() {
+        return sessionFactory;
     }
 
     public UndertowJaxrsServer getServer() {
@@ -189,8 +188,7 @@ public class KeycloakServer {
     }
 
     public void importRealm(RealmRepresentation rep) {
-        ProviderSession providerSession = providerSessionFactory.createSession();
-        KeycloakSession session = providerSession.getProvider(KeycloakSession.class);
+        KeycloakSession session = sessionFactory.create();;
         session.getTransaction().begin();
 
         try {
@@ -213,13 +211,12 @@ public class KeycloakServer {
 
             session.getTransaction().commit();
         } finally {
-            providerSession.close();
+            session.close();
         }
     }
 
     protected void setupDevConfig() {
-        ProviderSession providerSession = providerSessionFactory.createSession();
-        KeycloakSession session = providerSession.getProvider(KeycloakSession.class);
+        KeycloakSession session = sessionFactory.create();
         session.getTransaction().begin();
 
         try {
@@ -231,7 +228,7 @@ public class KeycloakServer {
 
             session.getTransaction().commit();
         } finally {
-            providerSession.close();
+            session.close();
         }
     }
 
@@ -263,7 +260,7 @@ public class KeycloakServer {
 
         server.deploy(di);
 
-        providerSessionFactory = ((KeycloakApplication) deployment.getApplication()).getProviderSessionFactory();
+        sessionFactory = ((KeycloakApplication) deployment.getApplication()).getSessionFactory();
 
         setupDevConfig();
 
@@ -284,7 +281,7 @@ public class KeycloakServer {
     }
 
     public void stop() {
-        providerSessionFactory.close();
+        sessionFactory.close();
         server.stop();
 
         info("Stopped Keycloak");
diff --git a/testsuite/integration/src/main/resources/META-INF/keycloak-server.json b/testsuite/integration/src/main/resources/META-INF/keycloak-server.json
index a1e1ec1..b51cee6 100755
--- a/testsuite/integration/src/main/resources/META-INF/keycloak-server.json
+++ b/testsuite/integration/src/main/resources/META-INF/keycloak-server.json
@@ -24,7 +24,7 @@
     },
 
     "modelCache": {
-        "provider": "${keycloak.model.cache.provider:simple}"
+        "provider": "${keycloak.model.cache.provider:}"
     },
 
     "timer": {
@@ -40,7 +40,7 @@
         }
     },
 
-    "login-forms": {
+    "login": {
         "provider": "freemarker"
     },
 
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/account/ProfileTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/account/ProfileTest.java
index af78795..ad78f4a 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/account/ProfileTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/account/ProfileTest.java
@@ -54,7 +54,7 @@ public class ProfileTest {
             user.setAttribute("key1", "value1");
             user.setAttribute("key2", "value2");
 
-            ApplicationModel accountApp = appRealm.getApplicationNameMap().get(org.keycloak.models.Constants.ACCOUNT_MANAGEMENT_APP);
+            ApplicationModel accountApp = appRealm.getApplicationByName(org.keycloak.models.Constants.ACCOUNT_MANAGEMENT_APP);
 
             UserModel user2 = appRealm.addUser("test-user-no-access@localhost");
             user2.setEnabled(true);
@@ -66,7 +66,7 @@ public class ProfileTest {
             creds.setValue("password");
             user2.updateCredential(creds);
 
-            ApplicationModel app = appRealm.getApplicationNameMap().get("test-app");
+            ApplicationModel app = appRealm.getApplicationByName("test-app");
             app.addScopeMapping(accountApp.getRole(AccountRoles.VIEW_PROFILE));
             app.addRedirectUri("http://localhost:8081/app/*");
             app.addWebOrigin("http://localtest.me:8081");
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/adapter/AdapterTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/adapter/AdapterTest.java
index 46e8b2f..b063436 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/adapter/AdapterTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/adapter/AdapterTest.java
@@ -34,8 +34,6 @@ import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.UserSessionModel;
-import org.keycloak.models.cache.CacheKeycloakSession;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.representations.AccessToken;
 import org.keycloak.representations.adapters.action.SessionStats;
 import org.keycloak.representations.idm.RealmRepresentation;
@@ -94,9 +92,9 @@ public class AdapterTest {
     };
 
     private static String createToken() {
-        ProviderSession providerSession = keycloakRule.startSession();
+        KeycloakSession session = keycloakRule.startSession();
         try {
-            RealmManager manager = new RealmManager(providerSession.getProvider(KeycloakSession.class));
+            RealmManager manager = new RealmManager(session);
 
             RealmModel adminRealm = manager.getRealm(Config.getAdminRealm());
             ApplicationModel adminConsole = adminRealm.getApplicationByName(Constants.ADMIN_CONSOLE_APPLICATION);
@@ -106,8 +104,7 @@ public class AdapterTest {
             AccessToken token = tm.createClientAccessToken(null, adminRealm, adminConsole, admin, userSession);
             return tm.encodeToken(adminRealm, token);
         } finally {
-            keycloakRule.stopSession(providerSession, true);
-
+            keycloakRule.stopSession(session, true);
         }
     }
 
@@ -192,12 +189,12 @@ public class AdapterTest {
         System.out.println(pageSource);
         Assert.assertTrue(pageSource.contains("Bill Burke") && pageSource.contains("Stian Thorgersen"));
 
-        KeycloakSession keycloakSession = keycloakRule.startCacheSession();
-        RealmModel realm = keycloakSession.getRealmByName("demo");
+        KeycloakSession session = keycloakRule.startSession();
+        RealmModel realm = session.getRealmByName("demo");
         int originalIdle = realm.getSsoSessionIdleTimeout();
         realm.setSsoSessionIdleTimeout(1);
-        keycloakSession.getTransaction().commit();
-        keycloakSession.close();
+        session.getTransaction().commit();
+        session.close();
 
         Thread.sleep(2000);
 
@@ -206,11 +203,11 @@ public class AdapterTest {
         driver.navigate().to("http://localhost:8081/product-portal");
         Assert.assertTrue(driver.getCurrentUrl().startsWith(LOGIN_URL));
 
-        keycloakSession = keycloakRule.startCacheSession();
-        realm = keycloakSession.getRealmByName("demo");
+        session = keycloakRule.startSession();
+        realm = session.getRealmByName("demo");
         realm.setSsoSessionIdleTimeout(originalIdle);
-        keycloakSession.getTransaction().commit();
-        keycloakSession.close();
+        session.getTransaction().commit();
+        session.close();
     }
 
     @Test
@@ -226,30 +223,30 @@ public class AdapterTest {
         System.out.println(pageSource);
         Assert.assertTrue(pageSource.contains("Bill Burke") && pageSource.contains("Stian Thorgersen"));
 
-        KeycloakSession keycloakSession = keycloakRule.startCacheSession();
-        RealmModel realm = keycloakSession.getRealmByName("demo");
+        KeycloakSession session = keycloakRule.startSession();
+        RealmModel realm = session.getRealmByName("demo");
         int originalIdle = realm.getSsoSessionIdleTimeout();
         realm.setSsoSessionIdleTimeout(1);
-        keycloakSession.getTransaction().commit();
-        keycloakSession.close();
+        session.getTransaction().commit();
+        session.close();
 
         Thread.sleep(2000);
 
-        keycloakSession = keycloakRule.startCacheSession();
-        realm = keycloakSession.getRealmByName("demo");
+        session = keycloakRule.startSession();
+        realm = session.getRealmByName("demo");
         realm.removeExpiredUserSessions();
-        keycloakSession.getTransaction().commit();
-        keycloakSession.close();
+        session.getTransaction().commit();
+        session.close();
 
         // test SSO
         driver.navigate().to("http://localhost:8081/product-portal");
         Assert.assertTrue(driver.getCurrentUrl().startsWith(LOGIN_URL));
 
-        keycloakSession = keycloakRule.startCacheSession();
-        realm = keycloakSession.getRealmByName("demo");
+        session = keycloakRule.startSession();
+        realm = session.getRealmByName("demo");
         realm.setSsoSessionIdleTimeout(originalIdle);
-        keycloakSession.getTransaction().commit();
-        keycloakSession.close();
+        session.getTransaction().commit();
+        session.close();
     }
 
     @Test
@@ -265,12 +262,12 @@ public class AdapterTest {
         System.out.println(pageSource);
         Assert.assertTrue(pageSource.contains("Bill Burke") && pageSource.contains("Stian Thorgersen"));
 
-        KeycloakSession keycloakSession = keycloakRule.startCacheSession();
-        RealmModel realm = keycloakSession.getRealmByName("demo");
+        KeycloakSession session = keycloakRule.startSession();
+        RealmModel realm = session.getRealmByName("demo");
         int original = realm.getSsoSessionMaxLifespan();
         realm.setSsoSessionMaxLifespan(1);
-        keycloakSession.getTransaction().commit();
-        keycloakSession.close();
+        session.getTransaction().commit();
+        session.close();
 
         Thread.sleep(2000);
 
@@ -279,11 +276,11 @@ public class AdapterTest {
         driver.navigate().to("http://localhost:8081/product-portal");
         Assert.assertTrue(driver.getCurrentUrl().startsWith(LOGIN_URL));
 
-        keycloakSession = keycloakRule.startCacheSession();
-        realm = keycloakSession.getRealmByName("demo");
+        session = keycloakRule.startSession();
+        realm = session.getRealmByName("demo");
         realm.setSsoSessionMaxLifespan(original);
-        keycloakSession.getTransaction().commit();
-        keycloakSession.close();
+        session.getTransaction().commit();
+        session.close();
     }
 
     /**
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/AssertEvents.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/AssertEvents.java
index 1ca02fe..c51e89e 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/AssertEvents.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/AssertEvents.java
@@ -14,11 +14,11 @@ import org.keycloak.audit.Details;
 import org.keycloak.audit.Event;
 import org.keycloak.audit.EventType;
 import org.keycloak.models.ClientModel;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.UserSessionModel;
 import org.keycloak.models.utils.KeycloakModelUtils;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.representations.idm.UserRepresentation;
 import org.keycloak.services.managers.RealmManager;
 import org.keycloak.testsuite.rule.KeycloakRule;
@@ -173,7 +173,7 @@ public class AssertEvents implements TestRule, AuditListenerFactory {
     }
 
     @Override
-    public AuditListener create(ProviderSession providerSession) {
+    public AuditListener create(KeycloakSession session) {
         return new AuditListener() {
             @Override
             public void onEvent(Event event) {
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/AuthProvidersIntegrationTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/AuthProvidersIntegrationTest.java
index 461b8a8..e47c714 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/AuthProvidersIntegrationTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/AuthProvidersIntegrationTest.java
@@ -62,7 +62,7 @@ public class AuthProvidersIntegrationTest {
 
             // Configure LDAP
             ldapRule.getEmbeddedServer().setupLdapInRealm(appRealm);
-            LDAPTestUtils.setLdapPassword(providerSession, appRealm, "johnkeycloak", "password");
+            LDAPTestUtils.setLdapPassword(session, appRealm, "johnkeycloak", "password");
         }
     });
 
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/oauth/RefreshTokenTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/oauth/RefreshTokenTest.java
index a98f860..43f386e 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/oauth/RefreshTokenTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/oauth/RefreshTokenTest.java
@@ -32,7 +32,6 @@ import org.keycloak.audit.Event;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserSessionModel;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.representations.AccessToken;
 import org.keycloak.representations.RefreshToken;
 import org.keycloak.testsuite.AssertEvents;
@@ -183,7 +182,7 @@ public class RefreshTokenTest {
 
         String refreshId = oauth.verifyRefreshToken(tokenResponse.getRefreshToken()).getId();
 
-        KeycloakSession session = keycloakRule.startCacheSession();
+        KeycloakSession session = keycloakRule.startSession();
         RealmModel realm = session.getRealmByName("test");
         UserSessionModel userSession = realm.getUserSession(sessionId);
         int last = userSession.getLastSessionRefresh();
@@ -199,7 +198,7 @@ public class RefreshTokenTest {
 
         Assert.assertEquals(200, tokenResponse.getStatusCode());
 
-        session = keycloakRule.startCacheSession();
+        session = keycloakRule.startSession();
         realm = session.getRealmByName("test");
         userSession = realm.getUserSession(sessionId);
         int next = userSession.getLastSessionRefresh();
@@ -211,7 +210,7 @@ public class RefreshTokenTest {
 
 
 
-        session = keycloakRule.startCacheSession();
+        session = keycloakRule.startSession();
         realm = session.getRealmByName("test");
         int lastAccessTokenLifespan = realm.getAccessTokenLifespan();
         realm.setAccessTokenLifespan(100000);
@@ -221,7 +220,7 @@ public class RefreshTokenTest {
         Thread.sleep(2000);
         tokenResponse = oauth.doRefreshTokenRequest(tokenResponse.getRefreshToken(), "password");
 
-        session = keycloakRule.startCacheSession();
+        session = keycloakRule.startSession();
         realm = session.getRealmByName("test");
         userSession = realm.getUserSession(sessionId);
         next = userSession.getLastSessionRefresh();
@@ -231,7 +230,7 @@ public class RefreshTokenTest {
         // lastSEssionRefresh should be updated because access code lifespan is higher than sso idle timeout
         Assert.assertThat(next, allOf(greaterThan(last), lessThan(last + 6)));
 
-        session = keycloakRule.startCacheSession();
+        session = keycloakRule.startSession();
         realm = session.getRealmByName("test");
         int originalIdle = realm.getSsoSessionIdleTimeout();
         realm.setSsoSessionIdleTimeout(1);
@@ -249,7 +248,7 @@ public class RefreshTokenTest {
 
         events.expectRefresh(refreshId, sessionId).error(Errors.INVALID_TOKEN);
 
-        session = keycloakRule.startCacheSession();
+        session = keycloakRule.startSession();
         realm = session.getRealmByName("test");
         realm.setSsoSessionIdleTimeout(originalIdle);
         realm.setAccessTokenLifespan(lastAccessTokenLifespan);
@@ -274,7 +273,7 @@ public class RefreshTokenTest {
 
         String refreshId = oauth.verifyRefreshToken(tokenResponse.getRefreshToken()).getId();
 
-        KeycloakSession session = keycloakRule.startCacheSession();
+        KeycloakSession session = keycloakRule.startSession();
         RealmModel realm = session.getRealmByName("test");
         int maxLifespan = realm.getSsoSessionMaxLifespan();
         realm.setSsoSessionMaxLifespan(1);
@@ -289,7 +288,7 @@ public class RefreshTokenTest {
         assertNull(tokenResponse.getAccessToken());
         assertNull(tokenResponse.getRefreshToken());
 
-        session = keycloakRule.startCacheSession();
+        session = keycloakRule.startSession();
         realm = session.getRealmByName("test");
         realm.setSsoSessionMaxLifespan(maxLifespan);
         session.getTransaction().commit();
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/AbstractKeycloakRule.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/AbstractKeycloakRule.java
index a97b397..2db2269 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/AbstractKeycloakRule.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/AbstractKeycloakRule.java
@@ -10,8 +10,6 @@ import org.keycloak.Config;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
-import org.keycloak.models.cache.CacheKeycloakSession;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.representations.idm.UserRepresentation;
 import org.keycloak.services.managers.ModelToRepresentation;
@@ -39,29 +37,28 @@ public abstract class AbstractKeycloakRule extends ExternalResource {
     }
 
     public UserRepresentation getUser(String realm, String name) {
-        ProviderSession providerSession = server.getProviderSessionFactory().createSession();
-        KeycloakSession session = providerSession.getProvider(KeycloakSession.class);
+        KeycloakSession session = server.getSessionFactory().create();
+        session.getTransaction().begin();
         try {
             UserModel user = session.getRealmByName(realm).getUser(name);
             return user != null ? ModelToRepresentation.toRepresentation(user) : null;
         } finally {
-            providerSession.close();
+            session.close();
         }
     }
 
     public UserRepresentation getUserById(String realm, String id) {
-        ProviderSession providerSession = server.getProviderSessionFactory().createSession();
-        KeycloakSession session = providerSession.getProvider(KeycloakSession.class);
+        KeycloakSession session = server.getSessionFactory().create();
+        session.getTransaction().begin();
         try {
             return ModelToRepresentation.toRepresentation(session.getRealmByName(realm).getUserById(id));
         } finally {
-            providerSession.close();
+            session.close();
         }
     }
 
     protected void setupKeycloak() {
-        ProviderSession providerSession = server.getProviderSessionFactory().createSession();
-        KeycloakSession session = providerSession.getProvider(KeycloakSession.class);
+        KeycloakSession session = server.getSessionFactory().create();
         session.getTransaction().begin();
 
         try {
@@ -73,7 +70,7 @@ public abstract class AbstractKeycloakRule extends ExternalResource {
 
             session.getTransaction().commit();
         } finally {
-            providerSession.close();
+            session.close();
         }
     }
 
@@ -137,23 +134,15 @@ public abstract class AbstractKeycloakRule extends ExternalResource {
         return JsonSerialization.readValue(bytes, RealmRepresentation.class);
     }
 
-    public ProviderSession startSession() {
-        ProviderSession providerSession = server.getProviderSessionFactory().createSession();
-        KeycloakSession session = providerSession.getProvider(KeycloakSession.class);
-        session.getTransaction().begin();
-        return providerSession;
-    }
-
-    public KeycloakSession startCacheSession() {
-        ProviderSession providerSession = server.getProviderSessionFactory().createSession();
-        KeycloakSession session = providerSession.getProvider(CacheKeycloakSession.class);
+    public KeycloakSession startSession() {
+        KeycloakSession session = server.getSessionFactory().create();
         session.getTransaction().begin();
         return session;
     }
 
-    public void stopSession(ProviderSession session, boolean commit) {
+    public void stopSession(KeycloakSession session, boolean commit) {
         if (commit) {
-            session.getProvider(KeycloakSession.class).getTransaction().commit();
+            session.getTransaction().commit();
         }
         session.close();
     }
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/KeycloakRule.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/KeycloakRule.java
index 4cdb096..d502c6e 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/KeycloakRule.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/KeycloakRule.java
@@ -25,8 +25,6 @@ import org.keycloak.Config;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserSessionModel;
-import org.keycloak.models.cache.CacheKeycloakSession;
-import org.keycloak.provider.ProviderSession;
 import org.keycloak.services.managers.RealmManager;
 import org.keycloak.testsuite.ApplicationServlet;
 
@@ -62,8 +60,7 @@ public class KeycloakRule extends AbstractKeycloakRule {
     }
 
     public void configure(KeycloakSetup configurer) {
-        ProviderSession providerSession = server.getProviderSessionFactory().createSession();
-        KeycloakSession session = providerSession.getProvider(KeycloakSession.class);
+        KeycloakSession session = server.getSessionFactory().create();
         session.getTransaction().begin();
 
         try {
@@ -72,18 +69,17 @@ public class KeycloakRule extends AbstractKeycloakRule {
             RealmModel adminstrationRealm = manager.getRealm(Config.getAdminRealm());
             RealmModel appRealm = manager.getRealm("test");
 
-            configurer.providerSession = providerSession;
+            configurer.session = session;
             configurer.config(manager, adminstrationRealm, appRealm);
 
             session.getTransaction().commit();
         } finally {
-            providerSession.close();
+            session.close();
         }
     }
 
     public void update(KeycloakSetup configurer) {
-        ProviderSession providerSession = server.getProviderSessionFactory().createSession();
-        KeycloakSession session = providerSession.getProvider(CacheKeycloakSession.class);
+        KeycloakSession session = server.getSessionFactory().create();
         session.getTransaction().begin();
 
         try {
@@ -92,28 +88,28 @@ public class KeycloakRule extends AbstractKeycloakRule {
             RealmModel adminstrationRealm = manager.getRealm(Config.getAdminRealm());
             RealmModel appRealm = manager.getRealm("test");
 
-            configurer.providerSession = providerSession;
+            configurer.session = session;
             configurer.config(manager, adminstrationRealm, appRealm);
 
             session.getTransaction().commit();
         } finally {
-            providerSession.close();
+            session.close();
         }
     }
 
 
     public void removeUserSession(String sessionId) {
-        ProviderSession providerSession = startSession();
-        RealmModel realm = providerSession.getProvider(KeycloakSession.class).getRealm("test");
-        UserSessionModel session = realm.getUserSession(sessionId);
-        assertNotNull(session);
-        realm.removeUserSession(session);
-        stopSession(providerSession, true);
+        KeycloakSession session = startSession();
+        RealmModel realm = session.getRealm("test");
+        UserSessionModel userSession = realm.getUserSession(sessionId);
+        assertNotNull(userSession);
+        realm.removeUserSession(userSession);
+        stopSession(session, true);
     }
 
     public abstract static class KeycloakSetup {
 
-        protected ProviderSession providerSession;
+        protected KeycloakSession session;
 
         public abstract void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm);
 
diff --git a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/BaseJMeterPerformanceTest.java b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/BaseJMeterPerformanceTest.java
index c78cb61..93939c1 100755
--- a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/BaseJMeterPerformanceTest.java
+++ b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/BaseJMeterPerformanceTest.java
@@ -6,8 +6,6 @@ import org.apache.jmeter.samplers.SampleResult;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.KeycloakTransaction;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.provider.ProviderSessionFactory;
 import org.keycloak.services.resources.KeycloakApplication;
 
 import java.util.concurrent.Callable;
@@ -20,18 +18,18 @@ import java.util.concurrent.atomic.AtomicInteger;
 public class BaseJMeterPerformanceTest extends AbstractJavaSamplerClient {
 
 
-    private static FutureTask<ProviderSessionFactory> factoryProvider = new FutureTask<ProviderSessionFactory>(new Callable() {
+    private static FutureTask<KeycloakSessionFactory> factoryProvider = new FutureTask<KeycloakSessionFactory>(new Callable() {
 
         @Override
-        public ProviderSessionFactory call() throws Exception {
-            return KeycloakApplication.createProviderSessionFactory();
+        public KeycloakSessionFactory call() throws Exception {
+            return KeycloakApplication.createSessionFactory();
         }
 
     });
     private static AtomicInteger counter = new AtomicInteger();
 
-    private ProviderSessionFactory factory;
-    // private KeycloakSession identitySession;
+    private KeycloakSessionFactory factory;
+    // private KeycloakSession session;
     private Worker worker;
     private boolean setupSuccess = false;
 
@@ -44,14 +42,13 @@ public class BaseJMeterPerformanceTest extends AbstractJavaSamplerClient {
         worker = getWorker();
 
         factory = getFactory();
-        ProviderSession providerSession = factory.createSession();
-        KeycloakSession identitySession = providerSession.getProvider(KeycloakSession.class);
-        KeycloakTransaction transaction = identitySession.getTransaction();
+        KeycloakSession session = factory.create();
+        KeycloakTransaction transaction = session.getTransaction();
         transaction.begin();
 
         int workerId = counter.getAndIncrement();
         try {
-            worker.setup(workerId, identitySession);
+            worker.setup(workerId, session);
             setupSuccess = true;
         } finally {
             if (setupSuccess) {
@@ -59,11 +56,11 @@ public class BaseJMeterPerformanceTest extends AbstractJavaSamplerClient {
             } else {
                 transaction.rollback();
             }
-            providerSession.close();
+            session.close();
         }
     }
 
-    private static ProviderSessionFactory getFactory() {
+    private static KeycloakSessionFactory getFactory() {
         factoryProvider.run();
         try {
             return factoryProvider.get();
@@ -101,13 +98,12 @@ public class BaseJMeterPerformanceTest extends AbstractJavaSamplerClient {
             return result;
         }
 
-        ProviderSession providerSession = factory.createSession();
-        KeycloakSession identitySession = providerSession.getProvider(KeycloakSession.class);
-        KeycloakTransaction transaction = identitySession.getTransaction();
+        KeycloakSession session = factory.create();
+        KeycloakTransaction transaction = session.getTransaction();
         try {
             transaction.begin();
 
-            worker.run(result, identitySession);
+            worker.run(result, session);
 
             result.setResponseCodeOK();
             transaction.commit();
@@ -118,7 +114,7 @@ public class BaseJMeterPerformanceTest extends AbstractJavaSamplerClient {
         } finally {
             result.sampleEnd();
             result.setSuccessful(true);
-            providerSession.close();
+            session.close();
         }
 
         return result;
diff --git a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/CreateRealmsWorker.java b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/CreateRealmsWorker.java
index a51c06b..8deadb7 100755
--- a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/CreateRealmsWorker.java
+++ b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/CreateRealmsWorker.java
@@ -30,7 +30,7 @@ public class CreateRealmsWorker implements Worker {
     private boolean createRequiredCredentials;
 
     @Override
-    public void setup(int workerId, KeycloakSession identitySession) {
+    public void setup(int workerId, KeycloakSession session) {
         offset = PerfTestUtils.readSystemProperty("keycloak.perf.createRealms.realms.offset", Integer.class);
         appsPerRealm = PerfTestUtils.readSystemProperty("keycloak.perf.createRealms.appsPerRealm", Integer.class);
         rolesPerRealm = PerfTestUtils.readSystemProperty("keycloak.perf.createRealms.rolesPerRealm", Integer.class);
@@ -51,10 +51,10 @@ public class CreateRealmsWorker implements Worker {
     }
 
     @Override
-    public void run(SampleResult result, KeycloakSession identitySession) {
+    public void run(SampleResult result, KeycloakSession session) {
         int realmNumber = realmCounter.getAndIncrement();
         String realmName = PerfTestUtils.getRealmName(realmNumber);
-        RealmManager realmManager = new RealmManager(identitySession);
+        RealmManager realmManager = new RealmManager(session);
         RealmModel realm = realmManager.createRealm(realmName, realmName);
 
         // Add roles
diff --git a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/CreateUsersWorker.java b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/CreateUsersWorker.java
index ae7795d..ce2f08a 100755
--- a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/CreateUsersWorker.java
+++ b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/CreateUsersWorker.java
@@ -36,7 +36,7 @@ public class CreateUsersWorker implements Worker {
     private int socialLinksPerUserCount;
 
     @Override
-    public void setup(int workerId, KeycloakSession identitySession) {
+    public void setup(int workerId, KeycloakSession session) {
         realmsOffset = PerfTestUtils.readSystemProperty("keycloak.perf.createUsers.realms.offset", Integer.class);
         addBasicUserAttributes = PerfTestUtils.readSystemProperty("keycloak.perf.createUsers.addBasicUserAttributes", Boolean.class);
         addDefaultRoles = PerfTestUtils.readSystemProperty("keycloak.perf.createUsers.addDefaultRoles", Boolean.class);
@@ -57,9 +57,9 @@ public class CreateUsersWorker implements Worker {
     }
 
     @Override
-    public void run(SampleResult result, KeycloakSession identitySession) {
+    public void run(SampleResult result, KeycloakSession session) {
         // We need to obtain realm first
-        RealmModel realm = identitySession.getRealm(realmId);
+        RealmModel realm = session.getRealm(realmId);
         if (realm == null) {
             throw new IllegalStateException("Realm '" + realmId + "' not found");
         }
diff --git a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/ReadUsersWorker.java b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/ReadUsersWorker.java
index 1eb1044..a06a2c2 100755
--- a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/ReadUsersWorker.java
+++ b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/ReadUsersWorker.java
@@ -39,7 +39,7 @@ public class ReadUsersWorker implements Worker {
     private int iterationNumber;
 
     @Override
-    public void setup(int workerId, KeycloakSession identitySession) {
+    public void setup(int workerId, KeycloakSession session) {
         realmsOffset = PerfTestUtils.readSystemProperty("keycloak.perf.readUsers.realms.offset", Integer.class);
         readUsersPerIteration = PerfTestUtils.readSystemProperty("keycloak.perf.readUsers.readUsersPerIteration", Integer.class);
         countOfUsersPerRealm = PerfTestUtils.readSystemProperty("keycloak.perf.readUsers.countOfUsersPerRealm", Integer.class);
@@ -66,9 +66,9 @@ public class ReadUsersWorker implements Worker {
     }
 
     @Override
-    public void run(SampleResult result, KeycloakSession identitySession) {
+    public void run(SampleResult result, KeycloakSession session) {
         // We need to obtain realm first
-        RealmModel realm = identitySession.getRealm(realmId);
+        RealmModel realm = session.getRealm(realmId);
         if (realm == null) {
             throw new IllegalStateException("Realm '" + realmId + "' not found");
         }
diff --git a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/RemoveUsersWorker.java b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/RemoveUsersWorker.java
index b13b7d1..20f0fd6 100755
--- a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/RemoveUsersWorker.java
+++ b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/RemoveUsersWorker.java
@@ -27,12 +27,12 @@ public class RemoveUsersWorker implements Worker {
     private int realmsOffset;
 
     @Override
-    public void setup(int workerId, KeycloakSession identitySession) {
+    public void setup(int workerId, KeycloakSession session) {
         realmsOffset = PerfTestUtils.readSystemProperty("keycloak.perf.removeUsers.realms.offset", Integer.class);
 
         int realmNumber = realmsOffset + workerId;
         String realmId = PerfTestUtils.getRealmName(realmNumber);
-        realm = identitySession.getRealm(realmId);
+        realm = session.getRealm(realmId);
         if (realm == null) {
             throw new IllegalStateException("Realm '" + realmId + "' not found");
         }
@@ -41,7 +41,7 @@ public class RemoveUsersWorker implements Worker {
     }
 
     @Override
-    public void run(SampleResult result, KeycloakSession identitySession) {
+    public void run(SampleResult result, KeycloakSession session) {
         throw new IllegalStateException("Not yet supported");
         /*
         int userNumber = ++userCounterInRealm;
diff --git a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/Worker.java b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/Worker.java
index 69732cf..e5b8061 100644
--- a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/Worker.java
+++ b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/Worker.java
@@ -8,9 +8,9 @@ import org.keycloak.models.KeycloakSession;
  */
 public interface Worker {
 
-    void setup(int workerId, KeycloakSession identitySession);
+    void setup(int workerId, KeycloakSession session);
 
-    void run(SampleResult result, KeycloakSession identitySession);
+    void run(SampleResult result, KeycloakSession session);
 
     void tearDown();
 
diff --git a/testsuite/tools/src/main/java/org/keycloak/test/tools/jobs/CreateUsers.java b/testsuite/tools/src/main/java/org/keycloak/test/tools/jobs/CreateUsers.java
index 2191e6c..87a932a 100644
--- a/testsuite/tools/src/main/java/org/keycloak/test/tools/jobs/CreateUsers.java
+++ b/testsuite/tools/src/main/java/org/keycloak/test/tools/jobs/CreateUsers.java
@@ -1,12 +1,10 @@
 package org.keycloak.test.tools.jobs;
 
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserCredentialModel;
 import org.keycloak.models.UserModel;
-import org.keycloak.models.cache.CacheKeycloakSession;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.provider.ProviderSessionFactory;
 import org.keycloak.services.managers.RealmManager;
 import org.keycloak.test.tools.PerfTools;
 
@@ -19,16 +17,16 @@ import java.io.StringWriter;
 public class CreateUsers implements Runnable {
 
     private PerfTools.Job job;
-    private final ProviderSessionFactory providerSessionFactory;
+    private final KeycloakSessionFactory sessionFactory;
     private final String realmName;
     private int start;
     private int count;
     private String prefix;
     private String[] roles;
 
-    public CreateUsers(PerfTools.Job job, ProviderSessionFactory providerSessionFactory, String realmName, int start, int count, String prefix, String[] roles) {
+    public CreateUsers(PerfTools.Job job, KeycloakSessionFactory sessionFactory, String realmName, int start, int count, String prefix, String[] roles) {
         this.job = job;
-        this.providerSessionFactory = providerSessionFactory;
+        this.sessionFactory = sessionFactory;
         this.realmName = realmName;
         this.start = start;
         this.count = count;
@@ -40,10 +38,8 @@ public class CreateUsers implements Runnable {
     public void run() {
         job.start();
 
-        ProviderSession providerSession = providerSessionFactory.createSession();
+        KeycloakSession session = sessionFactory.create();
         try {
-            KeycloakSession session = providerSession.getProvider(CacheKeycloakSession.class);
-
             session.getTransaction().begin();
 
             RealmModel realm = new RealmManager(session).getRealmByName(realmName);
@@ -74,7 +70,7 @@ public class CreateUsers implements Runnable {
             t.printStackTrace(new PrintWriter(sw));
             job.setError(sw.toString());
         } finally {
-            providerSession.close();
+            session.close();
         }
     }
 
diff --git a/testsuite/tools/src/main/java/org/keycloak/test/tools/KeycloakTestApplication.java b/testsuite/tools/src/main/java/org/keycloak/test/tools/KeycloakTestApplication.java
index b8dcf4e..52e7811 100644
--- a/testsuite/tools/src/main/java/org/keycloak/test/tools/KeycloakTestApplication.java
+++ b/testsuite/tools/src/main/java/org/keycloak/test/tools/KeycloakTestApplication.java
@@ -1,7 +1,7 @@
 package org.keycloak.test.tools;
 
 import org.jboss.resteasy.core.Dispatcher;
-import org.keycloak.provider.ProviderSessionFactory;
+import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.services.resources.KeycloakApplication;
 
 import javax.servlet.ServletContext;
@@ -15,18 +15,18 @@ import java.util.Set;
  */
 public class KeycloakTestApplication extends Application {
 
-    protected ProviderSessionFactory providerSessionFactory;
+    protected KeycloakSessionFactory sessionFactory;
     protected Set<Class<?>> classes = new HashSet<Class<?>>();
     protected Set<Object> singletons = new HashSet<Object>();
 
     public KeycloakTestApplication(@Context ServletContext context, @Context Dispatcher dispatcher) {
         KeycloakApplication.loadConfig();
 
-        this.providerSessionFactory = KeycloakApplication.createProviderSessionFactory();
+        this.sessionFactory = KeycloakApplication.createSessionFactory();
 
-        context.setAttribute(ProviderSessionFactory.class.getName(), this.providerSessionFactory);
+        context.setAttribute(KeycloakSessionFactory.class.getName(), this.sessionFactory);
 
-        singletons.add(new PerfTools(providerSessionFactory));
+        singletons.add(new PerfTools(sessionFactory));
     }
 
     @Override
diff --git a/testsuite/tools/src/main/java/org/keycloak/test/tools/PerfTools.java b/testsuite/tools/src/main/java/org/keycloak/test/tools/PerfTools.java
index 318f7ea..638e064 100644
--- a/testsuite/tools/src/main/java/org/keycloak/test/tools/PerfTools.java
+++ b/testsuite/tools/src/main/java/org/keycloak/test/tools/PerfTools.java
@@ -3,11 +3,9 @@ package org.keycloak.test.tools;
 import org.keycloak.exportimport.ExportImportConfig;
 import org.keycloak.exportimport.ExportImportProvider;
 import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
-import org.keycloak.provider.ProviderSession;
-import org.keycloak.provider.ProviderSessionFactory;
-import org.keycloak.services.managers.RealmManager;
 import org.keycloak.test.tools.jobs.CreateUsers;
 import org.keycloak.util.ProviderLoader;
 
@@ -24,7 +22,6 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -36,15 +33,15 @@ public class PerfTools {
 
     private ExecutorService executor = Executors.newFixedThreadPool(20);
 
-    private final ProviderSessionFactory providerSessionFactory;
+    private final KeycloakSessionFactory sessionFactory;
 
     @Context
     private KeycloakSession session;
 
     private List<Job> jobs = new LinkedList<Job>();
 
-    public PerfTools(ProviderSessionFactory providerSessionFactory) {
-        this.providerSessionFactory = providerSessionFactory;
+    public PerfTools(KeycloakSessionFactory sessionFactory) {
+        this.sessionFactory = sessionFactory;
     }
 
     @GET
@@ -89,7 +86,7 @@ public class PerfTools {
 
         for (int s = start; s < (start + count); s += batch) {
             int c = s + batch <= (start + count) ? batch : (start + count) - s;
-            executor.submit(new CreateUsers(job, providerSessionFactory, realmName, s, c, prefix, rolesArray));
+            executor.submit(new CreateUsers(job, sessionFactory, realmName, s, c, prefix, rolesArray));
         }
 
         return Response.noContent().build();
@@ -115,7 +112,7 @@ public class PerfTools {
 
         if (providers.hasNext()) {
             ExportImportProvider exportImport = providers.next();
-            exportImport.checkExportImport(providerSessionFactory);
+            exportImport.checkExportImport(sessionFactory);
         } else {
             throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
         }
diff --git a/testsuite/tools/src/main/resources/META-INF/keycloak-server.json b/testsuite/tools/src/main/resources/META-INF/keycloak-server.json
index fb726ca..7e3f246 100755
--- a/testsuite/tools/src/main/resources/META-INF/keycloak-server.json
+++ b/testsuite/tools/src/main/resources/META-INF/keycloak-server.json
@@ -15,7 +15,7 @@
     },
 
     "modelCache": {
-        "provider": "${keycloak.model.cache.provider:none}"
+        "provider": "${keycloak.model.cache.provider:}"
     },
 
     "timer": {
@@ -31,7 +31,7 @@
         }
     },
 
-    "login-forms": {
+    "login": {
         "provider": "freemarker"
     },
 
diff --git a/timer/api/pom.xml b/timer/api/pom.xml
index 51f78dc..68d991d 100755
--- a/timer/api/pom.xml
+++ b/timer/api/pom.xml
@@ -18,6 +18,12 @@
             <version>${project.version}</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-model-api</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/timer/basic/pom.xml b/timer/basic/pom.xml
index 72b203c..34b0c0f 100755
--- a/timer/basic/pom.xml
+++ b/timer/basic/pom.xml
@@ -21,6 +21,12 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-model-api</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
             <artifactId>keycloak-timer-api</artifactId>
             <version>${project.version}</version>
             <scope>provided</scope>
diff --git a/timer/basic/src/main/java/org/keycloak/timer/basic/BasicTimerProviderFactory.java b/timer/basic/src/main/java/org/keycloak/timer/basic/BasicTimerProviderFactory.java
index 3454d87..b0e5063 100644
--- a/timer/basic/src/main/java/org/keycloak/timer/basic/BasicTimerProviderFactory.java
+++ b/timer/basic/src/main/java/org/keycloak/timer/basic/BasicTimerProviderFactory.java
@@ -1,7 +1,7 @@
 package org.keycloak.timer.basic;
 
 import org.keycloak.Config;
-import org.keycloak.provider.ProviderSession;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.timer.TimerProvider;
 import org.keycloak.timer.TimerProviderFactory;
 
@@ -15,7 +15,7 @@ public class BasicTimerProviderFactory implements TimerProviderFactory {
     private Timer timer;
 
     @Override
-    public TimerProvider create(ProviderSession providerSession) {
+    public TimerProvider create(KeycloakSession session) {
         return new BasicTimerProvider(timer);
     }