You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2018/07/02 21:25:24 UTC

[5/5] wicket git commit: WICKET-6563 new IPageStore implementation

WICKET-6563 new IPageStore implementation

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/bcf76f51
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bcf76f51
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bcf76f51

Branch: refs/heads/WICKET-6563
Commit: bcf76f517310ac5d27a2092595c3a925c3973067
Parents: 175734d
Author: Sven Meier <sv...@apache.org>
Authored: Mon Jun 25 17:19:41 2018 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Mon Jul 2 23:14:42 2018 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/Application.java     |  30 +-
 .../wicket/DefaultPageManagerProvider.java      | 132 ++--
 .../org/apache/wicket/IPageManagerProvider.java |   5 +-
 .../src/main/java/org/apache/wicket/Page.java   |  10 +-
 .../main/java/org/apache/wicket/Session.java    |   7 +-
 .../core/request/handler/PageProvider.java      |   1 -
 .../handler/RenderPageRequestHandler.java       |   2 +-
 .../org/apache/wicket/mock/MockApplication.java |   2 +-
 .../org/apache/wicket/mock/MockPageManager.java |  56 +-
 .../org/apache/wicket/mock/MockPageStore.java   |  60 ++
 .../apache/wicket/page/AbstractPageManager.java | 121 ----
 .../wicket/page/DefaultPageManagerContext.java  | 101 ---
 .../org/apache/wicket/page/IPageManager.java    |  80 +--
 .../apache/wicket/page/IPageManagerContext.java |  66 --
 .../wicket/page/PageAccessSynchronizer.java     |  42 +-
 .../org/apache/wicket/page/PageManager.java     |  88 +++
 .../wicket/page/PageManagerDecorator.java       | 100 ---
 .../apache/wicket/page/PageStoreManager.java    | 507 -------------
 .../org/apache/wicket/page/RequestAdapter.java  | 206 ------
 .../pageStore/AbstractCachingPageStore.java     | 105 ---
 .../wicket/pageStore/AbstractPageStore.java     | 154 ----
 .../wicket/pageStore/AsynchronousDataStore.java | 353 ---------
 .../wicket/pageStore/AsynchronousPageStore.java | 378 ++++++----
 .../wicket/pageStore/DefaultPageContext.java    | 103 +++
 .../wicket/pageStore/DefaultPageStore.java      | 469 ------------
 .../wicket/pageStore/DelegatingPageStore.java   |  67 ++
 .../apache/wicket/pageStore/DiskDataStore.java  | 589 ---------------
 .../apache/wicket/pageStore/DiskPageStore.java  | 719 +++++++++++++++++++
 .../wicket/pageStore/GroupingPageStore.java     | 289 ++++++++
 .../org/apache/wicket/pageStore/IDataStore.java |  83 ---
 .../apache/wicket/pageStore/IPageContext.java   | 102 +++
 .../org/apache/wicket/pageStore/IPageStore.java | 103 ++-
 .../apache/wicket/pageStore/IPersistedPage.java |  44 ++
 .../wicket/pageStore/IPersistentPageStore.java  |  51 ++
 .../wicket/pageStore/InMemoryPageStore.java     | 352 +++++++++
 .../wicket/pageStore/InSessionPageStore.java    | 268 +++++++
 .../apache/wicket/pageStore/NoopPageStore.java  |  53 ++
 .../wicket/pageStore/PageWindowManager.java     | 506 -------------
 .../wicket/pageStore/PerSessionPageStore.java   | 332 ---------
 .../wicket/pageStore/RequestPageStore.java      | 159 ++++
 .../wicket/pageStore/SecondLevelPageCache.java  |  42 --
 .../pageStore/disk/PageWindowManager.java       | 493 +++++++++++++
 .../pageStore/memory/HttpSessionDataStore.java  | 186 -----
 .../memory/IDataStoreEvictionStrategy.java      |  35 -
 .../memory/MemorySizeEvictionStrategy.java      |  64 --
 .../memory/PageNumberEvictionStrategy.java      |  62 --
 .../wicket/pageStore/memory/PageTable.java      | 128 ----
 .../pageStore/memory/PageTableCleaner.java      |  46 --
 .../apache/wicket/settings/StoreSettings.java   |  26 -
 .../wicket/util/tester/BaseWicketTester.java    |   8 +-
 .../core/request/mapper/TestMapperContext.java  |  47 +-
 .../DontStoreNotRenderedPageTestCase.java       |  23 +-
 .../html/TransparentWebMarkupContainerTest.java |   8 +-
 .../wicket/page/PageAccessSynchronizerTest.java |   2 +-
 .../wicket/page/PersistentPageManagerTest.java  |  75 +-
 .../persistent/disk/PageWindowManagerTest.java  | 301 --------
 .../wicket/pageStore/AbstractPageStoreTest.java |  61 +-
 .../pageStore/AsynchronousDataStoreTest.java    |  37 +-
 .../pageStore/AsynchronousPageStoreTest.java    | 135 ++--
 .../wicket/pageStore/DefaultPageStoreTest.java  |  31 -
 .../wicket/pageStore/DiskDataStoreTest.java     | 151 ++--
 .../wicket/pageStore/DummyPageContext.java      | 103 +++
 .../wicket/pageStore/GroupingPageStoreTest.java | 112 +++
 .../wicket/pageStore/InMemoryPageStoreTest.java |  31 +
 .../pageStore/InSessionPageStoreTest.java       |  32 +
 .../apache/wicket/pageStore/NoopDataStore.java  |  61 --
 .../pageStore/PerSessionPageStoreTest.java      |  53 --
 .../pageStore/disk/PageWindowManagerTest.java   | 303 ++++++++
 .../memory/DummyPageManagerContext.java         |  66 --
 .../memory/HttpSessionDataStoreTest.java        | 112 ---
 .../memory/MemorySizeEvictionStrategyTest.java  |  65 --
 .../memory/PageNumberEvictionStrategyTest.java  |  63 --
 .../wicket/pageStore/memory/PageTableTest.java  |  58 --
 .../request/handler/PageIdPoliticTest.java      |  25 +-
 .../request/handler/PageProviderTest.java       |  20 +-
 .../wicket/versioning/InMemoryPageStore.java    | 126 ----
 .../wicket/versioning/PageVersioningTest.java   |  28 +-
 .../devutils/debugbar/DebugBarInitializer.java  |   2 +-
 .../devutils/debugbar/InspectorDebugPanel.java  |  20 +-
 .../devutils/debugbar/PageSizeDebugPanel.java   | 104 ---
 .../devutils/debugbar/PageStoreDebugPanel.java  |  84 +++
 .../devutils/debugbar/StandardDebugPanel.java   |   4 +-
 .../devutils/diskstore/DebugDiskDataStore.java  | 100 ---
 .../diskstore/DebugPageManagerProvider.java     |  63 --
 .../diskstore/DiskStoreBrowserPage.html         |  31 -
 .../diskstore/DiskStoreBrowserPage.java         |  51 --
 .../devutils/diskstore/PageStorePage.html       |  31 +
 .../devutils/diskstore/PageStorePage.java       |  68 ++
 .../diskstore/browser/BrowserPanel.html         |   9 +-
 .../diskstore/browser/BrowserPanel.java         | 115 ++-
 .../diskstore/browser/BrowserTable.java         |  47 --
 .../diskstore/browser/DataStoreHelper.java      |  43 --
 .../diskstore/browser/PageWindowColumn.java     |  80 ---
 .../browser/PageWindowDescription.java          |  57 --
 .../diskstore/browser/PageWindowProvider.java   | 108 ---
 .../browser/PersistedPagesProvider.java         | 130 ++++
 .../browser/SessionIdentifiersModel.java        |  59 ++
 .../browser/SessionsProviderModel.java          |  57 --
 .../devutils/inspector/EnhancedPageView.java    |  37 +-
 .../devutils/inspector/InspectorPage.java       |  30 +-
 .../wicket/examples/frames/BodyFrame.java       |   6 +-
 .../apache/wicket/examples/StartExamples.java   |  13 +-
 .../ajax/markup/html/modal/ModalWindow.java     |   5 +-
 .../apache/wicket/jmx/StoreSettingsMBean.java   |  13 +-
 .../wicket/jmx/wrapper/StoreSettings.java       |   6 -
 .../ws/api/AbstractWebSocketProcessor.java      |   2 +-
 106 files changed, 4761 insertions(+), 6728 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/Application.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Application.java b/wicket-core/src/main/java/org/apache/wicket/Application.java
index 9415afa..64bf7ac 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Application.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Application.java
@@ -55,10 +55,9 @@ import org.apache.wicket.markup.parser.filter.WicketMessageTagHandler;
 import org.apache.wicket.markup.resolver.HtmlHeaderResolver;
 import org.apache.wicket.markup.resolver.WicketContainerResolver;
 import org.apache.wicket.markup.resolver.WicketMessageResolver;
-import org.apache.wicket.page.DefaultPageManagerContext;
 import org.apache.wicket.page.IPageManager;
-import org.apache.wicket.page.IPageManagerContext;
-import org.apache.wicket.pageStore.IDataStore;
+import org.apache.wicket.pageStore.DefaultPageContext;
+import org.apache.wicket.pageStore.IPageContext;
 import org.apache.wicket.pageStore.IPageStore;
 import org.apache.wicket.protocol.http.IRequestLogger;
 import org.apache.wicket.protocol.http.RequestLogger;
