diff --git a/DotCMIS/binding/binding-impl.cs b/DotCMIS/binding/binding-impl.cs
index cabaf63..3021a4b 100644
--- a/DotCMIS/binding/binding-impl.cs
+++ b/DotCMIS/binding/binding-impl.cs
@@ -35,6 +35,11 @@
         private BindingRepositoryService repositoryServiceWrapper;
 
         public CmisBinding(IDictionary<string, string> sessionParameters)
+            : this(sessionParameters, null)
+        {
+        }
+
+        public CmisBinding(IDictionary<string, string> sessionParameters, AbstractAuthenticationProvider authenticationProvider)
         {
             if (sessionParameters == null)
             {
@@ -54,20 +59,28 @@
             }
 
             // set up authentication provider
-            string authenticationProviderClass;
-            if (sessionParameters.TryGetValue(SessionParameter.AuthenticationProviderClass, out authenticationProviderClass))
+            if (authenticationProvider == null)
             {
-                try
+                string authenticationProviderClass;
+                if (sessionParameters.TryGetValue(SessionParameter.AuthenticationProviderClass, out authenticationProviderClass))
                 {
-                    Type authProvType = Type.GetType(authenticationProviderClass);
-                    AbstractAuthenticationProvider authenticationProvider = (AbstractAuthenticationProvider)Activator.CreateInstance(authProvType);
-                    authenticationProvider.Session = session;
-                    session.PutValue(BindingSession.AuthenticationProvider, authenticationProvider);
+                    try
+                    {
+                        Type authProvType = Type.GetType(authenticationProviderClass);
+                        authenticationProvider = (AbstractAuthenticationProvider)Activator.CreateInstance(authProvType);
+                        authenticationProvider.Session = session;
+                        session.PutValue(BindingSession.AuthenticationProvider, authenticationProvider);
+                    }
+                    catch (Exception e)
+                    {
+                        throw new CmisRuntimeException("Could not load authentictaion provider: " + e.Message, e);
+                    }
                 }
-                catch (Exception e)
-                {
-                    throw new CmisRuntimeException("Could not load authentictaion provider: " + e.Message, e);
-                }
+            }
+            else
+            {
+                authenticationProvider.Session = session;
+                session.PutValue(BindingSession.AuthenticationProvider, authenticationProvider);
             }
 
             // initialize the SPI
diff --git a/DotCMIS/binding/binding-intf.cs b/DotCMIS/binding/binding-intf.cs
index 3318036..3819fc9 100644
--- a/DotCMIS/binding/binding-intf.cs
+++ b/DotCMIS/binding/binding-intf.cs
@@ -218,37 +218,43 @@
             }
         }
 
-        public ICmisBinding CreateCmisBinding(IDictionary<string, string> sessionParameters)
+        public ICmisBinding CreateCmisBinding(IDictionary<string, string> sessionParameters, AbstractAuthenticationProvider authenticationProvider)
         {
             CheckSessionParameters(sessionParameters, true);
             AddDefaultParameters(sessionParameters);
 
-            return new CmisBinding(sessionParameters);
+            return new CmisBinding(sessionParameters, authenticationProvider);
         }
 
-        public ICmisBinding CreateCmisAtomPubBinding(IDictionary<string, string> sessionParameters)
+        public ICmisBinding CreateCmisAtomPubBinding(IDictionary<string, string> sessionParameters, AbstractAuthenticationProvider authenticationProvider)
         {
             CheckSessionParameters(sessionParameters, false);
             sessionParameters[SessionParameter.BindingSpiClass] = BindingSpiAtomPub;
-            if (!sessionParameters.ContainsKey(SessionParameter.AuthenticationProviderClass))
+            if (authenticationProvider == null)
             {
-                sessionParameters[SessionParameter.AuthenticationProviderClass] = StandardAuthenticationProviderClass;
+                if (!sessionParameters.ContainsKey(SessionParameter.AuthenticationProviderClass))
+                {
+                    sessionParameters[SessionParameter.AuthenticationProviderClass] = StandardAuthenticationProviderClass;
+                }
             }
 
             AddDefaultParameters(sessionParameters);
 
             Check(sessionParameters, SessionParameter.AtomPubUrl);
 
-            return new CmisBinding(sessionParameters);
+            return new CmisBinding(sessionParameters, authenticationProvider);
         }
 
