Index: app.config
===================================================================
--- app.config	(revision 1686)
+++ app.config	(working copy)
@@ -2,11 +2,12 @@
 <configuration>
     <configSections>
         <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="Rhino.Commons.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
             <section name="Rhino.Commons.NHibernate.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
         </sectionGroup>
     </configSections>
     <applicationSettings>
-        <Rhino.Commons.NHibernate.Properties.Settings>
+        <Rhino.Commons.Properties.Settings>
             <setting name="WindsorConfig" serializeAs="String">
                 <value>Windsor</value>
             </setting>
@@ -16,6 +17,9 @@
             <setting name="MaxNumberOfQueriesPerRequest" serializeAs="String">
                 <value>30</value>
             </setting>
-        </Rhino.Commons.NHibernate.Properties.Settings>
+            <setting name="LongConversationRequestKey" serializeAs="String">
+                <value>LongConversationKey</value>
+            </setting>
+        </Rhino.Commons.Properties.Settings>
     </applicationSettings>
 </configuration>
\ No newline at end of file
Index: HttpModules/UnitOfWorkApplication.cs
===================================================================
--- HttpModules/UnitOfWorkApplication.cs	(revision 1686)
+++ HttpModules/UnitOfWorkApplication.cs	(working copy)
@@ -55,40 +55,23 @@
             if (IoC.IsInitialized == false)
                 InitializeContainer(this);
 
-            IUnitOfWork currentUnitOfWork = null;
+			bool loadedConversation = false;
             if (IsAspSessionAvailable)
             {
-                currentUnitOfWork = (IUnitOfWork)HttpContext.Current.Session[UnitOfWork.CurrentUnitOfWorkKey];
+            	loadedConversation = LongConversationManager.LoadConversation();
             }
 
-            if (currentUnitOfWork == null)
+			if (!loadedConversation)
             {
                 UnitOfWork.Start();
             }
-            else
-            {
-                IUnitOfWork UoW;
-                Guid? longConversationId;
-
-                IoC.Resolve<IUnitOfWorkFactory>().
-                    MoveUnitOfWorkFromAspSessionIntoRequestContext(out UoW, out longConversationId);
-
-                UnitOfWork.Current = UoW;
-                UnitOfWork.CurrentLongConversationId = longConversationId;
-
-                UnitOfWork.CurrentSession.Reconnect();
-            }
         }
 
-
-
-
         private static bool IsAspSessionAvailable
         {
             get { return HttpContext.Current.Session != null; }
         }
 
-
         public virtual void UnitOfWorkApplication_EndRequest(object sender, EventArgs e)
         {
             if (HttpContext.Current.Server.GetLastError() == null && UnitOfWork.InLongConversation)
@@ -99,7 +82,7 @@
                     throw new InvalidOperationException(
                         "Session must be enabled when using Long Conversations! If you are using web services, make sure to use [WebMethod(EnabledSession=true)]");
                 }
-                IoC.Resolve<IUnitOfWorkFactory>().SaveUnitOfWorkToAspSession();
+				LongConversationManager.SaveConversation();
             }
             else
             {
@@ -108,10 +91,6 @@
             }
         }
 
-
-
-
-
         public IWindsorContainer Container
         {
             get
@@ -135,7 +114,6 @@
             self.CreateContainer();
         }
 
-
         public virtual void Application_End(object sender, EventArgs e)
         {
             if (Container != null) //can happen if this isn't the first app
@@ -145,7 +123,6 @@
             }
         }
 
-
         public override void Dispose()
         {
 			// we can't unregister to those, we get invalid operation exeption
Index: Properties/Settings.Designer.cs
===================================================================
--- Properties/Settings.Designer.cs	(revision 1686)
+++ Properties/Settings.Designer.cs	(working copy)
@@ -1,7 +1,7 @@
 ﻿//------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:2.0.50727.1434
+//     Runtime Version:2.0.50727.3053
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.
@@ -49,5 +49,14 @@
                 return ((int)(this["MaxNumberOfQueriesPerRequest"]));
             }
         }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("LongConversationKey")]