@@ -1355,11 +1354,6 @@ public abstract class Application implements UnboundListener, IEventSink
 	}
 
 	/**
-	 * Context for PageManager to interact with rest of Wicket
-	 */
-	private final IPageManagerContext pageManagerContext = new DefaultPageManagerContext();
-
-	/**
 	 * Returns an unsynchronized version of page manager
 	 * 
 	 * @return the page manager
@@ -1372,22 +1366,13 @@ public abstract class Application implements UnboundListener, IEventSink
 			{
 				if (pageManager == null)
 				{
-					pageManager = pageManagerProvider.apply(getPageManagerContext());
+					pageManager = pageManagerProvider.get();
 				}
 			}
 		}
 		return pageManager;
 	}
 
-	/**
-	 * 
-	 * @return the page manager context
-	 */
-	protected IPageManagerContext getPageManagerContext()
-	{
-		return pageManagerContext;
-	}
-
 	// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	//
@@ -1545,7 +1530,7 @@ public abstract class Application implements UnboundListener, IEventSink
 		{
 			session = newSession(requestCycle.getRequest(), requestCycle.getResponse());
 			ThreadContext.setSession(session);
-			internalGetPageManager().newSessionCreated();
+			internalGetPageManager().removeAllPages();
 			sessionListeners.onCreated(session);
 		}
 		else