-        public ICmisBinding CreateCmisWebServicesBinding(IDictionary<string, string> sessionParameters)
+        public ICmisBinding CreateCmisWebServicesBinding(IDictionary<string, string> sessionParameters, AbstractAuthenticationProvider authenticationProvider)
         {
             CheckSessionParameters(sessionParameters, false);
             sessionParameters[SessionParameter.BindingSpiClass] = BindingSpiWebServices;
-            if (!sessionParameters.ContainsKey(SessionParameter.AuthenticationProviderClass))
+            if (authenticationProvider == null)
             {
-                sessionParameters[SessionParameter.AuthenticationProviderClass] = StandardAuthenticationProviderClass;
+                if (!sessionParameters.ContainsKey(SessionParameter.AuthenticationProviderClass))
+                {
+                    sessionParameters[SessionParameter.AuthenticationProviderClass] = StandardAuthenticationProviderClass;
+                }
             }
 
             AddDefaultParameters(sessionParameters);
@@ -263,7 +269,7 @@
             Check(sessionParameters, SessionParameter.WebServicesRepositoryService);
             Check(sessionParameters, SessionParameter.WebServicesVersioningService);
 
-            return new CmisBinding(sessionParameters);
+            return new CmisBinding(sessionParameters, authenticationProvider);
         }
 
         // ---- internals ----
