LUCENE-1706: backport Lucene/Solr search to 2.4.1 site, as it is the current release

git-svn-id: https://svn.apache.org/repos/asf/lucene/java/tags/lucene_2_4_1@788074 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/docs/benchmarks.html b/docs/benchmarks.html
index 71c464d..7b74baa 100644
--- a/docs/benchmarks.html
+++ b/docs/benchmarks.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>Apache Lucene - Resources - Performance Benchmarks</title>
 <link type="text/css" href="skin/basic.css" rel="stylesheet">
 <link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
@@ -49,10 +49,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/broken-links.xml b/docs/broken-links.xml
index f95aa9be..0355644 100644
--- a/docs/broken-links.xml
+++ b/docs/broken-links.xml
@@ -1,2 +1,14 @@
 <broken-links>
+  <link message="/Users/grantingersoll/projects/lucene/java/lucene_2_4_1/src/site/src/documentation/content/xdocs/images.instruction_arrow.png (No such file or directory)" uri="images/instruction_arrow.png">
+    <referrer uri="skin/screen.css"/>
+  </link>
+  <link message="/usr/local/apache-forrest-0.8/main/webapp/. (No such file or directory)" uri="skin/images/chapter.gif">
+    <referrer uri="skin/screen.css"/>
+  </link>
+  <link message="/usr/local/apache-forrest-0.8/main/webapp/. (No such file or directory)" uri="skin/images/page.gif">
+    <referrer uri="skin/screen.css"/>
+  </link>
+  <link message="/usr/local/apache-forrest-0.8/main/webapp/. (No such file or directory)" uri="skin/images/current.gif">
+    <referrer uri="skin/screen.css"/>
+  </link>
 </broken-links>
diff --git a/docs/contributions.html b/docs/contributions.html
index 42de6f0..3c23420 100644
--- a/docs/contributions.html
+++ b/docs/contributions.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Contributions
 		</title>
@@ -51,10 +51,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/demo.html b/docs/demo.html
index 73df0c6..a376aea 100644
--- a/docs/demo.html
+++ b/docs/demo.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Building and Installing the Basic Demo
 		</title>
@@ -51,10 +51,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/demo2.html b/docs/demo2.html
index 60eda12..d7389ae 100644
--- a/docs/demo2.html
+++ b/docs/demo2.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Basic Demo Sources Walk-through
 		</title>
@@ -51,10 +51,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/demo3.html b/docs/demo3.html
index 8bc7be9..a19b865 100644
--- a/docs/demo3.html
+++ b/docs/demo3.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Building and Installing the Basic Demo
 		</title>
@@ -51,10 +51,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/demo4.html b/docs/demo4.html
index 0478d43..17e2846 100644
--- a/docs/demo4.html
+++ b/docs/demo4.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Basic Demo Sources Walkthrough
 		</title>
@@ -51,10 +51,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/fileformats.html b/docs/fileformats.html
index 3a22229..50cbd7b 100644
--- a/docs/fileformats.html
+++ b/docs/fileformats.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>
             Apache Lucene - Index File Formats
         </title>
@@ -51,10 +51,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/gettingstarted.html b/docs/gettingstarted.html
index f8c34da..732def0 100644
--- a/docs/gettingstarted.html
+++ b/docs/gettingstarted.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Getting Started Guide
 		</title>
@@ -51,10 +51,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/index.html b/docs/index.html
index f41efc8..87501f8 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>Lucene Java Documentation</title>
 <link type="text/css" href="skin/basic.css" rel="stylesheet">
 <link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
@@ -49,10 +49,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/linkmap.html b/docs/linkmap.html
index 50301b8..8189733 100644
--- a/docs/linkmap.html
+++ b/docs/linkmap.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>Site Linkmap Table of Contents</title>
 <link type="text/css" href="skin/basic.css" rel="stylesheet">
 <link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
@@ -49,10 +49,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/lucene-sandbox/index.html b/docs/lucene-sandbox/index.html
index cdcdbfd..b595166 100644
--- a/docs/lucene-sandbox/index.html
+++ b/docs/lucene-sandbox/index.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Lucene Sandbox
 		</title>
@@ -51,10 +51,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/queryparsersyntax.html b/docs/queryparsersyntax.html
index 3139424..d987417 100644
--- a/docs/queryparsersyntax.html
+++ b/docs/queryparsersyntax.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Query Parser Syntax
 		</title>
@@ -51,10 +51,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/scoring.html b/docs/scoring.html
index 9f39f1f..c83f2f4 100644
--- a/docs/scoring.html
+++ b/docs/scoring.html
@@ -4,7 +4,7 @@
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
 <meta name="Forrest-version" content="0.8">
-<meta name="Forrest-skin-name" content="pelt">
+<meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Scoring
 		</title>
@@ -51,10 +51,12 @@
     |start Search
     +-->
 <div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="lucene.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+<form action="http://search.lucidimagination.com/p:lucene" method="get" class="roundtopsmall">
+<input onFocus="getBlank (this, 'Search the site with Lucene');" size="25" name="q" id="query" type="text" value="Search the site with Lucene">&nbsp; 
                     <input name="Search" value="Search" type="submit">
 </form>
+<div style="position: relative; top: -5px; left: -10px">Powered by <a href="http://www.lucidimagination.com" style="color: #033268">Lucid Imagination</a>
+</div>
 </div>
 <!--+
     |end search
diff --git a/docs/skin/images/corner-imports.svg.xslt b/docs/skin/images/corner-imports.svg.xslt
index 3c335b4..95b58d2 100644
--- a/docs/skin/images/corner-imports.svg.xslt
+++ b/docs/skin/images/corner-imports.svg.xslt
@@ -1,11 +1,11 @@
 <?xml version="1.0"?>
 <!--
-  Copyright 2002-2004 The Apache Software Foundation or its licensors,
-  as applicable.
-
-  Licensed 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
+  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
 
@@ -16,81 +16,77 @@
   limitations under the License.
 -->
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-    <xsl:param name="orientation-tb"/>
-    <xsl:param name="orientation-lr"/>
-    <xsl:param name="size"/>
-    <xsl:param name="bg-color-name"/>
-    <xsl:param name="stroke-color-name"/>
-    <xsl:param name="fg-color-name"/>    
-
-   <!-- if not all colors are present, don't even try to render the corners -->
-    <xsl:variable name="isize"><xsl:choose>
-    	<xsl:when test="$bg-color-name and $stroke-color-name and $fg-color-name"><xsl:value-of select="$size"/></xsl:when>
-    	<xsl:otherwise>0</xsl:otherwise>
-    </xsl:choose></xsl:variable>
-    <xsl:variable name="smallersize" select="number($isize)-1"/>
-    <xsl:variable name="biggersize" select="number($isize)+1"/>     
-    <xsl:variable name="bg"><xsl:if test="skinconfig/colors/color[@name=$bg-color-name]">fill:<xsl:value-of select="skinconfig/colors/color[@name=$bg-color-name]/@value"/>;</xsl:if></xsl:variable>
-    <xsl:variable name="fill"><xsl:if test="skinconfig/colors/color[@name=$stroke-color-name]">fill:<xsl:value-of select="skinconfig/colors/color[@name=$stroke-color-name]/@value"/>;</xsl:if></xsl:variable>
-    <xsl:variable name="stroke"><xsl:if test="skinconfig/colors/color[@name=$fg-color-name]">stroke:<xsl:value-of select="skinconfig/colors/color[@name=$fg-color-name]/@value"/>;</xsl:if></xsl:variable>
-        
-	<xsl:template match="skinconfig">
-
-        	
-
-<svg width="{$isize}" height="{$isize}">
-    <!-- background-->
-    <rect x="-1" y="-1" width="{$biggersize}" height="{$biggersize}" style="{$bg}stroke-width:0"/>
+  <xsl:param name="orientation-tb"/>
+  <xsl:param name="orientation-lr"/>
+  <xsl:param name="size"/>
+  <xsl:param name="bg-color-name"/>
+  <xsl:param name="stroke-color-name"/>
+  <xsl:param name="fg-color-name"/>
+<!-- if not all colors are present, don't even try to render the corners -->
+  <xsl:variable name="isize">
+    <xsl:choose>
+      <xsl:when test="$bg-color-name and $stroke-color-name and $fg-color-name">
+        <xsl:value-of select="$size"/>
+      </xsl:when>
+      <xsl:otherwise>0</xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+  <xsl:variable name="smallersize" select="number($isize)-1"/>
+  <xsl:variable name="biggersize" select="number($isize)+1"/>
+  <xsl:variable name="bg">
+    <xsl:if test="skinconfig/colors/color[@name=$bg-color-name]">fill:<xsl:value-of select="skinconfig/colors/color[@name=$bg-color-name]/@value"/>;</xsl:if>
+  </xsl:variable>
+  <xsl:variable name="fill">
+    <xsl:if test="skinconfig/colors/color[@name=$stroke-color-name]">fill:<xsl:value-of select="skinconfig/colors/color[@name=$stroke-color-name]/@value"/>;</xsl:if>
+  </xsl:variable>
+  <xsl:variable name="stroke">
+    <xsl:if test="skinconfig/colors/color[@name=$fg-color-name]">stroke:<xsl:value-of select="skinconfig/colors/color[@name=$fg-color-name]/@value"/>;</xsl:if>
+  </xsl:variable>
+  <xsl:template match="skinconfig">
+    <svg width="{$isize}" height="{$isize}">
+<!-- background-->
+      <rect x="-1" y="-1" width="{$biggersize}" height="{$biggersize}" style="{$bg}stroke-width:0"/>
 <!-- 0,0 0,-4 4,0 4,-4-->
-
-    <xsl:variable name="flip-tb-scale">
-      <xsl:choose>
-    	<xsl:when test="$orientation-tb='t'">1</xsl:when>
-    	<xsl:otherwise>-1</xsl:otherwise>
-      </xsl:choose>
-    </xsl:variable>
-
-    <xsl:variable name="flip-lr-scale">
-      <xsl:choose>
-    	<xsl:when test="$orientation-lr='l'">1</xsl:when>
-    	<xsl:otherwise>-1</xsl:otherwise>
-      </xsl:choose>
-    </xsl:variable>
-    
-    <xsl:variable name="flip-tb-translate">
-      <xsl:choose>
-    	<xsl:when test="$orientation-tb='t'">0</xsl:when>
-    	<xsl:otherwise>-<xsl:value-of select="$isize" /></xsl:otherwise>
-      </xsl:choose>
-    </xsl:variable>
-
-    <xsl:variable name="flip-lr-translate">
-      <xsl:choose>
-    	<xsl:when test="$orientation-lr='l'">0</xsl:when>
-    	<xsl:otherwise>-<xsl:value-of select="$isize" /></xsl:otherwise>
-      </xsl:choose>
-    </xsl:variable>    
-    
-    <!-- flip transform -->
-    <g transform="scale({$flip-lr-scale},{$flip-tb-scale}) translate({$flip-lr-translate}, {$flip-tb-translate})"> 
-      <xsl:call-template name="figure" />
-    </g>
-</svg>
-</xsl:template>
-
-        
-  <xsl:template name="figure">
-       <!-- Just change shape here -->     
-		<g transform="translate(0.5 0.5)">
-			<ellipse cx="{$smallersize}" cy="{$smallersize}" rx="{$smallersize}" ry="{$smallersize}"
-				 style="{$fill}{$stroke}stroke-width:1"/>
-		</g>
-	   <!-- end -->	
+      <xsl:variable name="flip-tb-scale">
+        <xsl:choose>
+          <xsl:when test="$orientation-tb='t'">1</xsl:when>
+          <xsl:otherwise>-1</xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+      <xsl:variable name="flip-lr-scale">
+        <xsl:choose>
+          <xsl:when test="$orientation-lr='l'">1</xsl:when>
+          <xsl:otherwise>-1</xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+      <xsl:variable name="flip-tb-translate">
+        <xsl:choose>
+          <xsl:when test="$orientation-tb='t'">0</xsl:when>
+          <xsl:otherwise>-<xsl:value-of select="$isize" />
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+      <xsl:variable name="flip-lr-translate">
+        <xsl:choose>
+          <xsl:when test="$orientation-lr='l'">0</xsl:when>
+          <xsl:otherwise>-<xsl:value-of select="$isize" />
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+<!-- flip transform -->
+      <g transform="scale({$flip-lr-scale},{$flip-tb-scale}) translate({$flip-lr-translate}, {$flip-tb-translate})">
+        <xsl:call-template name="figure" />
+      </g>
+    </svg>
   </xsl:template>
-    
-  
+  <xsl:template name="figure">
+<!-- Just change shape here -->
+    <g transform="translate(0.5 0.5)">
+      <ellipse cx="{$smallersize}" cy="{$smallersize}" rx="{$smallersize}" ry="{$smallersize}"
+				 style="{$fill}{$stroke}stroke-width:1"/>
+    </g>
+<!-- end -->
+  </xsl:template>
   <xsl:template match="*"></xsl:template>
   <xsl:template match="text()"></xsl:template>
-  
 </xsl:stylesheet>
diff --git a/docs/skin/images/dc.svg.xslt b/docs/skin/images/dc.svg.xslt
index fb8cfb0..f900f2f 100644
--- a/docs/skin/images/dc.svg.xslt
+++ b/docs/skin/images/dc.svg.xslt
@@ -1,11 +1,11 @@
 <?xml version="1.0"?>
 <!--
-  Copyright 2002-2004 The Apache Software Foundation or its licensors,
-  as applicable.
-
-  Licensed 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
+  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
 
@@ -17,15 +17,12 @@
 -->
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:import href="corner-imports.svg.xslt" />
-  
-  <!-- Diagonal 45 degrees corner -->
+<!-- Diagonal 45 degrees corner -->
   <xsl:template name="figure">
-        <xsl:variable name="biggersize" select="number($size)+number($size)"/>     
-		<g transform="translate(0 0.5)">
-           <polygon points="0,{$size} {$size},0 {$biggersize},0 {$biggersize},{$biggersize} 0,{$biggersize}"
+    <xsl:variable name="biggersize" select="number($size)+number($size)"/>
+    <g transform="translate(0 0.5)">
+      <polygon points="0,{$size} {$size},0 {$biggersize},0 {$biggersize},{$biggersize} 0,{$biggersize}"
                     style="{$fill}{$stroke}stroke-width:1"/>
-		</g>
+    </g>
   </xsl:template>
-      
 </xsl:stylesheet>
-
diff --git a/docs/skin/images/pdfdoc.gif b/docs/skin/images/pdfdoc.gif
index ec13eb5..00dee28 100644
--- a/docs/skin/images/pdfdoc.gif
+++ b/docs/skin/images/pdfdoc.gif
Binary files differ
diff --git a/docs/skin/images/poddoc.svg.xslt b/docs/skin/images/poddoc.svg.xslt
index 160d3da..6097d2b 100644
--- a/docs/skin/images/poddoc.svg.xslt
+++ b/docs/skin/images/poddoc.svg.xslt
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
-  Copyright 2002-2004 The Apache Software Foundation or its licensors,
-  as applicable.
-
-  Licensed 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
+  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
 
@@ -30,13 +30,11 @@
        gradientUnits="objectBoundingBox" spreadMethod="pad" />
     <path d="M 0 0 L 200 0" style="stroke:#000000;stroke-width:1pt;" id="hr"/>
   </defs>
-
   <g transform="scale(0.08)">
     <g transform="translate(40, 0)">
       <rect width="230" height="300" x="0" y="0"
             style="fill:url(#pageshade);fill-rule:evenodd;
             stroke:#000000;stroke-width:1.25;"/>
-
       <g transform="translate(15, 60)">
         <use xlink:href="#hr" x="0" y="0"/>
         <use xlink:href="#hr" x="0" y="60"/>
@@ -44,7 +42,6 @@
         <use xlink:href="#hr" x="0" y="180"/>
       </g>
     </g>
-
     <g transform="translate(0,70),scale(1.1,1.6)">
       <rect width="200" height="100" x="0" y="0"
          style="fill:#ff0000;fill-rule:evenodd;
diff --git a/docs/skin/images/printer.gif b/docs/skin/images/printer.gif
index a8d0d41..5021187 100644
--- a/docs/skin/images/printer.gif
+++ b/docs/skin/images/printer.gif
Binary files differ
diff --git a/docs/skin/images/rc-b-l-15-1body-2menu-3menu.png b/docs/skin/images/rc-b-l-15-1body-2menu-3menu.png
index cdb460a..dd790d3 100644
--- a/docs/skin/images/rc-b-l-15-1body-2menu-3menu.png
+++ b/docs/skin/images/rc-b-l-15-1body-2menu-3menu.png
Binary files differ
diff --git a/docs/skin/images/rc-b-r-15-1body-2menu-3menu.png b/docs/skin/images/rc-b-r-15-1body-2menu-3menu.png
index 3eff254..790f43f 100644
--- a/docs/skin/images/rc-b-r-15-1body-2menu-3menu.png
+++ b/docs/skin/images/rc-b-r-15-1body-2menu-3menu.png
Binary files differ
diff --git a/docs/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png b/docs/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png
index b175f27..1987c0a 100644
--- a/docs/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png
+++ b/docs/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png
Binary files differ
diff --git a/docs/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png b/docs/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png
index e9f4440..b69812a 100644
--- a/docs/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png
+++ b/docs/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png
Binary files differ
diff --git a/docs/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png b/docs/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png
index f1e015b..07e5ebe 100644
--- a/docs/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png
+++ b/docs/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png
Binary files differ
diff --git a/docs/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png b/docs/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png
index e9f4440..b69812a 100644
--- a/docs/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png
+++ b/docs/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png
Binary files differ
diff --git a/docs/skin/images/rc-t-r-15-1body-2menu-3menu.png b/docs/skin/images/rc-t-r-15-1body-2menu-3menu.png
index 29388b5..5e44a80 100644
--- a/docs/skin/images/rc-t-r-15-1body-2menu-3menu.png
+++ b/docs/skin/images/rc-t-r-15-1body-2menu-3menu.png
Binary files differ
diff --git a/docs/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png b/docs/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png
index 944ed73..cbaea9c 100644
--- a/docs/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png
+++ b/docs/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png
Binary files differ
diff --git a/docs/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png b/docs/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png
index c4d4a8c..6fe87de 100644
--- a/docs/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png
+++ b/docs/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png
Binary files differ
diff --git a/docs/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png b/docs/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png
index 944ed73..cbaea9c 100644
--- a/docs/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png
+++ b/docs/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png
Binary files differ
diff --git a/docs/skin/images/rc.svg.xslt b/docs/skin/images/rc.svg.xslt
index fe097eb..d8924fe 100644
--- a/docs/skin/images/rc.svg.xslt
+++ b/docs/skin/images/rc.svg.xslt
@@ -1,11 +1,11 @@
 <?xml version="1.0"?>
 <!--
-  Copyright 2002-2004 The Apache Software Foundation or its licensors,
-  as applicable.
-
-  Licensed 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
+  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
 
@@ -17,14 +17,11 @@
 -->
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:import href="corner-imports.svg.xslt" />
-
-  <!-- Rounded corner -->
+<!-- Rounded corner -->
   <xsl:template name="figure">
-		<g transform="translate(0.5 0.5)">
-			<ellipse cx="{$smallersize}" cy="{$smallersize}" rx="{$smallersize}" ry="{$smallersize}"
+    <g transform="translate(0.5 0.5)">
+      <ellipse cx="{$smallersize}" cy="{$smallersize}" rx="{$smallersize}" ry="{$smallersize}"
 				 style="{$fill}{$stroke}stroke-width:1"/>
-		</g>
+    </g>
   </xsl:template>
-      
 </xsl:stylesheet>
-
diff --git a/docs/skin/images/txtdoc.svg.xslt b/docs/skin/images/txtdoc.svg.xslt
index ebbdef5..d85715c 100644
--- a/docs/skin/images/txtdoc.svg.xslt
+++ b/docs/skin/images/txtdoc.svg.xslt
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!--
-  Copyright 2002-2004 The Apache Software Foundation or its licensors,
-  as applicable.
-
-  Licensed 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
+  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
 
@@ -30,13 +30,11 @@
        gradientUnits="objectBoundingBox" spreadMethod="pad" />
     <path d="M 0 0 L 200 0" style="stroke:#000000;stroke-width:1pt;" id="hr"/>
   </defs>
-
   <g transform="scale(0.08)">
     <g transform="translate(40, 0)">
       <rect width="230" height="300" x="0" y="0"
             style="fill:url(#pageshade);fill-rule:evenodd;
             stroke:#000000;stroke-width:1.25;"/>
-
       <g transform="translate(15, 60)">
         <use xlink:href="#hr" x="0" y="0"/>
         <use xlink:href="#hr" x="0" y="60"/>
@@ -44,7 +42,6 @@
         <use xlink:href="#hr" x="0" y="180"/>
       </g>
     </g>
-
     <g transform="translate(0,70),scale(1.1,1.6)">
       <rect width="200" height="100" x="0" y="0"
          style="fill:#ff0000;fill-rule:evenodd;
diff --git a/docs/skin/images/xmldoc.gif b/docs/skin/images/xmldoc.gif
index c92d9b9..ca1224f 100644
--- a/docs/skin/images/xmldoc.gif
+++ b/docs/skin/images/xmldoc.gif
Binary files differ
diff --git a/docs/skin/skinconf.xsl b/docs/skin/skinconf.xsl
index 4a21644..2f8df12 100644
--- a/docs/skin/skinconf.xsl
+++ b/docs/skin/skinconf.xsl
@@ -1,11 +1,11 @@
 <?xml version="1.0"?>
 <!--
-  Copyright 2002-2004 The Apache Software Foundation or its licensors,
-  as applicable.
-
-  Licensed 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
+  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
 
@@ -16,138 +16,122 @@
   limitations under the License.
 -->
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-        
-    <xsl:template match="skinconfig">
-
-  <xsl:if test="not(colors)">
-  <colors>
+  <xsl:template match="skinconfig">
+    <xsl:if test="not(colors)">
+      <colors>
 <!-- Lenya -->
-  <color name="header" value="#ffffff"/>
-
-    <color name="tab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
-    <color name="tab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="subtab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
-    <color name="subtab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
-
-    <color name="heading" value="#E5E4D9"/>
-    <color name="subheading" value="#E5E4D9"/>
-    <color name="published" value="#4C6C8F" font="#FFFFFF"/>
-	<color name="feedback" value="#4C6C8F" font="#FFFFFF" align="center"/>
-    <color name="navstrip" value="#E5E4D9" font="#000000"/>
-
-    <color name="toolbox" value="#CFDCED" font="#000000"/>
-
-    <color name="border" value="#999999"/>
-    <color name="menu" value="#4C6C8F" font="#ffffff" link="#ffffff" vlink="#ffffff" hlink="#ffffff"  />    
-    <color name="menuheading" value="#cfdced" font="#000000" />
-    <color name="searchbox" value="#E5E4D9" font="#000000"/>
-    
-    <color name="dialog" value="#E5E4D9" font="#000000"/>
-	<color name="body" value="#ffffff" />            
-    
-    <color name="table" value="#ccc"/>    
-    <color name="table-cell" value="#ffffff"/>   
-    <color name="highlight" value="#ffff00"/>
-    <color name="fixme" value="#cc6600"/>
-    <color name="note" value="#006699"/>
-    <color name="warning" value="#990000"/>
-    <color name="code" value="#003366"/>
-        
-    <color name="footer" value="#E5E4D9"/>
-  </colors>
-  </xsl:if>
-
-     <xsl:copy>
-      <xsl:copy-of select="@*"/>
-      <xsl:copy-of select="node()[not(name(.)='colors')]"/>     
-      <xsl:apply-templates select="colors"/>
-     </xsl:copy> 
-
-    </xsl:template>
-
-    <xsl:template match="colors">
-     <xsl:copy>
-      <xsl:copy-of select="@*"/>
-      <xsl:copy-of select="node()[name(.)='color']"/> 
-      
-     <xsl:if test="not(color[@name='header'])">
-       <color name="header" value="#FFFFFF"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='tab-selected'])">
-      <color name="tab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='tab-unselected'])">
-      <color name="tab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
-     </xsl:if>
-     <xsl:if test="not(color[@name='subtab-selected'])">
-      <color name="subtab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='subtab-unselected'])">
-      <color name="subtab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='heading'])">
-      <color name="heading" value="#E5E4D9"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='subheading'])">
-      <color name="subheading" value="#E5E4D9"/>
-     </xsl:if>
-      <xsl:if test="not(color[@name='published'])">
-		<color name="feedback" value="#4C6C8F" font="#FFFFFF" align="center"/>
-     </xsl:if> 
-     <xsl:if test="not(color[@name='published'])">
+        <color name="header" value="#ffffff"/>
+        <color name="tab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
+        <color name="tab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
+        <color name="subtab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
+        <color name="subtab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
+        <color name="heading" value="#E5E4D9"/>
+        <color name="subheading" value="#E5E4D9"/>
         <color name="published" value="#4C6C8F" font="#FFFFFF"/>
-     </xsl:if> 
-     <xsl:if test="not(color[@name='navstrip'])">
-      <color name="navstrip" value="#E5E4D9" font="#000000"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='toolbox'])">
-       <color name="toolbox" value="#CFDCED" font="#000000"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='border'])">
-       <color name="border" value="#999999"/>
-     </xsl:if>       
-     <xsl:if test="not(color[@name='menu'])">
-      	<color name="menu" value="#4C6C8F" font="#ffffff" link="#ffffff" vlink="#ffffff" hlink="#ffffff"  /> 
-     </xsl:if>
-     <xsl:if test="not(color[@name='menuheading'])">
-	     <color name="menuheading" value="#cfdced" font="#000000" />
-     </xsl:if> 
-     <xsl:if test="not(color[@name='searchbox'])">
-	 	<color name="searchbox" value="#E5E4D9" font="#000000"/>
-     </xsl:if> 
-     <xsl:if test="not(color[@name='dialog'])">
-      <color name="dialog" value="#E5E4D9" font="#000000" link="#000000" vlink="#000000" hlink="#000000"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='body'])">
-      <color name="body" value="#ffffff" /> 
-     </xsl:if>  
-     <xsl:if test="not(color[@name='table'])">
-      <color name="table" value="#ccc"/>    
-     </xsl:if>  
-     <xsl:if test="not(color[@name='table-cell'])">
-      <color name="table-cell" value="#ffffff"/>    
-     </xsl:if>  
-     <xsl:if test="not(color[@name='highlight'])">
-       <color name="highlight" value="#ffff00"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='fixme'])">
-       <color name="fixme" value="#c60"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='note'])">
-       <color name="note" value="#069"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='warning'])">
-       <color name="warning" value="#900"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='code'])">
-       <color name="code" value="#a5b6c6"/>
-     </xsl:if>  
-     <xsl:if test="not(color[@name='footer'])">
-       <color name="footer" value="#E5E4D9"/>
-     </xsl:if>  
-    
-     </xsl:copy> 
-
-    </xsl:template>
-    
+        <color name="feedback" value="#4C6C8F" font="#FFFFFF" align="center"/>
+        <color name="navstrip" value="#E5E4D9" font="#000000"/>
+        <color name="toolbox" value="#CFDCED" font="#000000"/>
+        <color name="border" value="#999999"/>
+        <color name="menu" value="#4C6C8F" font="#ffffff" link="#ffffff" vlink="#ffffff" hlink="#ffffff"  />
+        <color name="menuheading" value="#cfdced" font="#000000" />
+        <color name="searchbox" value="#E5E4D9" font="#000000"/>
+        <color name="dialog" value="#E5E4D9" font="#000000"/>
+        <color name="body" value="#ffffff" />
+        <color name="table" value="#ccc"/>
+        <color name="table-cell" value="#ffffff"/>
+        <color name="highlight" value="#ffff00"/>
+        <color name="fixme" value="#cc6600"/>
+        <color name="note" value="#006699"/>
+        <color name="warning" value="#990000"/>
+        <color name="code" value="#003366"/>
+        <color name="footer" value="#E5E4D9"/>
+      </colors>
+    </xsl:if>
+    <xsl:copy>
+      <xsl:copy-of select="@*"/>
+      <xsl:copy-of select="node()[not(name(.)='colors')]"/>
+      <xsl:apply-templates select="colors"/>
+    </xsl:copy>
+  </xsl:template>
+  <xsl:template match="colors">
+    <xsl:copy>
+      <xsl:copy-of select="@*"/>
+      <xsl:copy-of select="node()[name(.)='color']"/>
+      <xsl:if test="not(color[@name='header'])">
+        <color name="header" value="#FFFFFF"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='tab-selected'])">
+        <color name="tab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='tab-unselected'])">
+        <color name="tab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='subtab-selected'])">
+        <color name="subtab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='subtab-unselected'])">
+        <color name="subtab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='heading'])">
+        <color name="heading" value="#E5E4D9"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='subheading'])">
+        <color name="subheading" value="#E5E4D9"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='feedback'])">
+        <color name="feedback" value="#4C6C8F" font="#FFFFFF" align="center"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='published'])">
+        <color name="published" value="#4C6C8F" font="#FFFFFF"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='navstrip'])">
+        <color name="navstrip" value="#E5E4D9" font="#000000"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='toolbox'])">
+        <color name="toolbox" value="#CFDCED" font="#000000"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='border'])">
+        <color name="border" value="#999999"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='menu'])">
+        <color name="menu" value="#4C6C8F" font="#ffffff" link="#ffffff" vlink="#ffffff" hlink="#ffffff"  />
+      </xsl:if>
+      <xsl:if test="not(color[@name='menuheading'])">
+        <color name="menuheading" value="#cfdced" font="#000000" />
+      </xsl:if>
+      <xsl:if test="not(color[@name='searchbox'])">
+        <color name="searchbox" value="#E5E4D9" font="#000000"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='dialog'])">
+        <color name="dialog" value="#E5E4D9" font="#000000" link="#000000" vlink="#000000" hlink="#000000"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='body'])">
+        <color name="body" value="#ffffff" />
+      </xsl:if>
+      <xsl:if test="not(color[@name='table'])">
+        <color name="table" value="#ccc"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='table-cell'])">
+        <color name="table-cell" value="#ffffff"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='highlight'])">
+        <color name="highlight" value="#ffff00"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='fixme'])">
+        <color name="fixme" value="#c60"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='note'])">
+        <color name="note" value="#069"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='warning'])">
+        <color name="warning" value="#900"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='code'])">
+        <color name="code" value="#a5b6c6"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='footer'])">
+        <color name="footer" value="#E5E4D9"/>
+      </xsl:if>
+    </xsl:copy>
+  </xsl:template>
 </xsl:stylesheet>
diff --git a/src/site/forrest.properties b/src/site/forrest.properties
index 9474f4b..10da2e1 100755
--- a/src/site/forrest.properties
+++ b/src/site/forrest.properties
@@ -26,7 +26,7 @@
 
 # Specifies name of Forrest skin to use
 # See list at http://forrest.apache.org/docs/skins.html
-#project.skin=pelt
+project.skin=lucene
 
 # Descriptors for plugins and skins
 # comma separated list, file:// is supported
diff --git a/src/site/src/documentation/skinconf.xml b/src/site/src/documentation/skinconf.xml
index d6ee9fc..dfc7dea 100755
--- a/src/site/src/documentation/skinconf.xml
+++ b/src/site/src/documentation/skinconf.xml
@@ -30,7 +30,7 @@
     no search box. @domain will enable sitesearch for the specific domain with google.
     In other words google will search the @domain for the query string.
   -->
-  <search name="Lucene Java" domain="lucene.apache.org" provider="google"/>
+  <search name="Lucene Java" provider="Lucene"/>
 
   <!-- Disable the print link? If enabled, invalid HTML 4.0.1 -->
   <disable-print-link>true</disable-print-link>  