+        public string LongConversationRequestKey {
+            get {
+                return ((string)(this["LongConversationRequestKey"]));
+            }
+        }
     }
 }
Index: Properties/Settings.settings
===================================================================
--- Properties/Settings.settings	(revision 1686)
+++ Properties/Settings.settings	(working copy)
@@ -1,5 +1,5 @@
 ﻿<?xml version='1.0' encoding='utf-8'?>
-<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Rhino.Commons.NHibernate.Properties" GeneratedClassName="Settings">
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Rhino.Commons.Properties" GeneratedClassName="Settings">
   <Profiles />
   <Settings>
     <Setting Name="WindsorConfig" Type="System.String" Scope="Application">
@@ -11,5 +11,8 @@
     <Setting Name="MaxNumberOfQueriesPerRequest" Type="System.Int32" Scope="Application">
       <Value Profile="(Default)">30</Value>
     </Setting>
+    <Setting Name="LongConversationRequestKey" Type="System.String" Scope="Application">
+      <Value Profile="(Default)">LongConversationKey</Value>
+    </Setting>
   </Settings>
 </SettingsFile>
\ No newline at end of file
Index: Rhino.Commons.NHibernate-v2008.csproj
===================================================================
--- Rhino.Commons.NHibernate-v2008.csproj	(revision 1686)
+++ Rhino.Commons.NHibernate-v2008.csproj	(working copy)
@@ -2,7 +2,7 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{BF4E220E-5AF8-4448-ABA9-981D69AB8775}</ProjectGuid>
     <OutputType>Library</OutputType>
@@ -121,6 +121,7 @@
     <Compile Include="UnitOfWork\IUnitOfWork.cs" />
     <Compile Include="UnitOfWork\IUnitOfWorkFactory.cs" />
     <Compile Include="UnitOfWork\IUnitOfWorkImplementor.cs" />
+    <Compile Include="UnitOfWork\LongConversationManager.cs" />
     <Compile Include="UnitOfWork\MultipleNHibernateTransaction.cs" />
     <Compile Include="UnitOfWork\MultipleNHibernateUnitOfWorkFactory.cs" />
     <Compile Include="UnitOfWork\MultipleUnitOfWorkImplementor.cs" />
Index: UnitOfWork/IUnitOfWorkFactory.cs
===================================================================
--- UnitOfWork/IUnitOfWorkFactory.cs	(revision 1686)
+++ UnitOfWork/IUnitOfWorkFactory.cs	(working copy)
@@ -27,6 +27,7 @@
 #endregion
 
 using System;
+using System.Collections;
 using System.Data;
 using NHibernate;
 
@@ -61,15 +62,16 @@
         ///  When using LongConversation UnitOfWorkApplication uses this method to restore the
         ///  conversation between requests
         /// </summary>
+        /// <param name="hashtable">the Hashtable to load the unit of work from</param>
         /// <param name="iUoW">the IUnitOfWork that had been restored</param>
         /// <param name="LongConversationId">the Long Conversation Id</param>
-	    void MoveUnitOfWorkFromAspSessionIntoRequestContext(
-	        out IUnitOfWork iUoW, out Guid? LongConversationId);
+	    void LoadUnitOfWorkFromHashtable(Hashtable hashtable, out IUnitOfWork iUoW, out Guid? LongConversationId);
 
         /// <summary>
         ///  When using LongConversation UnitOfWorkApplication uses this method to store the
         ///  conversation between requests
         /// </summary>
-	    void SaveUnitOfWorkToAspSession();
+		/// <param name="hashtable">the Hashtable to save the unit of work to</param>
+	    void SaveUnitOfWorkToHashtable(Hashtable hashtable);
 	}
 }
