diff --git a/ccm-pages/src/org/libreccm/pagemodel/AbstractPageRenderer.java b/ccm-pages/src/org/libreccm/pagemodel/AbstractPageRenderer.java
new file mode 100644
index 000000000..edc4d5369
--- /dev/null
+++ b/ccm-pages/src/org/libreccm/pagemodel/AbstractPageRenderer.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2016 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.pagemodel;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * An abstract base class for implementations of the {@link PageRenderer}
+ * interface providing some functionality needed by all implementations of the
+ * {@link PageRenderer} interface.
+ *
+ * @author Jens Pelzetter
+ *
+ */
+public abstract class AbstractPageRenderer implements PageRenderer {
+
+ private ComponentRendererManager componentRendererManager;
+
+ /**
+ * Renders a {@code Page} based on a {@link PageModel}. This implementation
+ * first calls {@link #renderPage()} to create the page object. After that
+ * all {@link ComponentModel}s of the {@link PageModel} are processed and
+ * the component objects created by the {@link ComponentRenderer}s are added
+ * to the page.
+ *
+ * @param pageModel The {@link PageModel} to render.
+ * @param parameters Parameters provided by application which wants to
+ * render a {@link PageModel}. The parameters are passed
+ * the {@link ComponentRenderer}s.
+ *
+ * @return A map containing the results from rendering the components of the
+ * page model.
+ */
+ @Override
+ public Map renderPage(
+ final PageModel pageModel, final Map parameters) {
+
+ final Map page = renderPage(parameters);
+
+ final ContainerModelCollection containers = pageModel
+ .getContainerModels();
+ while(containers.next()) {
+ final ContainerModel containerModel = containers
+ .getContainerModel();
+
+ final Map container = renderContainer(
+ containerModel, parameters);
+ page.put(containerModel.getKey(), container);
+ }
+
+ return page;
+ }
+
+ protected Map renderContainer(
+ final ContainerModel containerModel,
+ final Map parameters) {
+
+ final Map container = new HashMap<>();
+
+ container.put("key", containerModel.getKey());
+
+ final ComponentModelCollection components = containerModel
+ .getComponents();
+ while (components.next()) {
+ final ComponentModel componentModel = components.getComponentModel();
+
+ renderComponent(componentModel,
+ componentModel.getClass(),
+ parameters)
+ .ifPresent(component -> container.put(componentModel.getKey(),
+ component));
+ }
+
+ return container;
+ }
+
+ /**
+ * Helper method for rendering the components.
+ *
+ * @param Generics variable for the type of rendered
+ * component
+ * @param componentModel The {@link ComponentModel} to process.
+ * @param componentModelClass The class of the {@link ComponentModel}.
+ * @param parameters Parameters provided by application which wants
+ * to render a {@link PageModel}. The parameters
+ * are passed the {@link ComponentRenderer}s.
+ *
+ * @return A map containing the results from rendering the components of the
+ * page model.
+ */
+ protected Optional