diff --git a/src/site/src/documentation/skins/common/css/forrest.css.xslt b/src/site/src/documentation/skins/common/css/forrest.css.xslt
new file mode 100644
index 0000000..fbfa020
--- /dev/null
+++ b/src/site/src/documentation/skins/common/css/forrest.css.xslt
@@ -0,0 +1,78 @@
+<?xml version="1.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.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<!-- This is not used by Forrest but makes it possible to debug the 
+       stylesheet in standalone editors -->
+  <xsl:output method = "text"  omit-xml-declaration="yes"  />
+<!--
+  If the skin doesn't override this, at least aural styles 
+  and extra-css are present 
+-->
+  <xsl:template match="skinconfig">
+    <xsl:call-template name="aural"/>
+    <xsl:call-template name="a-external"/>
+    <xsl:apply-templates/>
+    <xsl:call-template name="add-extra-css"/>
+  </xsl:template>
+  <xsl:template match="colors">
+    <xsl:apply-templates/>
+  </xsl:template>
+  <xsl:template name="aural">
+
+/* ==================== aural ============================ */
+
+@media aural {
+  h1, h2, h3, h4, h5, h6 { voice-family: paul, male; stress: 20; richness: 90 }
+  h1 { pitch: x-low; pitch-range: 90 }
+  h2 { pitch: x-low; pitch-range: 80 }
+  h3 { pitch: low; pitch-range: 70 }
+  h4 { pitch: medium; pitch-range: 60 }
+  h5 { pitch: medium; pitch-range: 50 }
+  h6 { pitch: medium; pitch-range: 40 }
+  li, dt, dd { pitch: medium; richness: 60 }
+  dt { stress: 80 }
+  pre, code, tt { pitch: medium; pitch-range: 0; stress: 0; richness: 80 }
+  em { pitch: medium; pitch-range: 60; stress: 60; richness: 50 }
+  strong { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
+  dfn { pitch: high; pitch-range: 60; stress: 60 }
+  s, strike { richness: 0 }
+  i { pitch: medium; pitch-range: 60; stress: 60; richness: 50 }
+  b { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
+  u { richness: 0 }
+  
+  :link { voice-family: harry, male }
+  :visited { voice-family: betty, female }
+  :active { voice-family: betty, female; pitch-range: 80; pitch: x-high }
+}
+  </xsl:template>
+  <xsl:template name="a-external">
+a.external  {
+  padding: 0 20px 0px 0px;
+	display:inline;
+  background-repeat: no-repeat;
+	background-position: center right;
+	background-image: url(images/external-link.gif);
+}
+  </xsl:template>
+  <xsl:template name="add-extra-css">
+<xsl:text>/* extra-css */</xsl:text>
+    <xsl:value-of select="extra-css"/>
+  </xsl:template>
+  <xsl:template match="*"></xsl:template>
+  <xsl:template match="text()"></xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/images/README.txt b/src/site/src/documentation/skins/common/images/README.txt
new file mode 100644
index 0000000..e0932f4
--- /dev/null
+++ b/src/site/src/documentation/skins/common/images/README.txt
@@ -0,0 +1 @@
+The images in this directory are used if the current skin lacks them.
diff --git a/src/site/src/documentation/skins/common/images/corner-imports.svg.xslt b/src/site/src/documentation/skins/common/images/corner-imports.svg.xslt
new file mode 100644
index 0000000..95b58d2
--- /dev/null
+++ b/src/site/src/documentation/skins/common/images/corner-imports.svg.xslt
@@ -0,0 +1,92 @@
+<?xml version="1.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.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:param name="orientation-tb"/>
+  <xsl:param name="orientation-lr"/>
+  <xsl:param name="size"/>
+  <xsl:param name="bg-color-name"/>
+  <xsl:param name="stroke-color-name"/>
+  <xsl:param name="fg-color-name"/>
+<!-- if not all colors are present, don't even try to render the corners -->
+  <xsl:variable name="isize">
+    <xsl:choose>
+      <xsl:when test="$bg-color-name and $stroke-color-name and $fg-color-name">
+        <xsl:value-of select="$size"/>
+      </xsl:when>
+      <xsl:otherwise>0</xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+  <xsl:variable name="smallersize" select="number($isize)-1"/>
+  <xsl:variable name="biggersize" select="number($isize)+1"/>
+  <xsl:variable name="bg">
+    <xsl:if test="skinconfig/colors/color[@name=$bg-color-name]">fill:<xsl:value-of select="skinconfig/colors/color[@name=$bg-color-name]/@value"/>;</xsl:if>
+  </xsl:variable>
+  <xsl:variable name="fill">
+    <xsl:if test="skinconfig/colors/color[@name=$stroke-color-name]">fill:<xsl:value-of select="skinconfig/colors/color[@name=$stroke-color-name]/@value"/>;</xsl:if>
+  </xsl:variable>
+  <xsl:variable name="stroke">
+    <xsl:if test="skinconfig/colors/color[@name=$fg-color-name]">stroke:<xsl:value-of select="skinconfig/colors/color[@name=$fg-color-name]/@value"/>;</xsl:if>
+  </xsl:variable>
+  <xsl:template match="skinconfig">
+    <svg width="{$isize}" height="{$isize}">
+<!-- background-->
+      <rect x="-1" y="-1" width="{$biggersize}" height="{$biggersize}" style="{$bg}stroke-width:0"/>
+<!-- 0,0 0,-4 4,0 4,-4-->
+      <xsl:variable name="flip-tb-scale">
+        <xsl:choose>
+          <xsl:when test="$orientation-tb='t'">1</xsl:when>
+          <xsl:otherwise>-1</xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+      <xsl:variable name="flip-lr-scale">
+        <xsl:choose>
+          <xsl:when test="$orientation-lr='l'">1</xsl:when>
+          <xsl:otherwise>-1</xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+      <xsl:variable name="flip-tb-translate">
+        <xsl:choose>
+          <xsl:when test="$orientation-tb='t'">0</xsl:when>
+          <xsl:otherwise>-<xsl:value-of select="$isize" />
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+      <xsl:variable name="flip-lr-translate">
+        <xsl:choose>
+          <xsl:when test="$orientation-lr='l'">0</xsl:when>
+          <xsl:otherwise>-<xsl:value-of select="$isize" />
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+<!-- flip transform -->
+      <g transform="scale({$flip-lr-scale},{$flip-tb-scale}) translate({$flip-lr-translate}, {$flip-tb-translate})">
+        <xsl:call-template name="figure" />
+      </g>
+    </svg>
+  </xsl:template>
+  <xsl:template name="figure">
+<!-- Just change shape here -->
+    <g transform="translate(0.5 0.5)">
+      <ellipse cx="{$smallersize}" cy="{$smallersize}" rx="{$smallersize}" ry="{$smallersize}"
+				 style="{$fill}{$stroke}stroke-width:1"/>
+    </g>
+<!-- end -->
+  </xsl:template>
+  <xsl:template match="*"></xsl:template>
+  <xsl:template match="text()"></xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/images/dc.svg.xslt b/src/site/src/documentation/skins/common/images/dc.svg.xslt
new file mode 100644
index 0000000..f900f2f
--- /dev/null
+++ b/src/site/src/documentation/skins/common/images/dc.svg.xslt
@@ -0,0 +1,28 @@
+<?xml version="1.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.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:import href="corner-imports.svg.xslt" />
+<!-- Diagonal 45 degrees corner -->
+  <xsl:template name="figure">
+    <xsl:variable name="biggersize" select="number($size)+number($size)"/>
+    <g transform="translate(0 0.5)">
+      <polygon points="0,{$size} {$size},0 {$biggersize},0 {$biggersize},{$biggersize} 0,{$biggersize}"
+                    style="{$fill}{$stroke}stroke-width:1"/>
+    </g>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/images/poddoc.svg.xslt b/src/site/src/documentation/skins/common/images/poddoc.svg.xslt
new file mode 100644
index 0000000..6097d2b
--- /dev/null
+++ b/src/site/src/documentation/skins/common/images/poddoc.svg.xslt
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  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.
+-->
+<svg width="20pt" height="20pt"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink">
+  <defs
+     id="defs550">
+    <linearGradient id="gray2white">
+      <stop style="stop-color:#7f7f7f;stop-opacity:1;" offset="0.000000"/>
+      <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1.000000"/>
+    </linearGradient>
+    <linearGradient id="pageshade" xlink:href="#gray2white"
+       x1="0.95" y1="0.95"
+       x2="0.40" y2="0.20"
+       gradientUnits="objectBoundingBox" spreadMethod="pad" />
+    <path d="M 0 0 L 200 0" style="stroke:#000000;stroke-width:1pt;" id="hr"/>
+  </defs>
+  <g transform="scale(0.08)">
+    <g transform="translate(40, 0)">
+      <rect width="230" height="300" x="0" y="0"
+            style="fill:url(#pageshade);fill-rule:evenodd;
+            stroke:#000000;stroke-width:1.25;"/>
+      <g transform="translate(15, 60)">
+        <use xlink:href="#hr" x="0" y="0"/>
+        <use xlink:href="#hr" x="0" y="60"/>
+        <use xlink:href="#hr" x="0" y="120"/>
+        <use xlink:href="#hr" x="0" y="180"/>
+      </g>
+    </g>
+    <g transform="translate(0,70),scale(1.1,1.6)">
+      <rect width="200" height="100" x="0" y="0"
+         style="fill:#ff0000;fill-rule:evenodd;
+                stroke:#000000;stroke-width:2.33903;"/>
+      <text x="20" y="75"
+            style="stroke:#ffffff;stroke-width:1.0;
+                   font-size:72;font-weight:normal;fill:#ffffff;
+                   font-family:Arial;text-anchor:start;">POD</text>
+    </g>
+  </g>
+</svg>
diff --git a/src/site/src/documentation/skins/common/images/rc.svg.xslt b/src/site/src/documentation/skins/common/images/rc.svg.xslt
new file mode 100644
index 0000000..d8924fe
--- /dev/null
+++ b/src/site/src/documentation/skins/common/images/rc.svg.xslt
@@ -0,0 +1,27 @@
+<?xml version="1.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.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:import href="corner-imports.svg.xslt" />
+<!-- Rounded corner -->
+  <xsl:template name="figure">
+    <g transform="translate(0.5 0.5)">
+      <ellipse cx="{$smallersize}" cy="{$smallersize}" rx="{$smallersize}" ry="{$smallersize}"
+				 style="{$fill}{$stroke}stroke-width:1"/>
+    </g>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/images/txtdoc.svg.xslt b/src/site/src/documentation/skins/common/images/txtdoc.svg.xslt
new file mode 100644
index 0000000..d85715c
--- /dev/null
+++ b/src/site/src/documentation/skins/common/images/txtdoc.svg.xslt
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  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.
+-->
+<svg width="20pt" height="20pt"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink">
+  <defs
+     id="defs550">
+    <linearGradient id="gray2white">
+      <stop style="stop-color:#7f7f7f;stop-opacity:1;" offset="0.000000"/>
+      <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1.000000"/>
+    </linearGradient>
+    <linearGradient id="pageshade" xlink:href="#gray2white"
+       x1="0.95" y1="0.95"
+       x2="0.40" y2="0.20"
+       gradientUnits="objectBoundingBox" spreadMethod="pad" />
+    <path d="M 0 0 L 200 0" style="stroke:#000000;stroke-width:1pt;" id="hr"/>
+  </defs>
+  <g transform="scale(0.08)">
+    <g transform="translate(40, 0)">
+      <rect width="230" height="300" x="0" y="0"
+            style="fill:url(#pageshade);fill-rule:evenodd;
+            stroke:#000000;stroke-width:1.25;"/>
+      <g transform="translate(15, 60)">
+        <use xlink:href="#hr" x="0" y="0"/>
+        <use xlink:href="#hr" x="0" y="60"/>
+        <use xlink:href="#hr" x="0" y="120"/>
+        <use xlink:href="#hr" x="0" y="180"/>
+      </g>
+    </g>
+    <g transform="translate(0,70),scale(1.1,1.6)">
+      <rect width="200" height="100" x="0" y="0"
+         style="fill:#ff0000;fill-rule:evenodd;
+                stroke:#000000;stroke-width:2.33903;"/>
+      <text x="20" y="75"
+            style="stroke:#ffffff;stroke-width:1.0;
+                   font-size:72;font-weight:normal;fill:#ffffff;
+                   font-family:Arial;text-anchor:start;">TXT</text>
+    </g>
+  </g>
+</svg>
diff --git a/src/site/src/documentation/skins/common/scripts/breadcrumbs-optimized.js b/src/site/src/documentation/skins/common/scripts/breadcrumbs-optimized.js
new file mode 100644
index 0000000..507612a
--- /dev/null
+++ b/src/site/src/documentation/skins/common/scripts/breadcrumbs-optimized.js
@@ -0,0 +1,90 @@
+/*
+* 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.
+*/
+var PREPREND_CRUMBS=new Array();
+var link1="@skinconfig.trail.link1.name@";
+var link2="@skinconfig.trail.link2.name@";
+var link3="@skinconfig.trail.link3.name@";
+if(!(link1=="")&&!link1.indexOf( "@" ) == 0){
+  PREPREND_CRUMBS.push( new Array( link1, @skinconfig.trail.link1.href@ ) ); }
+if(!(link2=="")&&!link2.indexOf( "@" ) == 0){
+  PREPREND_CRUMBS.push( new Array( link2, @skinconfig.trail.link2.href@ ) ); }
+if(!(link3=="")&&!link3.indexOf( "@" ) == 0){
+  PREPREND_CRUMBS.push( new Array( link3, @skinconfig.trail.link3.href@ ) ); }
+var DISPLAY_SEPARATOR=" &gt; ";
+var DISPLAY_PREPREND=" &gt; ";
+var DISPLAY_POSTPREND=":";
+var CSS_CLASS_CRUMB="breadcrumb";
+var CSS_CLASS_TRAIL="breadcrumbTrail";
+var CSS_CLASS_SEPARATOR="crumbSeparator";
+var FILE_EXTENSIONS=new Array( ".html", ".htm", ".jsp", ".php", ".php3", ".php4" );
+var PATH_SEPARATOR="/";
+
+function sc(s) {
+	var l=s.toLowerCase();
+	return l.substr(0,1).toUpperCase()+l.substr(1);
+}
+function getdirs() {
+	var t=document.location.pathname.split(PATH_SEPARATOR);
+	var lc=t[t.length-1];
+	for(var i=0;i < FILE_EXTENSIONS.length;i++)
+	{
+		if(lc.indexOf(FILE_EXTENSIONS[i]))
+			return t.slice(1,t.length-1); }
+	return t.slice(1,t.length);
+}
+function getcrumbs( d )
+{
+	var pre = "/";
+	var post = "/";
+	var c = new Array();
+	if( d != null )
+	{
+		for(var i=0;i < d.length;i++) {
+			pre+=d[i]+postfix;
+			c.push(new Array(d[i],pre)); }
+	}
+	if(PREPREND_CRUMBS.length > 0 )
+		return PREPREND_CRUMBS.concat( c );
+	return c;
+}
+function gettrail( c )
+{
+	var h=DISPLAY_PREPREND;
+	for(var i=0;i < c.length;i++)
+	{
+		h+='<a href="'+c[i][1]+'" >'+sc(c[i][0])+'</a>';
+		if(i!=(c.length-1))
+			h+=DISPLAY_SEPARATOR; }
+	return h+DISPLAY_POSTPREND;
+}
+
+function gettrailXHTML( c )
+{
+	var h='<span class="'+CSS_CLASS_TRAIL+'">'+DISPLAY_PREPREND;
+	for(var i=0;i < c.length;i++)
+	{
+		h+='<a href="'+c[i][1]+'" class="'+CSS_CLASS_CRUMB+'">'+sc(c[i][0])+'</a>';
+		if(i!=(c.length-1))
+			h+='<span class="'+CSS_CLASS_SEPARATOR+'">'+DISPLAY_SEPARATOR+'</span>'; }
+	return h+DISPLAY_POSTPREND+'</span>';
+}
+
+if(document.location.href.toLowerCase().indexOf("http://")==-1)
+	document.write(gettrail(getcrumbs()));
+else
+	document.write(gettrail(getcrumbs(getdirs())));
+
diff --git a/src/site/src/documentation/skins/common/scripts/breadcrumbs.js b/src/site/src/documentation/skins/common/scripts/breadcrumbs.js
new file mode 100644
index 0000000..aea80ec
--- /dev/null
+++ b/src/site/src/documentation/skins/common/scripts/breadcrumbs.js
@@ -0,0 +1,237 @@
+/*
+* 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.
+*/
+/**
+ * This script, when included in a html file, builds a neat breadcrumb trail
+ * based on its url. That is, if it doesn't contains bugs (I'm relatively
+ * sure it does).
+ *
+ * Typical usage:
+ * <script type="text/javascript" language="JavaScript" src="breadcrumbs.js"></script>
+ */
+
+/**
+ * IE 5 on Mac doesn't know Array.push.
+ *
+ * Implement it - courtesy to fritz.
+ */
+var abc	= new Array();
+if (!abc.push) {
+  Array.prototype.push	= function(what){this[this.length]=what}
+}
+
+/* ========================================================================
+	CONSTANTS
+   ======================================================================== */
+
+/**
+ * Two-dimensional array containing extra crumbs to place at the front of
+ * the trail. Specify first the name of the crumb, then the URI that belongs
+ * to it. You'll need to modify this for every domain or subdomain where
+ * you use this script (you can leave it as an empty array if you wish)
+ */
+var PREPREND_CRUMBS = new Array();
+
+var link1 = "@skinconfig.trail.link1.name@";
+var link2 = "@skinconfig.trail.link2.name@";
+var link3 = "@skinconfig.trail.link3.name@";
+
+var href1 = "@skinconfig.trail.link1.href@";
+var href2 = "@skinconfig.trail.link2.href@";
+var href3 = "@skinconfig.trail.link3.href@";
+
+   if(!(link1=="")&&!link1.indexOf( "@" ) == 0){
+     PREPREND_CRUMBS.push( new Array( link1, href1 ) );
+   }
+   if(!(link2=="")&&!link2.indexOf( "@" ) == 0){
+     PREPREND_CRUMBS.push( new Array( link2, href2 ) );
+   }
+   if(!(link3=="")&&!link3.indexOf( "@" ) == 0){
+     PREPREND_CRUMBS.push( new Array( link3, href3 ) );
+   }
+
+/**
+ * String to include between crumbs:
+ */
+var DISPLAY_SEPARATOR = " &gt; ";
+/**
+ * String to include at the beginning of the trail
+ */
+var DISPLAY_PREPREND = " &gt; ";
+/**
+ * String to include at the end of the trail
+ */
+var DISPLAY_POSTPREND = "";
+
+/**
+ * CSS Class to use for a single crumb:
+ */
+var CSS_CLASS_CRUMB = "breadcrumb";
+
+/**
+ * CSS Class to use for the complete trail:
+ */
+var CSS_CLASS_TRAIL = "breadcrumbTrail";
+
+/**
+ * CSS Class to use for crumb separator:
+ */
+var CSS_CLASS_SEPARATOR = "crumbSeparator";
+
+/**
+ * Array of strings containing common file extensions. We use this to
+ * determine what part of the url to ignore (if it contains one of the
+ * string specified here, we ignore it).
+ */
+var FILE_EXTENSIONS = new Array( ".html", ".htm", ".jsp", ".php", ".php3", ".php4" );
+
+/**
+ * String that separates parts of the breadcrumb trail from each other.
+ * When this is no longer a slash, I'm sure I'll be old and grey.
+ */
+var PATH_SEPARATOR = "/";
+
+/* ========================================================================
+	UTILITY FUNCTIONS
+   ======================================================================== */
+/**
+ * Capitalize first letter of the provided string and return the modified
+ * string.
+ */
+function sentenceCase( string )
+{        return string;
+	//var lower = string.toLowerCase();
+	//return lower.substr(0,1).toUpperCase() + lower.substr(1);
+}
+
+/**
+ * Returns an array containing the names of all the directories in the
+ * current document URL
+ */
+function getDirectoriesInURL()
+{
+	var trail = document.location.pathname.split( PATH_SEPARATOR );
+
+	// check whether last section is a file or a directory
+	var lastcrumb = trail[trail.length-1];
+	for( var i = 0; i < FILE_EXTENSIONS.length; i++ )
+	{
+		if( lastcrumb.indexOf( FILE_EXTENSIONS[i] ) )
+		{
+			// it is, remove it and send results
+			return trail.slice( 1, trail.length-1 );
+		}
+	}
+
+	// it's not; send the trail unmodified
+	return trail.slice( 1, trail.length );
+}
+
+/* ========================================================================
+	BREADCRUMB FUNCTIONALITY
+   ======================================================================== */
+/**
+ * Return a two-dimensional array describing the breadcrumbs based on the
+ * array of directories passed in.
+ */
+function getBreadcrumbs( dirs )
+{
+	var prefix = "/";
+	var postfix = "/";
+
+	// the array we will return
+	var crumbs = new Array();
+
+	if( dirs != null )
+	{
+		for( var i = 0; i < dirs.length; i++ )
+		{
+			prefix += dirs[i] + postfix;
+			crumbs.push( new Array( dirs[i], prefix ) );
+		}
+	}
+
+	// preprend the PREPREND_CRUMBS
+	if(PREPREND_CRUMBS.length > 0 )
+	{
+		return PREPREND_CRUMBS.concat( crumbs );
+	}
+
+	return crumbs;
+}
+
+/**
+ * Return a string containing a simple text breadcrumb trail based on the
+ * two-dimensional array passed in.
+ */
+function getCrumbTrail( crumbs )
+{
+	var xhtml = DISPLAY_PREPREND;
+
+	for( var i = 0; i < crumbs.length; i++ )
+	{
+		xhtml += '<a href="' + crumbs[i][1] + '" >';
+		xhtml += unescape( crumbs[i][0] ) + '</a>';
+		if( i != (crumbs.length-1) )
+		{
+			xhtml += DISPLAY_SEPARATOR;
+		}
+	}
+
+	xhtml += DISPLAY_POSTPREND;
+
+	return xhtml;
+}
+
+/**
+ * Return a string containing an XHTML breadcrumb trail based on the
+ * two-dimensional array passed in.
+ */
+function getCrumbTrailXHTML( crumbs )
+{
+	var xhtml = '<span class="' + CSS_CLASS_TRAIL  + '">';
+	xhtml += DISPLAY_PREPREND;
+
+	for( var i = 0; i < crumbs.length; i++ )
+	{
+		xhtml += '<a href="' + crumbs[i][1] + '" class="' + CSS_CLASS_CRUMB + '">';
+		xhtml += unescape( crumbs[i][0] ) + '</a>';
+		if( i != (crumbs.length-1) )
+		{
+			xhtml += '<span class="' + CSS_CLASS_SEPARATOR + '">' + DISPLAY_SEPARATOR + '</span>';
+		}
+	}
+
+	xhtml += DISPLAY_POSTPREND;
+	xhtml += '</span>';
+
+	return xhtml;
+}
+
+/* ========================================================================
+	PRINT BREADCRUMB TRAIL
+   ======================================================================== */
+
+// check if we're local; if so, only print the PREPREND_CRUMBS
+if( document.location.href.toLowerCase().indexOf( "http://" ) == -1 )
+{
+	document.write( getCrumbTrail( getBreadcrumbs() ) );
+}
+else
+{
+	document.write( getCrumbTrail( getBreadcrumbs( getDirectoriesInURL() ) ) );
+}
+
diff --git a/src/site/src/documentation/skins/common/scripts/fontsize.js b/src/site/src/documentation/skins/common/scripts/fontsize.js
new file mode 100644
index 0000000..11722bf
--- /dev/null
+++ b/src/site/src/documentation/skins/common/scripts/fontsize.js
@@ -0,0 +1,166 @@
+/*
+* 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.
+*/
+function init() 
+{ //embedded in the doc
+  //ndeSetTextSize();
+}
+
+function checkBrowser(){
+  if (!document.getElementsByTagName){
+    return true;
+  }
+  else{
+    return false;
+  }
+}
+
+
+function ndeSetTextSize(chgsize,rs) 
+{
+  var startSize;
+  var newSize;
+
+  if (!checkBrowser)
+  {
+    return;
+  }
+
+  startSize = parseInt(ndeGetDocTextSize());
+
+  if (!startSize)
+  {
+    startSize = 16;
+  }
+
+  switch (chgsize)
+  {
+  case 'incr':
+    newSize = startSize + 2;
+    break;
+
+  case 'decr':
+    newSize = startSize - 2;
+    break;
+
+  case 'reset':
+    if (rs) {newSize = rs;} else {newSize = 16;}
+    break;
+
+  default:
+    try{
+      newSize = parseInt(ndeReadCookie("nde-textsize"));
+    }
+    catch(e){
+      alert(e);
+    }
+    
+    if (!newSize || newSize == 'NaN')
+    {
+      newSize = startSize;
+    }
+    break;
+
+  }
+
+  if (newSize < 10) 
+  {
+    newSize = 10;
+  }
+
+  newSize += 'px';
+
+  document.getElementsByTagName('html')[0].style.fontSize = newSize;
+  document.getElementsByTagName('body')[0].style.fontSize = newSize;
+
+  ndeCreateCookie("nde-textsize", newSize, 365);
+}
+
+function ndeGetDocTextSize() 
+{
+  if (!checkBrowser)
+  {
+    return 0;
+  }
+
+  var size = 0;
+  var body = document.getElementsByTagName('body')[0];
+
+  if (body.style && body.style.fontSize)
+  {
+    size = body.style.fontSize;
+  }
+  else if (typeof(getComputedStyle) != 'undefined')
+  {
+    size = getComputedStyle(body,'').getPropertyValue('font-size');
+  }
+  else if (body.currentStyle)
+  {
+   size = body.currentStyle.fontSize;
+  }
+
+  //fix IE bug
+  if( isNaN(size)){
+    if(size.substring(size.length-1)=="%"){
+      return
+    }
+
+  }
+
+  return size;
+
+}
+
+
+
+function ndeCreateCookie(name,value,days) 
+{
+  var cookie = name + "=" + value + ";";
+
+  if (days) 
+  {
+    var date = new Date();
+    date.setTime(date.getTime()+(days*24*60*60*1000));
+    cookie += " expires=" + date.toGMTString() + ";";
+  }
+  cookie += " path=/";
+
+  document.cookie = cookie;
+
+}
+
+function ndeReadCookie(name) 
+{
+  var nameEQ = name + "=";
+  var ca = document.cookie.split(';');
+
+ 
+  for(var i = 0; i < ca.length; i++) 
+  {
+    var c = ca[i];
+    while (c.charAt(0) == ' ') 
+    {
+      c = c.substring(1, c.length);
+    }
+
+    ctest = c.substring(0,name.length);
+ 
+    if(ctest == name){
+      return c.substring(nameEQ.length,c.length);
+    }
+  }
+  return null;
+}
diff --git a/src/site/src/documentation/skins/common/scripts/getBlank.js b/src/site/src/documentation/skins/common/scripts/getBlank.js
new file mode 100644
index 0000000..d9978c0
--- /dev/null
+++ b/src/site/src/documentation/skins/common/scripts/getBlank.js
@@ -0,0 +1,40 @@
+/*
+* 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.
+*/
+/**
+ * getBlank script - when included in a html file and called from a form text field, will set the value of this field to ""
+ * if the text value is still the standard value.
+ * getPrompt script - when included in a html file and called from a form text field, will set the value of this field to the prompt
+ * if the text value is empty.
+ *
+ * Typical usage:
+ * <script type="text/javascript" language="JavaScript" src="getBlank.js"></script>
+ * <input type="text" id="query" value="Search the site:" onFocus="getBlank (this, 'Search the site:');" onBlur="getBlank (this, 'Search the site:');"/>
+ */
+<!--
+function getBlank (form, stdValue){
+if (form.value == stdValue){
+	form.value = '';
+	}
+return true;
+}
+function getPrompt (form, stdValue){
+if (form.value == ''){
+	form.value = stdValue;
+	}
+return true;
+}
+//-->
diff --git a/src/site/src/documentation/skins/common/scripts/getMenu.js b/src/site/src/documentation/skins/common/scripts/getMenu.js
new file mode 100644
index 0000000..b17aad6
--- /dev/null
+++ b/src/site/src/documentation/skins/common/scripts/getMenu.js
@@ -0,0 +1,45 @@
+/*
+* 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.
+*/
+/**
+ * This script, when included in a html file, can be used to make collapsible menus
+ *
+ * Typical usage:
+ * <script type="text/javascript" language="JavaScript" src="menu.js"></script>
+ */
+
+if (document.getElementById){ 
+  document.write('<style type="text/css">.menuitemgroup{display: none;}</style>')
+}
+
+
+function SwitchMenu(obj, thePath)
+{
+var open = 'url("'+thePath + 'images/chapter_open.gif")';
+var close = 'url("'+thePath + 'images/chapter.gif")';
+  if(document.getElementById)  {
+    var el = document.getElementById(obj);
+    var title = document.getElementById(obj+'Title');
+
+    if(el.style.display != "block"){ 
+      title.style.backgroundImage = open;
+      el.style.display = "block";
+    }else{
+      title.style.backgroundImage = close;
+      el.style.display = "none";
+    }
+  }// end -  if(document.getElementById) 
+}//end - function SwitchMenu(obj)
diff --git a/src/site/src/documentation/skins/common/scripts/menu.js b/src/site/src/documentation/skins/common/scripts/menu.js
new file mode 100644
index 0000000..06ea471
--- /dev/null
+++ b/src/site/src/documentation/skins/common/scripts/menu.js
@@ -0,0 +1,48 @@
+/*
+* 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.
+*/
+/**
+ * This script, when included in a html file, can be used to make collapsible menus
+ *
+ * Typical usage:
+ * <script type="text/javascript" language="JavaScript" src="menu.js"></script>
+ */
+
+if (document.getElementById){ 
+  document.write('<style type="text/css">.menuitemgroup{display: none;}</style>')
+}
+
+function SwitchMenu(obj)
+{
+  if(document.getElementById)  {
+    var el = document.getElementById(obj);
+    var title = document.getElementById(obj+'Title');
+
+    if(obj.indexOf("_selected_")==0&&el.style.display == ""){
+      el.style.display = "block";
+      title.className = "pagegroupselected";
+    }
+
+    if(el.style.display != "block"){
+      el.style.display = "block";
+      title.className = "pagegroupopen";
+    }
+    else{
+      el.style.display = "none";
+      title.className = "pagegroup";
+    }
+  }// end -  if(document.getElementById) 
+}//end - function SwitchMenu(obj)
diff --git a/src/site/src/documentation/skins/common/scripts/prototype.js b/src/site/src/documentation/skins/common/scripts/prototype.js
new file mode 100644
index 0000000..ed7d920
--- /dev/null
+++ b/src/site/src/documentation/skins/common/scripts/prototype.js
@@ -0,0 +1,1257 @@
+/*  Prototype JavaScript framework, version 1.4.0_pre4
+ *  (c) 2005 Sam Stephenson <sam@conio.net>
+ *
+ *  THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff
+ *  against the source tree, available from the Prototype darcs repository. 
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *
+ *  For details, see the Prototype web site: http://prototype.conio.net/
+ *
+/*--------------------------------------------------------------------------*/
+
+var Prototype = {
+  Version: '1.4.0_pre4',
+  
+  emptyFunction: function() {},
+  K: function(x) {return x}
+}
+
+var Class = {
+  create: function() {
+    return function() { 
+      this.initialize.apply(this, arguments);
+    }
+  }
+}
+
+var Abstract = new Object();
+
+Object.extend = function(destination, source) {
+  for (property in source) {
+    destination[property] = source[property];
+  }
+  return destination;
+}
+
+Function.prototype.bind = function(object) {
+  var __method = this;
+  return function() {
+    return __method.apply(object, arguments);
+  }
+}
+
+Function.prototype.bindAsEventListener = function(object) {
+  var __method = this;
+  return function(event) {
+    return __method.call(object, event || window.event);
+  }
+}
+
+Number.prototype.toColorPart = function() {
+  var digits = this.toString(16);
+  if (this < 16) return '0' + digits;
+  return digits;
+}
+
+var Try = {
+  these: function() {
+    var returnValue;
+
+    for (var i = 0; i < arguments.length; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) {}
+    }
+
+    return returnValue;
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create();
+PeriodicalExecuter.prototype = {
+  initialize: function(callback, frequency) {
+    this.callback = callback;
+    this.frequency = frequency;
+    this.currentlyExecuting = false;
+
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    if (!this.currentlyExecuting) {
+      try { 
+        this.currentlyExecuting = true;
+        this.callback(); 
+      } finally { 
+        this.currentlyExecuting = false;
+      }
+    }
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+function $() {
+  var elements = new Array();
+
+  for (var i = 0; i < arguments.length; i++) {
+    var element = arguments[i];
+    if (typeof element == 'string')
+      element = document.getElementById(element);
+
+    if (arguments.length == 1) 
+      return element;
+
+    elements.push(element);
+  }
+
+  return elements;
+}
+
+if (!Array.prototype.push) {
+  Array.prototype.push = function() {
+		var startLength = this.length;
+		for (var i = 0; i < arguments.length; i++)
+      this[startLength + i] = arguments[i];
+	  return this.length;
+  }
+}
+
+if (!Function.prototype.apply) {
+  // Based on code from http://www.youngpup.net/
+  Function.prototype.apply = function(object, parameters) {
+    var parameterStrings = new Array();
+    if (!object)     object = window;
+    if (!parameters) parameters = new Array();
+    
+    for (var i = 0; i < parameters.length; i++)
+      parameterStrings[i] = 'parameters[' + i + ']';
+    
+    object.__apply__ = this;
+    var result = eval('object.__apply__(' + 
+      parameterStrings.join(', ') + ')');
+    object.__apply__ = null;
+    
+    return result;
+  }
+}
+
+Object.extend(String.prototype, {
+  stripTags: function() {
+    return this.replace(/<\/?[^>]+>/gi, '');
+  },
+
+  escapeHTML: function() {
+    var div = document.createElement('div');
+    var text = document.createTextNode(this);
+    div.appendChild(text);
+    return div.innerHTML;
+  },
+
+  unescapeHTML: function() {
+    var div = document.createElement('div');
+    div.innerHTML = this.stripTags();
+    return div.childNodes[0].nodeValue;
+  },
+  
+  parseQuery: function() {
+    var str = this;
+    if (str.substring(0,1) == '?') {
+      str = this.substring(1);
+    }
+    var result = {};
+    var pairs = str.split('&');
+    for (var i = 0; i < pairs.length; i++) {
+      var pair = pairs[i].split('=');
+      result[pair[0]] = pair[1];
+    }
+    return result;
+  }
+});
+
+
+var _break    = new Object();
+var _continue = new Object();
+
+var Enumerable = {
+  each: function(iterator) {
+    var index = 0;
+    try {
+      this._each(function(value) {
+        try {
+          iterator(value, index++);
+        } catch (e) {
+          if (e != _continue) throw e;
+        }
+      });
+    } catch (e) {
+      if (e != _break) throw e;
+    }
+  },
+  
+  all: function(iterator) {
+    var result = true;
+    this.each(function(value, index) {
+      if (!(result &= (iterator || Prototype.K)(value, index))) 
+        throw _break;
+    });
+    return result;
+  },
+  
+  any: function(iterator) {
+    var result = true;
+    this.each(function(value, index) {
+      if (result &= (iterator || Prototype.K)(value, index)) 
+        throw _break;
+    });
+    return result;
+  },
+  
+  collect: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push(iterator(value, index));
+    });
+    return results;
+  },
+  
+  detect: function (iterator) {
+    var result;
+    this.each(function(value, index) {
+      if (iterator(value, index)) {
+        result = value;
+        throw _break;
+      }
+    });
+    return result;
+  },
+  
+  findAll: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+  
+  grep: function(pattern, iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      var stringValue = value.toString();
+      if (stringValue.match(pattern))
+        results.push((iterator || Prototype.K)(value, index));
+    })
+    return results;
+  },
+  
+  include: function(object) {
+    var found = false;
+    this.each(function(value) {
+      if (value == object) {
+        found = true;
+        throw _break;
+      }
+    });
+    return found;
+  },
+  
+  inject: function(memo, iterator) {
+    this.each(function(value, index) {
+      memo = iterator(memo, value, index);
+    });
+    return memo;
+  },
+  
+  invoke: function(method) {
+    var args = $A(arguments).slice(1);
+    return this.collect(function(value) {
+      return value[method].apply(value, args);
+    });
+  },
+  
+  max: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (value >= (result || value))
+        result = value;
+    });
+    return result;
+  },
+  
+  min: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (value <= (result || value))
+        result = value;
+    });
+    return result;
+  },
+  
+  partition: function(iterator) {
+    var trues = [], falses = [];
+    this.each(function(value, index) {
+      ((iterator || Prototype.K)(value, index) ? 
+        trues : falses).push(value);
+    });
+    return [trues, falses];
+  },
+  
+  pluck: function(property) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push(value[property]);
+    });
+    return results;
+  },
+  
+  reject: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (!iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+  
+  sortBy: function(iterator) {
+    return this.collect(function(value, index) {
+      return {value: value, criteria: iterator(value, index)};
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }).pluck('value');
+  },
+  
+  toArray: function() {
+    return this.collect(Prototype.K);
+  },
+  
+  zip: function() {
+    var iterator = Prototype.K, args = $A(arguments);
+    if (typeof args.last() == 'function')
+      iterator = args.pop();
+
+    var collections = [this].concat(args).map($A);
+    return this.map(function(value, index) {
+      iterator(value = collections.pluck(index));
+      return value;
+    });
+  }
+}
+
+Object.extend(Enumerable, {
+  map:     Enumerable.collect,
+  find:    Enumerable.detect,
+  select:  Enumerable.findAll,
+  member:  Enumerable.include,
+  entries: Enumerable.toArray
+});
+
+$A = Array.from = function(iterable) {
+  var results = [];
+  for (var i = 0; i < iterable.length; i++)
+    results.push(iterable[i]);
+  return results;
+}
+
+Object.extend(Array.prototype, {
+  _each: function(iterator) {
+    for (var i = 0; i < this.length; i++)
+      iterator(this[i]);
+  },
+  
+  first: function() {
+    return this[0];
+  },
+  
+  last: function() {
+    return this[this.length - 1];
+  }
+});
+
+Object.extend(Array.prototype, Enumerable);
+
+
+var Ajax = {
+  getTransport: function() {
+    return Try.these(
+      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+      function() {return new ActiveXObject('Microsoft.XMLHTTP')},
+      function() {return new XMLHttpRequest()}
+    ) || false;
+  }
+}
+
+Ajax.Base = function() {};
+Ajax.Base.prototype = {
+  setOptions: function(options) {
+    this.options = {
+      method:       'post',
+      asynchronous: true,
+      parameters:   ''
+    }
+    Object.extend(this.options, options || {});
+  },
+
+  responseIsSuccess: function() {
+    return this.transport.status == undefined
+        || this.transport.status == 0 
+        || (this.transport.status >= 200 && this.transport.status < 300);
+  },
+
+  responseIsFailure: function() {
+    return !this.responseIsSuccess();
+  }
+}
+
+Ajax.Request = Class.create();
+Ajax.Request.Events = 
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
+  initialize: function(url, options) {
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+    this.request(url);
+  },
+
+  request: function(url) {
+    var parameters = this.options.parameters || '';
+    if (parameters.length > 0) parameters += '&_=';
+
+    try {
+      if (this.options.method == 'get')
+        url += '?' + parameters;
+
+      this.transport.open(this.options.method, url,
+        this.options.asynchronous);
+
+      if (this.options.asynchronous) {
+        this.transport.onreadystatechange = this.onStateChange.bind(this);
+        setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
+      }
+
+      this.setRequestHeaders();
+
+      var body = this.options.postBody ? this.options.postBody : parameters;
+      this.transport.send(this.options.method == 'post' ? body : null);
+
+    } catch (e) {
+    }
+  },
+
+  setRequestHeaders: function() {
+    var requestHeaders = 
+      ['X-Requested-With', 'XMLHttpRequest',
+       'X-Prototype-Version', Prototype.Version];
+
+    if (this.options.method == 'post') {
+      requestHeaders.push('Content-type', 
+        'application/x-www-form-urlencoded');
+
+      /* Force "Connection: close" for Mozilla browsers to work around
+       * a bug where XMLHttpReqeuest sends an incorrect Content-length
+       * header. See Mozilla Bugzilla #246651. 
+       */
+      if (this.transport.overrideMimeType)
+        requestHeaders.push('Connection', 'close');
+    }
+
+    if (this.options.requestHeaders)
+      requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
+
+    for (var i = 0; i < requestHeaders.length; i += 2)
+      this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
+  },
+
+  onStateChange: function() {
+    var readyState = this.transport.readyState;
+    if (readyState != 1)
+      this.respondToReadyState(this.transport.readyState);
+  },
+
+  respondToReadyState: function(readyState) {
+    var event = Ajax.Request.Events[readyState];
+
+    if (event == 'Complete')
+      (this.options['on' + this.transport.status]
+       || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
+       || Prototype.emptyFunction)(this.transport);
+
+    (this.options['on' + event] || Prototype.emptyFunction)(this.transport);
+
+    /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
+    if (event == 'Complete')
+      this.transport.onreadystatechange = Prototype.emptyFunction;
+  }
+});
+
+Ajax.Updater = Class.create();
+Ajax.Updater.ScriptFragment = '(?:<script.*?>)((\n|.)*?)(?:<\/script>)';
+
+Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
+  initialize: function(container, url, options) {
+    this.containers = {
+      success: container.success ? $(container.success) : $(container),
+      failure: container.failure ? $(container.failure) :
+        (container.success ? null : $(container))
+    }
+
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+
+    var onComplete = this.options.onComplete || Prototype.emptyFunction;
+    this.options.onComplete = (function() {
+      this.updateContent();
+      onComplete(this.transport);
+    }).bind(this);
+
+    this.request(url);
+  },
+
+  updateContent: function() {
+    var receiver = this.responseIsSuccess() ?
+      this.containers.success : this.containers.failure;
+
+    var match    = new RegExp(Ajax.Updater.ScriptFragment, 'img');
+    var response = this.transport.responseText.replace(match, '');
+    var scripts  = this.transport.responseText.match(match);
+
+    if (receiver) {
+      if (this.options.insertion) {
+        new this.options.insertion(receiver, response);
+      } else {
+        receiver.innerHTML = response;
+      }
+    }
+
+    if (this.responseIsSuccess()) {
+      if (this.onComplete)
+        setTimeout((function() {this.onComplete(
+          this.transport)}).bind(this), 10);
+    }
+
+    if (this.options.evalScripts && scripts) {
+      match = new RegExp(Ajax.Updater.ScriptFragment, 'im');
+      setTimeout((function() {
+        for (var i = 0; i < scripts.length; i++)
+          eval(scripts[i].match(match)[1]);
+      }).bind(this), 10);
+    }
+  }
+});
+
+Ajax.PeriodicalUpdater = Class.create();
+Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
+  initialize: function(container, url, options) {
+    this.setOptions(options);
+    this.onComplete = this.options.onComplete;
+
+    this.frequency = (this.options.frequency || 2);
+    this.decay = 1;
+
+    this.updater = {};
+    this.container = container;
+    this.url = url;
+
+    this.start();
+  },
+
+  start: function() {
+    this.options.onComplete = this.updateComplete.bind(this);
+    this.onTimerEvent();
+  },
+
+  stop: function() {
+    this.updater.onComplete = undefined;
+    clearTimeout(this.timer);
+    (this.onComplete || Ajax.emptyFunction).apply(this, arguments);
+  },
+
+  updateComplete: function(request) {
+    if (this.options.decay) {
+      this.decay = (request.responseText == this.lastText ? 
+        this.decay * this.options.decay : 1);
+
+      this.lastText = request.responseText;
+    }
+    this.timer = setTimeout(this.onTimerEvent.bind(this), 
+      this.decay * this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    this.updater = new Ajax.Updater(this.container, this.url, this.options);
+  }
+});
+
+document.getElementsByClassName = function(className) {
+  var children = document.getElementsByTagName('*') || document.all;
+  var elements = new Array();
+  
+  for (var i = 0; i < children.length; i++) {
+    var child = children[i];
+    var classNames = child.className.split(' ');
+    for (var j = 0; j < classNames.length; j++) {
+      if (classNames[j] == className) {
+        elements.push(child);
+        break;
+      }
+    }
+  }
+  
+  return elements;
+}
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Element) {
+  var Element = new Object();
+}
+
+Object.extend(Element, {
+  toggle: function() {
+    for (var i = 0; i < arguments.length; i++) {
+      var element = $(arguments[i]);
+      element.style.display = 
+        (element.style.display == 'none' ? '' : 'none');
+    }
+  },
+
+  hide: function() {
+    for (var i = 0; i < arguments.length; i++) {
+      var element = $(arguments[i]);
+      element.style.display = 'none';
+    }
+  },
+
+  show: function() {
+    for (var i = 0; i < arguments.length; i++) {
+      var element = $(arguments[i]);
+      element.style.display = '';
+    }
+  },
+
+  remove: function(element) {
+    element = $(element);
+    element.parentNode.removeChild(element);
+  },
+   
+  getHeight: function(element) {
+    element = $(element);
+    return element.offsetHeight; 
+  },
+
+  hasClassName: function(element, className) {
+    element = $(element);
+    if (!element)
+      return;
+    var a = element.className.split(' ');
+    for (var i = 0; i < a.length; i++) {
+      if (a[i] == className)
+        return true;
+    }
+    return false;
+  },
+
+  addClassName: function(element, className) {
+    element = $(element);
+    Element.removeClassName(element, className);
+    element.className += ' ' + className;
+  },
+
+  removeClassName: function(element, className) {
+    element = $(element);
+    if (!element)
+      return;
+    var newClassName = '';
+    var a = element.className.split(' ');
+    for (var i = 0; i < a.length; i++) {
+      if (a[i] != className) {
+        if (i > 0)
+          newClassName += ' ';
+        newClassName += a[i];
+      }
+    }
+    element.className = newClassName;
+  },
+  
+  // removes whitespace-only text node children
+  cleanWhitespace: function(element) {
+    var element = $(element);
+    for (var i = 0; i < element.childNodes.length; i++) {
+      var node = element.childNodes[i];
+      if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) 
+        Element.remove(node);
+    }
+  }
+});
+
+var Toggle = new Object();
+Toggle.display = Element.toggle;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.Insertion = function(adjacency) {
+  this.adjacency = adjacency;
+}
+
+Abstract.Insertion.prototype = {
+  initialize: function(element, content) {
+    this.element = $(element);
+    this.content = content;
+    
+    if (this.adjacency && this.element.insertAdjacentHTML) {
+      this.element.insertAdjacentHTML(this.adjacency, this.content);
+    } else {
+      this.range = this.element.ownerDocument.createRange();
+      if (this.initializeRange) this.initializeRange();
+      this.fragment = this.range.createContextualFragment(this.content);
+      this.insertContent();
+    }
+  }
+}
+
+var Insertion = new Object();
+
+Insertion.Before = Class.create();
+Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
+  initializeRange: function() {
+    this.range.setStartBefore(this.element);
+  },
+  
+  insertContent: function() {
+    this.element.parentNode.insertBefore(this.fragment, this.element);
+  }
+});
+
+Insertion.Top = Class.create();
+Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(true);
+  },
+  
+  insertContent: function() {  
+    this.element.insertBefore(this.fragment, this.element.firstChild);
+  }
+});
+
+Insertion.Bottom = Class.create();
+Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(this.element);
+  },
+  
+  insertContent: function() {
+    this.element.appendChild(this.fragment);
+  }
+});
+
+Insertion.After = Class.create();
+Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
+  initializeRange: function() {
+    this.range.setStartAfter(this.element);
+  },
+  
+  insertContent: function() {
+    this.element.parentNode.insertBefore(this.fragment, 
+      this.element.nextSibling);
+  }
+});
+
+var Field = {
+  clear: function() {
+    for (var i = 0; i < arguments.length; i++)
+      $(arguments[i]).value = '';
+  },
+
+  focus: function(element) {
+    $(element).focus();
+  },
+  
+  present: function() {
+    for (var i = 0; i < arguments.length; i++)
+      if ($(arguments[i]).value == '') return false;
+    return true;
+  },
+  
+  select: function(element) {
+    $(element).select();
+  },
+   
+  activate: function(element) {
+    $(element).focus();
+    $(element).select();
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Form = {
+  serialize: function(form) {
+    var elements = Form.getElements($(form));
+    var queryComponents = new Array();
+    
+    for (var i = 0; i < elements.length; i++) {
+      var queryComponent = Form.Element.serialize(elements[i]);
+      if (queryComponent)
+        queryComponents.push(queryComponent);
+    }
+    
+    return queryComponents.join('&');
+  },
+  
+  getElements: function(form) {
+    var form = $(form);
+    var elements = new Array();
+
+    for (tagName in Form.Element.Serializers) {
+      var tagElements = form.getElementsByTagName(tagName);
+      for (var j = 0; j < tagElements.length; j++)
+        elements.push(tagElements[j]);
+    }
+    return elements;
+  },
+  
+  getInputs: function(form, typeName, name) {
+    var form = $(form);
+    var inputs = form.getElementsByTagName('input');
+    
+    if (!typeName && !name)
+      return inputs;
+      
+    var matchingInputs = new Array();
+    for (var i = 0; i < inputs.length; i++) {
+      var input = inputs[i];
+      if ((typeName && input.type != typeName) ||
+          (name && input.name != name)) 
+        continue;
+      matchingInputs.push(input);
+    }
+
+    return matchingInputs;
+  },
+
+  disable: function(form) {
+    var elements = Form.getElements(form);
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      element.blur();
+      element.disabled = 'true';
+    }
+  },
+
+  enable: function(form) {
+    var elements = Form.getElements(form);
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      element.disabled = '';
+    }
+  },
+
+  focusFirstElement: function(form) {
+    var form = $(form);
+    var elements = Form.getElements(form);
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      if (element.type != 'hidden' && !element.disabled) {
+        Field.activate(element);
+        break;
+      }
+    }
+  },
+
+  reset: function(form) {
+    $(form).reset();
+  }
+}
+
+Form.Element = {
+  serialize: function(element) {
+    var element = $(element);
+    var method = element.tagName.toLowerCase();
+    var parameter = Form.Element.Serializers[method](element);
+    
+    if (parameter)
+      return encodeURIComponent(parameter[0]) + '=' + 
+        encodeURIComponent(parameter[1]);                   
+  },
+  
+  getValue: function(element) {
+    var element = $(element);
+    var method = element.tagName.toLowerCase();
+    var parameter = Form.Element.Serializers[method](element);
+    
+    if (parameter) 
+      return parameter[1];
+  }
+}
+
+Form.Element.Serializers = {
+  input: function(element) {
+    switch (element.type.toLowerCase()) {
+      case 'submit':
+      case 'hidden':
+      case 'password':
+      case 'text':
+        return Form.Element.Serializers.textarea(element);
+      case 'checkbox':  
+      case 'radio':
+        return Form.Element.Serializers.inputSelector(element);
+    }
+    return false;
+  },
+
+  inputSelector: function(element) {
+    if (element.checked)
+      return [element.name, element.value];
+  },
+
+  textarea: function(element) {
+    return [element.name, element.value];
+  },
+
+  select: function(element) {
+    var value = '';
+    if (element.type == 'select-one') {
+      var index = element.selectedIndex;
+      if (index >= 0)
+        value = element.options[index].value || element.options[index].text;
+    } else {
+      value = new Array();
+      for (var i = 0; i < element.length; i++) {
+        var opt = element.options[i];
+        if (opt.selected)
+          value.push(opt.value || opt.text);
+      }
+    }
+    return [element.name, value];
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var $F = Form.Element.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.TimedObserver = function() {}
+Abstract.TimedObserver.prototype = {
+  initialize: function(element, frequency, callback) {
+    this.frequency = frequency;
+    this.element   = $(element);
+    this.callback  = callback;
+    
+    this.lastValue = this.getValue();
+    this.registerCallback();
+  },
+  
+  registerCallback: function() {
+    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+  
+  onTimerEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+}
+
+Form.Element.Observer = Class.create();
+Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create();
+Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = function() {}
+Abstract.EventObserver.prototype = {
+  initialize: function(element, callback) {
+    this.element  = $(element);
+    this.callback = callback;
+    
+    this.lastValue = this.getValue();
+    if (this.element.tagName.toLowerCase() == 'form')
+      this.registerFormCallbacks();
+    else
+      this.registerCallback(this.element);
+  },
+  
+  onElementEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  },
+  
+  registerFormCallbacks: function() {
+    var elements = Form.getElements(this.element);
+    for (var i = 0; i < elements.length; i++)
+      this.registerCallback(elements[i]);
+  },
+  
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':  
+        case 'radio':
+          element.target = this;
+          element.prev_onclick = element.onclick || Prototype.emptyFunction;
+          element.onclick = function() {
+            this.prev_onclick(); 
+            this.target.onElementEvent();
+          }
+          break;
+        case 'password':
+        case 'text':
+        case 'textarea':
+        case 'select-one':
+        case 'select-multiple':
+          element.target = this;
+          element.prev_onchange = element.onchange || Prototype.emptyFunction;
+          element.onchange = function() {
+            this.prev_onchange(); 
+            this.target.onElementEvent();
+          }
+          break;
+      }
+    }    
+  }
+}
+
+Form.Element.EventObserver = Class.create();
+Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.EventObserver = Class.create();
+Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+
+if (!window.Event) {
+  var Event = new Object();
+}
+
+Object.extend(Event, {
+  KEY_BACKSPACE: 8,
+  KEY_TAB:       9,
+  KEY_RETURN:   13,
+  KEY_ESC:      27,
+  KEY_LEFT:     37,
+  KEY_UP:       38,
+  KEY_RIGHT:    39,
+  KEY_DOWN:     40,
+  KEY_DELETE:   46,
+
+  element: function(event) {
+    return event.target || event.srcElement;
+  },
+
+  isLeftClick: function(event) {
+    return (((event.which) && (event.which == 1)) ||
+            ((event.button) && (event.button == 1)));
+  },
+
+  pointerX: function(event) {
+    return event.pageX || (event.clientX + 
+      (document.documentElement.scrollLeft || document.body.scrollLeft));
+  },
+
+  pointerY: function(event) {
+    return event.pageY || (event.clientY + 
+      (document.documentElement.scrollTop || document.body.scrollTop));
+  },
+
+  stop: function(event) {
+    if (event.preventDefault) { 
+      event.preventDefault(); 
+      event.stopPropagation(); 
+    } else {
+      event.returnValue = false;
+    }
+  },
+
+  // find the first node with the given tagName, starting from the
+  // node the event was triggered on; traverses the DOM upwards
+  findElement: function(event, tagName) {
+    var element = Event.element(event);
+    while (element.parentNode && (!element.tagName ||
+        (element.tagName.toUpperCase() != tagName.toUpperCase())))
+      element = element.parentNode;
+    return element;
+  },
+
+  observers: false,
+  
+  _observeAndCache: function(element, name, observer, useCapture) {
+    if (!this.observers) this.observers = [];
+    if (element.addEventListener) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.addEventListener(name, observer, useCapture);
+    } else if (element.attachEvent) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.attachEvent('on' + name, observer);
+    }
+  },
+  
+  unloadCache: function() {
+    if (!Event.observers) return;
+    for (var i = 0; i < Event.observers.length; i++) {
+      Event.stopObserving.apply(this, Event.observers[i]);
+      Event.observers[i][0] = null;
+    }
+    Event.observers = false;
+  },
+
+  observe: function(element, name, observer, useCapture) {
+    var element = $(element);
+    useCapture = useCapture || false;
+    
+    if (name == 'keypress' &&
+        ((/Konqueror|Safari|KHTML/.test(navigator.userAgent)) 
+        || element.attachEvent))
+      name = 'keydown';
+    
+    this._observeAndCache(element, name, observer, useCapture);
+  },
+
+  stopObserving: function(element, name, observer, useCapture) {
+    var element = $(element);
+    useCapture = useCapture || false;
+    
+    if (name == 'keypress' &&
+        ((/Konqueror|Safari|KHTML/.test(navigator.userAgent)) 
+        || element.detachEvent))
+      name = 'keydown';
+    
+    if (element.removeEventListener) {
+      element.removeEventListener(name, observer, useCapture);
+    } else if (element.detachEvent) {
+      element.detachEvent('on' + name, observer);
+    }
+  }
+});
+
+/* prevent memory leaks in IE */
+Event.observe(window, 'unload', Event.unloadCache, false);
+
+var Position = {
+
+  // set to true if needed, warning: firefox performance problems
+  // NOT neeeded for page scrolling, only if draggable contained in
+  // scrollable elements
+  includeScrollOffsets: false, 
+
+  // must be called before calling withinIncludingScrolloffset, every time the
+  // page is scrolled
+  prepare: function() {
+    this.deltaX =  window.pageXOffset 
+                || document.documentElement.scrollLeft 
+                || document.body.scrollLeft 
+                || 0;
+    this.deltaY =  window.pageYOffset 
+                || document.documentElement.scrollTop 
+                || document.body.scrollTop 
+                || 0;
+  },
+
+  realOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0; 
+      element = element.parentNode;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  // caches x/y coordinate pair to use with overlap
+  within: function(element, x, y) {
+    if (this.includeScrollOffsets)
+      return this.withinIncludingScrolloffsets(element, x, y);
+    this.xcomp = x;
+    this.ycomp = y;
+    this.offset = this.cumulativeOffset(element);
+
+    return (y >= this.offset[1] &&
+            y <  this.offset[1] + element.offsetHeight &&
+            x >= this.offset[0] && 
+            x <  this.offset[0] + element.offsetWidth);
+  },
+
+  withinIncludingScrolloffsets: function(element, x, y) {
+    var offsetcache = this.realOffset(element);
+
+    this.xcomp = x + offsetcache[0] - this.deltaX;
+    this.ycomp = y + offsetcache[1] - this.deltaY;
+    this.offset = this.cumulativeOffset(element);
+
+    return (this.ycomp >= this.offset[1] &&
+            this.ycomp <  this.offset[1] + element.offsetHeight &&
+            this.xcomp >= this.offset[0] && 
+            this.xcomp <  this.offset[0] + element.offsetWidth);
+  },
+
+  // within must be called directly before
+  overlap: function(mode, element) {  
+    if (!mode) return 0;  
+    if (mode == 'vertical') 
+      return ((this.offset[1] + element.offsetHeight) - this.ycomp) / 
+        element.offsetHeight;
+    if (mode == 'horizontal')
+      return ((this.offset[0] + element.offsetWidth) - this.xcomp) / 
+        element.offsetWidth;
+  },
+
+  clone: function(source, target) {
+    source = $(source);
+    target = $(target);
+    target.style.position = 'absolute';
+    var offsets = this.cumulativeOffset(source);
+    target.style.top    = offsets[1] + 'px';
+    target.style.left   = offsets[0] + 'px';
+    target.style.width  = source.offsetWidth + 'px';
+    target.style.height = source.offsetHeight + 'px';
+  }
+}
diff --git a/src/site/src/documentation/skins/common/skinconf.xsl b/src/site/src/documentation/skins/common/skinconf.xsl
new file mode 100644
index 0000000..5d11320
--- /dev/null
+++ b/src/site/src/documentation/skins/common/skinconf.xsl
@@ -0,0 +1,238 @@
+<?xml version="1.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.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:template match="skinconfig">
+    <xsl:copy>
+      <xsl:if test="not(disable-print-link)">
+        <disable-print-link>true</disable-print-link>
+      </xsl:if>
+      <xsl:if test="not(disable-pdf-link)">
+        <disable-pdf-link>true</disable-pdf-link>
+      </xsl:if>
+      <xsl:if test="not(disable-txt-link)">
+        <disable-txt-link>true</disable-txt-link>
+      </xsl:if>
+      <xsl:if test="not(disable-pod-link)">
+        <disable-pod-link>true</disable-pod-link>
+      </xsl:if>
+      <xsl:if test="not(disable-xml-link)">
+        <disable-xml-link>true</disable-xml-link>
+      </xsl:if>
+      <xsl:if test="not(disable-external-link-image)">
+        <disable-external-link-image>false</disable-external-link-image>
+      </xsl:if>
+      <xsl:if test="not(disable-compliance-links)">
+        <disable-compliance-links>false</disable-compliance-links>
+      </xsl:if>
+      <xsl:if test="not(obfuscate-mail-links)">
+        <obfuscate-mail-links>true</obfuscate-mail-links>
+      </xsl:if>
+      <xsl:if test="not(obfuscate-mail-value)">
+        <obfuscate-mail-value>.at.</obfuscate-mail-value>
+      </xsl:if>
+      <xsl:if test="not(disable-font-script)">
+        <disable-font-script>true</disable-font-script>
+      </xsl:if>
+<!--
+     <xsl:if test="not(project-name)">
+       <project-name>MyProject</project-name>
+     </xsl:if>
+     <xsl:if test="not(project-description)">
+       <project-description>MyProject Description</project-description>
+     </xsl:if>
+     <xsl:if test="not(project-url)">
+       <project-url>http://myproj.mygroup.org/</project-url>
+     </xsl:if>
+     <xsl:if test="not(project-logo)">
+       <project-logo>images/project.png</project-logo>
+     </xsl:if>
+     <xsl:if test="not(group-name)">
+       <group-name>MyGroup</group-name>
+     </xsl:if>
+     <xsl:if test="not(group-description)">
+       <group-description>MyGroup Description</group-description>
+     </xsl:if>
+     <xsl:if test="not(group-url)">
+       <group-url>http://mygroup.org</group-url>
+     </xsl:if>
+     <xsl:if test="not(group-logo)">
+       <group-logo>images/group.png</group-logo>
+     </xsl:if>
+     <xsl:if test="not(host-url)">
+       <host-url/>
+     </xsl:if>
+     <xsl:if test="not(host-logo)">
+       <host-logo/>
+     </xsl:if>
+     <xsl:if test="not(year)">
+       <year>2006</year>
+     </xsl:if>
+     <xsl:if test="not(vendor)">
+       <vendor>The Acme Software Foundation.</vendor>
+     </xsl:if>
+     -->
+      <xsl:if test="not(trail)">
+        <trail>
+          <link1 name="" href=""/>
+          <link2 name="" href=""/>
+          <link3 name="" href=""/>
+        </trail>
+      </xsl:if>
+      <xsl:if test="not(toc)">
+        <toc level="2" location="page"/>
+      </xsl:if>
+      <xsl:if test="not(pdf/page-numbering-format)">
+        <pdf>
+          <page-numbering-format>Page 1</page-numbering-format>
+        </pdf>
+      </xsl:if>
+      <xsl:if test="not(pdf/show-external-urls)">
+        <pdf>
+          <show-external-urls>true</show-external-urls>
+        </pdf>
+      </xsl:if>
+<!--
+  <xsl:if test="not(colors)">
+  <colors>
+    <color name="header" value="#294563"/>
+
+    <color name="tab-selected" value="#4a6d8c"/>
+    <color name="tab-unselected" value="#b5c7e7"/>
+    <color name="subtab-selected" value="#4a6d8c"/>
+    <color name="subtab-unselected" value="#4a6d8c"/>
+
+    <color name="heading" value="#294563"/>
+    <color name="subheading" value="#4a6d8c"/>
+
+    <color name="navstrip" value="#cedfef"/>
+    <color name="toolbox" value="#294563"/>
+
+    <color name="menu" value="#4a6d8c"/>
+    <color name="dialog" value="#4a6d8c"/>
+
+    <color name="body" value="#ffffff"/>
+
+    <color name="table" value="#7099C5"/>
+    <color name="table-cell" value="#f0f0ff"/>
+    <color name="highlight" value="#ffff00"/>
+    <color name="fixme" value="#c60"/>
+    <color name="note" value="#069"/>
+
+    <color name="warning" value="#900"/>
+    <color name="code" value="#CFDCED"/>
+
+    <color name="footer" value="#cedfef"/>
+  </colors>
+  </xsl:if>
+-->
+      <xsl:if test="not(extra-css)">
+        <extra-css/>
+      </xsl:if>
+      <xsl:if test="not(credits)">
+        <credits>
+          <credit>
+            <name>Built with Apache Forrest</name>
+            <url>http://forrest.apache.org/</url>
+            <image>images/built-with-forrest-button.png</image>
+            <width>88</width>
+            <height>31</height>
+          </credit>
+<!-- A credit with @role='pdf' will have its name and url displayed in the
+    PDF page's footer. -->
+        </credits>
+      </xsl:if>
+      <xsl:copy-of select="@*"/>
+      <xsl:copy-of select="node()"/>
+<!--
+      <xsl:copy-of select="node()[not(name(.)='colors')]"/>
+      <xsl:apply-templates select="colors"/>-->
+    </xsl:copy>
+  </xsl:template>
+<!--
+    <xsl:template match="colors">
+    <colors>
+     <xsl:if test="not(color[@name='header'])">
+       <color name="header" value="#294563"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='tab-selected'])">
+      <color name="tab-selected" value="#4a6d8c"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='tab-unselected'])">
+      <color name="tab-unselected" value="#b5c7e7"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='subtab-selected'])">
+      <color name="subtab-selected" value="#4a6d8c"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='subtab-unselected'])">
+      <color name="subtab-unselected" value="#4a6d8c"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='heading'])">
+      <color name="heading" value="#294563"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='subheading'])">
+      <color name="subheading" value="#4a6d8c"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='navstrip'])">
+      <color name="navstrip" value="#cedfef"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='toolbox'])">
+       <color name="toolbox" value="#294563"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='menu'])">
+       <color name="menu" value="#4a6d8c"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='dialog'])">
+      <color name="dialog" value="#4a6d8c"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='body'])">
+      <color name="body" value="#ffffff"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='table'])">
+      <color name="table" value="#7099C5"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='table-cell'])">
+      <color name="table-cell" value="#f0f0ff"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='highlight'])">
+       <color name="highlight" value="#yellow"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='fixme'])">
+       <color name="fixme" value="#c60"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='note'])">
+       <color name="note" value="#069"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='warning'])">
+       <color name="warning" value="#900"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='code'])">
+       <color name="code" value="#CFDCED"/>
+     </xsl:if>
+     <xsl:if test="not(color[@name='footer'])">
+       <color name="footer" value="#cedfef"/>
+     </xsl:if>
+
+     <xsl:copy>
+      <xsl:copy-of select="@*"/>
+      <xsl:copy-of select="node()[name(.)='color']"/>
+     </xsl:copy>
+
+      </colors>
+    </xsl:template>
+-->
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/translations/CommonMessages_de.xml b/src/site/src/documentation/skins/common/translations/CommonMessages_de.xml
new file mode 100644
index 0000000..bc46119
--- /dev/null
+++ b/src/site/src/documentation/skins/common/translations/CommonMessages_de.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+  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.
+-->
+<catalogue>
+  <message key="Font size:">Schriftgrösse:</message>
+  <message key="Last Published:">Zuletzt veröffentlicht:</message>
+  <message key="Search">Suche:</message>
+  <message key="Search the site with">Suche auf der Seite mit</message>
+</catalogue>
diff --git a/src/site/src/documentation/skins/common/translations/CommonMessages_en_US.xml b/src/site/src/documentation/skins/common/translations/CommonMessages_en_US.xml
new file mode 100644
index 0000000..88dfe14
--- /dev/null
+++ b/src/site/src/documentation/skins/common/translations/CommonMessages_en_US.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+  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.
+-->
+<catalogue>
+  <message  key="Font size:">Font size:</message>
+  <message key="Last Published:">Last Published:</message>
+  <message key="Search">Search</message>
+  <message key="Search the site with">Search site with</message>
+</catalogue>
diff --git a/src/site/src/documentation/skins/common/translations/CommonMessages_es.xml b/src/site/src/documentation/skins/common/translations/CommonMessages_es.xml
new file mode 100644
index 0000000..63be671
--- /dev/null
+++ b/src/site/src/documentation/skins/common/translations/CommonMessages_es.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+  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.
+-->
+<catalogue>
+  <message key="Font size:">Tamaño del texto:</message>
+  <message key="Last Published:">Fecha de publicación:</message>
+  <message key="Search">Buscar</message>
+  <message key="Search the site with">Buscar en</message>
+</catalogue>
diff --git a/src/site/src/documentation/skins/common/translations/CommonMessages_fr.xml b/src/site/src/documentation/skins/common/translations/CommonMessages_fr.xml
new file mode 100644
index 0000000..622569a
--- /dev/null
+++ b/src/site/src/documentation/skins/common/translations/CommonMessages_fr.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+  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.
+-->
+<catalogue>
+  <message key="Font size:">Taille :</message>
+  <message key="Last Published:">Dernière publication :</message>
+  <message key="Search">Rechercher</message>
+  <message key="Search the site with">Rechercher sur le site avec</message>
+</catalogue>
diff --git a/src/site/src/documentation/skins/common/xslt/fo/document-to-fo.xsl b/src/site/src/documentation/skins/common/xslt/fo/document-to-fo.xsl
new file mode 100644
index 0000000..6bae24b
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/fo/document-to-fo.xsl
@@ -0,0 +1,1014 @@
+<?xml version="1.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.
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                version="1.0">
+<!-- left, justify, right -->
+  <xsl:variable name="text-align" select="string(//skinconfig/pdf/page/@text-align)"/>
+<!-- print URL of external links -->
+  <xsl:variable name="show-external-urls" select="//skinconfig/pdf/show-external-urls"/>
+<!-- Get the section depth to use when generating the minitoc (default is 2) -->
+  <xsl:variable name="toc-max-depth" select="number(//skinconfig/toc/@max-depth)"/>
+<!-- The page size to be used -->
+  <xsl:variable name="pagesize"
+                select="string(//skinconfig/pdf/page/@size)"/>
+<!-- The page orientation ("portrait" or "landscape") -->
+  <xsl:variable name="pageorientation"
+                select="string(//skinconfig/pdf/page/@orientation)"/>
+<!-- Double-sided printing toggle -->
+  <xsl:variable name="doublesided"
+                select="string(//skinconfig/pdf/margins/@double-sided)"/>
+<!-- The top page margin -->
+  <xsl:variable name="topmargin"
+                select="string(//skinconfig/pdf/margins/top)"/>
+<!-- The bottom page margin -->
+  <xsl:variable name="bottommargin"
+                select="string(//skinconfig/pdf/margins/bottom)"/>
+<!-- The inner page margin (always the left margin if
+  double-sided printing is off, alternating between left and right if
+  it's on) -->
+  <xsl:variable name="innermargin"
+                select="string(//skinconfig/pdf/margins/inner)"/>
+<!-- The outer page margin (always the right margin if
+  double-sided printing is off, alternating between right and left if
+  it's on)-->
+  <xsl:variable name="outermargin"
+                select="string(//skinconfig/pdf/margins/outer)"/>
+  <xsl:param name="numbersections" select="'true'"/>
+<!-- page breaks after TOC and each page if an aggregate document -->
+  <xsl:variable name="page-break-top-sections" select="'true'"/>
+<!-- page numbering format -->
+  <xsl:variable name="page-numbering-format" select="string(//skinconfig/pdf/page-numbering-format)"/>
+<!-- Section depth at which we stop numbering and just indent -->
+  <xsl:param name="numbering-max-depth" select="'3'"/>
+  <xsl:param name="imagesdir" select="."/>
+  <xsl:param name="xmlbasedir"/>
+  <xsl:include href="pdfoutline.xsl"/>
+  <xsl:include href="footerinfo.xsl"/>
+<!-- Determine page height for various page sizes (US Letter portrait
+  is the default) -->
+<!-- FIXME: JJP:would this be better of a file? -->
+  <xsl:variable name="pageheight">
+    <xsl:choose>
+      <xsl:when test="$pageorientation = 'landscape'">
+        <xsl:choose>
+          <xsl:when test="$pagesize = 'a0'">841mm</xsl:when>
+          <xsl:when test="$pagesize = 'a1'">594mm</xsl:when>
+          <xsl:when test="$pagesize = 'a2'">420mm</xsl:when>
+          <xsl:when test="$pagesize = 'a3'">297mm</xsl:when>
+          <xsl:when test="$pagesize = 'a4'">210mm</xsl:when>
+          <xsl:when test="$pagesize = 'a5'">148mm</xsl:when>
+          <xsl:when test="$pagesize = 'executive'">7.25in</xsl:when>
+          <xsl:when test="$pagesize = 'folio'">8.5in</xsl:when>
+          <xsl:when test="$pagesize = 'ledger'">11in</xsl:when>
+          <xsl:when test="$pagesize = 'legal'">8.5in</xsl:when>
+          <xsl:when test="$pagesize = 'letter'">8.5in</xsl:when>
+          <xsl:when test="$pagesize = 'quarto'">8.5in</xsl:when>
+          <xsl:when test="$pagesize = 'tabloid'">11in</xsl:when>
+          <xsl:otherwise>8.5in</xsl:otherwise>
+        </xsl:choose>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:choose>
+          <xsl:when test="$pagesize = 'a0'">1189mm</xsl:when>
+          <xsl:when test="$pagesize = 'a1'">841mm</xsl:when>
+          <xsl:when test="$pagesize = 'a2'">594mm</xsl:when>
+          <xsl:when test="$pagesize = 'a3'">420mm</xsl:when>
+          <xsl:when test="$pagesize = 'a4'">297mm</xsl:when>
+          <xsl:when test="$pagesize = 'a5'">210mm</xsl:when>
+          <xsl:when test="$pagesize = 'executive'">10.5in</xsl:when>
+          <xsl:when test="$pagesize = 'folio'">13in</xsl:when>
+          <xsl:when test="$pagesize = 'ledger'">17in</xsl:when>
+          <xsl:when test="$pagesize = 'legal'">14in</xsl:when>
+          <xsl:when test="$pagesize = 'quarto'">10.83in</xsl:when>
+          <xsl:when test="$pagesize = 'tabloid'">17in</xsl:when>
+          <xsl:otherwise>11in</xsl:otherwise>
+        </xsl:choose>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+<!-- Determine page width for various page sizes (US Letter portrait
+  is the default) -->
+  <xsl:variable name="pagewidth">
+    <xsl:choose>
+      <xsl:when test="$pageorientation = 'landscape'">
+        <xsl:choose>
+          <xsl:when test="$pagesize = 'a0'">1189mm</xsl:when>
+          <xsl:when test="$pagesize = 'a1'">841mm</xsl:when>
+          <xsl:when test="$pagesize = 'a2'">594mm</xsl:when>
+          <xsl:when test="$pagesize = 'a3'">420mm</xsl:when>
+          <xsl:when test="$pagesize = 'a4'">297mm</xsl:when>
+          <xsl:when test="$pagesize = 'a5'">210mm</xsl:when>
+          <xsl:when test="$pagesize = 'executive'">10.5in</xsl:when>
+          <xsl:when test="$pagesize = 'folio'">13in</xsl:when>
+          <xsl:when test="$pagesize = 'ledger'">17in</xsl:when>
+          <xsl:when test="$pagesize = 'legal'">14in</xsl:when>
+          <xsl:when test="$pagesize = 'quarto'">10.83in</xsl:when>
+          <xsl:when test="$pagesize = 'tabloid'">17in</xsl:when>
+          <xsl:otherwise>11in</xsl:otherwise>
+        </xsl:choose>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:choose>
+          <xsl:when test="$pagesize = 'a0'">841mm</xsl:when>
+          <xsl:when test="$pagesize = 'a1'">594mm</xsl:when>
+          <xsl:when test="$pagesize = 'a2'">420mm</xsl:when>
+          <xsl:when test="$pagesize = 'a3'">297mm</xsl:when>
+          <xsl:when test="$pagesize = 'a4'">210mm</xsl:when>
+          <xsl:when test="$pagesize = 'a5'">148mm</xsl:when>
+          <xsl:when test="$pagesize = 'executive'">7.25in</xsl:when>
+          <xsl:when test="$pagesize = 'folio'">8.5in</xsl:when>
+          <xsl:when test="$pagesize = 'ledger'">11in</xsl:when>
+          <xsl:when test="$pagesize = 'legal'">8.5in</xsl:when>
+          <xsl:when test="$pagesize = 'letter'">8.5in</xsl:when>
+          <xsl:when test="$pagesize = 'quarto'">8.5in</xsl:when>
+          <xsl:when test="$pagesize = 'tabloid'">11in</xsl:when>
+          <xsl:otherwise>8.5in</xsl:otherwise>
+        </xsl:choose>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+  <xsl:template match="/">
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+      <fo:layout-master-set>
+        <fo:simple-page-master master-name="first-page"
+          page-height="{$pageheight}"
+          page-width="{$pagewidth}"
+          margin-top="{$topmargin}"
+          margin-bottom="{$bottommargin}"
+          margin-left="{$innermargin}"
+          margin-right="{$outermargin}">
+          <fo:region-body
+            margin-top="0.5in"
+            margin-bottom=".5in"/>
+          <fo:region-after
+            region-name="first-footer"
+            extent=".5in"
+            display-align="before"/>
+        </fo:simple-page-master>
+        <fo:simple-page-master master-name="even-page"
+          page-height="{$pageheight}"
+          page-width="{$pagewidth}"
+          margin-top="{$topmargin}"
+          margin-bottom="{$bottommargin}">
+          <xsl:choose>
+            <xsl:when test="$doublesided = 'true'">
+              <xsl:attribute name="margin-left">
+                <xsl:value-of select="$outermargin"/>
+              </xsl:attribute>
+              <xsl:attribute name="margin-right">
+                <xsl:value-of select="$innermargin"/>
+              </xsl:attribute>
+            </xsl:when>
+            <xsl:otherwise>
+              <xsl:attribute name="margin-left">
+                <xsl:value-of select="$innermargin"/>
+              </xsl:attribute>
+              <xsl:attribute name="margin-right">
+                <xsl:value-of select="$outermargin"/>
+              </xsl:attribute>
+            </xsl:otherwise>
+          </xsl:choose>
+          <fo:region-before
+            region-name="even-header"
+            extent="0.5in"
+            border-bottom="0.5pt solid"/>
+          <fo:region-body
+            margin-top="0.5in"
+            margin-bottom=".5in"/>
+          <fo:region-after
+            region-name="even-footer"
+            extent=".5in"
+            display-align="before"/>
+        </fo:simple-page-master>
+        <fo:simple-page-master master-name="odd-page"
+          page-height="{$pageheight}"
+          page-width="{$pagewidth}"
+          margin-top="{$topmargin}"
+          margin-bottom="{$bottommargin}"
+          margin-left="{$innermargin}"
+          margin-right="{$outermargin}">
+          <fo:region-before
+            region-name="odd-header"
+            extent="0.5in"
+            border-bottom="0.5pt solid"/>
+          <fo:region-body
+            margin-top="0.5in"
+            margin-bottom=".5in"/>
+          <fo:region-after
+            region-name="odd-footer"
+            extent=".5in"
+            display-align="before"/>
+        </fo:simple-page-master>
+        <fo:page-sequence-master master-name="book">
+          <fo:repeatable-page-master-alternatives>
+            <fo:conditional-page-master-reference
+              page-position="first"
+              master-reference="first-page"/>
+            <fo:conditional-page-master-reference
+              odd-or-even="odd"
+              master-reference="odd-page"/>
+            <fo:conditional-page-master-reference
+              odd-or-even="even"
+              master-reference="even-page"/>
+          </fo:repeatable-page-master-alternatives>
+        </fo:page-sequence-master>
+      </fo:layout-master-set>
+      <xsl:apply-templates select="/site/document" mode="outline"/>
+      <fo:page-sequence master-reference="book">
+        <xsl:apply-templates select="/site/document"/>
+      </fo:page-sequence>
+    </fo:root>
+  </xsl:template>
+  <xsl:template match="document">
+    <fo:title>
+      <xsl:value-of select="header/title"/>
+    </fo:title>
+    <fo:static-content flow-name="first-footer">
+      <fo:block
+        border-top="0.25pt solid"
+        padding-before="6pt"
+        text-align="center">
+        <xsl:apply-templates select="footer"/>
+      </fo:block>
+<!-- don't list page number on first page if it's contents is just the TOC -->
+      <xsl:if test="not($toc-max-depth > 0 and $page-break-top-sections)">
+        <xsl:call-template name="insertPageNumber">
+          <xsl:with-param name="text-align">start</xsl:with-param>
+        </xsl:call-template>
+      </xsl:if>
+      <xsl:call-template name="info"/>
+    </fo:static-content>
+    <fo:static-content flow-name="even-header">
+      <fo:block
+        font-size="70%"
+        text-align="end"
+        font-style="italic">
+        <xsl:value-of select="header/title"/>
+      </fo:block>
+    </fo:static-content>
+    <fo:static-content flow-name="even-footer">
+      <fo:block
+        border-top="0.25pt solid"
+        padding-before="6pt"
+        text-align="center">
+        <xsl:apply-templates select="footer"/>
+      </fo:block>
+      <xsl:call-template name="insertPageNumber">
+        <xsl:with-param name="text-align">end</xsl:with-param>
+      </xsl:call-template>
+      <xsl:call-template name="info"/>
+    </fo:static-content>
+    <fo:static-content flow-name="odd-header">
+      <fo:block
+        font-size="70%"
+        text-align="start"
+        font-style="italic">
+        <xsl:value-of select="header/title"/>
+      </fo:block>
+    </fo:static-content>
+    <fo:static-content flow-name="odd-footer">
+      <fo:block
+        border-top="0.25pt solid"
+        padding-before="6pt"
+        text-align="center">
+        <xsl:apply-templates select="footer"/>
+      </fo:block>
+      <xsl:call-template name="insertPageNumber">
+        <xsl:with-param name="text-align">start</xsl:with-param>
+      </xsl:call-template>
+      <xsl:call-template name="info"/>
+    </fo:static-content>
+    <fo:flow flow-name="xsl-region-body">
+      <fo:block
+        padding-before="24pt"
+        padding-after="24pt"
+        font-size="24pt"
+        font-weight="bold"
+        id="{generate-id()}">
+        <xsl:value-of select="header/title"/>
+      </fo:block>
+      <fo:block
+        text-align="{$text-align}"
+        padding-before="18pt"
+        padding-after="18pt">
+        <xsl:apply-templates/>
+      </fo:block>
+<!-- Total number of pages calculation... -->
+      <fo:block id="term"/>
+    </fo:flow>
+  </xsl:template>
+  <xsl:template match="abstract">
+    <fo:block
+      font-size="12pt"
+      text-align="center"
+      space-before="20pt"
+      space-after="25pt"
+      width="7.5in"
+      font-family="serif"
+      font-style="italic">
+      <xsl:call-template name="insertPageBreaks"/>
+      <xsl:apply-templates/>
+    </fo:block>
+  </xsl:template>
+  <xsl:template match="notice">
+    <fo:block
+      font-size="10pt"
+      text-align="left"
+      space-before="20pt"
+      width="7.5in"
+      font-family="serif"
+      border-top="0.25pt solid"
+      border-bottom="0.25pt solid"
+      padding-before="6pt"
+      padding-after="6pt">
+      <xsl:call-template name="insertPageBreaks"/>
+<!-- insert i18n stuff here -->
+      NOTICE: <xsl:apply-templates/>
+    </fo:block>
+  </xsl:template>
+  <xsl:template match="anchor">
+    <fo:block id="{@id}"/>
+    <xsl:apply-templates/>
+  </xsl:template>
+  <xsl:template match="section">
+    <xsl:param name="level">0</xsl:param>
+    <xsl:variable name="size">
+<!-- 14pt for level 1 12pt for level 2 -->
+      <xsl:value-of select="14-number($level)"/>
+    </xsl:variable>
+    <xsl:variable name="background-color" select="//skinconfig/colors/color[@name='body']/@value"/>
+    <xsl:variable name="heading-color" select="//skinconfig/colors/color[@name='subheading']/@value"/>
+    <xsl:variable name="heading-type" select="//skinconfig/headings/@type"/>
+    <fo:block
+      font-family="serif"
+      font-size="{$size}pt"
+      font-weight="bold"
+      space-before="12pt"
+      space-after="4pt">
+      <xsl:call-template name="insertPageBreaks"/>
+      <xsl:if test="$heading-type = 'boxed'">
+        <xsl:attribute name="background-color">
+          <xsl:value-of select="$heading-color"/>
+        </xsl:attribute>
+      </xsl:if>
+      <xsl:attribute name="id">
+        <xsl:choose>
+          <xsl:when test="normalize-space(@id)!=''">
+            <xsl:value-of select="@id"/>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:value-of select="generate-id()"/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:attribute>
+      <xsl:if test="$numbersections = 'true' and number($level) &lt; $numbering-max-depth+1">
+        <xsl:number format="1.1.1.1.1.1.1" count="section" level="multiple"/>
+<xsl:text>. </xsl:text>
+      </xsl:if>
+<!-- For sections 4  or more nestings deep, indent instead of number -->
+      <xsl:if test="number($level) &gt; $numbering-max-depth+1">
+        <xsl:attribute name="start-indent">
+          <xsl:value-of select="4+number($level)"/>
+<xsl:text>pt</xsl:text>
+        </xsl:attribute>
+      </xsl:if>
+      <xsl:value-of select="title"/>
+    </fo:block>
+    <xsl:if test="$heading-type = 'underlined'">
+<!-- The non-breaking space in this block is required, otherwise
+      the block won't be rendered at all. -->
+      <fo:block
+        font-family="serif"
+        font-size="{10 div (number($level) +1 )}pt"
+        background-color="{$heading-color}">&#160;</fo:block>
+    </xsl:if>
+    <fo:block
+        background-color="{$background-color}">
+      <xsl:apply-templates>
+        <xsl:with-param name="level" select="number($level)+1"/>
+      </xsl:apply-templates>
+    </fo:block>
+  </xsl:template>
+  <xsl:template match="title">
+<!-- do nothing as titles are handled in their parent templates -->
+  </xsl:template>
+  <xsl:template match="subtitle">
+    <xsl:param name="level">0</xsl:param>
+    <xsl:variable name="size" select="16-(number($level)*1.5)"/>
+    <fo:block
+      font-weight="bold"
+      font-size="{$size}pt">
+      <xsl:call-template name="insertPageBreaks"/>
+      <xsl:apply-templates/>
+    </fo:block>
+  </xsl:template>
+  <xsl:template match="authors">
+    <fo:block
+      space-before="20pt"
+      font-weight="bold"
+      font-size="9pt">
+      <xsl:call-template name="insertPageBreaks"/>
+<!-- insert i18n stuff here -->
+      by
+      <xsl:for-each select="person">
+        <xsl:value-of select="@name"/>
+        <xsl:if test="not(position() = last())">, </xsl:if>
+      </xsl:for-each>
+    </fo:block>
+  </xsl:template>
+  <xsl:template match="p">
+    <xsl:choose>
+      <xsl:when test="ancestor::li and not(preceding-sibling::*)">
+        <fo:block
+          space-after="4pt"
+          font-family="serif">
+          <xsl:call-template name="insertPageBreaks"/>
+          <xsl:apply-templates/>
+        </fo:block>
+      </xsl:when>
+      <xsl:otherwise>
+        <fo:block
+          space-before="4pt"
+          space-after="4pt"
+          font-family="serif">
+          <xsl:call-template name="insertPageBreaks"/>
+          <xsl:apply-templates/>
+        </fo:block>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+  <xsl:template match="source">
+    <xsl:variable name="color" select="//skinconfig/colors/color[@name='code']/@value"/>
+    <fo:block
+      font-family="monospace"
+      font-size="10pt"
+      background-color="{$color}"
+      white-space-collapse="false"
+      linefeed-treatment="preserve"
+      white-space-treatment="preserve"
+      wrap-option="wrap"
+      text-align="start">
+      <xsl:call-template name="insertPageBreaks"/>
+      <xsl:apply-templates/>
+    </fo:block>
+  </xsl:template>
+  <xsl:template match="ol|ul">
+    <fo:list-block
+      provisional-distance-between-starts="18pt"
+      provisional-label-separation="3pt"
+      text-align="start">
+      <xsl:apply-templates/>
+    </fo:list-block>
+  </xsl:template>
+  <xsl:template match="ol/li">
+    <fo:list-item>
+      <xsl:if test="not(following-sibling::li[1])">
+        <xsl:attribute name="space-after">6pt"</xsl:attribute>
+      </xsl:if>
+      <fo:list-item-label
+        end-indent="label-end()">
+        <fo:block>
+          <xsl:number format="1."/>
+        </fo:block>
+      </fo:list-item-label>
+      <fo:list-item-body
+        start-indent="body-start()">
+        <fo:block
+          font-family="serif">
+          <xsl:apply-templates/>
+        </fo:block>
+      </fo:list-item-body>
+    </fo:list-item>
+  </xsl:template>
+<!-- Emulate browser handling of these invalid combinations that our DTD
+  unfortunately allows -->
+  <xsl:template match="ul/ul | ul/ol | ol/ul | ol/ol">
+    <fo:list-item>
+      <fo:list-item-label end-indent="label-end()">
+        <fo:block></fo:block>
+      </fo:list-item-label>
+      <fo:list-item-body start-indent="body-start()">
+        <fo:block font-family="serif">
+          <xsl:apply-templates/>
+        </fo:block>
+      </fo:list-item-body>
+    </fo:list-item>
+  </xsl:template>
+  <xsl:template match="ul/li">
+    <fo:list-item>
+      <xsl:if test="not(following-sibling::li[1])">
+        <xsl:attribute name="space-after">6pt</xsl:attribute>
+      </xsl:if>
+      <fo:list-item-label end-indent="label-end()">
+        <fo:block>&#x2022;</fo:block>
+      </fo:list-item-label>
+      <fo:list-item-body start-indent="body-start()">
+        <fo:block
+          font-family="serif">
+          <xsl:apply-templates/>
+        </fo:block>
+      </fo:list-item-body>
+    </fo:list-item>
+  </xsl:template>
+  <xsl:template match="dl">
+    <fo:list-block
+      provisional-distance-between-starts="18pt"
+      provisional-label-separation="3pt"
+      text-align="start">
+      <xsl:apply-templates/>
+    </fo:list-block>
+  </xsl:template>
+  <xsl:template match="dt">
+    <fo:list-item>
+      <fo:list-item-label end-indent="label-end()">
+        <fo:block></fo:block>
+      </fo:list-item-label>
+      <fo:list-item-body start-indent="body-start()">
+        <fo:block
+          font-weight="bold">
+          <xsl:apply-templates/>
+        </fo:block>
+      </fo:list-item-body>
+    </fo:list-item>
+  </xsl:template>
+  <xsl:template match="dd">
+    <fo:list-item>
+      <fo:list-item-label end-indent="label-end()">
+        <fo:block></fo:block>
+      </fo:list-item-label>
+      <fo:list-item-body start-indent="body-start()">
+        <fo:block>
+          <xsl:apply-templates/>
+        </fo:block>
+      </fo:list-item-body>
+    </fo:list-item>
+  </xsl:template>
+  <xsl:template match="strong">
+    <fo:inline font-weight="bold">
+      <xsl:apply-templates/>
+    </fo:inline>
+  </xsl:template>
+  <xsl:template match="em">
+    <fo:inline font-style="italic">
+      <xsl:apply-templates/>
+    </fo:inline>
+  </xsl:template>
+  <xsl:template match="code">
+    <fo:inline font-family="monospace">
+      <xsl:apply-templates/>
+    </fo:inline>
+  </xsl:template>
+  <xsl:template match="warning">
+    <xsl:variable name="color" select="//skinconfig/colors/color[@name='warning']/@value"/>
+    <fo:block
+      margin-left="0.25in"
+      margin-right="0.25in"
+      font-weight="bold"
+      font-size="10pt"
+      font-family="serif"
+      space-before="10pt"
+      border-before-style="solid"
+      border-start-style="solid"
+      border-end-style="solid"
+      border-color="{$color}"
+      background-color="{$color}"
+      color="#ffffff">
+      <xsl:call-template name="insertPageBreaks"/>
+      <xsl:choose>
+        <xsl:when test="@label">
+          <xsl:value-of select="@label"/>
+        </xsl:when>
+        <xsl:otherwise>Warning: </xsl:otherwise>
+      </xsl:choose>
+      <xsl:value-of select="title"/>
+    </fo:block>
+    <fo:block
+      margin-left="0.25in"
+      margin-right="0.25in"
+      font-family="serif"
+      font-size="8pt"
+      border-after-style="solid"
+      border-start-style="solid"
+      border-end-style="solid"
+      border-color="{$color}"
+      background-color="#fff0f0"
+      padding-start="3pt"
+      padding-end="3pt"
+      padding-before="3pt"
+      padding-after="3pt"
+      space-after="10pt">
+      <xsl:apply-templates/>
+    </fo:block>
+  </xsl:template>
+  <xsl:template match="note">
+    <xsl:variable name="color" select="//skinconfig/colors/color[@name='note']/@value"/>
+    <fo:block
+      margin-left="0.25in"
+      margin-right="0.25in"
+      font-weight="bold"
+      font-size="10pt"
+      color="#ffffff"
+      font-family="serif"
+      space-before="10pt"
+      border-before-style="solid"
+      border-start-style="solid"
+      border-end-style="solid"
+      border-color="{$color}"
+      background-color="{$color}">
+      <xsl:call-template name="insertPageBreaks"/>
+      <xsl:choose>
+        <xsl:when test="@label">
+          <xsl:value-of select="@label"/>
+        </xsl:when>
+<!-- insert i18n stuff here -->
+        <xsl:otherwise>Note: </xsl:otherwise>
+      </xsl:choose>
+      <xsl:value-of select="title"/>
+    </fo:block>
+    <fo:block
+      margin-left="0.25in"
+      margin-right="0.25in"
+      font-family="serif"
+      font-size="8pt"
+      space-after="10pt"
+      border-after-style="solid"
+      border-start-style="solid"
+      border-end-style="solid"
+      border-color="{$color}"
+      background-color="#F0F0FF"
+      padding-start="3pt"
+      padding-end="3pt"
+      padding-before="3pt"
+      padding-after="3pt">
+      <xsl:apply-templates/>
+    </fo:block>
+  </xsl:template>
+  <xsl:template match="fixme">
+    <xsl:variable name="color" select="//skinconfig/colors/color[@name='fixme']/@value"/>
+    <fo:block
+      margin-left="0.25in"
+      margin-right="0.25in"
+      font-weight="bold"
+      font-size="10pt"
+      color="#FFFFFF"
+      font-family="serif"
+      space-before="10pt"
+      border-before-style="solid"
+      border-start-style="solid"
+      border-end-style="solid"
+      border-color="{$color}"
+      background-color="{$color}">
+      <xsl:call-template name="insertPageBreaks"/>
+<!-- insert i18n stuff here -->
+      FIXME (<xsl:value-of select="@author"/>): <xsl:value-of select="title"/>
+    </fo:block>
+    <fo:block
+      margin-left="0.25in"
+      margin-right="0.25in"
+      font-family="serif"
+      font-size="8pt"
+      space-after="10pt"
+      border-after-style="solid"
+      border-start-style="solid"
+      border-end-style="solid"
+      border-color="{$color}"
+      background-color="#FFF0F0"
+      padding-start="3pt"
+      padding-end="3pt"
+      padding-before="3pt"
+      padding-after="3pt">
+      <xsl:apply-templates/>
+    </fo:block>
+  </xsl:template>
+  <xsl:template match="link|fork|jump">
+    <xsl:variable name="color" select="//skinconfig/colors/color[@name = 'body']/@link"/>
+    <xsl:choose>
+      <xsl:when test="starts-with(@href, '#')">
+        <fo:basic-link color="{$color}" text-decoration="underline" internal-destination="{substring(@href,2)}">
+          <xsl:apply-templates/>
+        </fo:basic-link>
+      </xsl:when>
+      <xsl:otherwise>
+        <fo:basic-link color="{$color}" text-decoration="underline" external-destination="{@href}">
+          <xsl:apply-templates/>
+        </fo:basic-link>
+        <xsl:if test="$show-external-urls = 'true' and @href != string(.)">
+          (<xsl:value-of select="@href"/>)
+        </xsl:if>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+  <xsl:template match="figure|img">
+    <fo:block text-align="center">
+      <xsl:call-template name="insertPageBreaks"/>
+      <xsl:if test="normalize-space(@id)!=''">
+        <xsl:attribute name="id">
+          <xsl:value-of select="@id"/>
+        </xsl:attribute>
+      </xsl:if>
+<!-- Make relative paths absolute -->
+      <xsl:variable name="imgpath">
+        <xsl:choose>
+<!-- resources image dir -->
+          <xsl:when test="starts-with(string(@src),'images/')">
+            <xsl:value-of select="concat($imagesdir,substring-after(@src,'images'))"/>
+          </xsl:when>
+          <xsl:when test="contains(string(@src),'/images/')">
+            <xsl:value-of select="concat($imagesdir,substring-after(@src,'/images'))"/>
+          </xsl:when>
+<!-- already absolute -->
+          <xsl:when test="contains(string(@src),':') or starts-with(string(@src),'/')">
+            <xsl:value-of select="@src"/>
+          </xsl:when>
+<!-- relative to document -->
+          <xsl:otherwise>
+            <xsl:value-of select="concat($xmlbasedir,@src)"/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+      <fo:external-graphic src="{$imgpath}">
+        <xsl:if test="@height">
+          <xsl:attribute name="height">
+            <xsl:value-of select="@height"/>
+          </xsl:attribute>
+        </xsl:if>
+        <xsl:if test="@width">
+          <xsl:attribute name="width">
+            <xsl:value-of select="@width"/>
+          </xsl:attribute>
+        </xsl:if>
+      </fo:external-graphic>
+<!-- alt text -->
+      <xsl:if test="//skinconfig/pdf/show-image-alt-text='true'">
+        <xsl:if test="normalize-space(@alt)!=''">
+          <fo:block>
+            <xsl:value-of select="@alt"/>
+          </fo:block>
+        </xsl:if>
+      </xsl:if>
+    </fo:block>
+  </xsl:template>
+  <xsl:template match="table">
+<!-- FIXME: Apache FOP must have column widths specified at present,
+         this section can be removed when this limitation is removed from Fop.
+         Unfortunately, this means that each column is a fixed width,
+         but at least the table displays! -->
+    <xsl:variable name="max-number-columns-td">
+      <xsl:for-each select="tr">
+        <xsl:sort select="count(td|th)" data-type="number"
+          order="descending"/>
+        <xsl:if test="position() = 1">
+          <xsl:value-of select="count(td|th)"/>
+        </xsl:if>
+      </xsl:for-each>
+    </xsl:variable>
+    <xsl:variable name="max-number-columns-colspan">
+      <xsl:for-each select="tr">
+        <xsl:sort select="count(td|th)" data-type="number"
+          order="descending"/>
+        <xsl:if test="position() = 1">
+          <xsl:value-of
+            select="sum(td/@colspan|th/@colspan)"/>
+        </xsl:if>
+      </xsl:for-each>
+    </xsl:variable>
+    <xsl:variable name="max-number-columns">
+      <xsl:choose>
+        <xsl:when
+          test="$max-number-columns-colspan&gt;$max-number-columns-td">
+          <xsl:value-of
+            select="$max-number-columns-colspan"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="$max-number-columns-td"/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:variable>
+    <xsl:variable name="column-width">
+      <xsl:value-of select="6.25 div number($max-number-columns)"/>in
+    </xsl:variable>
+    <fo:table>
+      <fo:table-column>
+        <xsl:attribute name="column-width">
+          <xsl:value-of select="$column-width"/>
+        </xsl:attribute>
+        <xsl:attribute name="number-columns-repeated">
+          <xsl:value-of select="number($max-number-columns)"/>
+        </xsl:attribute>
+      </fo:table-column>
+<!-- End of hack for Fop support (if removing this hack, remember
+           you need the <fo:table> element) -->
+      <fo:table-body
+        font-size="10pt"
+        font-family="sans-serif">
+        <xsl:apply-templates select="tr"/>
+      </fo:table-body>
+    </fo:table>
+<!-- FIXME: Apache Fop does not support the caption element yet.
+         This hack will display the table caption accordingly. -->
+    <xsl:if test="caption">
+      <fo:block
+        text-align="center"
+        font-weight="bold">
+<!-- insert i18n stuff here -->
+        Table
+        <xsl:text> </xsl:text>
+        <xsl:number count="table" level="multiple"/>
+<xsl:text>: </xsl:text>
+        <xsl:value-of select="caption"/>
+      </fo:block>
+    </xsl:if>
+  </xsl:template>
+  <xsl:template match="tr">
+    <fo:table-row>
+      <xsl:apply-templates/>
+    </fo:table-row>
+  </xsl:template>
+  <xsl:template match="th">
+    <xsl:variable name="border-color" select="//skinconfig/colors/color[@name = 'table']/@value"/>
+    <xsl:variable name="background-color" select="$border-color"/>
+    <fo:table-cell
+        padding-before="4pt"
+        padding-after="4pt"
+        padding-start="4pt"
+        padding-end="4pt"
+        color="#FFFFFF"
+        background-color="{$background-color}"
+        border="1pt solid {$border-color}">
+      <xsl:attribute name="number-columns-spanned">
+        <xsl:value-of select="@colspan"/>
+      </xsl:attribute>
+      <xsl:attribute name="number-rows-spanned">
+        <xsl:value-of select="@rowspan"/>
+      </xsl:attribute>
+      <fo:block
+          text-align="center">
+        <xsl:apply-templates/>
+      </fo:block>
+    </fo:table-cell>
+  </xsl:template>
+  <xsl:template match="td">
+    <xsl:variable name="border-color" select="//skinconfig/colors/color[@name = 'table']/@value"/>
+    <xsl:variable name="background-color" select="//skinconfig/colors/color[@name = 'table-cell']/@value"/>
+    <fo:table-cell
+      padding-before="4pt"
+      padding-after="4pt"
+      padding-start="4pt"
+      padding-end="4pt"
+      background-color="{$background-color}"
+      border="1pt solid {$border-color}">
+      <xsl:attribute name="number-columns-spanned">
+        <xsl:value-of select="@colspan"/>
+      </xsl:attribute>
+      <xsl:attribute name="number-rows-spanned">
+        <xsl:value-of select="@rowspan"/>
+      </xsl:attribute>
+      <fo:block>
+        <xsl:apply-templates/>
+      </fo:block>
+    </fo:table-cell>
+  </xsl:template>
+  <xsl:template match="br">
+    <fo:block></fo:block>
+  </xsl:template>
+  <xsl:template match="legal">
+    <fo:inline
+      font-size="8pt">
+      <xsl:apply-templates/>
+    </fo:inline>
+  </xsl:template>
+  <xsl:template match="body[count(//section) != 0]">
+    <xsl:if test="$toc-max-depth > 0">
+      <fo:block font-family="serif" font-size="14pt" font-weight="bold"
+      space-after="5pt" space-before="5pt" text-align="justify" width="7.5in">
+        <xsl:call-template name="insertPageBreaks"/>
+<!-- insert i18n stuff here -->
+<xsl:text>Table of contents</xsl:text>
+      </fo:block>
+      <fo:block font-family="sans" font-size="12pt" space-after="5pt"
+      space-before="0pt" text-align="justify" width="7.5in">
+        <xsl:if test="$page-break-top-sections">
+          <xsl:attribute name="break-after">page</xsl:attribute>
+        </xsl:if>
+        <xsl:apply-templates select="section" mode="toc" />
+      </fo:block>
+    </xsl:if>
+    <xsl:apply-templates />
+  </xsl:template>
+  <xsl:template match="section" mode="toc">
+<!-- FIXME: see bug FOR-640 -->
+    <xsl:param name="depth" select="'1'"/>
+    <fo:block space-before="5pt" text-align-last="justify" start-indent=".5em" text-indent=".5em">
+      <fo:inline>
+        <xsl:variable name="id">
+          <xsl:choose>
+            <xsl:when test="normalize-space(@id)!=''">
+              <xsl:value-of select="@id"/>
+            </xsl:when>
+            <xsl:otherwise>
+              <xsl:value-of select="generate-id()"/>
+            </xsl:otherwise>
+          </xsl:choose>
+        </xsl:variable>
+        <fo:basic-link internal-destination="{$id}">
+          <xsl:value-of select="substring('&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;', 0, 2 * $depth - 1)" />
+          <fo:inline font-size="10pt">
+            <xsl:number count="section" format="1.1.1.1.1.1.1" level="multiple" />
+          </fo:inline>
+<xsl:text> </xsl:text>
+          <xsl:value-of select="title" />
+          <fo:leader leader-pattern="dots" />
+          <fo:page-number-citation ref-id="{$id}" />
+        </fo:basic-link>
+      </fo:inline>
+      <xsl:if test="$toc-max-depth > $depth">
+        <xsl:apply-templates select="section" mode="toc">
+          <xsl:with-param name="depth" select="$depth + 1"/>
+        </xsl:apply-templates>
+      </xsl:if>
+    </fo:block>
+  </xsl:template>
+<!-- ====================================================================== -->
+<!-- Local Extensions section -->
+<!-- ====================================================================== -->
+  <xsl:template match="citation">
+    <fo:inline>
+     [<xsl:value-of select="@def"/>]
+   </fo:inline>
+  </xsl:template>
+  <xsl:template match="p[@class='quote']">
+    <fo:block start-indent="1em"
+     space-before="4pt"
+     space-after="4pt"
+     background-color="#f0f0f0"
+     font-family="monospace">
+      <xsl:call-template name="insertPageBreaks"/>
+      <xsl:apply-templates/>
+    </fo:block>
+  </xsl:template>
+  <xsl:template name="insertPageBreaks">
+<!-- if marked as a 'pageBreakBefore', and we're breaking on pages, and were not the first node -->
+    <xsl:if test="contains(@class, 'pageBreakBefore') and preceding-sibling::node()">
+      <xsl:attribute name="break-before">page</xsl:attribute>
+    </xsl:if>
+<!-- if marked as a 'pageBreakAfter', and we're breaking on pages, and were not the last node -->
+    <xsl:if test="contains(@class, 'pageBreakAfter') and following-sibling::node()">
+      <xsl:attribute name="break-after">page</xsl:attribute>
+    </xsl:if>
+  </xsl:template>
+<!-- Display the document numerotation -->
+  <xsl:template name="insertPageNumber">
+    <xsl:param name="text-align" select="'start'"/>
+    <xsl:variable name="prefixe" select="substring-before($page-numbering-format,'1')"/>
+    <xsl:variable name="sep" select="substring-before(substring-after($page-numbering-format,'1'),'1')"/>
+    <xsl:variable name="postfixe">
+      <xsl:choose>
+        <xsl:when test="contains(substring-after($page-numbering-format,'1'),'1')">
+          <xsl:value-of select="substring-after(substring-after($page-numbering-format,'1'),'1')"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="substring-after($page-numbering-format,'1')"/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:variable>
+<!-- if 'page-numbering-format' contains 1 digits, the page number is displayed in the footer -->
+    <xsl:if test="contains($page-numbering-format,'1')">
+      <fo:block font-size="70%" text-align="{$text-align}">
+<!-- if the separator is not found, the total page number is skipped -->
+        <xsl:value-of select="$prefixe"/>
+        <fo:page-number/>
+        <xsl:if test="$sep != ''">
+          <xsl:value-of select="$sep"/>
+          <fo:page-number-citation ref-id="term"/>
+        </xsl:if>
+        <xsl:value-of select="$postfixe"/>
+      </fo:block>
+    </xsl:if>
+  </xsl:template>
+<!-- ====================================================================== -->
+<!-- Temporary section - subject to change on short notice  -->
+<!-- ====================================================================== -->
+  <xsl:template match="//style">
+<!-- HACK: The OpenOffice.org input plugin currently produces
+   intermediate documents that contain a style element, invalid per
+   the Forrest Document DTD. This style element must be ignored
+   here. To find out why this is done this way, read the comments
+   attached to issue FOR-433. -->
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/fo/footerinfo.xsl b/src/site/src/documentation/skins/common/xslt/fo/footerinfo.xsl
new file mode 100644
index 0000000..c5ba5c9
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/fo/footerinfo.xsl
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                version="1.0">
+<!--
+Named template to generate a short message in the PDF footer, from text in
+skinconf.xml.  By default, the message is a copyright statement.  If a credit
+with @role='pdf' is present, that is used instead.  Eg:
+
+<credit role="pdf">
+  <name>Generated by Apache FOP 1.0-dev</name>
+  <url>http://xml.apache.org/fop/dev/</url>
+</credit>
+-->
+  <xsl:template name="info">
+    <xsl:variable name="disable-copyright-footer" select="//skinconfig/pdf/disable-copyright-footer"/>
+    <xsl:variable name="pdfcredit" select="//skinconfig/credits/credit[@role = 'pdf']"/>
+    <xsl:variable name="text">
+      <xsl:if test="$pdfcredit">
+        <xsl:value-of select="$pdfcredit/name"/>
+      </xsl:if>
+      <xsl:if test="not($pdfcredit) and not($disable-copyright-footer = 'true')">
+<xsl:text>Copyright &#169; </xsl:text>
+        <xsl:value-of select="//skinconfig/year"/>&#160;<xsl:value-of
+          select="//skinconfig/vendor"/>
+<xsl:text> All rights reserved.</xsl:text>
+      </xsl:if>
+    </xsl:variable>
+    <xsl:variable name="url" select="$pdfcredit/url"/>
+    <fo:block-container font-style="italic" absolute-position="absolute"
+      left="0pt" top="0pt" right="6.25in" bottom="150pt"
+      font-size="10pt">
+      <xsl:if test="not($url)">
+        <fo:block text-align="center" color="lightgrey">
+          <xsl:value-of select="$text"/>
+        </fo:block>
+      </xsl:if>
+      <xsl:if test="$url">
+        <fo:block text-align="center">
+          <fo:basic-link color="lightgrey"
+            external-destination="{$url}">
+            <xsl:value-of select="$text"/>
+          </fo:basic-link>
+        </fo:block>
+        <fo:block text-align="center">
+          <fo:basic-link color="lightgrey"
+            external-destination="{$url}">
+            <xsl:value-of select="$url"/>
+          </fo:basic-link>
+        </fo:block>
+      </xsl:if>
+    </fo:block-container>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/fo/pdfoutline.xsl b/src/site/src/documentation/skins/common/xslt/fo/pdfoutline.xsl
new file mode 100644
index 0000000..acdc6ac
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/fo/pdfoutline.xsl
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:fox="http://xml.apache.org/fop/extensions"
+                version="1.0">
+  <xsl:template match="document" mode="outline">
+    <xsl:apply-templates select="body/section" mode="outline"/>
+  </xsl:template>
+  <xsl:template match="section" mode="outline">
+    <fox:outline>
+      <xsl:attribute name="internal-destination">
+        <xsl:choose>
+          <xsl:when test="normalize-space(@id)!=''">
+            <xsl:value-of select="@id"/>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:value-of select="generate-id()"/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:attribute>
+      <fox:label>
+        <xsl:number format="1.1.1.1.1.1.1" count="section" level="multiple"/>
+<xsl:text> </xsl:text>
+        <xsl:value-of select="normalize-space(title)"/>
+      </fox:label>
+      <xsl:apply-templates select="section" mode="outline"/>
+    </fox:outline>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/html/book-to-menu.xsl b/src/site/src/documentation/skins/common/xslt/html/book-to-menu.xsl
new file mode 100644
index 0000000..228b57e
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/html/book-to-menu.xsl
@@ -0,0 +1,139 @@
+<?xml version="1.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.
+-->
+<!--
+book-to-menu.xsl generates the HTML menu. It outputs XML/HTML of the form:
+  <div class="menu">
+     ...
+  </div>
+which is then merged with other HTML by site-to-xhtml.xsl
+
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<!-- ================================================================ -->
+<!-- These templates SHOULD be overridden                             -->
+<!-- ================================================================ -->
+  <xsl:template name="selected">
+    <xsl:value-of select="@label"/>
+  </xsl:template>
+  <xsl:template name="unselected"><a href="{@href}">
+    <xsl:if test="@description">
+      <xsl:attribute name="title">
+        <xsl:value-of select="@description"/>
+      </xsl:attribute>
+    </xsl:if>
+    <xsl:value-of select="@label"/></a>
+  </xsl:template>
+  <xsl:template name="print-external">
+<!-- Use apply-imports when overriding -->
+    <xsl:value-of select="@label"/>
+  </xsl:template>
+<!-- ================================================================ -->
+<!-- These templates CAN be overridden                                -->
+<!-- ================================================================ -->
+<!-- Eg, if tab href is 'index.html#foo', this will be called when index.html
+  is selected -->
+  <xsl:template name="selected-anchor">
+<!-- By default, render as unselected so that it is clickable (takes user
+    to the anchor) -->
+    <xsl:call-template name="unselected"/>
+  </xsl:template>
+  <xsl:template name="unselected-anchor">
+    <xsl:call-template name="unselected"/>
+  </xsl:template>
+  <xsl:template match="book">
+    <xsl:apply-templates select="menu"/>
+  </xsl:template>
+  <xsl:template match="menu">
+    <div class="menu">
+      <xsl:call-template name="base-menu"/>
+    </div>
+  </xsl:template>
+  <xsl:template match="menu-item">
+<!-- Use apply-imports when overriding -->
+    <xsl:variable name="href-nofrag">
+      <xsl:call-template name="path-nofrag">
+        <xsl:with-param name="path" select="@href"/>
+      </xsl:call-template>
+    </xsl:variable>
+    <xsl:variable name="node-path">
+      <xsl:call-template name="normalize">
+        <xsl:with-param name="path" select="concat($dirname, $href-nofrag)"/>
+      </xsl:call-template>
+    </xsl:variable>
+    <xsl:choose>
+<!-- Compare with extensions stripped -->
+      <xsl:when test="$node-path = $path-nofrag">
+        <xsl:choose>
+          <xsl:when test="contains(@href, '#')">
+            <xsl:call-template name="selected-anchor"/>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:call-template name="selected"/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:choose>
+          <xsl:when test="contains(@href, '#')">
+            <xsl:call-template name="unselected-anchor"/>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:call-template name="unselected"/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+<!-- ================================================================ -->
+<!-- These templates SHOULD NOT be overridden                         -->
+<!-- ================================================================ -->
+  <xsl:param name="path"/>
+  <xsl:include href="pathutils.xsl"/>
+  <xsl:variable name="filename">
+    <xsl:call-template name="filename">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:variable name="path-nofrag">
+    <xsl:call-template name="path-nofrag">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:variable name="dirname">
+    <xsl:call-template name="dirname">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:template match="external">
+    <li><xsl:choose>
+        <xsl:when test="starts-with(@href, $path-nofrag)">
+          <span class="externalSelected">
+            <xsl:call-template name="print-external"/>
+          </span>
+        </xsl:when>
+        <xsl:otherwise><a href="{@href}" target="_blank">
+          <xsl:value-of select="@label"/></a>
+        </xsl:otherwise>
+      </xsl:choose></li>
+  </xsl:template>
+  <xsl:template match="menu-item[@type='hidden']"/>
+  <xsl:template match="external[@type='hidden']"/>
+  <xsl:template name="base-menu">
+    <xsl:apply-templates/>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/html/document-to-html.xsl b/src/site/src/documentation/skins/common/xslt/html/document-to-html.xsl
new file mode 100644
index 0000000..d4496e0
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/html/document-to-html.xsl
@@ -0,0 +1,374 @@
+<?xml version="1.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.
+-->
+<!--
+This stylesheet contains the majority of templates for converting documentv11
+to HTML.  It renders XML as HTML in this form:
+
+  <div class="content">
+   ...
+  </div>
+
+..which site-to-xhtml.xsl then combines with HTML from the index (book-to-menu.xsl)
+and tabs (tab-to-menu.xsl) to generate the final HTML.
+
+Section handling
+  - <a name/> anchors are added if the id attribute is specified
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:param name="dynamic-page" select="'false'"/>
+  <xsl:param name="notoc"/>
+  <xsl:param name="path"/>
+<!-- <xsl:include href="split.xsl"/> -->
+  <xsl:include href="dotdots.xsl"/>
+  <xsl:include href="pathutils.xsl"/>
+<!-- Path to site root, eg '../../' -->
+  <xsl:variable name="root">
+    <xsl:call-template name="dotdots">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:variable name="skin-img-dir" select="concat(string($root), 'skin/images')"/>
+  <xsl:template match="/">
+    <xsl:apply-templates mode="toc"/>
+    <xsl:apply-templates/>
+  </xsl:template>
+  <xsl:template match="document">
+    <div class="content">
+      <table summary="" class="title">
+        <tr>
+          <td valign="middle">
+            <xsl:if test="normalize-space(header/title)!=''">
+              <h1>
+                <xsl:value-of select="header/title"/>
+              </h1>
+            </xsl:if>
+          </td>
+          <div id="skinconf-printlink"/>
+          <xsl:if test="$dynamic-page='false'">
+            <div id="skinconf-pdflink"/>
+            <div id="skinconf-xmllink"/>
+          </xsl:if>
+        </tr>
+      </table>
+      <xsl:if test="normalize-space(header/subtitle)!=''">
+        <h3>
+          <xsl:value-of select="header/subtitle"/>
+        </h3>
+      </xsl:if>
+      <xsl:apply-templates select="header/type"/>
+      <xsl:apply-templates select="header/notice"/>
+      <xsl:apply-templates select="header/abstract"/>
+      <xsl:apply-templates select="body"/>
+      <div class="attribution">
+        <xsl:apply-templates select="header/authors"/>
+        <xsl:if test="header/authors and header/version">
+<xsl:text>; </xsl:text>
+        </xsl:if>
+        <xsl:apply-templates select="header/version"/>
+      </div>
+    </div>
+  </xsl:template>
+  <xsl:template match="body">
+    <div id="skinconf-toc-page"/>
+    <xsl:apply-templates/>
+  </xsl:template>
+<!-- Generate a <a name="..."> tag for an @id -->
+  <xsl:template match="@id">
+    <xsl:if test="normalize-space(.)!=''"><a name="{.}"/>
+    </xsl:if>
+  </xsl:template>
+  <xsl:template match="section">
+<!-- count the number of section in the ancestor-or-self axis to compute
+         the title element name later on -->
+    <xsl:variable name="sectiondepth" select="count(ancestor-or-self::section)"/><a name="{generate-id()}"/>
+    <xsl:apply-templates select="@id"/>
+<!-- generate a title element, level 1 -> h3, level 2 -> h4 and so on... -->
+    <xsl:element name="{concat('h',$sectiondepth + 2)}">
+      <xsl:value-of select="title"/>
+      <xsl:if test="$notoc='true' and $sectiondepth = 3">
+        <span style="float: right"><a href="#{@id}-menu">^</a>
+        </span>
+      </xsl:if>
+    </xsl:element>
+<!-- Indent FAQ entry text 15 pixels -->
+    <xsl:variable name="indent">
+      <xsl:choose>
+        <xsl:when test="$notoc='true' and $sectiondepth = 3">
+<xsl:text>15</xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+<xsl:text>0</xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:variable>
+    <div style="margin-left: {$indent} ; border: 2px">
+      <xsl:apply-templates select="*[not(self::title)]"/>
+    </div>
+  </xsl:template>
+  <xsl:template match="note | warning | fixme">
+    <xsl:apply-templates select="@id"/>
+    <div>
+      <xsl:call-template name="add.class">
+        <xsl:with-param name="class">
+          <xsl:value-of select="local-name()"/>
+        </xsl:with-param>
+      </xsl:call-template>
+      <div class="label">
+        <xsl:choose>
+<!-- FIXME: i18n Transformer here -->
+          <xsl:when test="@label">
+            <xsl:value-of select="@label"/>
+          </xsl:when>
+          <xsl:when test="local-name() = 'note'">Note</xsl:when>
+          <xsl:when test="local-name() = 'warning'">Warning</xsl:when>
+          <xsl:otherwise>Fixme (<xsl:value-of select="@author"/>)</xsl:otherwise>
+        </xsl:choose>
+      </div>
+      <div class="content">
+        <xsl:apply-templates/>
+      </div>
+    </div>
+  </xsl:template>
+  <xsl:template match="notice">
+    <div class="notice">
+<!-- FIXME: i18n Transformer here -->
+<xsl:text>Notice: </xsl:text>
+      <xsl:apply-templates/>
+    </div>
+  </xsl:template>
+  <xsl:template match="link">
+    <xsl:apply-templates select="@id"/><a>
+    <xsl:if test="@class='jump'">
+      <xsl:attribute name="target">_top</xsl:attribute>
+    </xsl:if>
+    <xsl:if test="@class='fork'">
+      <xsl:attribute name="target">_blank</xsl:attribute>
+    </xsl:if>
+    <xsl:copy-of select="@*"/>
+    <xsl:apply-templates/></a>
+  </xsl:template>
+  <xsl:template match="jump">
+    <xsl:apply-templates select="@id"/><a href="{@href}" target="_top">
+    <xsl:apply-templates/></a>
+  </xsl:template>
+  <xsl:template match="fork">
+    <xsl:apply-templates select="@id"/><a href="{@href}" target="_blank">
+    <xsl:apply-templates/></a>
+  </xsl:template>
+  <xsl:template match="p[@xml:space='preserve']">
+    <xsl:apply-templates select="@id"/>
+    <div class="pre">
+      <xsl:copy-of select="@id"/>
+      <xsl:apply-templates/>
+    </div>
+  </xsl:template>
+  <xsl:template match="source">
+    <xsl:apply-templates select="@id"/>
+    <pre class="code">
+<!-- Temporarily removed long-line-splitter ... gives out-of-memory problems -->
+      <xsl:copy-of select="@id"/>
+      <xsl:apply-templates/>
+<!--
+    <xsl:call-template name="format">
+    <xsl:with-param select="." name="txt" />
+     <xsl:with-param name="width">80</xsl:with-param>
+     </xsl:call-template>
+-->
+    </pre>
+  </xsl:template>
+  <xsl:template match="anchor"><a name="{@id}">
+    <xsl:copy-of select="@id"/></a>
+  </xsl:template>
+  <xsl:template match="icon">
+    <xsl:apply-templates select="@id"/>
+    <img class="icon">
+      <xsl:copy-of select="@height | @width | @src | @alt | @id"/>
+    </img>
+  </xsl:template>
+  <xsl:template match="code">
+    <xsl:apply-templates select="@id"/>
+    <span>
+      <xsl:call-template name="add.class">
+        <xsl:with-param name="class">codefrag</xsl:with-param>
+      </xsl:call-template>
+      <xsl:copy-of select="@id"/>
+      <xsl:value-of select="."/>
+    </span>
+  </xsl:template>
+  <xsl:template match="figure">
+    <xsl:apply-templates select="@id"/>
+    <div align="center">
+      <xsl:copy-of select="@id"/>
+      <img class="figure">
+        <xsl:copy-of select="@height | @width | @src | @alt | @id"/>
+      </img>
+    </div>
+  </xsl:template>
+  <xsl:template match="table">
+    <xsl:apply-templates select="@id"/>
+    <xsl:choose>
+<!-- Limit Forrest specific processing to tables without class -->
+      <xsl:when test="not(@class) or @class=''">
+        <table cellpadding="4" cellspacing="1" class="ForrestTable">
+          <xsl:copy-of select="@cellspacing | @cellpadding | @border | @class | @bgcolor |@id"/>
+          <xsl:apply-templates/>
+        </table>
+      </xsl:when>
+      <xsl:otherwise>
+<!-- Tables with class are passed without change -->
+        <xsl:copy>
+          <xsl:copy-of select="@*"/>
+          <xsl:apply-templates/>
+        </xsl:copy>
+      </xsl:otherwise>
+    </xsl:choose>
+    <xsl:if test="@class = ''"></xsl:if>
+  </xsl:template>
+  <xsl:template match="acronym/@title">
+    <xsl:attribute name="title">
+      <xsl:value-of select="normalize-space(.)"/>
+    </xsl:attribute>
+  </xsl:template>
+  <xsl:template match="header/authors">
+    <xsl:for-each select="person">
+      <xsl:choose>
+        <xsl:when test="position()=1">by</xsl:when>
+        <xsl:otherwise>,</xsl:otherwise>
+      </xsl:choose>
+<xsl:text> </xsl:text>
+      <xsl:value-of select="@name"/>
+    </xsl:for-each>
+  </xsl:template>
+  <xsl:template match="version">
+    <span class="version">
+      <xsl:apply-templates select="@major"/>
+      <xsl:apply-templates select="@minor"/>
+      <xsl:apply-templates select="@fix"/>
+      <xsl:apply-templates select="@tag"/>
+      <xsl:choose>
+        <xsl:when test="starts-with(., '$Revision: ')">
+          version <xsl:value-of select="substring(., 12, string-length(.) -11-2)"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="."/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </span>
+  </xsl:template>
+  <xsl:template match="@major">
+     v<xsl:value-of select="."/>
+  </xsl:template>
+  <xsl:template match="@minor | @fix">
+    <xsl:value-of select="concat('.',.)"/>
+  </xsl:template>
+  <xsl:template match="@tag">
+    <xsl:value-of select="concat('-',.)"/>
+  </xsl:template>
+  <xsl:template match="type">
+    <p class="type">
+<!-- FIXME: i18n Transformer here -->
+<xsl:text>Type: </xsl:text>
+      <xsl:value-of select="."/>
+    </p>
+  </xsl:template>
+  <xsl:template match="abstract">
+    <p>
+      <xsl:apply-templates/>
+    </p>
+  </xsl:template>
+  <xsl:template name="email"><a>
+    <xsl:attribute name="href">
+      <xsl:value-of select="concat('mailto:',@email)"/>
+    </xsl:attribute>
+    <xsl:value-of select="@name"/></a>
+  </xsl:template>
+  <xsl:template name="generate-id">
+    <xsl:choose>
+      <xsl:when test="@id">
+        <xsl:value-of select="@id"/>
+      </xsl:when>
+      <xsl:when test="@title">
+        <xsl:value-of select="@title"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:value-of select="generate-id(.)"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+<!--  Templates for "toc" mode.  This will generate a complete
+        Table of Contents for the document.  This will then be used
+        by the site2xhtml to generate a Menu ToC and a Page ToC -->
+  <xsl:template match="document" mode="toc">
+    <xsl:apply-templates mode="toc"/>
+  </xsl:template>
+  <xsl:template match="body" mode="toc">
+    <tocitems>
+      <xsl:if test="../header/meta[@name='forrest.force-toc'] = 'true'">
+        <xsl:attribute name="force">true</xsl:attribute>
+      </xsl:if>
+      <xsl:apply-templates select="section" mode="toc">
+        <xsl:with-param name="level" select="1"/>
+      </xsl:apply-templates>
+    </tocitems>
+  </xsl:template>
+  <xsl:template match="section" mode="toc">
+    <xsl:param name="level"/>
+    <tocitem level="{$level}">
+      <xsl:attribute name="href">#<xsl:call-template name="generate-id"/>
+      </xsl:attribute>
+      <xsl:attribute name="title">
+        <xsl:value-of select="title"/>
+      </xsl:attribute>
+      <xsl:apply-templates mode="toc">
+        <xsl:with-param name="level" select="$level+1"/>
+      </xsl:apply-templates>
+    </tocitem>
+  </xsl:template>
+  <xsl:template name="add.class">
+<!-- use the parameter to set class attribute -->
+<!-- if there are already classes set, adds to them -->
+    <xsl:param name="class"/>
+    <xsl:attribute name="class">
+      <xsl:choose>
+        <xsl:when test="@class">
+          <xsl:value-of select="$class"/>
+<xsl:text> </xsl:text>
+          <xsl:value-of select="@class"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="$class"/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:attribute>
+  </xsl:template>
+  <xsl:template match="node()|@*" mode="toc"/>
+<!-- End of "toc" mode templates -->
+  <xsl:template match="node()|@*" priority="-1">
+<!-- id processing will create its own a-element so processing has to 
+         happen outside the copied element 
+    -->
+    <xsl:apply-templates select="@id"/>
+    <xsl:copy>
+      <xsl:apply-templates select="@*[name(.) != 'id']"/>
+      <xsl:copy-of select="@id"/>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/html/dotdots.xsl b/src/site/src/documentation/skins/common/xslt/html/dotdots.xsl
new file mode 100644
index 0000000..2ff9d1f
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/html/dotdots.xsl
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  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.
+-->
+<!--
+Contains the 'dotdots' template, which, given a path, will output a set of
+directory traversals to get back to the source directory. Handles both '/' and
+'\' directory separators.
+
+Examples:
+  Input                           Output 
+    index.html                    ""
+    dir/index.html                "../"
+    dir/subdir/index.html         "../../"
+    dir//index.html              "../"
+    dir/                          "../"
+    dir//                         "../"
+    \some\windows\path            "../../"
+    \some\windows\path\           "../../../"
+    \Program Files\mydir          "../"
+
+Cannot handle ..'s in the path, so don't expect 'dir/subdir/../index.html' to
+work.
+
+-->
+<xsl:stylesheet
+  version="1.0"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:template name="dotdots">
+    <xsl:param name="path"/>
+    <xsl:variable name="dirs" select="normalize-space(translate(concat($path, 'x'), ' /\', '_  '))"/>
+<!-- The above does the following:
+       o Adds a trailing character to the path. This prevents us having to deal
+         with the special case of ending with '/'
+       o Translates all directory separators to ' ', and normalize spaces,
+		 cunningly eliminating duplicate '//'s. We also translate any real
+		 spaces into _ to preserve them.
+    -->
+    <xsl:variable name="remainder" select="substring-after($dirs, ' ')"/>
+    <xsl:if test="$remainder">
+<xsl:text>../</xsl:text>
+      <xsl:call-template name="dotdots">
+        <xsl:with-param name="path" select="translate($remainder, ' ', '/')"/>
+<!-- Translate back to /'s because that's what the template expects. -->
+      </xsl:call-template>
+    </xsl:if>
+  </xsl:template>
+<!--
+  Uncomment to test.
+  Usage: saxon dotdots.xsl dotdots.xsl path='/my/test/path'
+
+  <xsl:param name="path"/>
+  <xsl:template match="/">
+    <xsl:message>Path: <xsl:value-of select="$path"/></xsl:message>
+    <xsl:call-template name="dotdots">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+  </xsl:template>
+ -->
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/html/pathutils.xsl b/src/site/src/documentation/skins/common/xslt/html/pathutils.xsl
new file mode 100644
index 0000000..c1639a4
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/html/pathutils.xsl
@@ -0,0 +1,231 @@
+<?xml version="1.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.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<!--
+PathUtils.xsl
+
+A set of XSLT templates useful for parsing URI paths:
+
+dirname: return the directory part of a path
+filename: return the file part of a path
+ext: return the last extension of the filename in a path
+filename-noext: return the file part of a path without its last extension
+
+-->
+<!-- Returns the directory part of a path.  Equivalent to Unix 'dirname'.
+Examples:
+'' -> ''
+'foo/index.html' -> 'foo/'
+-->
+  <xsl:template name="dirname">
+    <xsl:param name="path" />
+    <xsl:if test="contains($path, '/')">
+      <xsl:value-of select="concat(substring-before($path, '/'), '/')" />
+      <xsl:call-template name="dirname">
+        <xsl:with-param name="path"
+        select="substring-after($path, '/')" />
+      </xsl:call-template>
+    </xsl:if>
+  </xsl:template>
+<!-- Normalized (..'s eliminated) version of 'dirname' -->
+  <xsl:template name="dirname-nz">
+    <xsl:param name="path" />
+    <xsl:call-template name="normalize">
+      <xsl:with-param name="path">
+        <xsl:call-template name="dirname">
+          <xsl:with-param name="path" select="$path" />
+        </xsl:call-template>
+      </xsl:with-param>
+    </xsl:call-template>
+  </xsl:template>
+<!-- Returns the filename part of a path.  Equivalent to Unix 'basename'
+Examples:
+'index.html'  ->  'index.html' 
+'foo/bar/'  ->  '' 
+'foo/bar/index.html'  ->  'index.html' 
+-->
+  <xsl:template name="filename">
+    <xsl:param name="path"/>
+    <xsl:choose>
+      <xsl:when test="contains($path, '/')">
+        <xsl:call-template name="filename">
+          <xsl:with-param name="path" select="substring-after($path, '/')"/>
+        </xsl:call-template>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:value-of select="$path"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+<!-- Returns the last extension of a filename in a path.
+Examples:
+'index.html'  ->  '.html' 
+'index.dtdx.html'  ->  '.html' 
+'foo/bar/'  ->  '' 
+'foo/bar/index.html'  ->  '.html' 
+'foo/bar/index'  ->  '' 
+-->
+  <xsl:template name="ext">
+    <xsl:param name="path"/>
+    <xsl:param name="subflag"/>
+<!-- Outermost call? -->
+    <xsl:choose>
+      <xsl:when test="contains($path, '.')">
+        <xsl:call-template name="ext">
+          <xsl:with-param name="path" select="substring-after($path, '.')"/>
+          <xsl:with-param name="subflag" select="'sub'"/>
+        </xsl:call-template>
+      </xsl:when>
+<!-- Handle extension-less filenames by returning '' -->
+      <xsl:when test="not($subflag) and not(contains($path, '.'))">
+<xsl:text/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:value-of select="concat('.', $path)"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+<!-- Returns a filename of a path stripped of its last extension.
+Examples:
+'foo/bar/index.dtdx.html' -> 'index.dtdx'
+-->
+  <xsl:template name="filename-noext">
+    <xsl:param name="path"/>
+    <xsl:variable name="filename">
+      <xsl:call-template name="filename">
+        <xsl:with-param name="path" select="$path"/>
+      </xsl:call-template>
+    </xsl:variable>
+    <xsl:variable name="ext">
+      <xsl:call-template name="ext">
+        <xsl:with-param name="path" select="$filename"/>
+      </xsl:call-template>
+    </xsl:variable>
+    <xsl:value-of select="substring($filename, 1, string-length($filename) - string-length($ext))"/>
+  </xsl:template>
+<!-- Returns a path with the filename stripped of its last extension.
+Examples:
+'foo/bar/index.dtdx.html' -> 'foo/bar/index.dtdx'
+-->
+  <xsl:template name="path-noext">
+    <xsl:param name="path"/>
+    <xsl:variable name="ext">
+      <xsl:call-template name="ext">
+        <xsl:with-param name="path" select="$path"/>
+      </xsl:call-template>
+    </xsl:variable>
+    <xsl:value-of select="substring($path, 1, string-length($path) - string-length($ext))"/>
+  </xsl:template>
+<!-- Normalized (..'s eliminated) version of 'path-noext' -->
+  <xsl:template name="path-noext-nz">
+    <xsl:param name="path" />
+    <xsl:call-template name="normalize">
+      <xsl:with-param name="path">
+        <xsl:call-template name="path-noext">
+          <xsl:with-param name="path" select="$path" />
+        </xsl:call-template>
+      </xsl:with-param>
+    </xsl:call-template>
+  </xsl:template>
+<!-- Returns a path with any fragment identifier ('#...') stripped off
+Examples:
+'foo/bar/index.dtdx.html#blah' -> 'foo/bar/index.dtdx.html'
+-->
+  <xsl:template name="path-nofrag">
+    <xsl:param name="path"/>
+    <xsl:if test="not(contains($path, '#'))">
+      <xsl:value-of select="$path"/>
+    </xsl:if>
+    <xsl:if test="contains($path, '#')">
+      <xsl:value-of select="substring-before($path, '#')"/>
+    </xsl:if>
+  </xsl:template>
+<!-- Normalizes a path, converting '/' to '\' and eliminating ..'s
+Examples:
+'foo/bar/../baz/index.html' -> foo/baz/index.html'
+-->
+  <xsl:template name="normalize">
+    <xsl:param name="path"/>
+<!-- replace all \  with / -->
+    <xsl:variable name="path-" select="translate($path, '\', '/')"/>
+    <xsl:choose>
+<!-- process relative refs here -->
+      <xsl:when test="contains($path-, '/../')">
+<!--  put part before /../ into $pa: "foo/bar" -->
+        <xsl:variable name="pa" select="substring-before($path-, '/../')"/>
+<!-- put part after first occurrence /../ into $th: "baz/index.html" -->
+        <xsl:variable name="th" select="substring-after($path-, '/../')"/>
+<!-- cut last real directory name before /../ and put rest in $pa- : "foo/"  -->
+        <xsl:variable name="pa-">
+          <xsl:call-template name="dirname">
+            <xsl:with-param name="path" select="$pa"/>
+          </xsl:call-template>
+        </xsl:variable>
+<!-- recombine pieces thus eliminating one .. and one dir step before it
+              and recurse into this template to eliminate more /../
+      -->
+        <xsl:variable name="pa-th" select="concat($pa-, $th)"/>
+        <xsl:call-template name="normalize">
+          <xsl:with-param name="path" select="$pa-th"/>
+        </xsl:call-template>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:value-of select="$path-"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+<!--
+Uncomment this to test.
+Usage: saxon pathutils.xsl pathutils.xsl path=foo/bar
+
+<xsl:param name="path" select="'/foo/bar/../baz/index.html'"/>
+<xsl:template match="/">
+  <xsl:message>
+    path           = <xsl:value-of select="$path"/>
+    normalize      = <xsl:call-template name="normalize">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+    dirname        = <xsl:call-template name="dirname">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+    dirname-nz     = <xsl:call-template name="dirname-nz">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+    filename       = <xsl:call-template name="filename">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+    ext            = <xsl:call-template name="ext">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+    filename-noext = <xsl:call-template name="filename-noext">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+    path-noext     = <xsl:call-template name="path-noext">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+    path-noext-nz  = <xsl:call-template name="path-noext-nz">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+    path-nofrag    = <xsl:call-template name="path-nofrag">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+ 
+  </xsl:message>
+</xsl:template>
+-->
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/html/renderlogo.xsl b/src/site/src/documentation/skins/common/xslt/html/renderlogo.xsl
new file mode 100644
index 0000000..698156b
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/html/renderlogo.xsl
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  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.
+-->
+<!--
+A simple callable template that renders a logo for an entity. The logo will 
+be a hyperlink and may include an image (with width and height if specified)
+or else it will just include the specified text.
+
+Note that text and image are mandatory parts of the template.
+-->
+<xsl:stylesheet
+  version="1.0"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:template name="renderlogo">
+    <xsl:param name="name"/>
+    <xsl:param name="url"/>
+    <xsl:param name="logo"/>
+    <xsl:param name="width"/>
+    <xsl:param name="height"/>
+    <xsl:param name="root"/>
+    <xsl:param name="description"/><a href="{$url}">
+    <xsl:choose>
+      <xsl:when test="$logo and not($logo = '')">
+        <img alt="{$name}" class="logoImage">
+          <xsl:attribute name="src">
+            <xsl:if test="not(starts-with($logo, 'http://'))">
+              <xsl:value-of select="$root"/>
+            </xsl:if>
+            <xsl:value-of select="$logo"/>
+          </xsl:attribute>
+          <xsl:if test="$width">
+            <xsl:attribute name="width">
+              <xsl:value-of select="$width"/>
+            </xsl:attribute>
+          </xsl:if>
+          <xsl:if test="$height">
+            <xsl:attribute name="height">
+              <xsl:value-of select="$height"/>
+            </xsl:attribute>
+          </xsl:if>
+          <xsl:if test="$description">
+            <xsl:attribute name="title">
+              <xsl:value-of select="$description"/>
+            </xsl:attribute>
+          </xsl:if>
+        </img>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:value-of select="$name"/>
+      </xsl:otherwise>
+    </xsl:choose></a>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/html/site-to-xhtml.xsl b/src/site/src/documentation/skins/common/xslt/html/site-to-xhtml.xsl
new file mode 100644
index 0000000..2f8b15c
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/html/site-to-xhtml.xsl
@@ -0,0 +1,388 @@
+<?xml version="1.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.
+-->
+<!--
+site-to-xhtml.xsl is the final stage in HTML page production.  It merges HTML from
+document-to-html.xsl, tab-to-menu.xsl and book-to-menu.xsl, and adds the site header,
+footer, searchbar, css etc.  As input, it takes XML of the form:
+
+<site>
+  <div class="menu">
+    ...
+  </div>
+  <div class="tab">
+    ...
+  </div>
+  <div class="content">
+    ...
+  </div>
+</site>
+
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java">
+  <xsl:variable name="config" select="//skinconfig"/>
+<!-- If true, a txt link for this page will not be generated -->
+  <xsl:variable name="disable-txt-link" select="//skinconfig/disable-txt-link"/>
+<!-- If true, a PDF link for this page will not be generated -->
+  <xsl:variable name="disable-pdf-link" select="//skinconfig/disable-pdf-link"/>
+<!-- If true, a "print" link for this page will not be generated -->
+  <xsl:variable name="disable-print-link" select="//skinconfig/disable-print-link"/>
+<!-- If true, an XML link for this page will not be generated -->
+  <xsl:variable name="disable-xml-link" select="//skinconfig/disable-xml-link"/>
+<!-- If true, a POD link for this page will not be generated -->
+  <xsl:variable name="disable-pod-link" select="//skinconfig/disable-pod-link"/>
+<!-- Get the location where to generate the minitoc -->
+  <xsl:variable name="minitoc-location" select="//skinconfig/toc/@location"/>
+  <xsl:param name="path"/>
+  <xsl:include href="dotdots.xsl"/>
+  <xsl:include href="pathutils.xsl"/>
+  <xsl:include href="renderlogo.xsl"/>
+<!-- Path (..'s) to the root directory -->
+  <xsl:variable name="root">
+    <xsl:call-template name="dotdots">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+  </xsl:variable>
+<!-- Source filename (eg 'foo.xml') of current page -->
+  <xsl:variable name="filename">
+    <xsl:call-template name="filename">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+  </xsl:variable>
+<!-- Path of Lucene search results page (relative to $root) -->
+  <xsl:param name="lucene-search" select="'lucene-search.html'"/>
+  <xsl:variable name="filename-noext">
+    <xsl:call-template name="filename-noext">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+  </xsl:variable>
+<!-- Whether to obfuscate email links -->
+  <xsl:variable name="obfuscate-mail-links" select="//skinconfig/obfuscate-mail-links"/>
+<!-- If true, the font size script will not be rendered -->
+  <xsl:variable name="disable-font-script" select="//skinconfig/disable-font-script"/>
+<!-- If true, an the images on all external links will not be added -->
+  <xsl:variable name="disable-external-link-image" select="//skinconfig/disable-external-link-image"/>
+  <xsl:variable name="skin-img-dir" select="concat(string($root), 'skin/images')"/>
+  <xsl:variable name="spacer" select="concat($root, 'skin/images/spacer.gif')"/>
+  <xsl:template name="breadcrumbs">
+    <xsl:if test="(//skinconfig/trail/link1/@name)and(//skinconfig/trail/link1/@name!='')"><a href="{//skinconfig/trail/link1/@href}">
+      <xsl:value-of select="//skinconfig/trail/link1/@name"/></a>
+    </xsl:if>
+    <xsl:if test="(//skinconfig/trail/link2/@name)and(//skinconfig/trail/link2/@name!='')"> &gt; <a href="{//skinconfig/trail/link2/@href}">
+      <xsl:value-of select="//skinconfig/trail/link2/@name"/></a>
+    </xsl:if>
+    <xsl:if test="(//skinconfig/trail/link3/@name)and(//skinconfig/trail/link3/@name!='')"> &gt; <a href="{//skinconfig/trail/link3/@href}">
+      <xsl:value-of select="//skinconfig/trail/link3/@name"/></a>
+    </xsl:if>
+<script type="text/javascript" language="JavaScript" src="{$root}skin/breadcrumbs.js"/>
+  </xsl:template>
+  <xsl:template match="site">
+    <html>
+      <head>
+        <title><xsl:value-of select="div[@class='content']/table/tr/td/h1"/></title>
+        <xsl:if test="//skinconfig/favicon-url"><link rel="shortcut icon">
+          <xsl:attribute name="href">
+            <xsl:value-of select="concat($root,//skinconfig/favicon-url)"/>
+          </xsl:attribute></link>
+        </xsl:if>
+      </head>
+      <body>
+        <xsl:if test="//skinconfig/group-url">
+          <xsl:call-template name="renderlogo">
+            <xsl:with-param name="name" select="//skinconfig/group-name"/>
+            <xsl:with-param name="url" select="//skinconfig/group-url"/>
+            <xsl:with-param name="logo" select="//skinconfig/group-logo"/>
+            <xsl:with-param name="root" select="$root"/>
+            <xsl:with-param name="description" select="//skinconfig/group-description"/>
+          </xsl:call-template>
+        </xsl:if>
+        <xsl:call-template name="renderlogo">
+          <xsl:with-param name="name" select="//skinconfig/project-name"/>
+          <xsl:with-param name="url" select="//skinconfig/project-url"/>
+          <xsl:with-param name="logo" select="//skinconfig/project-logo"/>
+          <xsl:with-param name="root" select="$root"/>
+          <xsl:with-param name="description" select="//skinconfig/project-description"/>
+        </xsl:call-template>
+        <xsl:comment>================= start Tabs ==================</xsl:comment>
+        <xsl:apply-templates select="div[@class='tab']"/>
+        <xsl:comment>================= end Tabs ==================</xsl:comment>
+        <xsl:comment>================= start Menu items ==================</xsl:comment>
+        <xsl:apply-templates select="div[@class='menu']"/>
+        <xsl:comment>================= end Menu items ==================</xsl:comment>
+        <xsl:comment>================= start Content==================</xsl:comment>
+        <xsl:apply-templates select="div[@class='content']"/>
+        <xsl:comment>================= end Content==================</xsl:comment>
+        <xsl:comment>================= start Footer ==================</xsl:comment>
+        <xsl:choose>
+          <xsl:when test="$config/copyright-link"><a>
+            <xsl:attribute name="href">
+              <xsl:value-of select="$config/copyright-link"/>
+            </xsl:attribute>
+              Copyright &#169; <xsl:value-of select="$config/year"/>
+            <xsl:call-template name="current-year">
+              <xsl:with-param name="copyrightyear" select="$config/year"/>
+            </xsl:call-template>&#160;
+              <xsl:value-of select="$config/vendor"/></a>
+          </xsl:when>
+          <xsl:otherwise>
+            Copyright &#169; <xsl:value-of select="$config/year"/>
+            <xsl:call-template name="current-year">
+              <xsl:with-param name="copyrightyear" select="$config/year"/>
+            </xsl:call-template>&#160;
+            <xsl:value-of select="$config/vendor"/>
+          </xsl:otherwise>
+        </xsl:choose>
+        All rights reserved.
+        <script language="JavaScript" type="text/javascript"><![CDATA[<!--
+          document.write(" - "+"Last Published: " + document.lastModified);
+          //  -->]]></script>
+        <xsl:if test="//skinconfig/host-logo and not(//skinconfig/host-logo = '')"><a href="{//skinconfig/host-url}">
+          <xsl:call-template name="renderlogo">
+            <xsl:with-param name="name" select="//skinconfig/host-name"/>
+            <xsl:with-param name="url" select="//skinconfig/host-url"/>
+            <xsl:with-param name="logo" select="//skinconfig/host-logo"/>
+            <xsl:with-param name="root" select="$root"/>
+          </xsl:call-template></a>
+        </xsl:if>
+        <xsl:if test="$filename = 'index.html' and //skinconfig/credits">
+          <xsl:for-each select="//skinconfig/credits/credit[not(@role='pdf')]">
+            <xsl:call-template name="renderlogo">
+              <xsl:with-param name="name" select="name"/>
+              <xsl:with-param name="url" select="url"/>
+              <xsl:with-param name="logo" select="image"/>
+              <xsl:with-param name="root" select="$root"/>
+              <xsl:with-param name="width" select="width"/>
+              <xsl:with-param name="height" select="height"/>
+            </xsl:call-template>
+          </xsl:for-each>
+        </xsl:if><a href="http://validator.w3.org/check/referer">
+        <img class="skin" border="0"
+            src="http://www.w3.org/Icons/valid-html401"
+            alt="Valid HTML 4.01!" height="31" width="88"/></a>
+      </body>
+    </html>
+  </xsl:template>
+<!-- Add links to any standards-compliance logos -->
+  <xsl:template name="compliancy-logos">
+    <xsl:if test="$filename = 'index.html' and //skinconfig/disable-compliance-links = 'false'"><a href="http://validator.w3.org/check/referer">
+      <img class="logoImage"
+          src="{$skin-img-dir}/valid-html401.png"
+          alt="Valid HTML 4.01!" title="Valid HTML 4.01!" height="31" width="88" border="0"/></a><a href="http://jigsaw.w3.org/css-validator/check/referer">
+      <img class="logoImage"
+          src="{$skin-img-dir}/vcss.png"
+          alt="Valid CSS!" title="Valid CSS!" height="31" width="88" border="0"/></a>
+    </xsl:if>
+  </xsl:template>
+<!-- Generates the PDF link -->
+  <xsl:template match="div[@id='skinconf-pdflink']">
+    <xsl:if test="not($config/disable-pdf-link) or $disable-pdf-link = 'false'">
+      <td align="center" width="40" nowrap="nowrap"><a href="{$filename-noext}.pdf" class="dida">
+        <img class="skin" src="{$skin-img-dir}/pdfdoc.gif" alt="PDF"/>
+        <br/>
+        PDF</a>
+      </td>
+    </xsl:if>
+  </xsl:template>
+<!-- Generates the TXT link -->
+  <xsl:template match="div[@id='skinconf-txtlink']">
+    <xsl:if test="$disable-txt-link = 'false'">
+      <td align="center" width="40" nowrap="nowrap"><a href="{$filename-noext}.txt" class="dida">
+        <img class="skin" src="{$skin-img-dir}/txtdoc.png" alt="TXT"/>
+        <br/>
+        TXT</a>
+      </td>
+    </xsl:if>
+  </xsl:template>
+<!-- Generates the POD link -->
+  <xsl:template match="div[@id='skinconf-podlink']">
+    <xsl:if test="$disable-pod-link = 'false'">
+      <td align="center" width="40" nowrap="nowrap"><a href="{$filename-noext}.pod" class="dida">
+        <img class="skin" src="{$skin-img-dir}/poddoc.png" alt="POD"/>
+        <br/>
+        POD</a>
+      </td>
+    </xsl:if>
+  </xsl:template>
+<!-- Generates the XML link -->
+  <xsl:template match="div[@id='skinconf-xmllink']">
+    <xsl:if test="$disable-xml-link = 'false'">
+      <td align="center" width="40" nowrap="nowrap"><a href="{$filename-noext}.xml" class="dida">
+        <img class="skin" src="{$skin-img-dir}/xmldoc.gif" alt="XML"/>
+        <br/>
+        XML</a>
+      </td>
+    </xsl:if>
+  </xsl:template>
+<!-- Generates the "printer friendly version" link -->
+  <xsl:template match="div[@id='skinconf-printlink']">
+    <xsl:if test="$disable-print-link = 'false'">
+<script type="text/javascript" language="Javascript">
+function printit() {
+  if (window.print) {
+    window.focus();
+    window.print();
+  }
+}
+
+var NS = (navigator.appName == "Netscape");
+var VERSION = parseInt(navigator.appVersion);
+if (VERSION > 3) {
+    document.write('<td align="center" width="40" nowrap="nowrap">');
+    document.write('  <a href="javascript:printit()" class="dida">');
+    document.write('    <img class="skin" src="{$skin-img-dir}/printer.gif" alt="Print this Page"/><br />');
+    document.write('  print</a>');
+    document.write('</td>');
+}
+</script>
+    </xsl:if>
+  </xsl:template>
+<!-- handle all obfuscating mail links and disabling external link images -->
+  <xsl:template match="a">
+    <xsl:choose>
+      <xsl:when test="$obfuscate-mail-links='true' and starts-with(@href, 'mailto:') and contains(@href, '@')">
+        <xsl:variable name="mailto-1" select="substring-before(@href,'@')"/>
+        <xsl:variable name="mailto-2" select="substring-after(@href,'@')"/>
+        <xsl:variable name="obfuscation" select="normalize-space(//skinconfig/obfuscate-mail-value)"/><a href="{$mailto-1}{$obfuscation}{$mailto-2}">
+        <xsl:apply-templates/></a>
+      </xsl:when>
+      <xsl:when test="not($disable-external-link-image='true') and contains(@href, ':') and not(contains(@href, //skinconfig/group-url)) and not(contains(@href, //skinconfig/project-url))"><a href="{@href}" class="external">
+        <xsl:apply-templates/></a>
+      </xsl:when>
+      <xsl:otherwise>
+<!-- xsl:copy-of makes sure we copy <a href> as well as <a name>
+             or any other <a ...> forms -->
+        <xsl:copy-of select="."/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+  <xsl:template match="div[@id='skinconf-toc-page']">
+    <xsl:if test="$config/toc">
+      <xsl:if test="contains($minitoc-location,'page')">
+        <xsl:if test="(count(//tocitems/tocitem) >= $config/toc/@min-sections) or (//tocitems/@force = 'true')">
+          <xsl:call-template name="minitoc">
+            <xsl:with-param name="tocroot" select="//tocitems"/>
+          </xsl:call-template>
+        </xsl:if>
+      </xsl:if>
+    </xsl:if>
+  </xsl:template>
+  <xsl:template name="minitoc">
+    <xsl:param name="tocroot"/>
+    <xsl:if test="(count($tocroot/tocitem) >= $config/toc/@min-sections) or ($tocroot/@force = 'true')">
+      <xsl:if test="contains($config/toc/@location,'page')">
+        <ul class="minitoc">
+          <xsl:for-each select="$tocroot/tocitem">
+            <li><a href="{@href}">
+              <xsl:value-of select="@title"/></a>
+              <xsl:if test="@level&lt;//skinconfig/toc/@max-depth+1">
+                <xsl:call-template name="minitoc">
+                  <xsl:with-param name="tocroot" select="."/>
+                </xsl:call-template>
+              </xsl:if></li>
+          </xsl:for-each>
+        </ul>
+      </xsl:if>
+    </xsl:if>
+  </xsl:template>
+  <xsl:template name="html-meta">
+    <meta name="Generator" content="Apache Forrest"/>
+    <meta name="Forrest-version">
+      <xsl:attribute name="content">
+        <xsl:value-of select="//info/forrest-version"/>
+      </xsl:attribute>
+    </meta>
+    <meta name="Forrest-skin-name">
+      <xsl:attribute name="content">
+        <xsl:value-of select="//info/project-skin"/>
+      </xsl:attribute>
+    </meta>
+  </xsl:template>
+<!-- meta information from v 2.0 documents
+       FIXME: the match is really inefficient -->
+  <xsl:template name="meta-data">
+    <xsl:for-each select="//meta-data/meta">
+      <xsl:element name="meta">
+        <xsl:attribute name="name">
+          <xsl:value-of select="@name"/>
+        </xsl:attribute>
+        <xsl:attribute name="content">
+          <xsl:value-of select="."/>
+        </xsl:attribute>
+        <xsl:if test="@xml:lang">
+          <xsl:attribute name="lang">
+            <xsl:value-of select="@xml:lang"/>
+          </xsl:attribute>
+        </xsl:if>
+      </xsl:element>
+    </xsl:for-each>
+  </xsl:template>
+  <xsl:template name="feedback">
+    <div id="feedback">
+      <xsl:value-of select="$config/feedback"/>
+      <xsl:choose>
+        <xsl:when test="$config/feedback/@href and not($config/feedback/@href='')"><a id="feedbackto">
+          <xsl:attribute name="href">
+            <xsl:value-of select="$config/feedback/@href"/>
+            <xsl:value-of select="$path"/>
+          </xsl:attribute>
+          <xsl:value-of select="$config/feedback/@to"/></a>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="$config/feedback/@to"/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </div>
+  </xsl:template>
+  <xsl:template match="node()|@*" priority="-1">
+    <xsl:copy>
+      <xsl:apply-templates select="@*"/>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+<!-- inception year copyright management -->
+  <xsl:template name="current-year">
+<!-- Displays the current year after the inception year (in the copyright i.e: 2002-2005)
+       - the copyright year (2005 by default) can be indicated in the copyrightyear parameter,
+       - the year format (yyyy by default) can be indicated in the dateformat parameter,
+       - the dates separator (- by default) can be indicated in the dateseparator parameter.
+       For instance the following call will format the year on 2 digits and separates the dates
+       with /
+       (copyright 02/05)
+        <xsl:call-template name="current-year">
+           <xsl:with-param name="copyrightyear" select="'02'"/>
+           <xsl:with-param name="dateformat" select="'yy'"/>
+           <xsl:with-param name="dateseparator" select="'/'"/>
+         </xsl:call-template>
+       Warning, to enable inception year, inception attribute must be set to "true" in copyright/year/@inception
+     -->
+    <xsl:param name="copyrightyear">2005</xsl:param>
+    <xsl:param name="dateformat">yyyy</xsl:param>
+    <xsl:param name="dateseparator">-</xsl:param>
+    <xsl:if test="$copyrightyear[@inception = 'true']">
+      <xsl:variable name="tz" select='java:java.util.SimpleTimeZone.new(0,"GMT+00:00")' />
+      <xsl:variable name="formatter" select="java:java.text.SimpleDateFormat.new($dateformat)"/>
+      <xsl:variable name="settz" select="java:setTimeZone($formatter, $tz)" />
+      <xsl:variable name="date" select="java:java.util.Date.new()"/>
+      <xsl:variable name="year" select="java:format($formatter, $date)"/>
+      <xsl:if test="$copyrightyear != $year">
+        <xsl:value-of select="$dateseparator"/>
+        <xsl:value-of select="$year"/>
+      </xsl:if>
+    </xsl:if>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/html/split.xsl b/src/site/src/documentation/skins/common/xslt/html/split.xsl
new file mode 100644
index 0000000..14c88e7
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/html/split.xsl
@@ -0,0 +1,124 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+<!--
+ This stylesheet was taken from the XSLT FAQ http://www.dpawson.co.uk/xsl/
+ 
+ Comments and adaption to be used without normalize-space()
+  by forrest-dev@xml.apache.org
+-->
+<!--
+  Input:
+
+<doc>
+
+<para>
+ 123456 2345 343434 545454 43434 343 
+ 12345 343434 545454 43434 343 
+ 32345645 343434 545454 43434 343 
+ 3422222225 343434 545454 43434 343 
+ llllllllllllllllllllllooooooooooooooonnnnnnnnnnnggggggggg
+ 345 343434 545454 43434 343 
+</para>
+
+</doc>
+
+Output:
+
+<HTML>
+<BODY>
+<PRE>123456 2345 343434 545454 
+43434 343 12345 343434 545454 
+43434 343 32345645 343434 
+545454 43434 343 3422222225 
+343434 545454 43434 343 
+lllllllllllllllllllllloooooooo
+ooooooonnnnnnnnnnnggggggggg 
+345 343434 545454 43434 
+343
+</PRE>
+</BODY>
+</HTML>
+
+Fragment ised: 
+
+ <xsl:template match="/doc">
+ <HTML><BODY><PRE>
+    <xsl:call-template name="format">
+    <xsl:with-param select="normalize-space(para)" name="txt" /> 
+     <xsl:with-param name="width">30</xsl:with-param> 
+     </xsl:call-template>
+  </PRE></BODY></HTML>
+  </xsl:template>
+
+
+-->
+  <xsl:template match="/body">
+    <body>
+      <xsl:call-template name="format">
+        <xsl:with-param select="source" name="txt" />
+        <xsl:with-param name="width">40</xsl:with-param>
+      </xsl:call-template>
+    </body>
+  </xsl:template>
+  <xsl:template name="format">
+    <xsl:param name="txt" />
+    <xsl:param name="width" />
+<!-- if there is still text left -->
+    <xsl:if test="$txt">
+      <xsl:variable name = "pretxt" select = "substring($txt,0, $width)" />
+      <xsl:choose>
+        <xsl:when test="contains($pretxt, '&#xA;')">
+          <xsl:value-of select="substring-before($pretxt, '&#xA;')"/>
+<xsl:text>&#xA;</xsl:text>
+          <xsl:call-template name="format">
+            <xsl:with-param name="txt" select="substring-after($txt,'&#xA;')"/>
+            <xsl:with-param select="$width" name="width" />
+          </xsl:call-template>
+        </xsl:when>
+        <xsl:otherwise>
+<!-- get the width at which to break-->
+          <xsl:variable name="real-width">
+            <xsl:call-template name="tune-width">
+              <xsl:with-param select="$txt" name="txt" />
+              <xsl:with-param select="$width" name="width" />
+              <xsl:with-param select="$width" name="def" />
+            </xsl:call-template>
+          </xsl:variable>
+<!-- output the first part of the broken string -->
+          <xsl:value-of select="substring($txt, 1, $real-width)" />
+<!-- output a newline -->
+<xsl:text>&#xA;</xsl:text>
+<!-- call itself with the remaining part of the text -->
+          <xsl:call-template name="format">
+            <xsl:with-param select="substring($txt,$real-width + 1)" name="txt" />
+            <xsl:with-param select="$width" name="width" />
+          </xsl:call-template>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:if>
+  </xsl:template>
+<!-- used by template "format", it calculates the width at the given def 
+       
+       It starts at def length and comes back till it finds a space -->
+  <xsl:template name="tune-width">
+    <xsl:param name="txt" />
+    <xsl:param name="width" />
+    <xsl:param name="def" />
+    <xsl:choose>
+      <xsl:when test="$width = 0">
+        <xsl:value-of select="$def" />
+      </xsl:when>
+      <xsl:when test="substring($txt, $width, 1 ) = ' '">
+        <xsl:value-of select="$width" />
+      </xsl:when>
+      <xsl:otherwise>
+<!-- otherwise need to tune again, trying with $width - 1 -->
+        <xsl:call-template name="tune-width">
+          <xsl:with-param select="$width - 1" name="width" />
+          <xsl:with-param select="$txt" name="txt" />
+          <xsl:with-param select="$def" name="def" />
+        </xsl:call-template>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/html/strip_namespaces.xsl b/src/site/src/documentation/skins/common/xslt/html/strip_namespaces.xsl
new file mode 100644
index 0000000..47dec6a
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/html/strip_namespaces.xsl
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<!-- FIXME: FOR-555. This might not be the best solution though, but it sure works -->
+  <xsl:template match="comment()|processing-instruction()">
+    <xsl:copy>
+      <xsl:apply-templates select="@*|*|text()|processing-instruction()|comment()"/>
+    </xsl:copy>
+  </xsl:template>
+<!-- End fixme FOR-555 -->
+  <xsl:template match="*">
+<!-- remove element prefix (if any) -->
+    <xsl:element name="{local-name()}">
+<!-- process attributes -->
+      <xsl:for-each select="@*">
+<!-- remove attribute prefix (if any) -->
+        <xsl:attribute name="{local-name()}">
+          <xsl:value-of select="."/>
+        </xsl:attribute>
+      </xsl:for-each>
+      <xsl:apply-templates/>
+    </xsl:element>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/html/tab-to-menu.xsl b/src/site/src/documentation/skins/common/xslt/html/tab-to-menu.xsl
new file mode 100644
index 0000000..257d291
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/html/tab-to-menu.xsl
@@ -0,0 +1,195 @@
+<?xml version="1.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.
+-->
+<!--
+This stylesheet generates 'tabs' at the top left of the screen.  Tabs are
+visual indicators that a certain subsection of the URI space is being browsed.
+For example, if we had tabs with paths:
+
+Tab1:  ''
+Tab2:  'community'
+Tab3:  'community/howto'
+Tab4:  'community/howto/xmlform/index.html'
+
+Then if the current path was 'community/howto/foo', Tab3 would be highlighted.
+The rule is: the tab with the longest path that forms a prefix of the current
+path is enabled.
+
+The output of this stylesheet is HTML of the form:
+    <div class="tab">
+      ...
+    </div>
+
+which is then merged by site-to-xhtml.xsl
+
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<!-- ================================================================ -->
+<!-- These templates SHOULD be overridden                             -->
+<!-- ================================================================ -->
+<!-- Called before first level 1 tag -->
+  <xsl:template name="pre-separator"></xsl:template>
+<!-- Called after last level 1 tag -->
+  <xsl:template name="post-separator"></xsl:template>
+<!-- Called between level 1 tags -->
+  <xsl:template name="separator">
+<xsl:text> | </xsl:text>
+  </xsl:template>
+<!-- Called before first level 2 tag -->
+  <xsl:template name="level2-pre-separator"></xsl:template>
+<!-- Called after last level 2 tag -->
+  <xsl:template name="level2-post-separator"></xsl:template>
+<!-- Called between level 2 tags -->
+  <xsl:template name="level2-separator">
+<xsl:text> | </xsl:text>
+  </xsl:template>
+<!--
+  Note: sub-stylesheets can't do apply-imports here, because it would choose
+  the 'tags' template and infinitely recurse. Hence call-template used instead.
+  -->
+<!-- Display a selected level 1 tab node -->
+  <xsl:template name="selected">
+    <xsl:call-template name="base-selected"/>
+  </xsl:template>
+<!-- Display an unselected level 1 tab node -->
+  <xsl:template name="not-selected">
+    <xsl:call-template name="base-not-selected"/>
+  </xsl:template>
+<!-- Display a selected second level tab node -->
+  <xsl:template name="level2-selected">
+    <xsl:call-template name="base-selected"/>
+  </xsl:template>
+<!-- Display an unselected second level tab node -->
+  <xsl:template name="level2-not-selected">
+    <xsl:call-template name="base-not-selected"/>
+  </xsl:template>
+<!-- ================================================================ -->
+<!-- These templates CAN be overridden                             -->
+<!-- ================================================================ -->
+  <xsl:template match="tabs">
+    <div class="tab">
+      <xsl:call-template name="base-tabs"/>
+    </div>
+  </xsl:template>
+<!-- ================================================================ -->
+<!-- These templates SHOULD NOT be overridden                         -->
+<!-- ================================================================ -->
+  <xsl:param name="path"/>
+  <xsl:include href="dotdots.xsl"/>
+  <xsl:include href="tabutils.xsl"/>
+<!-- NOTE: Xalan has a bug (race condition?) where sometimes $root is only half-evaluated -->
+  <xsl:variable name="root">
+    <xsl:call-template name="dotdots">
+      <xsl:with-param name="path" select="$path"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:variable name="skin-img-dir" select="concat(string($root), 'skin/images')"/>
+<!--
+    The longest path of any level 1 tab, whose path is a subset of the current URL.  Ie,
+    the path of the 'current' level 1 tab.
+  -->
+  <xsl:variable name="longest-dir">
+    <xsl:call-template name="longest-dir">
+      <xsl:with-param name="tabfile" select="/"/>
+    </xsl:call-template>
+  </xsl:variable>
+<!--
+    The longest path of any level 2 tab, whose path is a subset of the current URL.  Ie,
+    the path of the 'current' level 2 tab.
+  -->
+  <xsl:variable name="level2-longest-dir">
+    <xsl:call-template name="level2-longest-dir">
+      <xsl:with-param name="tabfile" select="/"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:variable name="matching-id">
+    <xsl:call-template name="matching-id"/>
+  </xsl:variable>
+<!-- Called from tabs, after it has written the outer 'div class=tabs' and
+  any other HTML -->
+  <xsl:template name="base-tabs">
+    <xsl:call-template name="pre-separator"/>
+    <xsl:for-each select="tab">
+      <xsl:if test="position()!=1">
+        <xsl:call-template name="separator"/>
+      </xsl:if>
+      <xsl:apply-templates select="." mode="level1"/>
+    </xsl:for-each>
+    <xsl:call-template name="post-separator"/>
+  </xsl:template>
+<!-- Called from tabs, after it has written the outer 'div class=tabs' and
+  any other HTML -->
+  <xsl:template name="level2tabs">
+    <xsl:call-template name="level2-pre-separator"/>
+    <xsl:for-each select="tab[@dir=$longest-dir]/tab|tab[@href=$longest-dir]/tab|tab[tab/@id=$matching-id]/tab">
+      <xsl:if test="position()!=1">
+        <xsl:call-template name="level2-separator"/>
+      </xsl:if>
+      <xsl:apply-templates select="." mode="level2"/>
+    </xsl:for-each>
+    <xsl:call-template name="level2-post-separator"/>
+  </xsl:template>
+  <xsl:template match="tab" mode="level1">
+    <xsl:choose>
+      <xsl:when test="@id and @id = $matching-id">
+        <xsl:call-template name="selected"/>
+      </xsl:when>
+      <xsl:when test="not(@id) and @dir = $longest-dir or @href = $longest-dir">
+        <xsl:call-template name="selected"/>
+      </xsl:when>
+      <xsl:when test="tab[@id = $matching-id]">
+        <xsl:call-template name="selected"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:call-template name="not-selected"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+  <xsl:template match="tab" mode="level2">
+    <xsl:choose>
+      <xsl:when test="@id and @id = $matching-id">
+        <xsl:call-template name="level2-selected"/>
+      </xsl:when>
+      <xsl:when test="@dir = $level2-longest-dir">
+        <xsl:call-template name="level2-selected"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:call-template name="level2-not-selected"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+<!-- Called from 'selected' -->
+  <xsl:template name="base-selected"><a class="selected">
+    <xsl:attribute name="href">
+      <xsl:call-template name="calculate-tab-href">
+        <xsl:with-param name="tab" select="."/>
+        <xsl:with-param name="path" select="$path"/>
+      </xsl:call-template>
+    </xsl:attribute>
+    <xsl:value-of select="@label"/></a>
+  </xsl:template>
+<!-- Called from 'not-selected' -->
+  <xsl:template name="base-not-selected"><a class="unselected">
+    <xsl:attribute name="href">
+      <xsl:call-template name="calculate-tab-href">
+        <xsl:with-param name="tab" select="."/>
+        <xsl:with-param name="path" select="$path"/>
+      </xsl:call-template>
+    </xsl:attribute>
+    <xsl:value-of select="@label"/></a>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/html/tabutils.xsl b/src/site/src/documentation/skins/common/xslt/html/tabutils.xsl
new file mode 100644
index 0000000..0caaaf4
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/html/tabutils.xsl
@@ -0,0 +1,98 @@
+<?xml version="1.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.
+-->
+<!--
+Some callable templates useful when dealing with tab paths.  Mostly used in
+tab-to-menu.xsl
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:param name="site-file" select="'cocoon://abs-menulinks'"/>
+  <xsl:variable name="site" select="document($site-file)"/>
+<!-- Given the current path and a tabs.xml entry, returns a relative path to
+  the specified tab's URL.  When rendering a set of tabs, this template will be
+  called once per tab.
+  -->
+  <xsl:template name="calculate-tab-href">
+    <xsl:param name="dir_index" select="'index.html'"/>
+    <xsl:param name="tab"/>
+<!-- current 'tab' node -->
+    <xsl:param name="path" select="$path"/>
+    <xsl:if test="starts-with($tab/@href, 'http')">
+<!-- Absolute URL -->
+      <xsl:value-of select="$tab/@href"/>
+    </xsl:if>
+    <xsl:if test="not(starts-with($tab/@href, 'http'))">
+<!-- Root-relative path -->
+      <xsl:variable name="backpath">
+        <xsl:call-template name="dotdots">
+          <xsl:with-param name="path" select="$path"/>
+        </xsl:call-template>
+<xsl:text>/</xsl:text>
+        <xsl:value-of select="$tab/@dir | $tab/@href"/>
+<!-- If we obviously have a directory, add /index.html -->
+        <xsl:if test="$tab/@dir or substring($tab/@href, string-length($tab/@href),
+          string-length($tab/@href)) = '/'">
+<xsl:text>/</xsl:text>
+          <xsl:if test="$tab/@indexfile">
+            <xsl:value-of select="$tab/@indexfile"/>
+          </xsl:if>
+          <xsl:if test="not(@indexfile)">
+            <xsl:value-of select="$dir_index"/>
+          </xsl:if>
+        </xsl:if>
+      </xsl:variable>
+      <xsl:value-of
+        select="translate(normalize-space(translate($backpath, ' /', '/ ')), ' /', '/ ')"/>
+<!-- Link to backpath, normalizing slashes -->
+    </xsl:if>
+  </xsl:template>
+<!--
+    The id of any tab, whose path is a subset of the current URL.  Ie,
+    the path of the 'current' tab.
+  -->
+  <xsl:template name="matching-id" xmlns:l="http://apache.org/forrest/linkmap/1.0">
+    <xsl:value-of select="$site//*[starts-with(@href, $path)]/@tab"/>
+  </xsl:template>
+<!--
+    The longest path of any level 1 tab, whose path is a subset of the current URL.  Ie,
+    the path of the 'current' tab.
+  -->
+  <xsl:template name="longest-dir">
+    <xsl:param name="tabfile"/>
+    <xsl:for-each select="$tabfile/tabs/tab[starts-with($path, @dir|@href)]">
+      <xsl:sort select="string-length(@dir|@href)"
+        data-type="number" order="descending"/>
+      <xsl:if test="position()=1">
+        <xsl:value-of select="@dir|@href"/>
+      </xsl:if>
+    </xsl:for-each>
+  </xsl:template>
+<!--
+    The longest path of any level 2 tab, whose path is a subset of the current URL.  Ie,
+    the path of the 'current' tab.
+  -->
+  <xsl:template name="level2-longest-dir">
+    <xsl:param name="tabfile"/>
+    <xsl:for-each select="$tabfile/tabs/tab/tab[starts-with($path, @dir|@href)]">
+      <xsl:sort select="string-length(@dir|@href)"
+        data-type="number" order="descending"/>
+      <xsl:if test="position()=1">
+        <xsl:value-of select="@dir|@href"/>
+      </xsl:if>
+    </xsl:for-each>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/common/xslt/svg/document-to-svg.xsl b/src/site/src/documentation/skins/common/xslt/svg/document-to-svg.xsl
new file mode 100644
index 0000000..08ca5ba
--- /dev/null
+++ b/src/site/src/documentation/skins/common/xslt/svg/document-to-svg.xsl
@@ -0,0 +1,45 @@
+<?xml version="1.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.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
+  <xsl:output method="xml" media-type="image/svg" omit-xml-declaration="yes" indent="yes"/>
+<!-- the skinconf file -->
+  <xsl:param name="config-file"/>
+  <xsl:variable name="config" select="document($config-file)/skinconfig"/>
+<!-- Get the section depth to use when generating the minitoc (default is 2) -->
+  <xsl:variable name="toc-max-depth" select="number($config/toc/@max-depth)"/>
+  <xsl:param name="numbersections" select="'true'"/>
+<!-- Section depth at which we stop numbering and just indent -->
+  <xsl:param name="numbering-max-depth" select="'3'"/>
+  <xsl:param name="ctxbasedir" select="."/>
+  <xsl:param name="xmlbasedir"/>
+  <xsl:template match="/">
+    <svg width="1305" height="1468" xmlns="http://www.w3.org/2000/svg">
+      <g transform="translate(0 0)">
+        <xsl:apply-templates/>
+      </g>
+    </svg>
+  </xsl:template>
+  <xsl:template match="document">
+    <text x="00px" y="30px" style="font-size:20;">
+      <xsl:value-of select="header/title"/>
+    </text>
+    <text x="0px" y="50px" style="font-size:12;">
+      <xsl:apply-templates/>
+    </text>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/lucene/css/basic.css b/src/site/src/documentation/skins/lucene/css/basic.css
new file mode 100644
index 0000000..4ed58b9
--- /dev/null
+++ b/src/site/src/documentation/skins/lucene/css/basic.css
@@ -0,0 +1,166 @@
+/*
+* 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.
+*/
+/**
+ * General
+ */
+
+img { border: 0; }
+
+#content table {
+  border: 0;
+  width: 100%;
+}
+/*Hack to get IE to render the table at 100%*/
+* html #content table { margin-left: -3px; }
+
+#content th,
+#content td {
+  margin: 0;
+  padding: 0;
+  vertical-align: top;
+}
+
+.clearboth {
+  clear: both;
+}
+
+.note, .warning, .fixme {
+  border: solid black 1px;
+  margin: 1em 3em;
+}
+
+.note .label {
+  background: #369;
+  color: white;
+  font-weight: bold;
+  padding: 5px 10px;
+}
+.note .content {
+  background: #F0F0FF;
+  color: black;
+  line-height: 120%;
+  font-size: 90%;
+  padding: 5px 10px;
+}
+.warning .label {
+  background: #C00;
+  color: white;
+  font-weight: bold;
+  padding: 5px 10px;
+}
+.warning .content {
+  background: #FFF0F0;
+  color: black;
+  line-height: 120%;
+  font-size: 90%;
+  padding: 5px 10px;
+}
+.fixme .label {
+  background: #C6C600;
+  color: black;
+  font-weight: bold;
+  padding: 5px 10px;
+}
+.fixme .content {
+  padding: 5px 10px;
+}
+
+/**
+ * Typography
+ */
+
+body {
+  font-family: verdana, "Trebuchet MS", arial, helvetica, sans-serif;
+  font-size: 100%;
+}
+
+#content {
+  font-family: Georgia, Palatino, Times, serif;
+  font-size: 95%;
+}
+#tabs {
+  font-size: 70%;
+}
+#menu {
+  font-size: 80%;
+}
+#footer {
+  font-size: 70%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  font-family: "Trebuchet MS", verdana, arial, helvetica, sans-serif;
+  font-weight: bold;
+  margin-top: 1em;
+  margin-bottom: .5em;
+}
+
+h1 {
+    margin-top: 0;
+    margin-bottom: 1em;
+  font-size: 1.4em;
+}
+#content h1 {
+  font-size: 160%;
+  margin-bottom: .5em;
+}
+#menu h1 {
+  margin: 0;
+  padding: 10px;
+  background: #336699;
+  color: white;
+}
+h2 { font-size: 120%; }
+h3 { font-size: 100%; }
+h4 { font-size: 90%; }
+h5 { font-size: 80%; }
+h6 { font-size: 75%; }
+
+p {
+  line-height: 120%;
+  text-align: left;
+  margin-top: .5em;
+  margin-bottom: 1em;
+}
+
+#content li,
+#content th,
+#content td,
+#content li ul,
+#content li ol{
+  margin-top: .5em;
+  margin-bottom: .5em;
+}
+
+
+#content li li,
+#minitoc-area li{
+  margin-top: 0em;
+  margin-bottom: 0em;
+}
+
+#content .attribution {
+  text-align: right;
+  font-style: italic;
+  font-size: 85%;
+  margin-top: 1em;
+}
+
+.codefrag {
+  font-family: "Courier New", Courier, monospace;
+  font-size: 110%;
+}
diff --git a/src/site/src/documentation/skins/lucene/css/print.css b/src/site/src/documentation/skins/lucene/css/print.css
new file mode 100644
index 0000000..8916b9f
--- /dev/null
+++ b/src/site/src/documentation/skins/lucene/css/print.css
@@ -0,0 +1,54 @@
+/*
+* 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.
+*/
+body {
+  font-family: Georgia, Palatino, serif;
+  font-size: 12pt;
+  background: white;
+}
+
+#tabs,
+#menu,
+#content .toc {
+  display: none;
+}
+
+#content {
+  width: auto;
+  padding: 0;
+  float: none !important;
+  color: black;
+  background: inherit;
+}
+
+a:link, a:visited {
+  color: #336699;
+  background: inherit;
+  text-decoration: underline;
+}
+
+#top .logo {
+  padding: 0;
+  margin: 0 0 2em 0;
+}
+
+#footer {
+  margin-top: 4em;
+}
+
+acronym {
+  border: 0;
+}
diff --git a/src/site/src/documentation/skins/lucene/css/profile.css.xslt b/src/site/src/documentation/skins/lucene/css/profile.css.xslt
new file mode 100644
index 0000000..a1dcb23
--- /dev/null
+++ b/src/site/src/documentation/skins/lucene/css/profile.css.xslt
@@ -0,0 +1,182 @@
+<?xml version="1.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.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:import href="../../common/css/forrest.css.xslt"/>
+<!-- xsl:output is not used by Forrest but makes it possible to debug the 
+       stylesheet in standalone editors -->
+  <xsl:output method = "text"  omit-xml-declaration="yes"  />
+<!-- ==================== main block colors ============================ -->
+  <xsl:template match="color[@name='header']">
+#top          { background-color: <xsl:value-of select="@value"/>;}  
+</xsl:template>
+  <xsl:template match="color[@name='tab-selected']"> 
+#top .header .current { background-color: <xsl:value-of select="@value"/>;} 
+#top .header .current a:link {  color: <xsl:value-of select="@link"/>;  }
+#top .header .current a:visited { color: <xsl:value-of select="@vlink"/>; }
+#top .header .current a:hover { color: <xsl:value-of select="@hlink"/>; }
+</xsl:template>
+  <xsl:template match="color[@name='tab-unselected']"> 
+#tabs li      { background-color: <xsl:value-of select="@value"/> ;} 
+#tabs li a:link {  color: <xsl:value-of select="@link"/>;  }
+#tabs li a:visited { color: <xsl:value-of select="@vlink"/>; }
+#tabs li a:hover { color: <xsl:value-of select="@hlink"/>; }
+</xsl:template>
+  <xsl:template match="color[@name='subtab-selected']">
+#level2tabs a.selected      { background-color: <xsl:value-of select="@value"/> ;} 
+#level2tabs a:link {  color: <xsl:value-of select="@link"/>;  }
+#level2tabs a:visited { color: <xsl:value-of select="@vlink"/>; }
+#level2tabs a:hover { color: <xsl:value-of select="@hlink"/>; }
+</xsl:template>
+  <xsl:template match="color[@name='subtab-unselected']">
+#level2tabs { background-color: <xsl:value-of select="@value"/>;}
+#level2tabs a.unselected:link {  color: <xsl:value-of select="@link"/>;  }
+#level2tabs a.unselected:visited { color: <xsl:value-of select="@vlink"/>; }
+#level2tabs a.unselected:hover { color: <xsl:value-of select="@hlink"/>; }
+</xsl:template>
+  <xsl:template match="color[@name='heading']">
+.heading { background-color: <xsl:value-of select="@value"/>;} 
+</xsl:template>
+  <xsl:template match="color[@name='subheading']">
+.boxed { background-color: <xsl:value-of select="@value"/>;} 
+.underlined_5 	{border-bottom: solid 5px <xsl:value-of select="@value"/>;}
+.underlined_10 	{border-bottom: solid 10px <xsl:value-of select="@value"/>;}
+table caption { 
+background-color: <xsl:value-of select="@value"/>; 
+color: <xsl:value-of select="@font"/>;
+}
+</xsl:template>
+  <xsl:template match="color[@name='feedback']">    
+#feedback {
+color: <xsl:value-of select="@font"/>;
+background: <xsl:value-of select="@value"/>;
+text-align: <xsl:value-of select="@align"/>;
+}
+#feedback #feedbackto {
+color: <xsl:value-of select="@font"/>;
+}   
+</xsl:template>
+  <xsl:template match="color[@name='breadtrail']">
+#main .breadtrail {
+background: <xsl:value-of select="@value"/>; 
+color: <xsl:value-of select="@font"/>;
+}
+#main .breadtrail a:link {  color: <xsl:value-of select="@link"/>;  }
+#main .breadtrail a:visited { color: <xsl:value-of select="@vlink"/>; }
+#main .breadtrail a:hover { color: <xsl:value-of select="@hlink"/>; }
+#top .breadtrail {
+background: <xsl:value-of select="@value"/>; 
+color: <xsl:value-of select="@font"/>;
+}
+#top .breadtrail a:link {  color: <xsl:value-of select="@link"/>;  }
+#top .breadtrail a:visited { color: <xsl:value-of select="@vlink"/>; }
+#top .breadtrail a:hover { color: <xsl:value-of select="@hlink"/>; }    
+</xsl:template>
+<!--Fix for other (old) profiles-->
+  <xsl:template match="color[@name='navstrip']">
+#publishedStrip { 
+color: <xsl:value-of select="@font"/>;
+background: <xsl:value-of select="@value"/>; 
+}
+</xsl:template>
+<!--has to go after the nav-strip (no 'navstrip')-->
+  <xsl:template match="color[@name='published']">
+#publishedStrip { 
+color: <xsl:value-of select="@font"/>;
+background: <xsl:value-of select="@value"/>; 
+}
+</xsl:template>
+  <xsl:template match="color[@name='toolbox']">
+#menu .menupagetitle  { background-color: <xsl:value-of select="@value"/>;
+  color: <xsl:value-of select="@font"/>;}
+</xsl:template>
+  <xsl:template match="color[@name='border']">
+#menu           { border-color: <xsl:value-of select="@value"/>;}
+#menu .menupagetitle  { border-color: <xsl:value-of select="@value"/>;}
+#menu .menupageitemgroup  { border-color: <xsl:value-of select="@value"/>;}
+</xsl:template>
+  <xsl:template match="color[@name='menu']">
+#menu      { background-color: <xsl:value-of select="@value"/>;} 
+#menu  {  color: <xsl:value-of select="@font"/>;} 
+#menu a:link {  color: <xsl:value-of select="@link"/>;} 
+#menu a:visited {  color: <xsl:value-of select="@vlink"/>;} 
+#menu a:hover {  
+background-color: <xsl:value-of select="@value"/>;
+color: <xsl:value-of select="@hlink"/>;} 
+</xsl:template>
+  <xsl:template match="color[@name='dialog']"> 
+#menu .menupageitemgroup     { 
+background-color: <xsl:value-of select="@value"/>;
+}
+#menu .menupageitem {
+color: <xsl:value-of select="@font"/>;
+} 
+#menu .menupageitem a:link {  color: <xsl:value-of select="@link"/>;} 
+#menu .menupageitem a:visited {  color: <xsl:value-of select="@vlink"/>;} 
+#menu .menupageitem a:hover {  
+background-color: <xsl:value-of select="@value"/>;
+color: <xsl:value-of select="@hlink"/>;
+}
+</xsl:template>
+  <xsl:template match="color[@name='menuheading']">
+#menu h1 {
+color: <xsl:value-of select="@font"/>;
+background-color: <xsl:value-of select="@value"/>;
+}   
+</xsl:template>
+  <xsl:template match="color[@name='searchbox']"> 
+#top .searchbox { 
+background-color: <xsl:value-of select="@value"/> ;
+color: <xsl:value-of select="@font"/>; 
+} 
+</xsl:template>
+  <xsl:template match="color[@name='body']">
+body{ 
+background-color: <xsl:value-of select="@value"/>;
+color: <xsl:value-of select="@font"/>;
+} 
+a:link { color:<xsl:value-of select="@link"/>} 
+a:visited { color:<xsl:value-of select="@vlink"/>} 
+a:hover { color:<xsl:value-of select="@hlink"/>} 
+
+</xsl:template>
+  <xsl:template match="color[@name='footer']"> 
+#footer       { background-color: <xsl:value-of select="@value"/>;} 
+</xsl:template>
+<!-- ==================== other colors ============================ -->
+  <xsl:template match="color[@name='highlight']"> 
+.highlight        { background-color: <xsl:value-of select="@value"/>;} 
+</xsl:template>
+  <xsl:template match="color[@name='fixme']"> 
+.fixme        { border-color: <xsl:value-of select="@value"/>;} 
+</xsl:template>
+  <xsl:template match="color[@name='note']"> 
+.note         { border-color: <xsl:value-of select="@value"/>;} 
+</xsl:template>
+  <xsl:template match="color[@name='warning']"> 
+.warning         { border-color: <xsl:value-of select="@value"/>;} 
+</xsl:template>
+  <xsl:template match="color[@name='code']"> 
+.code         { border-color: <xsl:value-of select="@value"/>;} 
+</xsl:template>
+  <xsl:template match="color[@name='table']"> 
+.ForrestTable      { background-color: <xsl:value-of select="@value"/>;} 
+</xsl:template>
+  <xsl:template match="color[@name='table-cell']"> 
+.ForrestTable td   { background-color: <xsl:value-of select="@value"/>;} 
+</xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/lucene/css/screen.css b/src/site/src/documentation/skins/lucene/css/screen.css
new file mode 100644
index 0000000..aa8c457
--- /dev/null
+++ b/src/site/src/documentation/skins/lucene/css/screen.css
@@ -0,0 +1,587 @@
+/*
+* 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.
+*/
+body {  margin: 0px 0px 0px 0px; font-family: Verdana, Helvetica, sans-serif; }
+
+h1     { font-size : 160%; margin: 0px 0px 0px 0px;  padding: 0px; }
+h2     { font-size : 140%; margin: 1em 0px 0.8em 0px; padding: 0px; font-weight : bold;}
+h3     { font-size : 130%; margin: 0.8em 0px 0px 0px; padding: 0px; font-weight : bold; }
+.h3 { margin: 22px 0px 3px 0px; }
+h4     { font-size : 120%; margin: 0.7em 0px 0px 0px; padding: 0px; font-weight : normal; text-align: left; }
+.h4 { margin: 18px 0px 0px 0px; }
+h4.faq { font-size : 120%; margin: 18px 0px 0px 0px; padding: 0px; font-weight : bold;   text-align: left; }
+h5     { font-size : 100%; margin: 14px 0px 0px 0px; padding: 0px; font-weight : normal; text-align: left; }
+
+/**
+* table
+*/
+table .title { background-color: #000000; }
+.ForrestTable         {
+    color: #ffffff;
+    background-color: #7099C5;
+    width: 100%;
+    font-size : 100%;
+    empty-cells: show;
+}
+table caption {
+    padding-left: 5px;
+    color: white;
+    text-align: left;
+    font-weight: bold;
+    background-color: #000000;
+}
+.ForrestTable td {
+    color: black;
+    background-color: #f0f0ff;
+}
+.ForrestTable th { text-align: center; }
+/**
+ * Page Header
+ */
+
+#top {
+    position: relative;
+    float: left;
+    width: 100%;
+    background: #294563; /* if you want a background in the header, put it here */
+}
+
+#top .breadtrail {
+    background: #CFDCED;
+    color: black;
+    border-bottom: solid 1px white;
+    padding: 3px 10px;
+    font-size: 75%;
+}
+#top .breadtrail a { color: black; }
+
+#top .header {
+    float: left;
+    width: 100%;
+    background: url("images/header_white_line.gif") repeat-x bottom;
+}
+
+#top .grouplogo {
+    padding: 7px 0 10px 10px;
+    float: left;
+    text-align: left;
+}
+#top .projectlogo {
+    padding: 7px 0 10px 10px;
+    float: left;
+    width: 33%;
+    text-align: right;
+}
+#top .projectlogoA1 {
+    padding: 7px 0 10px 10px;
+    float: right;
+}
+html>body #top .searchbox {
+    bottom: 0px;
+}
+#top .searchbox {
+    position: absolute;
+    right: 10px;
+    height: 42px;
+    font-size: 70%;
+    white-space: nowrap;
+    text-align: right;
+    color: white;
+    background-color: #000000;
+    z-index:0;
+    background-image: url(images/rc-t-l-5-1header-2searchbox-3searchbox.png);
+    background-repeat: no-repeat;
+    background-position: top left;
+    bottom: -1px; /* compensate for IE rendering issue */
+}
+
+#top .searchbox form {
+    padding: 5px 10px;
+    margin: 0;
+}
+#top .searchbox p {
+    padding: 0 0 2px 0;
+    margin: 0;
+}
+#top .searchbox input {
+    font-size: 100%;
+}
+
+#tabs {
+    clear: both;
+    padding-left: 10px;
+    margin: 0;
+    list-style: none;
+}
+/*    background: #CFDCED url("images/tab-right.gif") no-repeat right top;*/
+#tabs li {
+    float: left;
+    background-image: url(images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png);
+    background-repeat: no-repeat;
+    background-position: top right;
+    background-color: #000000;
+    margin: 0 3px 0 0;
+    padding: 0;
+}
+
+/*background: url("images/tab-left.gif") no-repeat left top;*/
+#tabs li a {
+    float: left;
+    display: block;
+    font-family: verdana, arial, sans-serif;
+    text-decoration: none;
+    color: black;
+    white-space: nowrap;
+    background-image: url(images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png);
+    background-repeat: no-repeat;
+    background-position: top left;
+    padding: 5px 15px 4px;
+    width: .1em; /* IE/Win fix */
+}
+
+#tabs li a:hover {
+   
+    cursor: pointer;
+    text-decoration:underline;
+}
+
+#tabs > li a { width: auto; } /* Rest of IE/Win fix */
+
+/* Commented Backslash Hack hides rule from IE5-Mac \*/
+#tabs a { float: none; }
+/* End IE5-Mac hack */
+
+#top .header .current {
+    background-color: #4C6C8F;
+    background-image: url(images/rc-t-r-5-1header-2tab-selected-3tab-selected.png);
+    background-repeat: no-repeat;
+    background-position: top right;
+}
+#top .header .current a {
+    font-weight: bold;
+    padding-bottom: 5px;
+    color: white;
+    background-image: url(images/rc-t-l-5-1header-2tab-selected-3tab-selected.png);
+    background-repeat: no-repeat;
+    background-position: top left;
+}
+#publishedStrip {
+    padding-right: 10px;
+    padding-left: 20px;
+    padding-top: 3px;
+    padding-bottom:3px;
+    color: #ffffff;
+    font-size : 60%;
+    font-weight: bold;
+    background-color: #4C6C8F;
+    text-align:right;
+}
+
+#level2tabs {
+margin: 0;
+float:left;
+position:relative;
+
+}
+
+
+
+#level2tabs  a:hover {
+   
+    cursor: pointer;
+    text-decoration:underline;
+    
+}
+
+#level2tabs  a{
+   
+    cursor: pointer;
+    text-decoration:none;
+    background-image: url('images/chapter.gif');
+    background-repeat: no-repeat;
+    background-position: center left;
+    padding-left: 6px;
+    margin-left: 6px;
+}
+
+/*
+*    border-top: solid #4C6C8F 15px;
+*/
+#main {
+    position: relative;
+    background: white;
+    clear:both;
+}
+#main .breadtrail {
+    clear:both;
+    position: relative;
+    background: #CFDCED;
+    color: black;
+    border-bottom: solid 1px black;
+    border-top: solid 1px black;
+    padding: 0px 180px;
+    font-size: 75%;
+    z-index:10;
+}
+/**
+* Round corner
+*/
+#roundtop {
+    background-image: url(images/rc-t-r-15-1body-2menu-3menu.png);
+    background-repeat: no-repeat;
+    background-position: top right;
+}
+
+#roundbottom {
+    background-image: url(images/rc-b-r-15-1body-2menu-3menu.png);
+    background-repeat: no-repeat;
+    background-position: top right;
+}
+
+img.corner {
+   width: 15px;
+   height: 15px;
+   border: none;
+   display: block !important;
+}
+
+.roundtopsmall {
+    background-image: url(images/rc-t-r-5-1header-2searchbox-3searchbox.png);
+    background-repeat: no-repeat;
+    background-position: top right;
+}
+
+#roundbottomsmall {
+    background-image: url(images/rc-b-r-5-1header-2tab-selected-3tab-selected.png);
+    background-repeat: no-repeat;
+    background-position: top right;
+}
+
+img.cornersmall {
+   width: 5px;
+   height: 5px;
+   border: none;
+   display: block !important;
+}
+/**
+ * Side menu
+ */
+#menu a {  font-weight: normal; text-decoration: none;}
+#menu a:visited {  font-weight: normal; }
+#menu a:active {  font-weight: normal; }
+#menu a:hover {  font-weight: normal;  text-decoration:underline;}
+
+#menuarea { width:10em;}
+#menu {
+    position: relative;
+    float: left;
+    width: 160px;
+    padding-top: 0px;
+    top:-18px;
+    left:10px;
+    z-index: 20;
+    background-color: #f90;
+    font-size : 70%;
+    
+}
+
+.menutitle {
+        cursor:pointer;
+        padding: 3px 12px;
+        margin-left: 10px;
+        background-image: url('images/chapter.gif');
+        background-repeat: no-repeat;
+        background-position: center left;
+        font-weight : bold;
+
+        
+}
+
+.menutitle:hover{text-decoration:underline;cursor: pointer;}
+
+#menu .menuitemgroup {
+        margin: 0px 0px 6px 8px;
+        padding: 0px;
+        font-weight : bold; }
+
+#menu .selectedmenuitemgroup{
+        margin: 0px 0px 0px 8px;
+        padding: 0px;
+        font-weight : normal; 
+       
+        }
+
+#menu .menuitem {
+        padding: 2px 0px 1px 13px;
+        background-image: url('images/page.gif');
+        background-repeat: no-repeat;
+        background-position: center left;
+        font-weight : normal;
+        margin-left: 10px;
+}
+
+#menu .menupage {
+        margin: 2px 0px 1px 10px;
+        padding: 0px 3px 0px 12px;
+        background-image: url('images/page.gif');
+        background-repeat: no-repeat;
+        background-position: center left;
+        font-style : normal;
+}
+#menu .menupagetitle {
+        padding: 0px 0px 0px 1px;
+        font-style : normal;
+        border-style: solid;
+        border-width: 1px;
+        margin-right: 10px;
+         
+}
+#menu .menupageitemgroup {
+        padding: 3px 0px 4px 6px;
+        font-style : normal;
+        border-bottom: 1px solid ;
+        border-left: 1px solid ;
+        border-right: 1px solid ;
+        margin-right: 10px;
+}
+#menu .menupageitem {
+        font-style : normal;
+        font-weight : normal;
+        border-width: 0px;
+        font-size : 90%;
+}
+#menu #credit {
+    text-align: center;
+}
+#menu #credit2 {
+    text-align: center;
+    padding: 3px 3px 3px 3px;
+    background-color: #ffffff;
+}
+#menu .searchbox {
+    text-align: center;
+}
+#menu .searchbox form {
+    padding: 3px 3px;
+    margin: 0;
+}
+#menu .searchbox input {
+    font-size: 100%;
+}
+
+#content {
+    padding: 20px 20px 20px 180px;
+    margin: 0;
+    font : small Verdana, Helvetica, sans-serif;
+    font-size : 80%;
+}
+
+#content ul {
+    margin: 0;
+    padding: 0 25px;
+}
+#content li {
+    padding: 0 5px;
+}
+#feedback {
+    color: black;
+    background: #CFDCED;
+    text-align:center;
+    margin-top: 5px;
+}
+#feedback #feedbackto {
+    font-size: 90%;
+    color: black;
+}
+#footer {
+    clear: both;
+    position: relative; /* IE bugfix (http://www.dracos.co.uk/web/css/ie6floatbug/) */
+    width: 100%;
+    background: #CFDCED;
+    border-top: solid 1px #4C6C8F;
+    color: black;
+}
+#footer .copyright {
+    position: relative; /* IE bugfix cont'd */
+    padding: 5px;
+    margin: 0;
+    width: 45%;
+}
+#footer .lastmodified {
+    position: relative; /* IE bugfix cont'd */
+    float: right;
+    width: 45%;
+    padding: 5px;
+    margin: 0;
+    text-align: right;
+}
+#footer a { color: white; }
+
+#footer #logos {
+    text-align: left;
+}
+
+
+/**
+ * Misc Styles
+ */
+
+acronym { cursor: help; }
+.boxed      { background-color: #a5b6c6;}
+.underlined_5     {border-bottom: solid 5px #4C6C8F;}
+.underlined_10     {border-bottom: solid 10px #4C6C8F;}
+/* ==================== snail trail ============================ */
+
+.trail {
+  position: relative; /* IE bugfix cont'd */
+  font-size: 70%;
+  text-align: right;
+  float: right;
+  margin: -10px 5px 0px 5px;
+  padding: 0;
+}
+
+#motd-area {
+    position: relative; /* IE bugfix cont'd */
+    float: right;
+    width: 35%;
+    background-color: #f0f0ff;
+    border-top: solid 1px #4C6C8F;
+    border-bottom: solid 1px #4C6C8F;
+    margin-bottom: 15px;
+    margin-left: 15px;
+    margin-right: 10%;
+    padding-bottom: 5px;
+    padding-top: 5px;
+}
+
+#minitoc-area {
+    border-top: solid 1px #4C6C8F;
+    border-bottom: solid 1px #4C6C8F;
+    margin: 15px 10% 5px 15px;
+   /* margin-bottom: 15px;
+    margin-left: 15px;
+    margin-right: 10%;*/
+    padding-bottom: 7px;
+    padding-top: 5px;
+}
+.minitoc {
+    list-style-image: url('images/current.gif');
+    font-weight: normal;
+}
+
+li p {
+    margin: 0;
+    padding: 0;
+}
+
+.pdflink {
+    position: relative; /* IE bugfix cont'd */
+    float: right;
+    margin: 0px 5px;
+    padding: 0;
+}
+.pdflink br {
+    margin-top: -10px;
+    padding-left: 1px;
+}
+.pdflink a {
+    display: block;
+    font-size: 70%;
+    text-align: center;
+    margin: 0;
+    padding: 0;
+}
+
+.pdflink img {
+    display: block;
+    height: 16px;
+    width: 16px;
+}
+.xmllink {
+    position: relative; /* IE bugfix cont'd */
+    float: right;
+    margin: 0px 5px;
+    padding: 0;
+}
+.xmllink br {
+    margin-top: -10px;
+    padding-left: 1px;
+}
+.xmllink a {
+    display: block;
+    font-size: 70%;
+    text-align: center;
+    margin: 0;
+    padding: 0;
+}
+
+.xmllink img {
+    display: block;
+    height: 16px;
+    width: 16px;
+}
+.podlink {
+    position: relative; /* IE bugfix cont'd */
+    float: right;
+    margin: 0px 5px;
+    padding: 0;
+}
+.podlink br {
+    margin-top: -10px;
+    padding-left: 1px;
+}
+.podlink a {
+    display: block;
+    font-size: 70%;
+    text-align: center;
+    margin: 0;
+    padding: 0;
+}
+
+.podlink img {
+    display: block;
+    height: 16px;
+    width: 16px;
+}
+
+.printlink {
+    position: relative; /* IE bugfix cont'd */
+    float: right;
+}
+.printlink br {
+    margin-top: -10px;
+    padding-left: 1px;
+}
+.printlink a {
+    display: block;
+    font-size: 70%;
+    text-align: center;
+    margin: 0;
+    padding: 0;
+}
+.printlink img {
+    display: block;
+    height: 16px;
+    width: 16px;
+}
+
+p.instruction {
+  display: list-item;
+  list-style-image: url('../images/instruction_arrow.png');
+  list-style-position: outside;
+  margin-left: 2em;
+} 
diff --git a/src/site/src/documentation/skins/lucene/note.txt b/src/site/src/documentation/skins/lucene/note.txt
new file mode 100644
index 0000000..d34c8db
--- /dev/null
+++ b/src/site/src/documentation/skins/lucene/note.txt
@@ -0,0 +1,50 @@
+Notes for developer:
+
+--Legend-------------------
+TODO -> blocker
+DONE -> blocker
+ToDo -> enhancement bug
+done -> enhancement bug
+
+--Issues-------------------
+- the corner images should be rendered through svg with the header color.
+-> DONE 
+-> ToDo: get rid of the images and use only divs!
+
+- the menu points should be displayed "better". 
+-> DONE
+-- Use the krysalis-site menu approach for the overall menu display.
+-> DONE
+-- Use the old lenya innermenu approch to further enhance the menu .
+-> DONE
+
+- the content area needs some attention.
+-> DONE
+-- introduce the heading scheme from krysalis (<headings type="clean|box|underlined"/>)
+-> DONE 
+-> ToDo: make box with round corners
+-> done: make underlined with variable border height
+-> ToDo: make underline with bottom round corner
+-- introduce the toc for each html-page
+-> DONE
+-- introduce the external-link-images.
+-> DONE
+
+- the publish note should be where now only a border is. 
+Like <div id="published"/>
+-> DONE
+, but make it configurable.
+-> DONE
+- footer needs some attention
+-> DONE
+-- the footer do not have the color profile! Enable it!
+-> DONE
+-- the footer should as well contain a feedback link. 
+See http://issues.apache.org/eyebrowse/ReadMsg?listName=forrest-user@xml.apache.org&msgNo=71
+-> DONE
+
+- introduce credits alternativ location
+-> DONE
+
+- border for published / breadtrail / menu /tab divs 
+-> ToDo
\ No newline at end of file
diff --git a/src/site/src/documentation/skins/lucene/skinconf.xsl b/src/site/src/documentation/skins/lucene/skinconf.xsl
new file mode 100644
index 0000000..2f8df12
--- /dev/null
+++ b/src/site/src/documentation/skins/lucene/skinconf.xsl
@@ -0,0 +1,137 @@
+<?xml version="1.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.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:template match="skinconfig">
+    <xsl:if test="not(colors)">
+      <colors>
+<!-- Lenya -->
+        <color name="header" value="#ffffff"/>
+        <color name="tab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
+        <color name="tab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
+        <color name="subtab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
+        <color name="subtab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
+        <color name="heading" value="#E5E4D9"/>
+        <color name="subheading" value="#E5E4D9"/>
+        <color name="published" value="#4C6C8F" font="#FFFFFF"/>
+        <color name="feedback" value="#4C6C8F" font="#FFFFFF" align="center"/>
+        <color name="navstrip" value="#E5E4D9" font="#000000"/>
+        <color name="toolbox" value="#CFDCED" font="#000000"/>
+        <color name="border" value="#999999"/>
+        <color name="menu" value="#4C6C8F" font="#ffffff" link="#ffffff" vlink="#ffffff" hlink="#ffffff"  />
+        <color name="menuheading" value="#cfdced" font="#000000" />
+        <color name="searchbox" value="#E5E4D9" font="#000000"/>
+        <color name="dialog" value="#E5E4D9" font="#000000"/>
+        <color name="body" value="#ffffff" />
+        <color name="table" value="#ccc"/>
+        <color name="table-cell" value="#ffffff"/>
+        <color name="highlight" value="#ffff00"/>
+        <color name="fixme" value="#cc6600"/>
+        <color name="note" value="#006699"/>
+        <color name="warning" value="#990000"/>
+        <color name="code" value="#003366"/>
+        <color name="footer" value="#E5E4D9"/>
+      </colors>
+    </xsl:if>
+    <xsl:copy>
+      <xsl:copy-of select="@*"/>
+      <xsl:copy-of select="node()[not(name(.)='colors')]"/>
+      <xsl:apply-templates select="colors"/>
+    </xsl:copy>
+  </xsl:template>
+  <xsl:template match="colors">
+    <xsl:copy>
+      <xsl:copy-of select="@*"/>
+      <xsl:copy-of select="node()[name(.)='color']"/>
+      <xsl:if test="not(color[@name='header'])">
+        <color name="header" value="#FFFFFF"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='tab-selected'])">
+        <color name="tab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='tab-unselected'])">
+        <color name="tab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='subtab-selected'])">
+        <color name="subtab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='subtab-unselected'])">
+        <color name="subtab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='heading'])">
+        <color name="heading" value="#E5E4D9"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='subheading'])">
+        <color name="subheading" value="#E5E4D9"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='feedback'])">
+        <color name="feedback" value="#4C6C8F" font="#FFFFFF" align="center"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='published'])">
+        <color name="published" value="#4C6C8F" font="#FFFFFF"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='navstrip'])">
+        <color name="navstrip" value="#E5E4D9" font="#000000"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='toolbox'])">
+        <color name="toolbox" value="#CFDCED" font="#000000"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='border'])">
+        <color name="border" value="#999999"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='menu'])">
+        <color name="menu" value="#4C6C8F" font="#ffffff" link="#ffffff" vlink="#ffffff" hlink="#ffffff"  />
+      </xsl:if>
+      <xsl:if test="not(color[@name='menuheading'])">
+        <color name="menuheading" value="#cfdced" font="#000000" />
+      </xsl:if>
+      <xsl:if test="not(color[@name='searchbox'])">
+        <color name="searchbox" value="#E5E4D9" font="#000000"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='dialog'])">
+        <color name="dialog" value="#E5E4D9" font="#000000" link="#000000" vlink="#000000" hlink="#000000"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='body'])">
+        <color name="body" value="#ffffff" />
+      </xsl:if>
+      <xsl:if test="not(color[@name='table'])">
+        <color name="table" value="#ccc"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='table-cell'])">
+        <color name="table-cell" value="#ffffff"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='highlight'])">
+        <color name="highlight" value="#ffff00"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='fixme'])">
+        <color name="fixme" value="#c60"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='note'])">
+        <color name="note" value="#069"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='warning'])">
+        <color name="warning" value="#900"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='code'])">
+        <color name="code" value="#a5b6c6"/>
+      </xsl:if>
+      <xsl:if test="not(color[@name='footer'])">
+        <color name="footer" value="#E5E4D9"/>
+      </xsl:if>
+    </xsl:copy>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/lucene/xslt/fo/document-to-fo.xsl b/src/site/src/documentation/skins/lucene/xslt/fo/document-to-fo.xsl
new file mode 100644
index 0000000..0fb2a23
--- /dev/null
+++ b/src/site/src/documentation/skins/lucene/xslt/fo/document-to-fo.xsl
@@ -0,0 +1,22 @@
+<?xml version="1.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.
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                version="1.0">
+  <xsl:import href="../../../common/xslt/fo/document-to-fo.xsl"/>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/lucene/xslt/html/book-to-menu.xsl b/src/site/src/documentation/skins/lucene/xslt/html/book-to-menu.xsl
new file mode 100644
index 0000000..5242fc8
--- /dev/null
+++ b/src/site/src/documentation/skins/lucene/xslt/html/book-to-menu.xsl
@@ -0,0 +1,53 @@
+<?xml version="1.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.
+-->
+<!--
+book-to-menu.xsl generates the HTML menu.  See the imported book-to-menu.xsl for
+details.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:import href="../../../common/xslt/html/book-to-menu.xsl"/>
+  <xsl:template match="book">
+    <div id="menu">
+      <ul>
+        <xsl:apply-templates select="menu"/>
+      </ul>
+    </div>
+  </xsl:template>
+  <xsl:template match="menu">
+    <li><h1>
+        <xsl:value-of select="@label"/>
+      </h1>
+      <ul>
+        <xsl:apply-templates/>
+      </ul></li>
+  </xsl:template>
+  <xsl:template match="menu-item[@type='hidden']"/>
+  <xsl:template match="menu-item">
+    <li><xsl:apply-imports/></li>
+  </xsl:template>
+  <xsl:template name="selected">
+    <div class="current">
+      <xsl:value-of select="@label"/>
+    </div>
+  </xsl:template>
+  <xsl:template name="print-external">
+    <font color="#ffcc00">
+      <xsl:apply-imports/>
+    </font>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/lucene/xslt/html/document-to-html.xsl b/src/site/src/documentation/skins/lucene/xslt/html/document-to-html.xsl
new file mode 100644
index 0000000..2d337bf
--- /dev/null
+++ b/src/site/src/documentation/skins/lucene/xslt/html/document-to-html.xsl
@@ -0,0 +1,154 @@
+<?xml version="1.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.
+-->
+<!--
+This stylesheet contains templates for converting documentv11 to HTML.  See the
+imported document-to-html.xsl for details.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:import href="../../../common/xslt/html/document-to-html.xsl"/>
+  <xsl:template match="document">
+    <meta-data>
+      <xsl:apply-templates select="header/meta"/>
+    </meta-data>
+    <div id="content">
+      <div id="skinconf-printlink"/>
+      <div id="skinconf-xmllink"/>
+      <div id="skinconf-podlink"/>
+      <div id="skinconf-txtlink"/>
+      <div id="skinconf-pdflink"/>
+      <div id="disable-font-script"/>
+      <xsl:if test="normalize-space(header/title)!=''">
+        <h1>
+          <xsl:value-of select="header/title"/>
+        </h1>
+      </xsl:if>
+      <xsl:if test="normalize-space(header/subtitle)!=''">
+        <h3>
+          <xsl:value-of select="header/subtitle"/>
+        </h3>
+      </xsl:if>
+<!--
+      <xsl:apply-templates select="header/type"/>
+      <xsl:apply-templates select="header/notice"/>
+      <xsl:apply-templates select="header/abstract"/>
+      <xsl:apply-templates select="body"/>
+
+      <div class="attribution">
+        <xsl:apply-templates select="header/authors"/>
+        <xsl:if test="header/authors and header/version">
+          <xsl:text>; </xsl:text>
+        </xsl:if>
+        <xsl:apply-templates select="header/version"/>
+      </div>
+    -->
+      <xsl:if test="header/abstract">
+        <div class="abstract">
+          <xsl:value-of select="header/abstract"/>
+        </div>
+      </xsl:if>
+      <xsl:apply-templates select="body"/>
+      <xsl:if test="header/authors">
+        <p align="right">
+          <font size="-2">
+            <xsl:for-each select="header/authors/person">
+              <xsl:choose>
+                <xsl:when test="position()=1">by&#160;</xsl:when>
+                <xsl:otherwise>,&#160;</xsl:otherwise>
+              </xsl:choose>
+              <xsl:value-of select="@name"/>
+            </xsl:for-each>
+          </font>
+        </p>
+      </xsl:if>
+      <xsl:if test="header/version">
+        <xsl:apply-templates select="header/version"/>
+      </xsl:if>
+    </div>
+  </xsl:template>
+  <xsl:template match="body">
+    <div id="skinconf-toc-page"/>
+    <xsl:apply-templates/>
+  </xsl:template>
+  <xsl:template match="@id">
+    <xsl:apply-imports/>
+  </xsl:template>
+  <xsl:template match="section"><a name="{generate-id()}"/>
+    <xsl:apply-templates select="@id"/>
+    <xsl:variable name = "level" select = "count(ancestor::section)+1" />
+    <xsl:choose>
+      <xsl:when test="$level=1">
+        <div class="skinconf-heading-{$level}">
+          <h1>
+            <xsl:value-of select="title"/>
+          </h1>
+        </div>
+        <div class="section">
+          <xsl:apply-templates select="*[not(self::title)]"/>
+        </div>
+      </xsl:when>
+      <xsl:when test="$level=2">
+        <div class="skinconf-heading-{$level}">
+          <h2>
+            <xsl:value-of select="title"/>
+          </h2>
+        </div>
+        <xsl:apply-templates select="*[not(self::title)]"/>
+      </xsl:when>
+<!-- If a faq, answer sections will be level 3 (1=Q/A, 2=part) -->
+      <xsl:when test="$level=3 and $notoc='true'">
+        <h4 class="faq">
+          <xsl:value-of select="title"/>
+        </h4>
+        <div align="right"><a href="#{@id}-menu">^</a>
+        </div>
+        <div style="margin-left: 15px">
+          <xsl:apply-templates select="*[not(self::title)]"/>
+        </div>
+      </xsl:when>
+      <xsl:when test="$level=3">
+        <h4>
+          <xsl:value-of select="title"/>
+        </h4>
+        <xsl:apply-templates select="*[not(self::title)]"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <h5>
+          <xsl:value-of select="title"/>
+        </h5>
+        <xsl:apply-templates select="*[not(self::title)]"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+  <xsl:template match="figure">
+    <xsl:apply-templates select="@id"/>
+    <div style="text-align: center;" id="{@id}">
+      <img src="{@src}" alt="{@alt}" class="figure"  id="{@id}">
+        <xsl:if test="@height">
+          <xsl:attribute name="height">
+            <xsl:value-of select="@height"/>
+          </xsl:attribute>
+        </xsl:if>
+        <xsl:if test="@width">
+          <xsl:attribute name="width">
+            <xsl:value-of select="@width"/>
+          </xsl:attribute>
+        </xsl:if>
+      </img>
+    </div>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/lucene/xslt/html/site-to-xhtml.xsl b/src/site/src/documentation/skins/lucene/xslt/html/site-to-xhtml.xsl
new file mode 100644
index 0000000..c929756
--- /dev/null
+++ b/src/site/src/documentation/skins/lucene/xslt/html/site-to-xhtml.xsl
@@ -0,0 +1,808 @@
+<?xml version="1.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.
+-->
+<!--
+site-to-xhtml.xsl is the final stage in HTML page production.  It merges HTML from
+document-to-html.xsl, tab-to-menu.xsl and book-to-menu.xsl, and adds the site header,
+footer, searchbar, css etc.  As input, it takes XML of the form:
+
+<site>
+  <div class="menu">
+    ...
+  </div>
+  <div class="tab">
+    ...
+  </div>
+  <div class="content">
+    ...
+  </div>
+</site>
+
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  xmlns:i18n="http://apache.org/cocoon/i18n/2.1" exclude-result-prefixes="i18n">
+  <xsl:import href="../../../common/xslt/html/site-to-xhtml.xsl"/>
+<!--+
+  |Overall site template
+  +-->
+  <xsl:template match="site">
+<!--html lang="en" xml:lang="en"-->
+    <html>
+<!--+
+  |HTML-head
+  +-->
+      <head>
+<!--+
+  |generator meta
+  +-->
+<!-- Add some Forrest-specific metadata -->
+        <xsl:call-template name="html-meta"/>
+<!-- Add any metadata from the documents -->
+        <xsl:call-template name="meta-data"/>
+<!--+
+  |title
+  +-->
+        <title><xsl:value-of select="div[@id='content']/h1"/>
+          <xsl:if test="$config/motd">
+            <xsl:for-each select="$config/motd/motd-option">
+              <xsl:choose>
+                <xsl:when test="@starts-with='true'">
+                  <xsl:if test="starts-with($path, @pattern)">
+                    <xsl:if test="normalize-space(motd-title) != ''">
+<xsl:text> (</xsl:text>
+                      <xsl:value-of select="motd-title"/>
+<xsl:text>)</xsl:text>
+                    </xsl:if>
+                  </xsl:if>
+                </xsl:when>
+                <xsl:otherwise>
+                  <xsl:if test="contains($path, @pattern)">
+                    <xsl:if test="normalize-space(motd-title) != ''">
+<xsl:text> (</xsl:text>
+                      <xsl:value-of select="motd-title"/>
+<xsl:text>)</xsl:text>
+                    </xsl:if>
+                  </xsl:if>
+                </xsl:otherwise>
+              </xsl:choose>
+            </xsl:for-each>
+          </xsl:if></title>
+<!--+
+  |stylesheets
+  +--><link rel="stylesheet" href="{$root}skin/basic.css" type="text/css" 
+                /><link rel="stylesheet" href="{$root}skin/screen.css" 
+                type="text/css" media="screen" /><link rel="stylesheet" href="{$root}skin/print.css" type="text/css" 
+                media="print" /><link rel="stylesheet" href="{$root}skin/profile.css" 
+                type="text/css" />
+<!--+
+  |Javascripts
+  +-->
+<script type="text/javascript" language="javascript" 
+                src="{$root}skin/getBlank.js"></script>
+<script type="text/javascript" language="javascript" 
+				src="{$root}skin/getMenu.js"></script>
+<script type="text/javascript" language="javascript" 
+				src="{$root}skin/fontsize.js"></script>
+<!--+
+  |favicon
+  +-->
+        <xsl:if test="//skinconfig/favicon-url"><link rel="shortcut icon">
+          <xsl:attribute name="href">
+            <xsl:value-of 
+                            select="concat($root,//skinconfig/favicon-url)"/>
+          </xsl:attribute></link>
+        </xsl:if>
+      </head>
+<!--+
+  |HTML-body
+  +-->
+      <body onload="init()">
+<script type="text/javascript">ndeSetTextSize();</script>
+<!--+Site structure
+  +++++++++++++++++++++++++++
+     +=========================+
+     |       topstrip          |
+     +=========================+
+     |                         |
+     |       centerstrip       |
+     |                         |
+     |                         |
+     +=========================+
+     |       bottomstrip       |
+     +=========================+
+     +++++++++++++++++++++++++++
+     +-->
+<!--+
+  |topstrip with logos and search box 
+  +-->
+        <div id="top">
+<!--breadcrumbs org location-->
+          <xsl:if test="not ($config/trail/@location)">
+            <xsl:comment>+
+    |breadtrail
+    +</xsl:comment>
+            <div class="breadtrail">
+              <xsl:call-template name="breadcrumbs"/>
+            </div>
+          </xsl:if>
+          <xsl:comment>+
+    |header
+    +</xsl:comment>
+          <div class="header">
+            <xsl:comment>+
+    |start group logo
+    +</xsl:comment>
+            <xsl:if test="$config/group-url">
+              <div class="grouplogo">
+                <xsl:call-template name="renderlogo">
+                  <xsl:with-param name="name" select="$config/group-name"/>
+                  <xsl:with-param name="url" select="$config/group-url"/>
+                  <xsl:with-param name="logo" select="$config/group-logo"/>
+                  <xsl:with-param name="root" select="$root"/>
+                  <xsl:with-param name="description" select="$config/group-description"/>
+                </xsl:call-template>
+              </div>
+            </xsl:if>
+            <xsl:comment>+
+    |end group logo
+    +</xsl:comment>
+            <xsl:comment>+
+    |start Project Logo
+    +</xsl:comment>
+            <xsl:variable name="xtest">
+              <xsl:choose>
+                <xsl:when 
+                    test="$config/group-url and $config/search and not($config/search/@box-location = 'alt')">
+<xsl:text>true</xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+<xsl:text>false</xsl:text>
+                </xsl:otherwise>
+              </xsl:choose>
+            </xsl:variable>
+            <div class="projectlogo">
+              <xsl:if test="$xtest='false'" >
+                <xsl:attribute name="class">
+<xsl:text>projectlogoA1</xsl:text>
+                </xsl:attribute>
+              </xsl:if>
+              <xsl:call-template name="renderlogo">
+                <xsl:with-param name="name" select="$config/project-name"/>
+                <xsl:with-param name="url" select="$config/project-url"/>
+                <xsl:with-param name="logo" select="$config/project-logo"/>
+                <xsl:with-param name="root" select="$root"/>
+                <xsl:with-param name="description" select="$config/project-description"/>
+              </xsl:call-template>
+            </div>
+            <xsl:comment>+
+    |end Project Logo
+    +</xsl:comment>
+            <xsl:if 
+            test="$config/search and not($config/search/@box-location = 'alt')">
+              <xsl:comment>+
+    |start Search
+    +</xsl:comment>
+              <div class="searchbox">
+                <xsl:variable name="search-prompt">
+                  <i18n:text>Search the site with</i18n:text>
+<xsl:text> </xsl:text>
+                  <xsl:value-of select="$config/search/@provider"/>
+                </xsl:variable>
+                <xsl:choose>
+                  <xsl:when test="$config/search/@provider = 'lucene'">
+<!-- Lucene search -->
+                    <form method="get" action="{$root}{$lucene-search}">
+                      <input type="text" id="query" name="queryString" size="25" onFocus="getBlank (this, '{$search-prompt}');">
+                        <xsl:attribute name="value">
+                          <xsl:value-of select="$search-prompt"/>
+                        </xsl:attribute>
+                      </input>&#160;
+		  <input type="submit" value="Search" name="Search" i18n:attr="value"/>
+                    </form>
+                  </xsl:when>
+                  <xsl:otherwise>
+                    <form class="roundtopsmall" method="get" action="http://search.lucidimagination.com/p:lucene">
+                      <input type="text" id="query" name="q" size="25" onFocus="getBlank (this, '{$search-prompt}');">
+                        <xsl:attribute name="value">
+                          <xsl:value-of select="$search-prompt"/>
+                        </xsl:attribute>
+                      </input>&#160; 
+                    <input type="submit" value="Search" name="Search" i18n:attr="value"/>
+                    </form>
+		    <div style="position: relative; top: -5px; left: -10px">Powered by <a style="color: #033268" href="http://www.lucidimagination.com">Lucid Imagination</a></div>
+                  </xsl:otherwise>
+                </xsl:choose>
+<!--div id="roundbottomsmall">
+            <img 
+                src="{$skin-img-dir}/rc-b-l-5-1body-2menu-3menu.png" 
+                alt="" width="5" height="5" class="cornersmall" 
+                style="display: none" />
+        </div-->
+              </div>
+              <xsl:comment>+
+    |end search
+    +</xsl:comment>
+            </xsl:if>
+            <xsl:comment>+
+    |start Tabs
+    +</xsl:comment>
+            <xsl:apply-templates select="ul[@id='tabs']"/>
+            <xsl:comment>+
+    |end Tabs
+    +</xsl:comment>
+          </div>
+        </div>
+<!--+
+  |centerstrip with menu and mainarea
+  +-->
+        <div id="main">
+          <div id="publishedStrip">
+            <xsl:comment>+
+    |start Subtabs
+    +</xsl:comment>
+            <div id="level2tabs">
+              <xsl:apply-templates select="span[@id='level2tabs']/node()"/>
+            </div>
+            <xsl:comment>+
+    |end Endtabs
+    +</xsl:comment>
+            <xsl:call-template name="last-published"/>
+          </div>
+          <xsl:comment>+
+    |breadtrail
+    +</xsl:comment>
+          <div class="breadtrail">
+            <xsl:choose>
+              <xsl:when test="$config/trail/@location='alt'">
+<!--breadtrail location='alt'-->
+                <xsl:call-template name="breadcrumbs"/>
+              </xsl:when>
+              <xsl:otherwise>
+<!--*NO* breadtrail-->
+             &#160;
+           </xsl:otherwise>
+            </xsl:choose>
+          </div>
+          <xsl:comment>+
+    |start Menu, mainarea
+    +</xsl:comment>
+          <xsl:if test="div[@id='menu']/ul/li">
+            <xsl:call-template name="menu"/>
+          </xsl:if>
+          <xsl:comment>+
+    |start content
+    +</xsl:comment>
+          <xsl:apply-templates select="div[@id='content']"/>
+          <xsl:comment>+
+    |end content
+    +</xsl:comment>
+          <div class="clearboth">&#160;</div>
+        </div>
+<!--+
+  |bottomstrip with footer
+  +-->
+        <div id="footer">
+          <xsl:comment>+
+    |start bottomstrip
+    +</xsl:comment>
+          <div class="lastmodified">
+            <xsl:call-template name="last-published"/>
+          </div>
+          <xsl:if test="not($config/disable-copyright-footer = 'true')">
+            <div class="copyright">
+        Copyright &#169;
+        <xsl:text> </xsl:text>
+              <xsl:value-of select="$config/year"/>
+              <xsl:call-template name="current-year">
+                <xsl:with-param name="copyrightyear" select="$config/year"/>
+              </xsl:call-template>
+<xsl:text> </xsl:text>
+              <xsl:choose>
+                <xsl:when test="$config/copyright-link"><a>
+                  <xsl:attribute name="href">
+                    <xsl:value-of select="$config/copyright-link"/>
+                  </xsl:attribute>
+                  <xsl:value-of select="$config/vendor"/></a>
+                </xsl:when>
+                <xsl:otherwise>
+                  <xsl:value-of select="$config/vendor"/>
+                </xsl:otherwise>
+              </xsl:choose>
+            </div>
+          </xsl:if>
+          <xsl:if test="$filename = 'index.html'">
+            <div id="logos" >
+              <xsl:if test="$config/disable-compliance-links/@align">
+                <xsl:attribute name="style">text-align: <xsl:value-of select="$config/disable-compliance-links/@align"/>
+                </xsl:attribute>
+              </xsl:if>
+<!-- W3C logos style="text-align: center;"-->
+              <xsl:call-template name="compliancy-logos"/>
+              <xsl:if test="$filename = 'index.html' and $config/credits">
+                <xsl:for-each select="$config/credits/credit[not(@role='pdf')]">
+                  <xsl:if test="not(@box-location = 'alt') and not(@box-location = 'alt2')">
+                    <xsl:variable name="name" select="name"/>
+                    <xsl:variable name="url" select="url"/>
+                    <xsl:variable name="image" select="image"/>
+                    <xsl:variable name="width" select="width"/>
+                    <xsl:variable name="height" select="height"/><a href="{$url}">
+                    <img alt="{$name} - logo" title="{$name}" border="0">
+                      <xsl:attribute name="src">
+                        <xsl:if test="not(starts-with($image, 'http://'))">
+                          <xsl:value-of select="$root"/>
+                        </xsl:if>
+                        <xsl:value-of select="$image"/>
+                      </xsl:attribute>
+                      <xsl:attribute name="style">
+                        <xsl:if test="$width">width: <xsl:value-of select="$width"/>px;</xsl:if>
+                        <xsl:if test="$height">height: <xsl:value-of select="$height"/>px;</xsl:if>
+                      </xsl:attribute>
+                    </img></a>
+                  </xsl:if>
+                </xsl:for-each>
+              </xsl:if>
+            </div>
+          </xsl:if>
+          <xsl:if test="$config/host-logo and not($config/host-logo = '')">
+            <div class="host">
+              <xsl:call-template name="renderlogo">
+                <xsl:with-param name="name" select="$config/host-name"/>
+                <xsl:with-param name="url" select="$config/host-url"/>
+                <xsl:with-param name="logo" select="$config/host-logo"/>
+                <xsl:with-param name="root" select="$root"/>
+              </xsl:call-template>
+            </div>
+          </xsl:if>
+          <xsl:if test="$config/feedback">
+            <xsl:call-template name="feedback"/>
+          </xsl:if>
+          <xsl:comment>+
+    |end bottomstrip
+    +</xsl:comment>
+        </div>
+      </body>
+    </html>
+  </xsl:template>
+  <xsl:template name="last-published">
+<script type="text/javascript"><![CDATA[<!--
+document.write("]]><i18n:text >Last Published:</i18n:text><![CDATA[ " + document.lastModified);
+//  -->]]></script>
+  </xsl:template>
+<!--headings-->
+  <xsl:template match="div[@class = 'skinconf-heading-1']">
+    <xsl:choose>
+      <xsl:when test="//skinconfig/headings/@type='underlined'">
+        <h2 class="underlined_10">
+          <xsl:value-of select="h1"/>
+        </h2>
+      </xsl:when>
+      <xsl:when test="//skinconfig/headings/@type='boxed'">
+        <h2 class="boxed">
+          <xsl:value-of select="h1"/>
+        </h2>
+      </xsl:when>
+      <xsl:otherwise>
+        <h2 class="h3">
+          <xsl:value-of select="h1"/>
+        </h2>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+  <xsl:template match="div[@class = 'skinconf-heading-2']">
+    <xsl:choose>
+      <xsl:when test="//skinconfig/headings/@type='underlined'">
+        <h3 class="underlined_5">
+          <xsl:value-of select="h2"/>
+        </h3>
+      </xsl:when>
+      <xsl:when test="//skinconfig/headings/@type='boxed'">
+        <h3 class="boxed">
+          <xsl:value-of select="h2"/>
+        </h3>
+      </xsl:when>
+      <xsl:otherwise>
+        <h3 class="h4">
+          <xsl:value-of select="h2"/>
+        </h3>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+<!-- Add links to any standards-compliance logos -->
+  <xsl:template name="compliancy-logos">
+    <xsl:if test="$filename = 'index.html' and $config/disable-compliance-links = 'false'"><a href="http://validator.w3.org/check/referer">
+      <img class="logoImage" 
+          src="{$skin-img-dir}/valid-html401.png"
+          alt="Valid HTML 4.01!" title="Valid HTML 4.01!" style="height: 31px; width: 88px;" /></a><a href="http://jigsaw.w3.org/css-validator/check/referer">
+      <img class="logoImage" 
+          src="{$skin-img-dir}/vcss.png" 
+          alt="Valid CSS!" title="Valid CSS!" style="height: 31px; width: 88px;"/></a>
+    </xsl:if>
+  </xsl:template>
+  <xsl:template name="menu">
+    <xsl:comment>+
+    |start Menu
+    +</xsl:comment>
+    <div id="menu">
+<!--menu - inner-->
+      <xsl:for-each select = "div[@id='menu']/ul/li">
+        <xsl:call-template name = "innermenuli" >
+          <xsl:with-param name="id" select="concat('1.', position())"/>
+        </xsl:call-template>
+      </xsl:for-each>
+<!--
+			<xsl:apply-templates select="div[@id='menu']/*" />
+		-->
+<!-- Search box: alternative location -->
+      <xsl:if 
+            test="$config/search and $config/search/@box-location='alt'">
+        <xsl:comment>+
+    |start Search
+    +</xsl:comment>
+        <div class="searchbox">
+          <hr />
+          <xsl:variable name="search-prompt">
+            <i18n:text>Search the site with</i18n:text>
+<xsl:text> </xsl:text>
+            <xsl:value-of select="$config/search/@provider"/>
+          </xsl:variable>
+          <xsl:choose>
+            <xsl:when test="$config/search/@provider = 'lucene'">
+<!-- Lucene search -->
+              <form method="get" action="{$root}{$lucene-search}">
+                <input type="text" id="query" name="queryString" size="18" onFocus="getBlank (this, '{$search-prompt}');">
+                  <xsl:attribute name="value">
+                    <xsl:value-of select="$search-prompt"/>
+                  </xsl:attribute>
+                </input>&#160;
+		  <input type="submit" value="Search" name="Search" i18n:attr="value"/>
+              </form>
+            </xsl:when>
+            <xsl:otherwise>
+	            <form class="roundtopsmall" method="get" action="http://search.lucidimagination.com/p:lucene">
+                  <input type="text" id="query" name="q" size="25" onFocus="getBlank (this, '{$search-prompt}');">
+                    <xsl:attribute name="value">
+                      <xsl:value-of select="$search-prompt"/>
+                    </xsl:attribute>
+                  </input>&#160; 
+                <input type="submit" value="Search" name="Search" i18n:attr="value"/>
+                </form>
+            </xsl:otherwise>
+          </xsl:choose>
+        </div>
+        <xsl:comment>+
+    |end search
+    +</xsl:comment>
+      </xsl:if>
+<!--credits in alternative location-->
+      <div id="credit">
+        <xsl:if test="$filename = 'index.html' and $config/credits and ($config/credits/credit/@box-location = 'alt')">
+          <hr />
+          <xsl:for-each select="$config/credits/credit[not(@role='pdf')]">
+            <xsl:if test="@box-location = 'alt'">
+              <xsl:variable name="name" select="name"/>
+              <xsl:variable name="url" select="url"/>
+              <xsl:variable name="image" select="image"/>
+              <xsl:variable name="width" select="width"/>
+              <xsl:variable name="height" select="height"/><a href="{$url}">
+              <img alt="{$name} - logo" title="{$name}" border="0">
+                <xsl:attribute name="src">
+                  <xsl:if test="not(starts-with($image, 'http://'))">
+                    <xsl:value-of select="$root"/>
+                  </xsl:if>
+                  <xsl:value-of select="$image"/>
+                </xsl:attribute>
+                <xsl:attribute name="style">
+                  <xsl:if test="$width">width: <xsl:value-of select="$width"/>px;</xsl:if>
+                  <xsl:if test="$height">height: <xsl:value-of select="$height"/>px;</xsl:if>
+                </xsl:attribute>
+              </img></a>
+            </xsl:if>
+          </xsl:for-each>
+        </xsl:if>
+<!-- Message of the day -->
+        <xsl:if test="$config/motd">
+          <xsl:for-each select="$config/motd/motd-option">
+            <xsl:choose>
+              <xsl:when test="@starts-with='true'">
+                <xsl:if test="starts-with($path, @pattern)">
+                  <xsl:if test="motd-page/@location='alt' or motd-page/@location='both'">
+                    <hr />
+                    <xsl:value-of select="motd-page"/>
+                    <xsl:if test="motd-page-url">
+<xsl:text> (</xsl:text><a>
+                      <xsl:attribute name="href">
+                        <xsl:value-of select="motd-page-url"/>
+                      </xsl:attribute>
+<xsl:text>More</xsl:text></a>
+<xsl:text>)</xsl:text>
+                    </xsl:if>
+                  </xsl:if>
+                </xsl:if>
+              </xsl:when>
+              <xsl:otherwise>
+                <xsl:if test="contains($path, @pattern)">
+                  <xsl:if test="motd-page/@location='alt' or motd-page/@location='both'">
+                    <hr />
+                    <xsl:value-of select="motd-page"/>
+                    <xsl:if test="motd-page-url">
+<xsl:text> (</xsl:text><a>
+                      <xsl:attribute name="href">
+                        <xsl:value-of select="motd-page-url"/>
+                      </xsl:attribute>
+<xsl:text>More</xsl:text></a>
+<xsl:text>)</xsl:text>
+                    </xsl:if>
+                  </xsl:if>
+                </xsl:if>
+              </xsl:otherwise>
+            </xsl:choose>
+          </xsl:for-each>
+        </xsl:if>
+      </div>
+      <div id="roundbottom">
+        <img 
+                src="{$skin-img-dir}/rc-b-l-15-1body-2menu-3menu.png" 
+                alt="" width="15" height="15" class="corner" 
+                style="display: none" />
+      </div>
+<!--credits in alternative location #2-->
+      <xsl:comment>+
+  |alternative credits
+  +</xsl:comment>
+      <div id="credit2">
+        <xsl:if test="$config/credits and ($config/credits/credit/@box-location = 'alt2')">
+          <xsl:for-each select="$config/credits/credit[not(@role='pdf')]">
+            <xsl:if test="@box-location = 'alt2'">
+              <xsl:variable name="name" select="name"/>
+              <xsl:variable name="url" select="url"/>
+              <xsl:variable name="image" select="image"/>
+              <xsl:variable name="width" select="width"/>
+              <xsl:variable name="height" select="height"/><a href="{$url}">
+              <img alt="{$name} - logo" title="{$name}" border="0">
+                <xsl:attribute name="src">
+                  <xsl:if test="not(starts-with($image, 'http://'))">
+                    <xsl:value-of select="$root"/>
+                  </xsl:if>
+                  <xsl:value-of select="$image"/>
+                </xsl:attribute>
+                <xsl:attribute name="style">
+                  <xsl:if test="$width">width: <xsl:value-of select="$width"/>px;</xsl:if>
+                  <xsl:if test="$height">height: <xsl:value-of select="$height"/>px;</xsl:if>
+                </xsl:attribute>
+              </img></a>
+            </xsl:if>
+          </xsl:for-each>
+        </xsl:if>
+      </div>
+    </div>
+    <xsl:comment>+
+    |end Menu
+    +</xsl:comment>
+  </xsl:template>
+  <xsl:template name="innermenuli">
+    <xsl:param name="id"/>
+    <xsl:variable name="tagid">
+      <xsl:choose>
+        <xsl:when test="descendant-or-self::node()/li/div/@class='current'">
+          <xsl:value-of select="concat('menu_selected_',$id)"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="concat('menu_',concat(font,$id))"/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:variable>
+    <xsl:variable name="whichGroup">
+      <xsl:choose>
+        <xsl:when test="descendant-or-self::node()/li/div/@class='current'">selectedmenuitemgroup</xsl:when>
+        <xsl:otherwise>menuitemgroup</xsl:otherwise>
+      </xsl:choose>
+    </xsl:variable>
+    <div class="menutitle" id="{$tagid}Title" 
+        onclick="SwitchMenu('{$tagid}', '{$root}skin/')">
+      <xsl:if test="contains($tagid, '_selected_')" >
+        <xsl:attribute name="style">
+<xsl:text>background-image: url('</xsl:text>
+          <xsl:value-of select="$root"/>
+<xsl:text>skin/images/chapter_open.gif');</xsl:text>
+        </xsl:attribute>
+      </xsl:if>
+      <xsl:value-of select="h1"/>
+    </div>
+    <div class="{$whichGroup}" id="{$tagid}">
+      <xsl:if test="contains($tagid, '_selected_')" >
+        <xsl:attribute name="style">
+<xsl:text>display: block;</xsl:text>
+        </xsl:attribute>
+      </xsl:if>
+      <xsl:for-each select= "ul/li">
+        <xsl:choose>
+          <xsl:when test="a">
+            <div class="menuitem"><a>
+              <xsl:attribute name="href">
+                <xsl:value-of select="a/@href"/>
+              </xsl:attribute>
+              <xsl:if test="a/@title!=''">
+                <xsl:attribute name="title">
+                  <xsl:value-of select="a/@title"/>
+                </xsl:attribute>
+              </xsl:if>
+              <xsl:value-of select="a"/></a>
+            </div>
+          </xsl:when>
+          <xsl:when test="div/@class='current'">
+            <div class="menupage">
+              <div class="menupagetitle">
+                <xsl:value-of select="div" />
+              </div>
+              <xsl:if test="$config/toc/@max-depth > 0
+                    and contains($minitoc-location,'menu')
+                    and count(//tocitems/tocitem) >= $config/toc/@min-sections">
+                <div class="menupageitemgroup">
+                  <xsl:for-each select = "//tocitems/tocitem">
+                    <div class="menupageitem">
+                      <xsl:choose>
+                        <xsl:when test="string-length(@title)>15"><a href="{@href}" title="{@title}">
+                          <xsl:value-of select="substring(@title,0,20)" />...</a>
+                        </xsl:when>
+                        <xsl:otherwise><a href="{@href}">
+                          <xsl:value-of select="@title" /></a>
+                        </xsl:otherwise>
+                      </xsl:choose>
+                    </div>
+                  </xsl:for-each>
+                </div>
+              </xsl:if>
+            </div>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:call-template name = "innermenuli">
+              <xsl:with-param name="id" select="concat($id, '.', position())"/>
+            </xsl:call-template>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:for-each>
+    </div>
+  </xsl:template>
+<!--+
+    |Generates the PDF link 
+    +-->
+  <xsl:template match="div[@id='skinconf-pdflink']">
+    <xsl:if test="not($config/disable-pdf-link) or $disable-pdf-link = 'false'">
+      <div class="pdflink" title="Portable Document Format"><a href="{$filename-noext}.pdf" class="dida">
+        <img class="skin" src="{$skin-img-dir}/pdfdoc.gif" alt="PDF -icon" />
+        <br/>
+        PDF</a>
+      </div>
+    </xsl:if>
+  </xsl:template>
+  <xsl:template match="div[@id='skinconf-xmllink']">
+    <xsl:if test="not($config/disable-xml-link) or $disable-xml-link = 'false'">
+      <div class="xmllink" title="raw XML"><a href="{$filename-noext}.xml" class="dida">
+        <img class="skin" src="{$skin-img-dir}/xmldoc.gif" alt="XML - icon" />
+        <br/>
+        XML</a>
+      </div>
+    </xsl:if>
+  </xsl:template>
+  <xsl:template match="div[@id='skinconf-txtlink']">
+    <xsl:if test="not($config/disable-txt-link) or $disable-txt-link = 'false'">
+      <div class="podlink" title="Plain Text Documentation"><a href="{$filename-noext}.txt" class="dida">
+        <img class="skin" src="{$skin-img-dir}/txtdoc.png" alt="TXT - icon" />
+        <br/>
+        TXT</a>
+      </div>
+    </xsl:if>
+  </xsl:template>
+  <xsl:template match="div[@id='skinconf-podlink']">
+    <xsl:if test="not($config/disable-pod-link) or $disable-pod-link = 'false'">
+      <div class="podlink" title="Plain Old Documentation"><a href="{$filename-noext}.pod" class="dida">
+        <img class="skin" src="{$skin-img-dir}/poddoc.png" alt="POD - icon" />
+        <br/>
+        POD</a>
+      </div>
+    </xsl:if>
+  </xsl:template>
+  <xsl:template match="div[@id='skinconf-printlink']">
+    <xsl:if test="not($config/disable-print-link) or $disable-print-link = 'false'">
+<script type="text/javascript" language="Javascript">
+function printit() {
+  if (window.print) {
+    window.focus();
+    window.print();
+  }
+}
+        </script>
+<script type="text/javascript" language="Javascript">
+var NS = (navigator.appName == "Netscape");
+var VERSION = parseInt(navigator.appVersion);
+if (VERSION > 3) {
+  document.write('<div class="printlink" title="Print this Page">');
+  document.write('  <a href="javascript:printit()" class="dida">');
+  document.write('    <img class="skin" src="{$skin-img-dir}/printer.gif" alt="print - icon" />');
+  document.write('    <br />');
+  document.write('  PRINT</a>');
+  document.write('</div>');
+}
+        </script>
+    </xsl:if>
+  </xsl:template>
+  <xsl:template match="div[@id='disable-font-script']">
+    <xsl:if test="$disable-font-script = 'false'">
+      <div class="trail">
+        <i18n:text >Font size:</i18n:text> 
+	          &#160;<input type="button" onclick="ndeSetTextSize('reset'); return false;" title="Reset text" class="resetfont" value="Reset"/>      
+	          &#160;<input type="button" onclick="ndeSetTextSize('decr'); return false;" title="Shrink text" class="smallerfont" value="-a"/>
+	          &#160;<input type="button" onclick="ndeSetTextSize('incr'); return false;" title="Enlarge text" class="biggerfont" value="+a"/>
+      </div>
+    </xsl:if>
+  </xsl:template>
+  <xsl:template match="div[@id='skinconf-toc-page']">
+<!-- Message of the day -->
+    <xsl:if test="$config/motd">
+      <xsl:for-each select="$config/motd/motd-option">
+        <xsl:choose>
+          <xsl:when test="@starts-with='true'">
+            <xsl:if test="starts-with($path, @pattern)">
+              <xsl:if test="motd-page/@location='page' or motd-page/@location='both'">
+                <div id="motd-area">
+                  <xsl:value-of select="motd-page"/>
+                  <xsl:if test="motd-page-url">
+<xsl:text> (</xsl:text><a>
+                    <xsl:attribute name="href">
+                      <xsl:value-of select="motd-page-url"/>
+                    </xsl:attribute>
+<xsl:text>More</xsl:text></a>
+<xsl:text>)</xsl:text>
+                  </xsl:if>
+                </div>
+              </xsl:if>
+            </xsl:if>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:if test="contains($path, @pattern)">
+              <xsl:if test="motd-page/@location='page' or motd-page/@location='both'">
+                <div id="motd-area">
+                  <xsl:value-of select="motd-page"/>
+                  <xsl:if test="motd-page-url">
+<xsl:text> (</xsl:text><a>
+                    <xsl:attribute name="href">
+                      <xsl:value-of select="motd-page-url"/>
+                    </xsl:attribute>
+<xsl:text>More</xsl:text></a>
+<xsl:text>)</xsl:text>
+                  </xsl:if>
+                </div>
+              </xsl:if>
+            </xsl:if>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:for-each>
+    </xsl:if>
+<!-- Table of Contents ToC -->
+    <xsl:if test="$config/toc">
+      <xsl:if test="contains($minitoc-location,'page')">
+        <xsl:if test="(count(//tocitems/tocitem) >= $config/toc/@min-sections) or (//tocitems/@force = 'true')">
+          <div id="minitoc-area">
+            <xsl:call-template name="minitoc">
+              <xsl:with-param name="tocroot" select="//tocitems"/>
+            </xsl:call-template>
+          </div>
+        </xsl:if>
+      </xsl:if>
+    </xsl:if>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/src/site/src/documentation/skins/lucene/xslt/html/tab-to-menu.xsl b/src/site/src/documentation/skins/lucene/xslt/html/tab-to-menu.xsl
new file mode 100644
index 0000000..3253adb
--- /dev/null
+++ b/src/site/src/documentation/skins/lucene/xslt/html/tab-to-menu.xsl
@@ -0,0 +1,66 @@
+<?xml version="1.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.
+-->
+<!--
+This stylesheet generates 'tabs' at the top left of the screen.  Tabs are
+visual indicators that a certain subsection of the URI space is being browsed.
+For example, if we had tabs with paths:
+
+Tab1:  ''
+Tab2:  'community'
+Tab3:  'community/howto'
+Tab4:  'community/howto/form/index.html'
+
+Then if the current path was 'community/howto/foo', Tab3 would be highlighted.
+The rule is: the tab with the longest path that forms a prefix of the current
+path is enabled.
+
+The output of this stylesheet is HTML of the form:
+    <div class="tab">
+      ...
+    </div>
+
+which is then merged by site-to-xhtml.xsl
+
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:import href="../../../common/xslt/html/tab-to-menu.xsl"/>
+  <xsl:template match="tabs">
+    <ul id="tabs">
+      <xsl:call-template name="base-tabs"/>
+    </ul>
+    <span id="level2tabs">
+      <xsl:call-template name="level2tabs"/>
+    </span>
+  </xsl:template>
+  <xsl:template name="pre-separator"></xsl:template>
+  <xsl:template name="post-separator"></xsl:template>
+  <xsl:template name="separator"></xsl:template>
+  <xsl:template name="level2-separator"></xsl:template>
+  <xsl:template name="selected">
+    <li class="current"><xsl:call-template name="base-selected"/></li>
+  </xsl:template>
+  <xsl:template name="not-selected">
+    <li><xsl:call-template name="base-not-selected"/></li>
+  </xsl:template>
+  <xsl:template name="level2-not-selected">
+    <xsl:call-template name="base-not-selected"/>
+  </xsl:template>
+  <xsl:template name="level2-selected">
+    <xsl:call-template name="base-selected"/>
+  </xsl:template>
+</xsl:stylesheet>