Index: UnitOfWork/MultipleNHibernateUnitOfWorkFactory.cs
===================================================================
--- UnitOfWork/MultipleNHibernateUnitOfWorkFactory.cs	(revision 1686)
+++ UnitOfWork/MultipleNHibernateUnitOfWorkFactory.cs	(working copy)
@@ -1,4 +1,5 @@
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Data;
 using System.Web;
@@ -127,28 +128,22 @@
 		    unitOfWorkFactory.CurrentSession = session;
 		}
 
-	    public void MoveUnitOfWorkFromAspSessionIntoRequestContext(out IUnitOfWork iUoW, out Guid? LongConversationId)
+	    public void LoadUnitOfWorkFromHashtable(Hashtable hashtable, out IUnitOfWork iUoW, out Guid? LongConversationId)
 		{
-			iUoW = (IUnitOfWork)HttpContext.Current.Session[UnitOfWork.CurrentUnitOfWorkKey];
-			LongConversationId = (Guid?)HttpContext.Current.Session[UnitOfWork.CurrentLongConversationIdKey];
-			ISession[] sessions = (ISession[])HttpContext.Current.Session[CurrentNHibernateSessionKey];
+			iUoW = (IUnitOfWork)hashtable[UnitOfWork.CurrentUnitOfWorkKey];
+			LongConversationId = (Guid?)hashtable[UnitOfWork.CurrentLongConversationIdKey];
+			ISession[] sessions = (ISession[])hashtable[CurrentNHibernateSessionKey];
 			for (int i = 0; i < Count - 1; i++)
 			{
 				this[i].CurrentSession = sessions[i];
 			}
-
-
-			//avoids the temptation to access UnitOfWork from the HttpSession!
-			HttpContext.Current.Session[UnitOfWork.CurrentUnitOfWorkKey] = null;
-			HttpContext.Current.Session[CurrentNHibernateSessionKey] = null;
-			HttpContext.Current.Session[UnitOfWork.CurrentLongConversationIdKey] = null;
 		}
 
-		public void SaveUnitOfWorkToAspSession()
+		public void SaveUnitOfWorkToHashtable(Hashtable hashtable)
 		{
-			HttpContext.Current.Session[UnitOfWork.CurrentUnitOfWorkKey] = UnitOfWork.Current;
-			HttpContext.Current.Session[CurrentNHibernateSessionKey] = ConvertAll<ISession>(FactoryToSession).ToArray();
-			HttpContext.Current.Session[UnitOfWork.CurrentLongConversationIdKey] = UnitOfWork.CurrentLongConversationId;
+			hashtable[UnitOfWork.CurrentUnitOfWorkKey] = UnitOfWork.Current;
+			hashtable[CurrentNHibernateSessionKey] = ConvertAll<ISession>(FactoryToSession).ToArray();
+			hashtable[UnitOfWork.CurrentLongConversationIdKey] = UnitOfWork.CurrentLongConversationId;
 		}
 
 		private ISession FactoryToSession(IUnitOfWorkFactory factory)
Index: UnitOfWork/NHibernateUnitOfWorkFactory.cs
===================================================================
--- UnitOfWork/NHibernateUnitOfWorkFactory.cs	(revision 1686)
+++ UnitOfWork/NHibernateUnitOfWorkFactory.cs	(working copy)
@@ -233,26 +233,19 @@
 		}
 
 
-		public void MoveUnitOfWorkFromAspSessionIntoRequestContext(
-			out IUnitOfWork iUoW, out Guid? LongConversationId)
+		public void LoadUnitOfWorkFromHashtable(Hashtable hashtable, out IUnitOfWork iUoW, out Guid? LongConversationId)
 		{
-			iUoW = (IUnitOfWork)HttpContext.Current.Session[UnitOfWork.CurrentUnitOfWorkKey];
-			LongConversationId = (Guid?)HttpContext.Current.Session[UnitOfWork.CurrentLongConversationIdKey];
+			iUoW = (IUnitOfWork)hashtable[UnitOfWork.CurrentUnitOfWorkKey];
+			LongConversationId = (Guid?)hashtable[UnitOfWork.CurrentLongConversationIdKey];
 
-			UnitOfWork.CurrentSession = (ISession)HttpContext.Current.Session[CurrentNHibernateSessionKey];
-
-			//avoids the temptation to access UnitOfWork from the HttpSession!
-			HttpContext.Current.Session[UnitOfWork.CurrentUnitOfWorkKey] = null;
-			HttpContext.Current.Session[CurrentNHibernateSessionKey] = null;
-			HttpContext.Current.Session[UnitOfWork.CurrentLongConversationIdKey] = null;
+			UnitOfWork.CurrentSession = (ISession)hashtable[CurrentNHibernateSessionKey];
 		}
 