diff --git a/DotCMIS/client/client-impl.cs b/DotCMIS/client/client-impl.cs
index e303bbc..cd0a89c 100644
--- a/DotCMIS/client/client-impl.cs
+++ b/DotCMIS/client/client-impl.cs
@@ -45,7 +45,12 @@
 
         public ISession CreateSession(IDictionary<string, string> parameters)
         {
-            Session session = new Session(parameters);
+            return CreateSession(parameters, null, null, null);
+        }
+
+        public ISession CreateSession(IDictionary<string, string> parameters, IObjectFactory objectFactory, AbstractAuthenticationProvider authenticationProvider, ICache cache)
+        {
+            Session session = new Session(parameters, objectFactory, authenticationProvider, cache);
             session.Connect();
 
             return session;
@@ -53,6 +58,11 @@
 
         public IList<IRepository> GetRepositories(IDictionary<string, string> parameters)
         {
+            return GetRepositories(parameters, null, null, null);
+        }
+
+        public IList<IRepository> GetRepositories(IDictionary<string, string> parameters, IObjectFactory objectFactory, AbstractAuthenticationProvider authenticationProvider, ICache cache)
+        {
             ICmisBinding binding = CmisBindingHelper.CreateBinding(parameters);
 
             IList<IRepositoryInfo> repositoryInfos = binding.GetRepositoryService().GetRepositoryInfos(null);
@@ -60,7 +70,7 @@
             IList<IRepository> result = new List<IRepository>();
             foreach (IRepositoryInfo data in repositoryInfos)
             {
-                result.Add(new Repository(data, parameters, this));
+                result.Add(new Repository(data, parameters, this, objectFactory, authenticationProvider, cache));
             }
 
             return result;
@@ -74,6 +84,11 @@
     {
         public static ICmisBinding CreateBinding(IDictionary<string, string> parameters)
         {
+            return CreateBinding(parameters, null);
+        }
+
+        public static ICmisBinding CreateBinding(IDictionary<string, string> parameters, AbstractAuthenticationProvider authenticationProvider)
+        {
             if (parameters == null)
             {
                 throw new ArgumentNullException("parameters");
@@ -88,36 +103,36 @@
             switch (bt)
             {
                 case BindingType.AtomPub:
-                    return CreateAtomPubBinding(parameters);
+                    return CreateAtomPubBinding(parameters, authenticationProvider);
                 case BindingType.WebServices:
-                    return CreateWebServiceBinding(parameters);
+                    return CreateWebServiceBinding(parameters, authenticationProvider);
                 case BindingType.Custom:
-                    return CreateCustomBinding(parameters);
+                    return CreateCustomBinding(parameters, authenticationProvider);
                 default:
                     throw new CmisRuntimeException("Ambiguous session parameter: " + parameters);
             }
         }
 
-        private static ICmisBinding CreateCustomBinding(IDictionary<string, string> parameters)
+        private static ICmisBinding CreateCustomBinding(IDictionary<string, string> parameters, AbstractAuthenticationProvider authenticationProvider)
         {
             CmisBindingFactory factory = CmisBindingFactory.NewInstance();
-            ICmisBinding binding = factory.CreateCmisBinding(parameters);
+            ICmisBinding binding = factory.CreateCmisBinding(parameters, authenticationProvider);
 
             return binding;
         }
 
-        private static ICmisBinding CreateWebServiceBinding(IDictionary<string, string> parameters)
+        private static ICmisBinding CreateWebServiceBinding(IDictionary<string, string> parameters, AbstractAuthenticationProvider authenticationProvider)
         {
             CmisBindingFactory factory = CmisBindingFactory.NewInstance();
-            ICmisBinding binding = factory.CreateCmisWebServicesBinding(parameters);
+            ICmisBinding binding = factory.CreateCmisWebServicesBinding(parameters, authenticationProvider);
 
             return binding;
         }
 
-        private static ICmisBinding CreateAtomPubBinding(IDictionary<string, string> parameters)
+        private static ICmisBinding CreateAtomPubBinding(IDictionary<string, string> parameters, AbstractAuthenticationProvider authenticationProvider)
         {
             CmisBindingFactory factory = CmisBindingFactory.NewInstance();
-            ICmisBinding binding = factory.CreateCmisAtomPubBinding(parameters);
+            ICmisBinding binding = factory.CreateCmisAtomPubBinding(parameters, authenticationProvider);
 
             return binding;
         }
@@ -129,20 +144,26 @@
     public class Repository : RepositoryInfo, IRepository
     {
         private IDictionary<string, string> parameters;
-        private ISessionFactory sessionFactory;
+        private SessionFactory sessionFactory;
+        private IObjectFactory objectFactory;
+        private AbstractAuthenticationProvider authenticationProvider;
+        private ICache cache;
 
-        public Repository(IRepositoryInfo info, IDictionary<string, string> parameters, ISessionFactory sessionFactory)
+        public Repository(IRepositoryInfo info, IDictionary<string, string> parameters, SessionFactory sessionFactory, IObjectFactory objectFactory, AbstractAuthenticationProvider authenticationProvider, ICache cache)
             : base(info)
         {
             this.parameters = new Dictionary<string, string>(parameters);
             this.parameters[SessionParameter.RepositoryId] = Id;
 
             this.sessionFactory = sessionFactory;
+            this.objectFactory = objectFactory;
+            this.authenticationProvider = authenticationProvider;
+            this.cache = cache;
         }
 
         public ISession CreateSession()
         {
-            return sessionFactory.CreateSession(parameters);
+            return sessionFactory.CreateSession(parameters, objectFactory, authenticationProvider, cache);
         }
     }
 
@@ -168,6 +189,7 @@
         public string RepositoryId { get { return RepositoryInfo.Id; } }
 
         public IObjectFactory ObjectFactory { get; protected set; }
+        protected AbstractAuthenticationProvider AuthenticationProvider { get; set; }
         protected ICache Cache { get; set; }
         protected bool cachePathOmit;
 
@@ -200,7 +222,7 @@
             }
         }
 
-        public Session(IDictionary<string, string> parameters)
+        public Session(IDictionary<string, string> parameters, IObjectFactory objectFactory, AbstractAuthenticationProvider authenticationProvider, ICache cache)
         {
             if (parameters == null)
             {
@@ -209,8 +231,9 @@
 
             this.parameters = parameters;
 
-            ObjectFactory = CreateObjectFactory();
-            Cache = CreateCache();
+            ObjectFactory = (objectFactory == null ? CreateObjectFactory() : objectFactory);
+            AuthenticationProvider = authenticationProvider;
+            Cache = (cache == null ? CreateCache() : cache);
 
             string cachePathOmitStr;
             if (parameters.TryGetValue(SessionParameter.CachePathOmit, out cachePathOmitStr))
@@ -228,7 +251,7 @@
             Lock();
             try
             {
-                Binding = CmisBindingHelper.CreateBinding(parameters);
+                Binding = CmisBindingHelper.CreateBinding(parameters, AuthenticationProvider);
 
                 string repositoryId;
                 if (!parameters.TryGetValue(SessionParameter.RepositoryId, out repositoryId))