@@ -1592,10 +1577,15 @@ public abstract class Application implements UnboundListener, IEventSink
 			@Override
 			public void onDetach(final RequestCycle requestCycle)
 			{
+				IPageManager pageManager;
+				
 				if (Session.exists())
 				{
-					Session.get().getPageManager().commitRequest();
+					pageManager = Session.get().getPageManager();
+				} else {
+					pageManager = internalGetPageManager();
 				}
+				pageManager.detach();
 
 				if (Application.exists())
 				{

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java b/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java
index f109472..c800935 100644
--- a/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java
+++ b/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java
@@ -19,22 +19,44 @@ package org.apache.wicket;
 import java.io.File;
 
 import org.apache.wicket.page.IPageManager;
-import org.apache.wicket.page.IPageManagerContext;
-import org.apache.wicket.page.PageStoreManager;
-import org.apache.wicket.pageStore.AsynchronousDataStore;
+import org.apache.wicket.page.PageManager;
 import org.apache.wicket.pageStore.AsynchronousPageStore;
-import org.apache.wicket.pageStore.DefaultPageStore;
-import org.apache.wicket.pageStore.DiskDataStore;
-import org.apache.wicket.pageStore.IDataStore;
+import org.apache.wicket.pageStore.DiskPageStore;
+import org.apache.wicket.pageStore.GroupingPageStore;
 import org.apache.wicket.pageStore.IPageStore;
+import org.apache.wicket.pageStore.InMemoryPageStore;
+import org.apache.wicket.pageStore.InSessionPageStore;
+import org.apache.wicket.pageStore.NoopPageStore;
+import org.apache.wicket.pageStore.RequestPageStore;
 import org.apache.wicket.serialize.ISerializer;
 import org.apache.wicket.settings.StoreSettings;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.lang.Bytes;
 
 /**
- * {@link IPageManagerProvider} implementation that creates new instance of {@link IPageManager}
- * that persists the pages in {@link DiskDataStore}
+ * A provider of a {@link PageManager} with a default chain of page {@link IPageStore}s:
+ * <ul>
+ * <li>{@link RequestPageStore} caching pages until end of the request</li>
+ * <li>{@link InSessionPageStore} keeping the last accessed page in the session</li>
+ * <li>{@link AsynchronousPageStore} moving storage of pages to a worker thread (if enabled in {@link StoreSettings#isAsynchronous()})</li>
+ * <li>{@link DiskPageStore} keeping all pages, configured according to {@link StoreSettings}</li>
+ * </ul>
+ * An alternative chain with all pages held in-memory could be:
+ * <ul>
+ * <li>{@link RequestPageStore} caching pages until end of the request</li>
+ * <li>{@link InSessionPageStore} keeping the last accessed page in the session</li>
+ * <li>{@link InMemoryPageStore} keeping all pages</li>
+ * </ul>
+ * ... or if all pages should be kept in the session only:
+ * <ul>
+ * <li>{@link RequestPageStore} caching pages until end of the request</li>
+ * <li>{@link InSessionPageStore} keeping a limited count of pages in the session, e.g. 10</li>
+ * <li>{@link NoopPageStore} discarding all exceeding pages</li>
+ * </ul>
+ * Other stores be may inserted ad libitum, e.g.
+ * <ul>
+ * <li>{@link GroupingPageStore} groups pages with their own maximum page limit</li>
+ * </ul>
  */
 public class DefaultPageManagerProvider implements IPageManagerProvider
 {
@@ -44,7 +66,7 @@ public class DefaultPageManagerProvider implements IPageManagerProvider
 	 * Constructor.
 	 *
 	 * @param application
-	 *          The application instance
+	 *            The application instance
 	 */
 	public DefaultPageManagerProvider(Application application)
 	{
@@ -52,53 +74,81 @@ public class DefaultPageManagerProvider implements IPageManagerProvider
 	}
 
 	@Override
-	public IPageManager apply(IPageManagerContext pageManagerContext)
+	public IPageManager get()
 	{
-		IDataStore dataStore = newDataStore();
+		IPageStore store = newPersistentStore();
 
-		StoreSettings storeSettings = getStoreSettings();
+		store = newAsynchronousStore(store);
 
-		IPageStore pageStore;
+		store = newSessionStore(store);
 
-		if (dataStore.canBeAsynchronous() && storeSettings.isAsynchronous())
-		{
-			int capacity = storeSettings.getAsynchronousQueueCapacity();
-			dataStore = new AsynchronousDataStore(dataStore, capacity);
-
-			pageStore = newPageStore(dataStore);
-
-			if (pageStore.canBeAsynchronous())
-			{
-				pageStore = new AsynchronousPageStore(pageStore, capacity);
-			}
-		}
-		else
-		{
-			pageStore = newPageStore(dataStore);
-		}
+		store = newRequestStore(store);
+		
+		return new PageManager(store);
+	}
 
-		return new PageStoreManager(application.getName(), pageStore, pageManagerContext);
+	/**
+	 * Get the {@link ISerializer} to use for serializing of pages.
+	 * 
+	 * @return how to serialize pages if needed for any {@link IPageStore}
+	 */
+	protected ISerializer getSerializer()
+	{
+		return application.getFrameworkSettings().getSerializer();
+	}
 
+	/**
+	 * Keep pages in the request until it is finished.
+	 * 
+	 * @see RequestPageStore
+	 */
+	protected IPageStore newRequestStore(IPageStore pageStore)
+	{
+		return new RequestPageStore(pageStore);
 	}
 
-	protected IPageStore newPageStore(IDataStore dataStore)
+	/**
+	 * After requests keep pages in the session.
+	 * 
+	 * @see InSessionPageStore
+	 */
+	protected IPageStore newSessionStore(IPageStore pageStore)
 	{
-		int inmemoryCacheSize = getStoreSettings().getInmemoryCacheSize();
-		ISerializer pageSerializer = application.getFrameworkSettings().getSerializer();
-		return new DefaultPageStore(pageSerializer, dataStore, inmemoryCacheSize);
+		return new InSessionPageStore(pageStore, getSerializer(), 1);
 	}
 
-	protected IDataStore newDataStore()
+	/**
+	 * Store pages asynchronously into the persistent store.
+	 * 
+	 * @see AsynchronousPageStore
+	 * @see StoreSettings#isAsynchronous()
+	 */
+	protected IPageStore newAsynchronousStore(IPageStore pageStore)
 	{
-		StoreSettings storeSettings = getStoreSettings();
-		Bytes maxSizePerSession = storeSettings.getMaxSizePerSession();
-		File fileStoreFolder = storeSettings.getFileStoreFolder();
+		StoreSettings storeSettings = application.getStoreSettings();
 
-		return new DiskDataStore(application.getName(), fileStoreFolder, maxSizePerSession);
+		if (storeSettings.isAsynchronous())
+		{
+			int capacity = storeSettings.getAsynchronousQueueCapacity();
+			pageStore = new AsynchronousPageStore(pageStore, capacity);
+		}
+
+		return pageStore;
 	}
 
-	StoreSettings getStoreSettings()
+	/**
+	 * Keep pages persistent on disk.
+	 * 
+	 * @see DiskPageStore
+	 * @see StoreSettings#getMaxSizePerSession()
+	 * @see StoreSettings#getFileStoreFolder()
+	 */
+	protected IPageStore newPersistentStore()
 	{
-		return application.getStoreSettings();
+		StoreSettings storeSettings = application.getStoreSettings();
+		Bytes maxSizePerSession = storeSettings.getMaxSizePerSession();
+		File fileStoreFolder = storeSettings.getFileStoreFolder();
+
+		return new DiskPageStore(application.getName(), getSerializer(), fileStoreFolder, maxSizePerSession);
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/IPageManagerProvider.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/IPageManagerProvider.java b/wicket-core/src/main/java/org/apache/wicket/IPageManagerProvider.java
index 557a7aa..ce40fcc 100644
--- a/wicket-core/src/main/java/org/apache/wicket/IPageManagerProvider.java
+++ b/wicket-core/src/main/java/org/apache/wicket/IPageManagerProvider.java
@@ -16,11 +16,10 @@
  */
 package org.apache.wicket;
 
-import java.util.function.Function;
+import java.util.function.Supplier;
 
 import org.apache.wicket.page.IPageManager;
-import org.apache.wicket.page.IPageManagerContext;
 
-public interface IPageManagerProvider extends Function<IPageManagerContext, IPageManager>
+public interface IPageManagerProvider extends Supplier<IPageManager>
 {
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/Page.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Page.java b/wicket-core/src/main/java/org/apache/wicket/Page.java
index a1f3b29..935e1f9 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Page.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Page.java
@@ -275,7 +275,7 @@ public abstract class Page extends MarkupContainer
 		}
 
 		final IPageManager pageManager = getSession().getPageManager();
-		if (!getFlag(FLAG_IS_DIRTY) && (isVersioned() && pageManager.supportsVersioning() ||
+		if (!getFlag(FLAG_IS_DIRTY) && (isVersioned() ||
 
 		// we need to get pageId for new page instances even when the page doesn't need
 		// versioning, otherwise pages override each other in the page store and back button
@@ -287,7 +287,7 @@ public abstract class Page extends MarkupContainer
 
 			if (isInitialization == false)
 			{
-				pageManager.touchPage(this);
+				pageManager.addPage(this);
 			}
 		}
 	}
@@ -298,7 +298,7 @@ public abstract class Page extends MarkupContainer
 		super.onInitialize();
 
 		final IPageManager pageManager = getSession().getPageManager();
-		pageManager.touchPage(this);
+		pageManager.addPage(this);
 	}
 
 	/**
@@ -825,7 +825,7 @@ public abstract class Page extends MarkupContainer
 			getSession().getSessionStore().getSessionId(RequestCycle.get().getRequest(), true);
 
 			// Add/touch the response page in the session.
-			getSession().getPageManager().touchPage(this);
+			getSession().getPageManager().addPage(this);
 		}
 
 		if (getApplication().getDebugSettings().isOutputMarkupContainerClassName())
@@ -936,7 +936,7 @@ public abstract class Page extends MarkupContainer
 		setStatelessHint(false);
 
 		// make sure the page will be available on following request
-		getSession().getPageManager().touchPage(this);
+		getSession().getPageManager().addPage(this);
 
 		return new PageReference(numericId);
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/Session.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Session.java b/wicket-core/src/main/java/org/apache/wicket/Session.java
index cb8f4a2..8df8577 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Session.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Session.java
@@ -37,6 +37,7 @@ import org.apache.wicket.feedback.FeedbackMessage;
 import org.apache.wicket.feedback.FeedbackMessages;
 import org.apache.wicket.page.IPageManager;
 import org.apache.wicket.page.PageAccessSynchronizer;
+import org.apache.wicket.pageStore.IPageStore;
 import org.apache.wicket.request.Request;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.session.ISessionStore;
@@ -290,7 +291,7 @@ public abstract class Session implements IClusterable, IEventSink
 	{
 		if (isTemporary() == false)
 		{
-			getPageManager().clear();
+			getPageManager().removeAllPages();
 		}
 	}
 
@@ -907,8 +908,8 @@ public abstract class Session implements IClusterable, IEventSink
 	 */
 	public final IPageManager getPageManager()
 	{
-		IPageManager pageManager = Application.get().internalGetPageManager();
-		return pageAccessSynchronizer.get().adapt(pageManager);
+		IPageManager manager = Application.get().internalGetPageManager();
+		return pageAccessSynchronizer.get().adapt(manager);
 	}
 
 	/** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java
index 7bd473e..bd45693 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java
@@ -19,7 +19,6 @@ package org.apache.wicket.core.request.handler;
 import org.apache.wicket.Application;
 import org.apache.wicket.core.request.mapper.IPageSource;
 import org.apache.wicket.core.request.mapper.StalePageException;
-import org.apache.wicket.page.IPageManager;
 import org.apache.wicket.protocol.http.PageExpiredException;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.IRequestMapper;

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RenderPageRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RenderPageRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RenderPageRequestHandler.java
index 156d420..642d40f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RenderPageRequestHandler.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RenderPageRequestHandler.java
@@ -136,7 +136,7 @@ public class RenderPageRequestHandler
 			if (Session.exists())
 			{
 				// WICKET-5499
-				Session.get().getPageManager().touchPage(pageProvider.getPageInstance());
+				Session.get().getPageManager().addPage(pageProvider.getPageInstance());
 			}
 		}
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/mock/MockApplication.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/mock/MockApplication.java b/wicket-core/src/main/java/org/apache/wicket/mock/MockApplication.java
index 1c0a99d..4ae6f41 100644
--- a/wicket-core/src/main/java/org/apache/wicket/mock/MockApplication.java
+++ b/wicket-core/src/main/java/org/apache/wicket/mock/MockApplication.java
@@ -67,7 +67,7 @@ public class MockApplication extends WebApplication
 
 		// set page and session store providers
 		setSessionStoreProvider(MockSessionStore::new);
-		setPageManagerProvider((pageManagerContext) -> new MockPageManager());
+		setPageManagerProvider(() -> new MockPageManager());
 
 		// for test cases we usually want stable resource names
 		getResourceSettings().setCachingStrategy(NoOpResourceCachingStrategy.INSTANCE);

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/mock/MockPageManager.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/mock/MockPageManager.java b/wicket-core/src/main/java/org/apache/wicket/mock/MockPageManager.java
index b27dc7e..05bb520 100644
--- a/wicket-core/src/main/java/org/apache/wicket/mock/MockPageManager.java
+++ b/wicket-core/src/main/java/org/apache/wicket/mock/MockPageManager.java
@@ -21,7 +21,7 @@ import java.util.Map;
 
 import org.apache.wicket.page.IManageablePage;
 import org.apache.wicket.page.IPageManager;
-import org.apache.wicket.page.IPageManagerContext;
+import org.apache.wicket.pageStore.IPageStore;
 
 /**
  * Simple {@link IPageManager} used for testing.
@@ -32,19 +32,6 @@ public class MockPageManager implements IPageManager
 {
 	private final Map<Integer, IManageablePage> pages = new HashMap<>();
 
-	/**
-	 * Construct.
-	 * 
-	 */
-	public MockPageManager()
-	{
-	}
-
-	@Override
-	public void commitRequest()
-	{
-	}
-
 	@Override
 	public void destroy()
 	{
@@ -59,54 +46,29 @@ public class MockPageManager implements IPageManager
 
 	@Override
 	public void removePage(final IManageablePage page) {
-		if (page != null) {
-			pages.remove(page.getPageId());
-		}
+		pages.remove(page.getPageId());
 	}
 
 	@Override
-	public void newSessionCreated()
+	public void addPage(IManageablePage page)
 	{
-		pages.clear();
+		pages.put(page.getPageId(), page);
 	}
 
 	@Override
-	public void clear()
+	public void removeAllPages()
 	{
 		pages.clear();
 	}
 
-	/**
-	 * @param context
-	 */
-	public void setContext(IPageManagerContext context)
-	{
-	}
-
-	@Override
-	public boolean supportsVersioning()
-	{
-		return true;
-	}
-
 	@Override
-	public void touchPage(IManageablePage page)
+	public void detach()
 	{
-		if (true || page.isPageStateless() == false)
-		{
-			pages.put(page.getPageId(), page);
-		}
-	}
-
-	@Override
-	public void untouchPage(IManageablePage page)
-	{
-		pages.remove(page.getPageId());
 	}
 
 	@Override
-	public IPageManagerContext getContext()
+	public IPageStore getPageStore()
 	{
-		return null;
+		throw new UnsupportedOperationException();
 	}
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/mock/MockPageStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/mock/MockPageStore.java b/wicket-core/src/main/java/org/apache/wicket/mock/MockPageStore.java
new file mode 100644
index 0000000..cb4eaec
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/mock/MockPageStore.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.mock;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.wicket.page.IManageablePage;
+import org.apache.wicket.pageStore.IPageContext;
+import org.apache.wicket.pageStore.IPageStore;
+
+public class MockPageStore implements IPageStore
+{
+	private final Map<Integer, IManageablePage> pages = new HashMap<>();
+
+	@Override
+	public void destroy()
+	{
+		pages.clear();
+	}
+
+	@Override
+	public IManageablePage getPage(IPageContext context, int id)
+	{
+		return pages.get(id);
+	}
+
+	@Override
+	public void removePage(IPageContext context, final IManageablePage page) {
+		if (page != null) {
+			pages.remove(page.getPageId());
+		}
+	}
+
+	@Override
+	public void removeAllPages(IPageContext context)
+	{
+		pages.clear();
+	}
+
+	@Override
+	public void addPage(IPageContext context, IManageablePage page)
+	{
+		pages.put(page.getPageId(), page);
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/page/AbstractPageManager.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/page/AbstractPageManager.java b/wicket-core/src/main/java/org/apache/wicket/page/AbstractPageManager.java
deleted file mode 100644
index 03b26aa..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/page/AbstractPageManager.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.page;
-
-import org.apache.wicket.util.lang.Args;
-
-/**
- * Convenience class for {@link IPageManager} implementations. Subclass should extend
- * {@link RequestAdapter} and override {@link #newRequestAdapter(IPageManagerContext)} method to return it's
- * {@link RequestAdapter} implementation.
- * 
- * @author Matej Knopp
- */
-public abstract class AbstractPageManager implements IPageManager
-{
-	private final IPageManagerContext context;
-
-	/**
-	 * Construct.
-	 * 
-	 * @param context
-	 */
-	public AbstractPageManager(IPageManagerContext context)
-	{
-		this.context = Args.notNull(context, "context");
-	}
-
-	/**
-	 * 
-	 * @param context
-	 * @return a new request adapter
-	 */
-	protected abstract RequestAdapter newRequestAdapter(IPageManagerContext context);
-
-	/**
-	 * @return The page manager context
-	 */
-	@Override
-	public IPageManagerContext getContext()
-	{
-		return context;
-	}
-
-	/**
-	 * @see #newRequestAdapter(IPageManagerContext)
-	 * @return the request adapter
-	 */
-	protected RequestAdapter getRequestAdapter()
-	{
-		RequestAdapter adapter = (RequestAdapter)getContext().getRequestData();
-		if (adapter == null)
-		{
-			adapter = newRequestAdapter(getContext());
-			getContext().setRequestData(adapter);
-		}
-		return adapter;
-	}
-
-	@Override
-	public void commitRequest()
-	{
-		getRequestAdapter().commitRequest();
-	}
-
-	@Override
-	public IManageablePage getPage(int id)
-	{
-		IManageablePage page = getRequestAdapter().getPage(id);
-		if (page != null)
-		{
-			touchPage(page);
-		}
-		return page;
-	}
-
-	@Override
-	public void removePage(final IManageablePage page) {
-		if (page != null)
-		{
-			getRequestAdapter().removePage(page);
-		}
-	}
-
-	@Override
-	public void newSessionCreated()
-	{
-		getRequestAdapter().newSessionCreated();
-	}
-
-	@Override
-	public void touchPage(IManageablePage page)
-	{
-		if (page != null)
-		{
-			getRequestAdapter().touch(page);
-		}
-	}
-
-	@Override
-	public void untouchPage(IManageablePage page)
-	{
-		if (page != null)
-		{
-			getRequestAdapter().untouch(page);
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/page/DefaultPageManagerContext.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/page/DefaultPageManagerContext.java b/wicket-core/src/main/java/org/apache/wicket/page/DefaultPageManagerContext.java
deleted file mode 100644
index 78f4b49..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/page/DefaultPageManagerContext.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.page;
-
-import java.io.Serializable;
-
-import org.apache.wicket.MetaDataKey;
-import org.apache.wicket.Session;
-import org.apache.wicket.request.cycle.RequestCycle;
-
-/**
- * Wicket's default page manager context
- * 
- * @author Juergen Donnerstag
- */
-public class DefaultPageManagerContext implements IPageManagerContext
-{
-	private static final MetaDataKey<Object> requestCycleMetaDataKey = new MetaDataKey<Object>()
-	{
-		private static final long serialVersionUID = 1L;
-	};
-
-	/**
-	 * @see org.apache.wicket.page.IPageManagerContext#bind()
-	 */
-	@Override
-	public void bind()
-	{
-		Session.get().bind();
-	}
-
-	/**
-	 * @see org.apache.wicket.page.IPageManagerContext#getRequestData()
-	 */
-	@Override
-	public Object getRequestData()
-	{
-		RequestCycle requestCycle = RequestCycle.get();
-		if (requestCycle == null)
-		{
-			throw new IllegalStateException("Not a request thread.");
-		}
-		return requestCycle.getMetaData(requestCycleMetaDataKey);
-	}
-
-	/**
-	 * @see org.apache.wicket.page.IPageManagerContext#getSessionAttribute(java.lang.String)
-	 */
-	@Override
-	public Serializable getSessionAttribute(final String key)
-	{
-		return Session.get().getAttribute(key);
-	}
-
-	/**
-	 * @see org.apache.wicket.page.IPageManagerContext#getSessionId()
-	 */
-	@Override
-	public String getSessionId()
-	{
-		return Session.get().getId();
-	}
-
-	/**
-	 * @see org.apache.wicket.page.IPageManagerContext#setRequestData(Object)
-	 */
-	@Override
-	public void setRequestData(final Object data)
-	{
-		RequestCycle requestCycle = RequestCycle.get();
-		if (requestCycle == null)
-		{
-			throw new IllegalStateException("Not a request thread.");
-		}
-		requestCycle.setMetaData(requestCycleMetaDataKey, data);
-	}
-
-	/**
-	 * @see org.apache.wicket.page.IPageManagerContext#setSessionAttribute(java.lang.String,
-	 *      java.io.Serializable)
-	 */
-	@Override
-	public void setSessionAttribute(String key, Serializable value)
-	{
-		Session.get().setAttribute(key, value);
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java b/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
index a19a0e3..9d517df 100644
--- a/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
+++ b/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
@@ -16,89 +16,59 @@
  */
 package org.apache.wicket.page;
 
+import org.apache.wicket.Page;
+import org.apache.wicket.pageStore.IPageStore;
 
 /**
- * Page manager.
- * 
- * @author Matej Knopp
+ * A manager of pages - facade between {@link Page}s and {@link IPageStore}s they are stored in.
  */
 public interface IPageManager
 {
-	/**
-	 * 
-	 * @return the page manager context
-	 */
-	IPageManagerContext getContext();
 
 	/**
-	 * Retrieve page instance with given id.
+	 * Get a page
 	 * 
-	 * @param id
-	 *      the id of the page to load
-	 * @return page instance or <code>null</code>
-	 * @throws CouldNotLockPageException if the page is already locked by another thread
-	 * and the lock cannot be acquired for some timeout
-	 */
-	IManageablePage getPage(int id) throws CouldNotLockPageException;
-
-	/**
-	 * Removes a page from the {@link org.apache.wicket.pageStore.IPageStore} and
-	 * {@link org.apache.wicket.pageStore.IDataStore}. Any attempt to access it later
-	 * will lead to {@link org.apache.wicket.protocol.http.PageExpiredException}
-	 *
-	 * @param page The page instance to remove from the stores
+	 * @param pageId
+	 *            id of page
+	 * @return page, may be <code>null</code>
 	 */
-	void removePage(IManageablePage page);
+	IManageablePage getPage(int pageId);
 
 	/**
-	 * Marks page as changed.
-	 * <p><strong>Note:</strong>Only stateful pages are stored.</p>
+	 * Remove a page
 	 * 
 	 * @param page
-	 *      the page that should be stored in the page stores at the end of the request.
-	 * @throws CouldNotLockPageException if the page is already locked by another thread
-	 * and the lock cannot be acquired for some timeout
-	 */
-	void touchPage(IManageablePage page);
-
-	/**
-	 * Marks page as non-changed.
-	 * Could be used in Ajax requests to avoid storing the page if no changes have happened.
-	 *
-	 * @param page
-	 *      the page that should <strong>not</strong> be stored in the page stores at the end of the request.
-	 * @throws CouldNotLockPageException if the page is already locked by another thread
-	 * and the lock cannot be acquired for some timeout
+	 *            page to remove
 	 */
-	void untouchPage(IManageablePage page);
+	void removePage(IManageablePage page);
 
 	/**
-	 * Returns whether this manager supports versioning. Managers that support versioning must store
-	 * page snapshots.
+	 * Add a page.
 	 * 
-	 * @return whether this page manager supports versioning
+	 * @param page
+	 *            page to add
 	 */
-	boolean supportsVersioning();
+	void addPage(IManageablePage page);
 
 	/**
-	 * Commits the changes to external storage if the manager uses it.
-	 * 
-	 * Should also detach all pages that were touched during this request.
+	 * Remove all pages.
 	 */
-	void commitRequest();
+	void removeAllPages();
 
 	/**
-	 * Invoked when new session has been created.
+	 * Detach at end of request.
 	 */
-	void newSessionCreated();
+	void detach();
 
 	/**
-	 * Clears all data for the current session.
+	 * Destroy when application is destroyed.
 	 */
-	void clear();
+	void destroy();
 
 	/**
-	 * Destroy the page manager.
+	 * Get the storage of pages, optional.
+	 *  
+	 * @return store or <code>null</code>
 	 */
-	void destroy();
+	IPageStore getPageStore();
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/page/IPageManagerContext.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/page/IPageManagerContext.java b/wicket-core/src/main/java/org/apache/wicket/page/IPageManagerContext.java
deleted file mode 100644
index d928606..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/page/IPageManagerContext.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.page;
-
-import java.io.Serializable;
-
-/**
- * Context object for {@link IPageManager}. This decouples the {@link IPageManager} from request
- * cycle and session.
- * 
- * @author Matej Knopp
- */
-public interface IPageManagerContext
-{
-	/**
-	 * 
-	 * @param data
-	 */
-	void setRequestData(Object data);
-
-	/**
-	 * 
-	 * @return request data
-	 */
-	Object getRequestData();
-
-	/**
-	 * 
-	 * @param key
-	 * @param value
-	 */
-	void setSessionAttribute(String key, Serializable value);
-
-	/**
-	 * 
-	 * @param key
-	 * @return The session attribute associate with the key
-	 */
-	Serializable getSessionAttribute(String key);
-
-	/**
-	 * Tells Wicket to bind the current session. This make a temporary session become persistent
-	 * across requests.
-	 */
-	void bind();
-
-	/**
-	 * 
-	 * @return session id
-	 */
-	String getSessionId();
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/page/PageAccessSynchronizer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/page/PageAccessSynchronizer.java b/wicket-core/src/main/java/org/apache/wicket/page/PageAccessSynchronizer.java
index d44b86a..c50fb20 100644
--- a/wicket-core/src/main/java/org/apache/wicket/page/PageAccessSynchronizer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/page/PageAccessSynchronizer.java
@@ -23,6 +23,7 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.function.Supplier;
 
 import org.apache.wicket.Application;
+import org.apache.wicket.pageStore.IPageStore;
 import org.apache.wicket.settings.ExceptionSettings.ThreadDumpStrategy;
 import org.apache.wicket.util.LazyInitializer;
 import org.apache.wicket.util.lang.Threads;
@@ -230,12 +231,12 @@ public class PageAccessSynchronizer implements Serializable
 	/**
 	 * Wraps a page manager with this synchronizer
 	 * 
-	 * @param pagemanager
+	 * @param manager
 	 * @return wrapped page manager
 	 */
-	public IPageManager adapt(IPageManager pagemanager)
+	public IPageManager adapt(final IPageManager manager)
 	{
-		return new PageManagerDecorator(pagemanager)
+		return new IPageManager()
 		{
 			@Override
 			public IManageablePage getPage(int pageId)
@@ -244,7 +245,7 @@ public class PageAccessSynchronizer implements Serializable
 				try
 				{
 					lockPage(pageId);
-					page = super.getPage(pageId);
+					page = manager.getPage(pageId);
 				}
 				finally
 				{
@@ -257,13 +258,13 @@ public class PageAccessSynchronizer implements Serializable
 			}
 
 			@Override
-			public void removePage(final IManageablePage page) {
+			public void removePage(IManageablePage page)
+			{
 				if (page != null)
 				{
 					try
 					{
-						super.removePage(page);
-						untouchPage(page);
+						manager.removePage(page);
 					}
 					finally
 					{
@@ -273,24 +274,43 @@ public class PageAccessSynchronizer implements Serializable
 			}
 
 			@Override
-			public void touchPage(IManageablePage page)
+			public void addPage(IManageablePage page)
 			{
 				lockPage(page.getPageId());
-				super.touchPage(page);
+				
+				manager.addPage(page);
 			}
 
 			@Override
-			public void commitRequest()
+			public void removeAllPages()
+			{
+				manager.removeAllPages();
+			}
+			
+			@Override
+			public void detach()
 			{
 				try
 				{
-					super.commitRequest();
+					manager.detach();
 				}
 				finally
 				{
 					unlockAllPages();
 				}
 			}
+			
+			@Override
+			public IPageStore getPageStore()
+			{
+				return manager.getPageStore();
+			}
+			
+			@Override
+			public void destroy()
+			{
+				manager.destroy();
+			}
 		};
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java b/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
new file mode 100644
index 0000000..ab58c41
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.page;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.Session;
+import org.apache.wicket.pageStore.DefaultPageContext;
+import org.apache.wicket.pageStore.IPageContext;
+import org.apache.wicket.pageStore.IPageStore;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A manager of pages, i.e. a mediator between an {@link Application} and an {@link IPageStore}.
+ */
+public class PageManager implements IPageManager
+{
+	private final IPageStore store;
+	
+	public PageManager(IPageStore store) {
+		this.store = Args.notNull(store, "store");
+	}
+
+	@Override
+	public IManageablePage getPage(int pageId)
+	{
+		return store.getPage(createPageContext(), pageId);
+	}
+
+	@Override
+	public void removePage(IManageablePage page)
+	{
+		store.removePage(createPageContext(), page);
+	}
+
+	@Override
+	public void addPage(IManageablePage page)
+	{
+		store.addPage(createPageContext(), page);
+	}
+
+	@Override
+	public void removeAllPages()
+	{
+		store.removeAllPages(createPageContext());
+	}
+
+	@Override
+	public void detach()
+	{
+		store.detach(createPageContext());
+	}
+
+	/**
+	 * Factory method for an {@link IPageContext}, returns a {@link DefaultPageContext} by default.
+	 * 
+	 * @return
+	 */
+	protected IPageContext createPageContext()
+	{
+		return new DefaultPageContext(Session.get());
+	}
+
+	@Override
+	public void destroy()
+	{
+		store.destroy();
+	}
+	
+	@Override
+	public IPageStore getPageStore()
+	{
+		return store;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/page/PageManagerDecorator.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/page/PageManagerDecorator.java b/wicket-core/src/main/java/org/apache/wicket/page/PageManagerDecorator.java
deleted file mode 100644
index 8f719f8..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/page/PageManagerDecorator.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.page;
-
-import org.apache.wicket.util.lang.Args;
-
-/**
- * Decorator for {@link IPageManager}
- * 
- * @author igor
- */
-public class PageManagerDecorator implements IPageManager
-{
-	private final IPageManager delegate;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param delegate
-	 */
-	public PageManagerDecorator(IPageManager delegate)
-	{
-		Args.notNull(delegate, "delegate");
-		this.delegate = delegate;
-	}
-
-	@Override
-	public IPageManagerContext getContext()
-	{
-		return delegate.getContext();
-	}
-
-	@Override
-	public IManageablePage getPage(int id)
-	{
-		return delegate.getPage(id);
-	}
-
-	@Override
-	public void removePage(final IManageablePage page) {
-		delegate.removePage(page);
-	}
-
-	@Override
-	public void touchPage(IManageablePage page)
-	{
-		delegate.touchPage(page);
-	}
-
-	@Override
-	public void untouchPage(IManageablePage page)
-	{
-		delegate.untouchPage(page);
-	}
-
-	@Override
-	public boolean supportsVersioning()
-	{
-		return delegate.supportsVersioning();
-	}
-
-	@Override
-	public void commitRequest()
-	{
-		delegate.commitRequest();
-	}
-
-	@Override
-	public void newSessionCreated()
-	{
-		delegate.newSessionCreated();
-	}
-
-	@Override
-	public void clear()
-	{
-		delegate.clear();
-	}
-
-	@Override
-	public void destroy()
-	{
-		delegate.destroy();
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/page/PageStoreManager.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/page/PageStoreManager.java b/wicket-core/src/main/java/org/apache/wicket/page/PageStoreManager.java
deleted file mode 100644
index 88c1645..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/page/PageStoreManager.java
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.page;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import javax.servlet.http.HttpSessionBindingEvent;
-import javax.servlet.http.HttpSessionBindingListener;
-
-import org.apache.wicket.pageStore.IPageStore;
-
-/**
- * 
- */
-public class PageStoreManager extends AbstractPageManager
-{
-	/**
-	 * A cache that holds all registered page managers. <br/>
-	 * applicationName -> page manager
-	 */
-	private static final ConcurrentMap<String, PageStoreManager> MANAGERS = new ConcurrentHashMap<>();
-
-	private static final String ATTRIBUTE_NAME = "wicket:persistentPageManagerData";
-
-	/**
-	 * A flag indicating whether this session entry is being re-set in the Session.
-	 * <p>
-	 * Web containers intercept
-	 * {@link javax.servlet.http.HttpSession#setAttribute(String, Object)} to detect changes and
-	 * replicate the session. If the attribute has been already bound in the session then
-	 * {@link #valueUnbound(HttpSessionBindingEvent)} might get called - this flag
-	 * helps us to ignore the invocation in that case.
-	 * 
-	 * @see #valueUnbound(HttpSessionBindingEvent)
-	 */
-	private static final ThreadLocal<Boolean> STORING_TOUCHED_PAGES = new ThreadLocal<Boolean>()
-	{
-		protected Boolean initialValue()
-		{
-			return Boolean.FALSE;
-		};
-	};
-
-	private final IPageStore pageStore;
-	
-	private final String applicationName;
-	
-	/**
-	 * Construct.
-	 * 
-	 * @param applicationName
-	 * @param pageStore
-	 * @param context
-	 */
-	public PageStoreManager(final String applicationName, final IPageStore pageStore,
-		final IPageManagerContext context)
-	{
-		super(context);
-
-		this.applicationName = applicationName;
-		this.pageStore = pageStore;
-
-		if (MANAGERS.containsKey(applicationName))
-		{
-			throw new IllegalStateException(
-				"Manager for application with key '" + applicationName + "' already exists.");
-		}
-		MANAGERS.put(applicationName, this);
-	}
-
-	/**
-	 * Represents entry for single session. This is stored as session attribute and caches pages
-	 * between requests.
-	 * 
-	 * @author Matej Knopp
-	 */
-	private static class SessionEntry implements Serializable, HttpSessionBindingListener
-	{
-		private static final long serialVersionUID = 1L;
-
-		private final String applicationName;
-
-		/**
-		 * The id handed to the {@link IPageStore} to identify the session.
-		 * <p>
-		 * Note: If the container changes a session's id, this field remains unchanged on its
-		 * initial value.
-		 */
-		private final String sessionId;
-
-		private transient List<IManageablePage> sessionCache;
-		private transient List<Object> afterReadObject;
-
-
-		/**
-		 * Construct.
-		 * 
-		 * @param applicationName
-		 * @param sessionId
-		 */
-		public SessionEntry(String applicationName, String sessionId)
-		{
-			this.applicationName = applicationName;
-			this.sessionId = sessionId;
-		}
-
-		/**
-		 * 
-		 * @return page store
-		 */
-		private IPageStore getPageStore()
-		{
-			PageStoreManager manager = MANAGERS.get(applicationName);
-
-			if (manager == null)
-			{
-				return null;
-			}
-
-			return manager.pageStore;
-		}
-
-		/**
-		 * 
-		 * @param id
-		 * @return null, if not found
-		 */
-		private IManageablePage findPage(int id)
-		{
-			for (IManageablePage p : sessionCache)
-			{
-				if (p.getPageId() == id)
-				{
-					return p;
-				}
-			}
-			return null;
-		}
-
-		/**
-		 * Add the page to cached pages if page with same id is not already there
-		 * 
-		 * @param page
-		 */
-		private void addPage(IManageablePage page)
-		{
-			if (page != null)
-			{
-				if (findPage(page.getPageId()) != null)
-				{
-					return;
-				}
-
-				sessionCache.add(page);
-			}
-		}
-
-		private synchronized void removePage(IManageablePage page)
-		{
-			if (page != null)
-			{
-				sessionCache.remove(page);
-				final IPageStore pageStore = getPageStore();
-				if (pageStore != null)
-				{
-					pageStore.removePage(sessionId, page.getPageId());
-				}
-			}
-		}
-
-		/**
-		 * If the pages are stored in temporary state (after deserialization) this method convert
-		 * them to list of "real" pages
-		 */
-		private void convertAfterReadObjects()
-		{
-			if (sessionCache == null)
-			{
-				sessionCache = new ArrayList<>();
-			}
-
-			final IPageStore pageStore = getPageStore();
-			if (pageStore != null)
-			{
-				for (Object o : afterReadObject)
-				{
-					IManageablePage page = pageStore.convertToPage(o);
-					addPage(page);
-				}
-			}
-
-			afterReadObject = null;
-		}
-
-		/**
-		 * 
-		 * @param id
-		 * @return manageable page
-		 */
-		public synchronized IManageablePage getPage(int id)
-		{
-			// check if pages are in deserialized state
-			if (afterReadObject != null && afterReadObject.isEmpty() == false)
-			{
-				convertAfterReadObjects();
-			}
-
-			IManageablePage page = null;
-			// try to find page with same id
-			if (sessionCache != null)
-			{
-				page = findPage(id);
-				if (page != null)
-				{
-					return page;
-				}
-			}
-
-			// not found, ask pagestore for the page
-			final IPageStore pageStore = getPageStore();
-			if (pageStore != null)
-			{
-				page = pageStore.getPage(sessionId, id);
-			}
-			return page;
-		}
-
-		/**
-		 * set the list of pages to remember after the request
-		 * 
-		 * @param pages
-		 */
-		public synchronized void setSessionCache(final List<IManageablePage> pages)
-		{
-			sessionCache = new ArrayList<>(pages);
-			afterReadObject = null;
-		}
-
-		/**
-		 * Serializes all pages in this {@link SessionEntry}. If this is http worker thread then
-		 * there is available {@link IPageStore} which will be asked to prepare the page for
-		 * serialization (see DefaultPageStore$SerializePage). If there is no {@link IPageStore}
-		 * available (session loading/persisting in application initialization/destruction thread)
-		 * then the pages are serialized without any pre-processing
-		 * 
-		 * @param s
-		 * @throws IOException
-		 */
-		private void writeObject(final ObjectOutputStream s) throws IOException
-		{
-			s.defaultWriteObject();
-
-			// prepare for serialization and store the pages
-			List<Serializable> serializedPages = new ArrayList<Serializable>();
-			if (sessionCache != null)
-			{
-				IPageStore pageStore = getPageStore();
-				for (IManageablePage p : sessionCache)
-				{
-					Serializable preparedPage;
-					if (pageStore != null)
-					{
-						preparedPage = pageStore.prepareForSerialization(sessionId, p);
-					}
-					else
-					{
-						preparedPage = p;
-					}
-
-					if (preparedPage != null)
-					{
-						serializedPages.add(preparedPage);
-					}
-				}
-			}
-			s.writeObject(serializedPages);
-		}
-
-		/**
-		 * Deserializes the pages in this {@link SessionEntry}. If this is http worker thread then
-		 * there is available {@link IPageStore} which will be asked to restore the page from its
-		 * optimized state (see DefaultPageStore$SerializePage). If there is no {@link IPageStore}
-		 * available (session loading/persisting in application initialization/destruction thread)
-		 * then the pages are deserialized without any post-processing
-		 * 
-		 * @param s
-		 * @throws IOException
-		 * @throws ClassNotFoundException
-		 */
-		@SuppressWarnings("unchecked")
-		private void readObject(final ObjectInputStream s)
-			throws IOException, ClassNotFoundException
-		{
-			s.defaultReadObject();
-
-			afterReadObject = new ArrayList<>();
-
-			List<Serializable> l = (List<Serializable>)s.readObject();
-
-			// convert to temporary state after deserialization (will need to be processed
-			// by convertAfterReadObject before the pages can be accessed)
-			IPageStore pageStore = getPageStore();
-			for (Serializable ser : l)
-			{
-				Object page;
-				if (pageStore != null)
-				{
-					page = pageStore.restoreAfterSerialization(ser);
-				}
-				else
-				{
-					page = ser;
-				}
-				afterReadObject.add(page);
-			}
-		}
-
-		@Override
-		public void valueBound(HttpSessionBindingEvent event)
-		{
-		}
-
-		@Override
-		public void valueUnbound(HttpSessionBindingEvent event)
-		{
-			if (STORING_TOUCHED_PAGES.get())
-			{
-				// triggered by #storeTouchedPages(), so do not remove the data
-				return;
-			}
-
-			// WICKET-5164 use the original sessionId
-			IPageStore store = getPageStore();
-			// store might be null if destroyed already
-			if (store != null)
-			{
-				store.unbind(sessionId);
-			}
-		}
-
-		@Override
-		public boolean equals(Object o)
-		{
-			// see https://issues.apache.org/jira/browse/WICKET-5390
-			return false;
-		}
-	}
-
-	private String getAttributeName()
-	{
-		return ATTRIBUTE_NAME + " - " + applicationName;
-	}
-
-	/**
-	 * {@link RequestAdapter} for {@link PageStoreManager}
-	 * 
-	 * @author Matej Knopp
-	 */
-	protected class PersistentRequestAdapter extends RequestAdapter
-	{
-		/**
-		 * Construct.
-		 * 
-		 * @param context
-		 */
-		public PersistentRequestAdapter(IPageManagerContext context)
-		{
-			super(context);
-		}
-
-		@Override
-		protected IManageablePage getPage(int id)
-		{
-			IManageablePage touchedPage = findPage(id);
-			if (touchedPage != null)
-			{
-				return touchedPage;
-			}
-
-			// try to get session entry for this session
-			SessionEntry entry = getSessionEntry(false);
-
-			if (entry != null)
-			{
-				return entry.getPage(id);
-			}
-			else
-			{
-				return null;
-			}
-		}
-
-		@Override
-		protected void removePage(final IManageablePage page)
-		{
-			final SessionEntry sessionEntry = getSessionEntry(false);
-			if (sessionEntry != null)
-			{
-				sessionEntry.removePage(page);
-			}
-		}
-
-		/**
-		 * 
-		 * @param create
-		 * @return Session Entry
-		 */
-		private SessionEntry getSessionEntry(boolean create)
-		{
-			SessionEntry entry = (SessionEntry)getSessionAttribute(getAttributeName());
-			if (entry == null && create)
-			{
-				bind();
-				entry = new SessionEntry(applicationName, getSessionId());
-			}
-			return entry;
-		}
-
-		@Override
-		protected void newSessionCreated()
-		{
-			// if the session is not temporary bind a session entry to it
-			if (getSessionId() != null)
-			{
-				getSessionEntry(true);
-			}
-		}
-
-		@Override
-		protected void storeTouchedPages(final List<IManageablePage> touchedPages)
-		{
-			if (!touchedPages.isEmpty())
-			{
-				SessionEntry entry = getSessionEntry(true);
-				entry.setSessionCache(touchedPages);
-				for (IManageablePage page : touchedPages)
-				{
-					// WICKET-5103 use the same sessionId as used in
-					// SessionEntry#getPage()
-					pageStore.storePage(entry.sessionId, page);
-				}
-
-				STORING_TOUCHED_PAGES.set(true);
-				try
-				{
-					setSessionAttribute(getAttributeName(), entry);
-				}
-				finally
-				{
-					STORING_TOUCHED_PAGES.remove();
-				}
-			}
-		}
-	}
-
-	@Override
-	protected RequestAdapter newRequestAdapter(IPageManagerContext context)
-	{
-		return new PersistentRequestAdapter(context);
-	}
-
-	@Override
-	public boolean supportsVersioning()
-	{
-		return true;
-	}
-
-	@Override
-	public void clear()
-	{
-		RequestAdapter requestAdapter = getRequestAdapter();
-		String sessionEntryAttributeName = getAttributeName();
-		Serializable sessionEntry = requestAdapter.getSessionAttribute(sessionEntryAttributeName);
-		if (sessionEntry instanceof SessionEntry)
-		{
-			((SessionEntry)sessionEntry).valueUnbound(null);
-		}
-	}
-
-	@Override
-	public void destroy()
-	{
-		MANAGERS.remove(applicationName);
-		pageStore.destroy();
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/page/RequestAdapter.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/page/RequestAdapter.java b/wicket-core/src/main/java/org/apache/wicket/page/RequestAdapter.java
deleted file mode 100644
index 7b8b7b9..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/page/RequestAdapter.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.page;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Request scoped helper class for {@link IPageManager}.
- * 
- * @author Matej Knopp
- */
-public abstract class RequestAdapter
-{
-	private static final Logger log = LoggerFactory.getLogger(RequestAdapter.class);
-
-	private final IPageManagerContext context;
-
-	private final List<IManageablePage> touchedPages = new ArrayList<IManageablePage>();
-
-	/**
-	 * Construct.
-	 * 
-	 * @param context
-	 *            The page manager context
-	 */
-	public RequestAdapter(final IPageManagerContext context)
-	{
-		this.context = context;
-	}
-
-	/**
-	 * Returns the page with specified id. The page is then cached by {@link RequestAdapter} during
-	 * the rest of request processing.
-	 * 
-	 * @param id
-	 * @return page instance or <code>null</code> if the page does not exist.
-	 */
-	protected abstract IManageablePage getPage(int id);
-
-	/**
-	 * Removes a page from the cache and the stores ({@link org.apache.wicket.pageStore.IPageStore} and
-	 * {@link org.apache.wicket.pageStore.IDataStore}). Any attempt to access it later
-	 * will lead to {@link org.apache.wicket.protocol.http.PageExpiredException}
-	 *
-	 * @param page The page instance to remove
-	 */
-	protected abstract void removePage(final IManageablePage page);
-
-	/**
-	 * Store the list of stateful pages.
-	 * 
-	 * @param touchedPages
-	 */
-	protected abstract void storeTouchedPages(List<IManageablePage> touchedPages);
-
-	/**
-	 * Notification on new session being created.
-	 */
-	protected abstract void newSessionCreated();
-
-	/**
-	 * Bind the session
-	 * 
-	 * @see IPageManagerContext#bind()
-	 */
-	protected void bind()
-	{
-		context.bind();
-	}
-
-	/**
-	 * @see IPageManagerContext#setSessionAttribute(String, Serializable)
-	 * 
-	 * @param key
-	 * @param value
-	 */
-	public void setSessionAttribute(String key, Serializable value)
-	{
-		context.setSessionAttribute(key, value);
-	}
-
-	/**
-	 * @see IPageManagerContext#getSessionAttribute(String)
-	 * 
-	 * @param key
-	 * @return the session attribute
-	 */
-	public Serializable getSessionAttribute(final String key)
-	{
-		return context.getSessionAttribute(key);
-	}
-
-	/**
-	 * @see IPageManagerContext#getSessionId()
-	 * 
-	 * @return session id
-	 */
-	public String getSessionId()
-	{
-		return context.getSessionId();
-	}
-
-	/**
-	 * 
-	 * @param id
-	 * @return null, if not found
-	 */
-	protected IManageablePage findPage(final int id)
-	{
-		for (IManageablePage page : touchedPages)
-		{
-			if (page.getPageId() == id)
-			{
-				return page;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Touches a page, so it will be stored in the page stores
-	 * at the end of the request cycle
-	 *
-	 * @param page The page to mark as dirty
-	 */
-	protected void touch(final IManageablePage page)
-	{
-		if (findPage(page.getPageId()) == null)
-		{
-			touchedPages.add(page);
-		}
-	}
-
-	/**
-	 * @param page The page to unmark as dirty, so it won't be stored
-	 *                at the end of the request cycle
-	 */
-	protected void untouch(final IManageablePage page)
-	{
-		Iterator<IManageablePage> iterator = touchedPages.iterator();
-		while (iterator.hasNext())
-		{
-			IManageablePage touchedPage = iterator.next();
-			if (touchedPage.getPageId() == page.getPageId())
-			{
-				iterator.remove();
-				break;
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	protected void commitRequest()
-	{
-		// store pages that are not stateless
-		if (touchedPages.isEmpty() == false)
-		{
-			List<IManageablePage> statefulPages = new ArrayList<IManageablePage>(
-				touchedPages.size());
-			for (IManageablePage page : touchedPages)
-			{
-				boolean isPageStateless;
-				try
-				{
-					isPageStateless = page.isPageStateless();
-				}
-				catch (Exception x)
-				{
-					log.warn("An error occurred while checking whether a page is stateless. Assuming it is stateful.", x);
-					isPageStateless = false;
-				}
-				if (isPageStateless == false)
-				{
-					statefulPages.add(page);
-				}
-			}
-
-			if (statefulPages.isEmpty() == false)
-			{
-				storeTouchedPages(statefulPages);
-			}
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractCachingPageStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractCachingPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractCachingPageStore.java
deleted file mode 100644
index 86b8d82..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractCachingPageStore.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.pageStore;
-
-import org.apache.wicket.page.IManageablePage;
-import org.apache.wicket.serialize.ISerializer;
-import org.apache.wicket.util.lang.Args;
-
-/**
- * An abstract {@link org.apache.wicket.pageStore.IPageStore} that uses
- * {@link org.apache.wicket.pageStore.SecondLevelPageCache} to cache the stored pages in memory
- *
- * @param <P>
- *          The type of the page to be stored
- */
-public abstract class AbstractCachingPageStore<P> extends AbstractPageStore
-{
-	/**
-	 * The cache implementation
-	 */
-	protected final SecondLevelPageCache<String, Integer, P> pagesCache;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param pageSerializer
-	 *          The serializer that will convert pages to/from byte[]
-	 * @param dataStore
-	 *          The third level page cache
-	 * @param pagesCache
-	 *          The cache to use as a second level store
-	 */
-	protected AbstractCachingPageStore(ISerializer pageSerializer, IDataStore dataStore,
-	                                   SecondLevelPageCache<String, Integer, P> pagesCache)
-	{
-		super(pageSerializer, dataStore);
-
-		this.pagesCache = Args.notNull(pagesCache, "pagesCache");
-	}
-
-	@Override
-	public IManageablePage getPage(final String sessionId, final int pageId)
-	{
-		P fromCache = pagesCache.getPage(sessionId, pageId);
-		if (fromCache != null)
-		{
-			return convertToPage(fromCache);
-		}
-
-		byte[] data = getPageData(sessionId, pageId);
-		if (data != null)
-		{
-			return deserializePage(data);
-		}
-		return null;
-	}
-
-	@Override
-	public void removePage(final String sessionId, final int pageId)
-	{
-		pagesCache.removePage(sessionId, pageId);
-		removePageData(sessionId, pageId);
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public void storePage(final String sessionId, final IManageablePage page)
-	{
-		byte[] data = serializePage(page);
-		if (data != null)
-		{
-			int pageId = page.getPageId();
-			pagesCache.storePage(sessionId, pageId,  (P) page);
-			storePageData(sessionId, pageId, data);
-		}
-	}
-
-	@Override
-	public void unbind(final String sessionId)
-	{
-		removePageData(sessionId);
-		pagesCache.removePages(sessionId);
-	}
-
-	@Override
-	public void destroy()
-	{
-		super.destroy();
-		pagesCache.destroy();
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPageStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPageStore.java
deleted file mode 100644
index 07f97d5..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPageStore.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.pageStore;
-
-import java.io.Serializable;
-
-import org.apache.wicket.page.IManageablePage;
-import org.apache.wicket.serialize.ISerializer;
-import org.apache.wicket.util.lang.Args;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- *
- */
-public abstract class AbstractPageStore implements IPageStore
-{
-	private static final Logger LOG = LoggerFactory.getLogger(AbstractPageStore.class);
-
-	protected final IDataStore dataStore;
-
-	/**
-	 * The {@link org.apache.wicket.serialize.ISerializer} that will be used to convert pages from/to byte arrays
-	 */
-	protected final ISerializer pageSerializer;
-
-	protected AbstractPageStore(final ISerializer pageSerializer, final IDataStore dataStore)
-	{
-		Args.notNull(pageSerializer, "pageSerializer");
-		Args.notNull(dataStore, "dataStore");
-
-		this.pageSerializer = pageSerializer;
-		this.dataStore = dataStore;
-	}
-
-	@Override
-	public void destroy()
-	{
-		dataStore.destroy();
-	}
-
-	@Override
-	public Serializable prepareForSerialization(final String sessionId, final Serializable page)
-	{
-		if (dataStore.isReplicated())
-		{
-			return null;
-		}
-
-		return page;
-	}
-
-	@Override
-	public Object restoreAfterSerialization(final Serializable serializable)
-	{
-		return serializable;
-	}
-
-	/**
-	 * @param sessionId
-	 *          The id of the http session
-	 * @param pageId
-	 *          The id of page which serialized data should be got
-	 * @return page data
-	 * @see org.apache.wicket.pageStore.IDataStore#getData(String, int)
-	 */
-	protected byte[] getPageData(final String sessionId, final int pageId)
-	{
-		return dataStore.getData(sessionId, pageId);
-	}
-
-	/**
-	 * @param sessionId
-	 *          The id of the http session
-	 * @param pageId
-	 *          The id of page which serialized data should be removed
-	 * @see org.apache.wicket.pageStore.IDataStore#removeData(String, int)
-	 */
-	protected void removePageData(final String sessionId, final int pageId)
-	{
-		dataStore.removeData(sessionId, pageId);
-	}
-
-	/**
-	 * @param sessionId
-	 *          The id of the http session for which all data should be removed
-	 * @see org.apache.wicket.pageStore.IDataStore#removeData(String)
-	 */
-	protected void removePageData(final String sessionId)
-	{
-		dataStore.removeData(sessionId);
-	}
-
-	/**
-	 * @param sessionId
-	 *          The id of the http session
-	 * @param pageId
-	 *          The id of the page to store
-	 * @param data
-	 *          The serialized view of the page
-	 * @see org.apache.wicket.pageStore.IDataStore#storeData(String, int, byte[])
-	 */
-	protected void storePageData(final String sessionId, final int pageId, final byte[] data)
-	{
-		dataStore.storeData(sessionId, pageId, data);
-	}
-
-	/**
-	 * Serializes the passed page to byte[]
-	 *
-	 * @param page
-	 *          The page to serialize
-	 * @return the serialized view of the passed page
-	 */
-	protected byte[] serializePage(final IManageablePage page)
-	{
-		Args.notNull(page, "page");
-
-		byte[] data = pageSerializer.serialize(page);
-
-		if (data == null && LOG.isWarnEnabled())
-		{
-			LOG.warn("Page {} cannot be serialized. See previous logs for possible reasons.", page);
-		}
-		return data;
-	}
-
-	/**
-	 *
-	 * @param data
-	 *          The serialized view of the page
-	 * @return page data deserialized
-	 */
-	protected IManageablePage deserializePage(final byte[] data)
-	{
-		Args.notNull(data, "data");
-
-		return (IManageablePage) pageSerializer.deserialize(data);
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java
deleted file mode 100644
index 7ccd689..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.pageStore;
-
-import java.util.Iterator;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.wicket.util.lang.Args;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Facade for {@link IDataStore} that does the actual saving in worker thread.
- * <p>
- * Creates an {@link Entry} for each triple (sessionId, pageId, data) and puts it in
- * {@link #entries} queue if there is room. Acts as producer.<br/>
- * Later {@link PageSavingRunnable} reads in blocking manner from {@link #entries} and saves each
- * entry. Acts as consumer.
- * </p>
- * It starts only one instance of {@link PageSavingRunnable} because all we need is to make the page
- * storing asynchronous. We don't want to write concurrently in the wrapped {@link IDataStore},
- * though it may happen in the extreme case when the queue is full. These cases should be avoided.
- * 
- * @author Matej Knopp
- */
-public class AsynchronousDataStore implements IDataStore
-{
-	/** Log for reporting. */
-	private static final Logger log = LoggerFactory.getLogger(AsynchronousDataStore.class);
-
-	/**
-	 * The time to wait when adding an {@link Entry} into the entries. In millis.
-	 */
-	private static final long OFFER_WAIT = 30L;
-
-	/**
-	 * The time to wait for an entry to save with the wrapped {@link IDataStore}. In millis.
-	 */
-	private static final long POLL_WAIT = 1000L;
-
-	/**
-	 * The page saving thread.
-	 */
-	private final Thread pageSavingThread;
-
-	/**
-	 * The wrapped {@link IDataStore} that actually stores that pages
-	 */
-	private final IDataStore dataStore;
-
-	/**
-	 * The queue where the entries which have to be saved are temporary stored
-	 */
-	private final BlockingQueue<Entry> entries;
-
-	/**
-	 * A map 'sessionId:::pageId' -> {@link Entry}. Used for fast retrieval of {@link Entry}s which
-	 * are not yet stored by the wrapped {@link IDataStore}
-	 */
-	private final ConcurrentMap<String, Entry> entryMap;
-
-	/**
-	 * Construct.
-	 * 
-	 * @param dataStore
-	 *            the wrapped {@link IDataStore} that actually saved the data
-	 * @param capacity
-	 *            the capacity of the queue that delays the saving
-	 */
-	public AsynchronousDataStore(final IDataStore dataStore, final int capacity)
-	{
-		this.dataStore = dataStore;
-		entries = new LinkedBlockingQueue<>(capacity);
-		entryMap = new ConcurrentHashMap<>();
-
-		PageSavingRunnable savingRunnable = new PageSavingRunnable(dataStore, entries, entryMap);
-		pageSavingThread = new Thread(savingRunnable, "Wicket-AsyncDataStore-PageSavingThread");
-		pageSavingThread.setDaemon(true);
-		pageSavingThread.start();
-	}
-
-	@Override
-	public void destroy()
-	{
-		if (pageSavingThread.isAlive())
-		{
-			pageSavingThread.interrupt();
-			try
-			{
-				pageSavingThread.join();
-			} catch (InterruptedException e)
-			{
-				log.error(e.getMessage(), e);
-			}
-		}
-
-		dataStore.destroy();
-	}
-
-	/**
-	 * Little helper
-	 * 
-	 * @param sessionId
-	 * @param id
-	 * @return Entry
-	 */
-	private Entry getEntry(final String sessionId, final int id)
-	{
-		return entryMap.get(getKey(sessionId, id));
-	}
-
-	@Override
-	public byte[] getData(final String sessionId, final int id)
-	{
-		Entry entry = getEntry(sessionId, id);
-		if (entry != null)
-		{
-			log.debug(
-				"Returning the data of a non-stored entry with sessionId '{}' and pageId '{}'",
-				sessionId, id);
-			return entry.data;
-		}
-		byte[] data = dataStore.getData(sessionId, id);
-
-		log.debug("Returning the data of a stored entry with sessionId '{}' and pageId '{}'",
-			sessionId, id);
-
-		return data;
-	}
-
-	@Override
-	public boolean isReplicated()
-	{
-		return dataStore.isReplicated();
-	}
-
-	@Override
-	public void removeData(final String sessionId, final int id)
-	{
-		String key = getKey(sessionId, id);
-		if (key != null)
-		{
-			Entry entry = entryMap.remove(key);
-			if (entry != null)
-			{
-				entries.remove(entry);
-			}
-		}
-
-		dataStore.removeData(sessionId, id);
-	}
-
-	@Override
-	public void removeData(final String sessionId)
-	{
-		for (Iterator<Entry> itor = entries.iterator(); itor.hasNext();)
-		{
-			Entry entry = itor.next();
-			if (entry != null) // this check is not needed in JDK6
-			{
-				String entrySessionId = entry.sessionId;
-
-				if (sessionId.equals(entrySessionId))
-				{
-					entryMap.remove(getKey(entry));
-					itor.remove();
-				}
-			}
-		}
-
-		dataStore.removeData(sessionId);
-	}
-
-	/**
-	 * Save the entry in the queue if there is a room or directly pass it to the wrapped
-	 * {@link IDataStore} if there is no such
-	 * 
-	 * @see org.apache.wicket.pageStore.IDataStore#storeData(java.lang.String, int, byte[])
-	 */
-	@Override
-	public void storeData(final String sessionId, final int id, final byte[] data)
-	{
-		Entry entry = new Entry(sessionId, id, data);
-		String key = getKey(entry);
-		entryMap.put(key, entry);
-
-		try
-		{
-			boolean added = entries.offer(entry, OFFER_WAIT, TimeUnit.MILLISECONDS);
-
-			if (added == false)
-			{
-				log.debug("Storing synchronously page with id '{}' in session '{}'", id, sessionId);
-				entryMap.remove(key);
-				dataStore.storeData(sessionId, id, data);
-			}
-		}
-		catch (InterruptedException e)
-		{
-			log.error(e.getMessage(), e);
-			entryMap.remove(key);
-			dataStore.storeData(sessionId, id, data);
-		}
-	}
-
-	/**
-	 * 
-	 * @param pageId
-	 * @param sessionId
-	 * @return generated key
-	 */
-	private static String getKey(final String sessionId, final int pageId)
-	{
-		return pageId + ":::" + sessionId;
-	}
-
-	/**
-	 * 
-	 * @param entry
-	 * @return generated key
-	 */
-	private static String getKey(final Entry entry)
-	{
-		return getKey(entry.sessionId, entry.pageId);
-	}
-
-	/**
-	 * The structure used for an entry in the queue
-	 */
-	private static class Entry
-	{
-		private final String sessionId;
-		private final int pageId;
-		private final byte data[];
-
-		public Entry(final String sessionId, final int pageId, final byte data[])
-		{
-			this.sessionId = Args.notNull(sessionId, "sessionId");
-			this.pageId = pageId;
-			this.data = Args.notNull(data, "data");
-		}
-
-		@Override
-		public int hashCode()
-		{
-			final int prime = 31;
-			int result = 1;
-			result = prime * result + pageId;
-			result = prime * result + ((sessionId == null) ? 0 : sessionId.hashCode());
-			return result;
-		}
-
-		@Override
-		public boolean equals(Object obj)
-		{
-			if (this == obj)
-				return true;
-			if (obj == null)
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			Entry other = (Entry)obj;
-			if (pageId != other.pageId)
-				return false;
-			if (sessionId == null)
-			{
-				if (other.sessionId != null)
-					return false;
-			}
-			else if (!sessionId.equals(other.sessionId))
-				return false;
-			return true;
-		}
-
-		@Override
-		public String toString()
-		{
-			return "Entry [sessionId=" + sessionId + ", pageId=" + pageId + "]";
-		}
-
-	}
-
-	/**
-	 * The thread that acts as consumer of {@link Entry}ies
-	 */
-	private static class PageSavingRunnable implements Runnable
-	{
-		private static final Logger log = LoggerFactory.getLogger(PageSavingRunnable.class);
-
-		private final BlockingQueue<Entry> entries;
-
-		private final ConcurrentMap<String, Entry> entryMap;
-
-		private final IDataStore dataStore;
-
-		private PageSavingRunnable(IDataStore dataStore, BlockingQueue<Entry> entries,
-			ConcurrentMap<String, Entry> entryMap)
-		{
-			this.dataStore = dataStore;
-			this.entries = entries;
-			this.entryMap = entryMap;
-		}
-
-		@Override
-		public void run()
-		{
-			while (!Thread.interrupted())
-			{
-				Entry entry = null;
-				try
-				{
-					entry = entries.poll(POLL_WAIT, TimeUnit.MILLISECONDS);
-				}
-				catch (InterruptedException e)
-				{
-					Thread.currentThread().interrupt();
-				}
-
-				if (entry != null)
-				{
-					log.debug("Saving asynchronously: {}...", entry);
-					dataStore.storeData(entry.sessionId, entry.pageId, entry.data);
-					entryMap.remove(getKey(entry));
-				}
-			}
-		}
-	}
-
-	@Override
-	public final boolean canBeAsynchronous()
-	{
-		// should not wrap in another AsynchronousDataStore
-		return false;
-	}
-}