-		public virtual void SaveUnitOfWorkToAspSession()
+		public virtual void SaveUnitOfWorkToHashtable(Hashtable hashtable)
 		{
-			HttpContext.Current.Session[UnitOfWork.CurrentUnitOfWorkKey] = UnitOfWork.Current;
-			HttpContext.Current.Session[CurrentNHibernateSessionKey] = UnitOfWork.CurrentSession;
-			HttpContext.Current.Session[UnitOfWork.CurrentLongConversationIdKey] =
-				UnitOfWork.CurrentLongConversationId;
+			hashtable[UnitOfWork.CurrentUnitOfWorkKey] = UnitOfWork.Current;
+			hashtable[CurrentNHibernateSessionKey] = UnitOfWork.CurrentSession;
+			hashtable[UnitOfWork.CurrentLongConversationIdKey] = UnitOfWork.CurrentLongConversationId;
 		}
 
         public ISession GetCurrentSessionFor(string name)
Index: UnitOfWork/UnitOfWork.cs
===================================================================
--- UnitOfWork/UnitOfWork.cs	(revision 1686)
+++ UnitOfWork/UnitOfWork.cs	(working copy)
@@ -39,7 +39,9 @@
     {
         public const string CurrentUnitOfWorkKey = "CurrentUnitOfWork.Key";
         public const string CurrentLongConversationIdKey = "CurrentLongConversationId.Key";
+		public const string CurrentLongPrivateKey = "CurrentLongPrivate.Key";
 
+
         private static IUnitOfWork globalNonThreadSafeUnitOfwork;
 
         /// <summary>
@@ -60,6 +62,25 @@
             Local.Data[CurrentLongConversationIdKey] = Guid.NewGuid();
         }
 
+		/// <summary>
+		/// Signals the start of an application/user transaction that spans multiple page requests, 
+		/// but is not loaded without explicitly specifying the conversation key.
+		/// </summary>
+		/// <remarks>
+		/// Used in conjunction with <see cref="UnitOfWorkApplication"/>, will ensure that the current UoW
+		/// (see <see cref="Current"/>) is kept intact across multiple page requests. Review the <see cref="LongConversationManager"/> for details.
+		/// <para>
+		/// Note: This method does not start a physical database transaction.
+		/// </para>
+		/// </remarks>
+		public static Guid StartPrivateConversation()
+		{
+			if (InLongConversation)
+				throw new InvalidOperationException("You are already in a long conversation");
+			LongConversationIsPrivate = true;
+			return (Guid) (Local.Data[CurrentLongConversationIdKey] = Guid.NewGuid());
+		}
+
         /// <summary>
         /// Signals the end of the current application/user transaction <seealso cref="StartLongConversation"/>
         /// </summary>
@@ -93,6 +114,12 @@
             internal set { Local.Data[CurrentLongConversationIdKey] = value; }
         }
 
+		public static bool LongConversationIsPrivate
+		{
+			get { return Local.Data[CurrentLongPrivateKey] != null && ((bool)Local.Data[CurrentLongPrivateKey]); }
+			internal set { Local.Data[CurrentLongPrivateKey] = value; }
+		}
+
         public static IDisposable SetCurrentSessionName(string name)
         {
             return IoC.Resolve<IUnitOfWorkFactory>().SetCurrentSessionName(name);
