- work on create more unique responsability components
- api modules compile, but not all implementation
- the main blockers are sessions (for publication and respository) : this sessions create strong and cyclic dependencies between publication and repository
- will try now to remove this component specific sessions

git-svn-id: https://svn.apache.org/repos/asf/lenya/trunk@1073180 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/org.apache.lenya.core.ac/pom.xml b/org.apache.lenya.core.ac/pom.xml
index ec38a1b..d9b0803 100644
--- a/org.apache.lenya.core.ac/pom.xml
+++ b/org.apache.lenya.core.ac/pom.xml
@@ -43,6 +43,10 @@
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-repository-api</artifactId>
     </dependency>
+     <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-identity</artifactId>
+    </dependency>
     <!-- TODO : see if theses dependencies are required -->
     <dependency>
       <groupId>javax.servlet</groupId>
diff --git a/org.apache.lenya.core.acusecases/src/main/java/org/apache/lenya/cms/ac/usecases/Login.java b/org.apache.lenya.core.acusecases/src/main/java/org/apache/lenya/cms/ac/usecases/Login.java
index 823881b..9fbdc55 100644
--- a/org.apache.lenya.core.acusecases/src/main/java/org/apache/lenya/cms/ac/usecases/Login.java
+++ b/org.apache.lenya.core.acusecases/src/main/java/org/apache/lenya/cms/ac/usecases/Login.java
@@ -52,9 +52,12 @@
                 Publication publication = getSession().getPublication(pubId);
                 setParameter(PUBLICATION, publication);
             }
-            Identity identity = this.getSession().getIdentity();
+            //florent : Identity identity = this.getSession().getIdentity();
+            Identity identity = Identity.getIdentity(this.request.getSession(false));
             if (identity != null && identity.getUser() != null) {
-                setParameter(CURRENT_USER, this.getSession().getIdentity().getUser());
+                //florent : use the just define identity, move when ok
+            	//setParameter(CURRENT_USER, this.getSession().getIdentity().getUser());
+            	setParameter(CURRENT_USER, identity.getUser());
             }
         } catch (Exception e) {
             throw new RuntimeException(e);
@@ -87,13 +90,17 @@
         validate();
         
         if (!hasErrors()) {
+        	//TODO : remove this part for retrive the request and use the other technique for identity as the request is in the abstract
+        	//usecase now
         	HttpServletRequest request = ServletHelper.getRequest();
             request.getSession(true);
             
             if (getAccessController().authenticate(request)) {
             	//we have an authenticated user, so we create a modifiable repository session
             	Identity identity = (Identity) request.getSession().getAttribute(Identity.class.getName());
-            	Session s = this.repository.startSession(identity, true);
+            	//florent : see if ok, startsession remove from repository
+            	//Session s = this.repository.startSession(identity, true);
+            	Session s = this.repository.getSession(this.request);
             	this.setSession(s);
             	//TODO : see if this remove attribute is still valid
             	request.getSession(false).removeAttribute(HISTORY_SESSION_ATTRIBUTE);
diff --git a/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/cms/ac/usecases/AccessControl.java b/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/cms/ac/usecases/AccessControl.java
index e024194..adc5cf3 100644
--- a/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/cms/ac/usecases/AccessControl.java
+++ b/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/cms/ac/usecases/AccessControl.java
@@ -27,7 +27,8 @@
 import org.apache.cocoon.ProcessingException;
 import org.apache.lenya.cms.publication.Document;
 import org.apache.lenya.cms.publication.Publication;
-import org.apache.lenya.cms.publication.URLInformation;
+//florent : import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.utils.URLInformation;
 
 import org.apache.lenya.ac.AccessControlException;
 import org.apache.lenya.ac.Accreditable;
@@ -86,7 +87,8 @@
         super.initParameters();
 
         try {
-            URLInformation info = new URLInformation(getSourceURL());
+            //URLInformation info = new URLInformation(getSourceURL());
+        	URLInformation info = new URLInformation();
             setParameter(COMPLETE_AREA, info.getCompleteArea());
 
             if (getSession().getUriHandler().isDocument(getSourceURL())) {
@@ -150,7 +152,8 @@
      */
     protected void doCheckPreconditions() throws Exception {
         super.doCheckPreconditions();
-        URLInformation info = new URLInformation(getSourceURL());
+        //URLInformation info = new URLInformation(getSourceURL());
+        URLInformation info = new URLInformation();
         String acArea = getParameterAsString(AC_AREA);
         if (!acArea.equals(Publication.LIVE_AREA) && !info.getArea().equals(acArea)) {
             addErrorMessage("This usecase can only be invoked in the configured area.");
@@ -449,7 +452,8 @@
 
     protected String getPolicyURL() {
         String infoUrl = getSourceURL();
-        URLInformation info = new URLInformation(infoUrl);
+        //URLInformation info = new URLInformation(infoUrl);
+        URLInformation info = new URLInformation();
 
         String area = getParameterAsString(AC_AREA);
         String url = "/" + info.getPublicationId() + "/" + area + info.getDocumentUrl();
diff --git a/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/cms/ac/usecases/ChangePassword.java b/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/cms/ac/usecases/ChangePassword.java
index 95cb6ac..a59427c 100644
--- a/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/cms/ac/usecases/ChangePassword.java
+++ b/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/cms/ac/usecases/ChangePassword.java
@@ -18,6 +18,7 @@
 package org.apache.lenya.cms.ac.usecases;
 
 import org.apache.lenya.ac.User;
+import org.apache.lenya.ac.Identity;
 
 /**
  * Usecase to change a user's password. The old password is checked.
@@ -30,7 +31,10 @@
      * @return Always returns the currently logged in user.
      */
     protected User getUser() {
-        return getSession().getIdentity().getUser();
+    	
+    	return Identity.getIdentity(this.request.getSession(false)).getUser();
+        //florent:  modifications due to session interface changes
+    		//return getSession().getIdentity().getUser();
     }
 
     /**
diff --git a/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/cms/ac/usecases/SessionViewer.java b/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/cms/ac/usecases/SessionViewer.java
index b7c77b4..7ab481d 100644
--- a/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/cms/ac/usecases/SessionViewer.java
+++ b/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/cms/ac/usecases/SessionViewer.java
@@ -29,7 +29,9 @@
 import org.apache.lenya.ac.Identity;
 import org.apache.lenya.ac.User;
 import org.apache.lenya.cms.ac.usecases.AccessControlUsecase;
-import org.apache.lenya.cms.publication.URLInformation;
+//florent 
+//import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.utils.URLInformation;
 import org.apache.lenya.modules.monitoring.SessionListener;
 
 /**
@@ -99,7 +101,8 @@
      * @return The publicationID from an URL.
      */
     private String getPublicationIDfromURL() {
-        URLInformation info = new URLInformation(getSourceURL());
+        //florent : URLInformation info = new URLInformation(getSourceURL());
+    	URLInformation info = new URLInformation();
         return info.getPublicationId();
     }
 }
diff --git a/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/modules/administration/Reports.java b/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/modules/administration/Reports.java
index e2f4452..3174f0a 100644
--- a/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/modules/administration/Reports.java
+++ b/org.apache.lenya.core.administration/src/main/java/org/apache/lenya/modules/administration/Reports.java
@@ -69,7 +69,9 @@
                 Link[] links = linkManager.getLinksFrom(docs[d]);
                 for (int l = 0; l < links.length; l++) {
                     String uri = links[l].getUri();
-                    LinkTarget target = linkResolver.resolve(docs[d], uri);
+                    //florent : change due to change in linkResolver
+                    //LinkTarget target = linkResolver.resolve(docs[d], uri);
+                    LinkTarget target = linkResolver.resolve(getSession(),docs[d], uri);
                     if (!target.exists()) {
                         BrokenLink brokenLink = new BrokenLink(docs[d].getCanonicalWebappURL(), uri);
                         brokenLinks.add(brokenLink);
diff --git a/org.apache.lenya.core.api/src/main/java/org/apache/lenya/xml/Schema.java b/org.apache.lenya.core.api/src/main/java/org/apache/lenya/xml/Schema.java
new file mode 100644
index 0000000..cd058a3
--- /dev/null
+++ b/org.apache.lenya.core.api/src/main/java/org/apache/lenya/xml/Schema.java
@@ -0,0 +1,16 @@
+package org.apache.lenya.xml;
+
+public interface Schema {
+
+	/**
+	 * @return The language.
+	 * @see org.apache.cocoon.components.validation.Validator
+	 */
+	public abstract String getLanguage();
+
+	/**
+	 * @return The URI to read the schema from.
+	 */
+	public abstract String getURI();
+
+}
\ No newline at end of file
diff --git a/org.apache.lenya.core.cache/pom.xml b/org.apache.lenya.core.cache/pom.xml
index 2d234a8..0a1ee54 100644
--- a/org.apache.lenya.core.cache/pom.xml
+++ b/org.apache.lenya.core.cache/pom.xml
@@ -27,7 +27,7 @@
   	</dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-api</artifactId>
+      <artifactId>lenya-core-impl</artifactId>
     </dependency>
   </dependencies>
 </project>
diff --git a/org.apache.lenya.core.cocoon/pom.xml b/org.apache.lenya.core.cocoon/pom.xml
index 0b3fb15..009dc57 100644
--- a/org.apache.lenya.core.cocoon/pom.xml
+++ b/org.apache.lenya.core.cocoon/pom.xml
@@ -24,6 +24,26 @@
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-impl</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-repository-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-publication-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-publication-impl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-document-api</artifactId>
+    </dependency>
+     <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-utils</artifactId>
+    </dependency>
   <!-- TODO : see if all theses dependencies are required -->
     <dependency>
       <groupId>org.apache.cocoon</groupId>
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/LanguageExistsAction.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/LanguageExistsAction.java
index b927992..916b2ed 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/LanguageExistsAction.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/LanguageExistsAction.java
@@ -31,7 +31,7 @@
 import org.apache.cocoon.environment.SourceResolver;
 import org.apache.lenya.cms.publication.Repository;
 import org.apache.lenya.cms.publication.Session;
-import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
 
 /**
  * Action that checks if the current URL represents an existing document.
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/ReservedCheckinAction.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/ReservedCheckinAction.java
index d776919..aca0f54 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/ReservedCheckinAction.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/ReservedCheckinAction.java
@@ -32,7 +32,7 @@
 import org.apache.lenya.cms.publication.Document;
 import org.apache.lenya.cms.publication.Repository;
 import org.apache.lenya.cms.publication.Session;
-import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
 
 /**
  * Checkin document
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/ReservedCheckoutAction.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/ReservedCheckoutAction.java
index b252a48..9187a64 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/ReservedCheckoutAction.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/ReservedCheckoutAction.java
@@ -27,7 +27,7 @@
 import org.apache.cocoon.environment.Redirector;
 import org.apache.cocoon.environment.SourceResolver;
 import org.apache.lenya.cms.publication.Document;
-import org.apache.lenya.cms.publication.RepositoryException;
+import org.apache.lenya.cms.repository.RepositoryException;
 import org.apache.lenya.cms.publication.Session;
 
 /**
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/ReservedCheckoutTestAction.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/ReservedCheckoutTestAction.java
index 11e0f55..f87efcb 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/ReservedCheckoutTestAction.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/ReservedCheckoutTestAction.java
@@ -27,7 +27,8 @@
 import org.apache.cocoon.environment.Redirector;
 import org.apache.cocoon.environment.SourceResolver;
 import org.apache.lenya.cms.publication.Document;
-import org.apache.lenya.cms.publication.RepositoryException;
+//import org.apache.lenya.cms.publication.RepositoryException;
+import org.apache.lenya.cms.repository.RepositoryException;
 
 /**
  * An action that tests if a document is already checked out by a given user. If it isn't, a check
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/RevisionControllerAction.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/RevisionControllerAction.java
index 4528325..935cf1f 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/RevisionControllerAction.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/acting/RevisionControllerAction.java
@@ -37,7 +37,7 @@
 import org.apache.lenya.cms.publication.Repository;
 import org.apache.lenya.cms.publication.Session;
 import org.apache.lenya.cms.publication.URLInformation;
-import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
 
 /**
  * Revision controller action.
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java
index 9a6c6a0..a74f783 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java
@@ -29,7 +29,7 @@
 import org.apache.lenya.cms.publication.PageEnvelopeFactory;
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.publication.Session;
-import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
 import org.apache.lenya.utils.URLInformation;
 /**
  * Abstract superclass for classes which need access to the page envelope.
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/FallbackModule.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/FallbackModule.java
index d09133f..c3ef88b 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/FallbackModule.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/FallbackModule.java
@@ -35,7 +35,7 @@
 import org.apache.lenya.cms.publication.Repository;
 import org.apache.lenya.cms.publication.Session;
 import org.apache.lenya.cms.publication.URLInformation;
-import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
 
 /**
  * <p>
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/ResourceTypeModule.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/ResourceTypeModule.java
index c80abdf..3204685 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/ResourceTypeModule.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/ResourceTypeModule.java
@@ -34,7 +34,7 @@
 import org.apache.lenya.cms.publication.ResourceType;
 import org.apache.lenya.cms.publication.ResourceTypeResolver;
 import org.apache.lenya.cms.publication.Session;
-import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
 
 /**
  * <p>
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java
index f08be25..97cca72 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java
@@ -35,7 +35,7 @@
 import org.apache.lenya.cms.publication.Session;
 import org.apache.lenya.cms.publication.URLInformation;
 import org.apache.lenya.cms.publication.templating.AllExistingSourceResolver;
-import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
 
 /**
  * <p>
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java
index d44da8b..c95fd10 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java
@@ -36,12 +36,14 @@
 import org.apache.lenya.cms.module.Module;
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.publication.Repository;
-import org.apache.lenya.cms.publication.Session;
+//florent import org.apache.lenya.cms.publication.Session;
+import org.apache.lenya.cms.repository.Session;
 import org.apache.lenya.cms.publication.URLInformation;
 import org.apache.lenya.cms.publication.templating.ExistingSourceResolver;
 import org.apache.lenya.cms.publication.templating.PublicationTemplateManager;
 import org.apache.lenya.cms.publication.templating.VisitingSourceResolver;
-import org.apache.lenya.util.ServletHelper;
+//florent import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
 
 /**
  * <p>
@@ -53,7 +55,6 @@
  * this is necessary as a workaround for bug 40564.
  * </p>
  * 
- * @version $Id$
  */
 public class FallbackSourceFactory extends AbstractLogEnabled implements SourceFactory,
         URIAbsolutizer {
@@ -156,9 +157,11 @@
     protected String getPublicationId() {
         final ProcessInfoProvider processInfo = (ProcessInfoProvider) WebAppContextUtils
                 .getCurrentWebApplicationContext().getBean(ProcessInfoProvider.ROLE);
-        HttpServletRequest request = processInfo.getRequest();
+        /*florent HttpServletRequest request = processInfo.getRequest();
         String webappUri = ServletHelper.getWebappURI(request);
-        URLInformation info = new URLInformation(webappUri);
+        URLInformation info = new URLInformation(webappUri);*/
+        HttpServletRequest request = processInfo.getRequest();
+        URLInformation info = new URLInformation();
         String pubId = null;
         try {
             Session session = this.repository.getSession(request);
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/LenyaDocSourceFactory.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/LenyaDocSourceFactory.java
index 9c6936c..d2b0bd4 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/LenyaDocSourceFactory.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/LenyaDocSourceFactory.java
@@ -38,7 +38,7 @@
 import org.apache.lenya.cms.publication.Session;
 import org.apache.lenya.cms.publication.URLInformation;
 import org.apache.lenya.cms.repository.NodeFactory;
-import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
 
 /**
  * A factory for the "lenyadoc" scheme (virtual protocol), which is used to resolve any
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/RepositorySource.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/RepositorySource.java
index 311b513..eea449b 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/RepositorySource.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/RepositorySource.java
@@ -44,15 +44,14 @@
 import org.apache.lenya.cms.publication.Document;
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.publication.Session;
-import org.apache.lenya.cms.publication.URLInformation;
 import org.apache.lenya.cms.repository.ContentHolder;
 import org.apache.lenya.cms.repository.Node;
 import org.apache.lenya.cms.repository.NodeFactory;
 import org.apache.lenya.cms.repository.RepositoryException;
 import org.apache.lenya.cms.repository.SessionHolder;
 import org.apache.lenya.util.Query;
-import org.apache.lenya.util.ServletHelper;
-
+import org.apache.lenya.utils.ServletHelper;
+import org.apache.lenya.utils.URLInformation;
 /**
  * Repository source.
  * 
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/SiteSourceFactory.java b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/SiteSourceFactory.java
index 068018a..a0dcd80 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/SiteSourceFactory.java
+++ b/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/source/SiteSourceFactory.java
@@ -37,7 +37,7 @@
 import org.apache.lenya.cms.publication.Session;
 import org.apache.lenya.cms.publication.URLInformation;
 import org.apache.lenya.cms.site.SiteStructure;
-import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
 
 /**
  * <p>
diff --git a/org.apache.lenya.core.document.api/src/main/java/org/apache/lenya/cms/publication/Document.java b/org.apache.lenya.core.document.api/src/main/java/org/apache/lenya/cms/publication/Document.java
index 6093cb0..fa1bb72 100644
--- a/org.apache.lenya.core.document.api/src/main/java/org/apache/lenya/cms/publication/Document.java
+++ b/org.apache.lenya.core.document.api/src/main/java/org/apache/lenya/cms/publication/Document.java
@@ -53,6 +53,38 @@
     String TRANSACTIONABLE_TYPE = "document";
     
     /**
+     * The meta data namespace.
+     */
+    public static final String METADATA_NAMESPACE = "http://apache.org/lenya/metadata/document/1.0";
+    
+    /**
+     * The name of the resource type attribute. A resource has a resource type; this information can
+     * be used e.g. for different rendering of different types.
+     */
+    public static final String METADATA_RESOURCE_TYPE = "resourceType";
+
+    /**
+     * The name of the mime type attribute.
+     */
+    public static final String METADATA_MIME_TYPE = "mimeType";
+
+    /**
+     * The name of the content type attribute. Any content managed by Lenya has a type; this
+     * information can be used e.g. to provide an appropriate management interface.
+     */
+    public static final String METADATA_CONTENT_TYPE = "contentType";
+
+    /**
+     * The number of seconds from the request that a document can be cached before it expires
+     */
+    public static final String METADATA_EXPIRES = "expires";
+
+    /**
+     * The extension to use for the document source.
+     */
+    public static final String METADATA_EXTENSION = "extension";
+
+    /**
      * <code>DOCUMENT_META_SUFFIX</code> The suffix for document meta Uris
      */
     final String DOCUMENT_META_SUFFIX = ".meta";
@@ -143,7 +175,7 @@
      * 
      * @return true if the document exists, false otherwise
      */
-    boolean exists();
+    boolean exists() throws DocumentException;
     
     /**
      * Check if a document exists with the given document-uuid and the given area
diff --git a/org.apache.lenya.core.document.api/src/main/java/org/apache/lenya/cms/publication/DocumentLocator.java b/org.apache.lenya.core.document.api/src/main/java/org/apache/lenya/cms/publication/DocumentLocator.java
index 7ba8914..0e22fa1 100644
--- a/org.apache.lenya.core.document.api/src/main/java/org/apache/lenya/cms/publication/DocumentLocator.java
+++ b/org.apache.lenya.core.document.api/src/main/java/org/apache/lenya/cms/publication/DocumentLocator.java
@@ -1,5 +1,10 @@
 package org.apache.lenya.cms.publication;
 
+/**
+ * A DocumentLocator describes a document based on its path in the site structure. The actual
+ * document doesn't have to exist.
+ * It helps to locate a document inside a publication
+ */
 public interface DocumentLocator {
 
 	/**
diff --git a/org.apache.lenya.core.document.impl/pom.xml b/org.apache.lenya.core.document.impl/pom.xml
index 815f03d..960751d 100644
--- a/org.apache.lenya.core.document.impl/pom.xml
+++ b/org.apache.lenya.core.document.impl/pom.xml
@@ -20,27 +20,31 @@
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-document-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-utils</artifactId>
+    </dependency>
 
-  <!-- <dependency> -->
-  <!--     <groupId>org.apache.lenya</groupId> -->
-  <!--     <artifactId>lenya-core-api</artifactId> -->
-  <!--   </dependency> -->
+   <dependency> 
+       <groupId>org.apache.lenya</groupId> 
+       <artifactId>lenya-core-publication-api</artifactId> 
+     </dependency> 
   <!--   <dependency> -->
   <!--     <groupId>org.apache.lenya</groupId> -->
   <!--     <artifactId>lenya-core-impl</artifactId> -->
   <!--   </dependency> -->
-<!--     <dependency> -->
-<!--       <groupId>org.apache.lenya</groupId> -->
-<!--       <artifactId>lenya-core-metadata</artifactId> -->
-<!--     </dependency> -->
+     <dependency> 
+       <groupId>org.apache.lenya</groupId> 
+       <artifactId>lenya-core-metadata-impl</artifactId> 
+     </dependency> 
 <!--     <dependency> -->
 <!--       <groupId>org.apache.lenya</groupId> -->
 <!--       <artifactId>lenya-core-sitemanagement</artifactId> -->
 <!--     </dependency> -->
-<!--     <dependency> -->
-<!--       <groupId>org.apache.lenya</groupId> -->
-<!--       <artifactId>lenya-core-repository-api</artifactId> -->
-<!--     </dependency> -->
+     <dependency> 
+       <groupId>org.apache.lenya</groupId> 
+       <artifactId>lenya-core-repository-api</artifactId> 
+     </dependency> 
   
 <!--    <dependency>-->
 <!--      <groupId>org.apache.cocoon</groupId>-->
diff --git a/org.apache.lenya.core.document.impl/src/main/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java b/org.apache.lenya.core.document.impl/src/main/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java
index f0d7da4..46e7446 100644
--- a/org.apache.lenya.core.document.impl/src/main/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java
+++ b/org.apache.lenya.core.document.impl/src/main/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java
@@ -30,7 +30,7 @@
 import org.apache.lenya.cms.repository.RepositoryItem;
 import org.apache.lenya.cms.repository.RepositoryItemFactory;
 import org.apache.lenya.cms.repository.SessionHolder;
-
+import org.apache.lenya.utils.URLInformation;
 /**
  * A DocumentIdentityMap avoids the multiple instanciation of a document object.
  * 
@@ -191,7 +191,8 @@
     public boolean isDocument(String webappUrl) throws ResourceNotFoundException {
         Validate.notNull(webappUrl);
         try {
-            URLInformation info = new URLInformation(webappUrl);
+            //florent URLInformation info = new URLInformation(webappUrl);
+        	URLInformation info = new URLInformation();
             String pubId = info.getPublicationId();
             String[] pubIds = getPublicationIds();
             if (pubId != null && Arrays.asList(pubIds).contains(pubId)) {
@@ -248,7 +249,8 @@
     protected DocumentLocator getLocator(String webappUrl) {
         DocumentLocator locator;
         try {
-            URLInformation info = new URLInformation(webappUrl);
+            //florent URLInformation info = new URLInformation(webappUrl);
+        	URLInformation info = new URLInformation();
             Publication publication = getPublication(info.getPublicationId());
             DocumentBuilder builder = publication.getDocumentBuilder();
             locator = builder.getLocator(this.session, webappUrl);
@@ -338,11 +340,11 @@
 
     private PublicationManager pubManager;
 
-    protected void setPublicationManager(PublicationManager pubManager) {
+    public void setPublicationManager(PublicationManager pubManager) {
         this.pubManager = pubManager;
     }
 
-    protected PublicationManager getPublicationManager() {
+    public PublicationManager getPublicationManager() {
         return this.pubManager;
     }
 
diff --git a/org.apache.lenya.core.document.impl/src/main/java/org/apache/lenya/cms/publication/DocumentImpl.java b/org.apache.lenya.core.document.impl/src/main/java/org/apache/lenya/cms/publication/DocumentImpl.java
index 3d9875d..a10cd26 100644
--- a/org.apache.lenya.core.document.impl/src/main/java/org/apache/lenya/cms/publication/DocumentImpl.java
+++ b/org.apache.lenya.core.document.impl/src/main/java/org/apache/lenya/cms/publication/DocumentImpl.java
@@ -21,9 +21,11 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 
+import org.apache.cocoon.ResourceNotFoundException;
 import org.apache.commons.lang.Validate;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -37,16 +39,18 @@
 import org.apache.lenya.cms.repository.ContentHolder;
 import org.apache.lenya.cms.repository.Node;
 import org.apache.lenya.cms.repository.NodeFactory;
+import org.apache.lenya.cms.repository.Persistable;
 import org.apache.lenya.cms.repository.RepositoryItem;
 import org.apache.lenya.cms.repository.Session;
 import org.apache.lenya.cms.repository.SessionHolder;
+import org.apache.lenya.cms.repository.RepositoryException;
+import org.apache.lenya.cms.repository.History;
 import org.apache.lenya.cms.site.Link;
 import org.apache.lenya.cms.site.SiteException;
 import org.apache.lenya.cms.site.SiteStructure;
 
 /**
  * A typical CMS document.
- * @version $Id$
  */
 public class DocumentImpl implements Document, RepositoryItem {
 
@@ -58,37 +62,38 @@
     private ResourceTypeResolver resourceTypeResolver;
     private int revision = -1;
 
+    //florent : extract propertie from document impl to document (api)
     /**
      * The meta data namespace.
      */
-    public static final String METADATA_NAMESPACE = "http://apache.org/lenya/metadata/document/1.0";
+   // public static final String METADATA_NAMESPACE = "http://apache.org/lenya/metadata/document/1.0";
 
     /**
      * The name of the resource type attribute. A resource has a resource type; this information can
      * be used e.g. for different rendering of different types.
      */
-    protected static final String METADATA_RESOURCE_TYPE = "resourceType";
+    //protected static final String METADATA_RESOURCE_TYPE = "resourceType";
 
     /**
      * The name of the mime type attribute.
      */
-    protected static final String METADATA_MIME_TYPE = "mimeType";
+    //protected static final String METADATA_MIME_TYPE = "mimeType";
 
     /**
      * The name of the content type attribute. Any content managed by Lenya has a type; this
      * information can be used e.g. to provide an appropriate management interface.
      */
-    protected static final String METADATA_CONTENT_TYPE = "contentType";
+    //protected static final String METADATA_CONTENT_TYPE = "contentType";
 
     /**
      * The number of seconds from the request that a document can be cached before it expires
      */
-    protected static final String METADATA_EXPIRES = "expires";
+    //protected static final String METADATA_EXPIRES = "expires";
 
     /**
      * The extension to use for the document source.
      */
-    protected static final String METADATA_EXTENSION = "extension";
+    //protected static final String METADATA_EXTENSION = "extension";
 
     /**
      * Creates a new instance of DefaultDocument.
@@ -98,7 +103,7 @@
      */
     protected DocumentImpl(org.apache.lenya.cms.publication.Session session,
             DocumentIdentifier identifier, int revision) {
-
+    	
         if (logger.isDebugEnabled()) {
             logger.debug("DefaultDocument() creating new instance with id [" + identifier.getUUID()
                     + "], language [" + identifier.getLanguage() + "]");
@@ -275,17 +280,15 @@
         this.extension = _extension;
     }
 
-    public boolean exists() throws ResourceNotFoundException {
+    public boolean exists()throws DocumentException{
         try {
             return getRepositoryNode().exists();
         } catch (org.apache.lenya.cms.repository.RepositoryException e) {
-            throw new ResourceNotFoundException(e);
+        	throw new DocumentException(e);
         }
     }
 
-  //florent : seems never use, imply cyclic dependencies
-    /*
-    public boolean existsInAnyLanguage() throws ResourceNotFoundException {
+    public boolean existsInAnyLanguage() {
         String[] languages = getLanguages();
 
         if (languages.length > 0) {
@@ -311,7 +314,7 @@
             return false;
         }
 
-    }*/
+    }
 
     public DocumentIdentifier getIdentifier() {
         return this.identifier;
@@ -420,7 +423,7 @@
         MetaData meta;
         try {
             meta = new MetaDataWrapper(getContentHolder().getMetaData(namespaceUri));
-        } catch (org.apache.lenya.cms.repository.metadata.MetaDataException e) {
+        } catch (org.apache.lenya.cms.metadata.MetaDataException e) {
             throw new MetaDataException(e);
         }
         if (getRepositorySession().isModifiable()) {
@@ -439,7 +442,7 @@
     public String[] getMetaDataNamespaceUris() throws MetaDataException {
         try {
             return getContentHolder().getMetaDataNamespaceUris();
-        } catch (org.apache.lenya.cms.repository.metadata.MetaDataException e) {
+        } catch (org.apache.lenya.cms.metadata.MetaDataException e) {
             throw new MetaDataException(e);
         }
     }
@@ -480,7 +483,7 @@
                     + "] is not referenced in the site structure.");
         }
         try {
-            return DocumentLocator.getLocator(getPublication().getId(), getArea(), structure
+            return DocumentLocatorImpl.getLocator(getPublication().getId(), getArea(), structure
                     .getByUuid(getUUID(), getLanguage()).getNode().getPath(), getLanguage());
         } catch (SiteException e) {
             throw new RuntimeException(e);
@@ -490,9 +493,7 @@
     public String getPath() throws DocumentException {
         return getLink().getNode().getPath();
     }
-
-  //florent : seems never use, imply cyclic dependencies
-    /*
+    
     public boolean existsAreaVersion(String area) {
         String sourceUri = getSourceURI(getPublication(), area, getUUID(), getLanguage());
         try {
@@ -500,17 +501,15 @@
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
-    }*/
+    }
 
     public boolean existsTranslation(String language) {
         return area().contains(getUUID(), language);
     }
 
-  //florent : seems never use, imply cyclic dependencies
-    /*
     public Document getAreaVersion(String area) throws ResourceNotFoundException {
         return getPublication().getArea(area).getDocument(getUUID(), getLanguage());
-    }*/
+    }
 
     public Document getTranslation(String language) throws ResourceNotFoundException {
         return area().getDocument(getUUID(), language);
@@ -561,8 +560,7 @@
         return pub.getContentUri(area) + "/" + path;
     }
 
-  //florent : seems never use, imply cyclic dependencies
-    /*
+    
     public boolean existsVersion(String area, String language) {
         String sourceUri = getSourceURI(getPublication(), area, getUUID(), language);
         try {
@@ -570,7 +568,7 @@
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
-    }*/
+    }
 
     public Document getVersion(String area, String language) throws ResourceNotFoundException {
         return getPublication().getArea(area).getDocument(getUUID(), language);
@@ -594,11 +592,9 @@
         return area().getSite().containsByUuid(getUUID(), getLanguage());
     }
 
-  //florent : seems never use, imply cyclic dependencies
-    /*
     public Area area() {
         return getPublication().getArea(getArea());
-    }*/
+    }
 
     public void setResourceType(ResourceType resourceType) {
         Validate.notNull(resourceType);
@@ -751,7 +747,8 @@
 
     public History getHistory() {
         if (this.history == null) {
-            this.history = new HistoryWrapper(getRepositoryNode().getHistory());
+            //florent : wrapper not still usefull this.history = new HistoryWrapper(getRepositoryNode().getHistory());
+        	this.history = getRepositoryNode().getHistory();
         }
         return this.history;
     }
@@ -761,8 +758,13 @@
         return false;
     }
 
-    public Document getRevision(int i) {
+    public Document getRevision(int i) throws RepositoryException{
+    	try{
         return area().getDocument(getUUID(), getLanguage(), i);
+    	}
+    	catch (ResourceNotFoundException rnfe){
+    		throw new RepositoryException(rnfe);
+    	}
     }
 
     public void forceCheckIn() throws RepositoryException {
@@ -793,4 +795,39 @@
         this.resourceTypeResolver = resourceTypeResolver;
     }
 
+    /*** BEGIN unimplemented methods **/
+    //Florent : 
+    //This methods come from the remove of o.a.l.cms.publication.Node and the use of o.a.l.cms.repository.Node
+    
+		public boolean isCollection() throws RepositoryException {
+			// TODO Auto-generated method stub
+			return false;
+		}
+
+		public Collection getChildren() throws RepositoryException {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		public void copyRevisionsFrom(Node source) throws RepositoryException {
+			// TODO Auto-generated method stub
+			
+		}
+
+		public void registerRemoved() throws RepositoryException {
+			// TODO Auto-generated method stub
+			
+		}
+
+		public void setPersistable(Persistable persistable)
+				throws RepositoryException {
+			// TODO Auto-generated method stub
+			
+		}
+
+		public Persistable getPersistable() {
+			// TODO Auto-generated method stub
+			return null;
+		}
+		/*** END unimplemented methods **/
 }
\ No newline at end of file
diff --git a/org.apache.lenya.core.document.impl/src/main/java/org/apache/lenya/cms/publication/DocumentLocatorImpl.java b/org.apache.lenya.core.document.impl/src/main/java/org/apache/lenya/cms/publication/DocumentLocatorImpl.java
index 5ab00f9..fb81b09 100644
--- a/org.apache.lenya.core.document.impl/src/main/java/org/apache/lenya/cms/publication/DocumentLocatorImpl.java
+++ b/org.apache.lenya.core.document.impl/src/main/java/org/apache/lenya/cms/publication/DocumentLocatorImpl.java
@@ -24,6 +24,7 @@
 /**
  * A DocumentLocator describes a document based on its path in the site structure. The actual
  * document doesn't have to exist.
+ * It helps to locate a document inside a publication
  */
 public class DocumentLocatorImpl implements DocumentLocator {
 
@@ -38,7 +39,7 @@
      * @return A document locator.
      */
     public static DocumentLocator getLocator(String pubId, String area, String path, String language) {
-        String key = DocumentLocator.getKey(pubId, area, path, language);
+        String key = getKey(pubId, area, path, language);
         DocumentLocator locator = (DocumentLocator) locators.get(key);
         if (locator == null) {
             locator = new DocumentLocatorImpl(pubId, area, path, language);
@@ -98,7 +99,7 @@
      * @return A document locator.
      */
     public DocumentLocator getPathVersion(String path) {
-        return DocumentLocator.getLocator(getPublicationId(), getArea(), path, getLanguage());
+        return getLocator(getPublicationId(), getArea(), path, getLanguage());
     }
 
     /**
@@ -164,18 +165,18 @@
      * @return A document locator.
      */
     public DocumentLocator getLanguageVersion(String language) {
-        return DocumentLocator.getLocator(getPublicationId(), getArea(), getPath(), language);
+        return getLocator(getPublicationId(), getArea(), getPath(), language);
     }
 
     protected String getKey() {
-        return DocumentLocator.getKey(getPublicationId(), getArea(), getPath(), getLanguage());
+        return getKey(getPublicationId(), getArea(), getPath(), getLanguage());
     }
 
     public boolean equals(Object obj) {
         if (!(obj instanceof DocumentLocator)) {
             return false;
         }
-        DocumentLocator locator = (DocumentLocator) obj;
+        DocumentLocatorImpl locator = (DocumentLocatorImpl) obj;
         return locator.getKey().equals(getKey());
     }
 
@@ -194,7 +195,7 @@
      * @return A document locator.
      */
     public DocumentLocator getAreaVersion(String area) {
-        return DocumentLocator.getLocator(getPublicationId(), area, getPath(), getLanguage());
+        return getLocator(getPublicationId(), area, getPath(), getLanguage());
     }
 
     /*
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/AccessControlException.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/AccessControlException.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/AccessControlException.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/AccessControlException.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Accreditable.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Accreditable.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Accreditable.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Accreditable.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/AccreditableManager.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/AccreditableManager.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/AccreditableManager.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/AccreditableManager.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Group.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Group.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Group.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Group.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/GroupManager.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/GroupManager.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/GroupManager.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/GroupManager.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Groupable.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Groupable.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Groupable.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Groupable.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/IPRange.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/IPRange.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/IPRange.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/IPRange.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/IPRangeManager.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/IPRangeManager.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/IPRangeManager.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/IPRangeManager.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Identifiable.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Identifiable.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Identifiable.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Identifiable.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Identity.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Identity.java
similarity index 97%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Identity.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Identity.java
index 4bbc4c8..1778465 100644
--- a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Identity.java
+++ b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Identity.java
@@ -169,7 +169,14 @@
         }
         return user;
     }
-
+    
+    /**
+     * return the string representation of the user
+     */
+    public String getUserId(){
+    	User user = getUser();
+    	return user.getId();
+    }
     /**
      * Returns the machine of this identity.
      * @return A machine.
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Item.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Item.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Item.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Item.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/ItemManager.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/ItemManager.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/ItemManager.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/ItemManager.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/ItemManagerListener.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/ItemManagerListener.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/ItemManagerListener.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/ItemManagerListener.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Machine.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Machine.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Machine.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Machine.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Role.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Role.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/Role.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/Role.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/RoleManager.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/RoleManager.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/RoleManager.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/RoleManager.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/User.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/User.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/User.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/User.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/UserManager.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/UserManager.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/UserManager.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/UserManager.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/UserType.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/UserType.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/UserType.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/UserType.java
diff --git a/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/World.java b/org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/World.java
similarity index 100%
rename from org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/World.java
rename to org.apache.lenya.core.identity/src/main/java/org/apache/lenya/ac/World.java
diff --git a/org.apache.lenya.core.impl/pom.xml b/org.apache.lenya.core.impl/pom.xml
index 69a5c84..ae73201 100644
--- a/org.apache.lenya.core.impl/pom.xml
+++ b/org.apache.lenya.core.impl/pom.xml
@@ -15,6 +15,16 @@
   <packaging>jar</packaging>
   <name>Apache Lenya Core Implementation</name>
   
+    <build>
+     <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>true</filtering>
+      </resource>
+    </resources>
+  </build>
+  
+  
   <dependencies>
     <dependency>
       <groupId>javax.servlet</groupId>
@@ -33,23 +43,11 @@
       <artifactId>lenya-core-api</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-observation</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-repository</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-utils</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.excalibur.components</groupId>
       <artifactId>excalibur-sourceresolve</artifactId>
       <version>2.2.3</version>
     </dependency>
+    
     <!-- for tests -->
     <dependency>
       <groupId>junit</groupId>
@@ -76,46 +74,6 @@
       <scope>test</scope>
       <type>test-jar</type>
     </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-ac</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-impl</artifactId>
-    </dependency>
-    
-    <!-- FIXME: maybe the tests can be organized with less dependencies -->
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-module-sitetree</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-module-sourcerepository</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-module-xhtml</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-module-links</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-module-opendocument</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-module-cforms</artifactId>
-      <scope>runtime</scope>
-    </dependency>
+
   </dependencies>
 </project>
diff --git a/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/util/ServletHelper.java b/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/util/ServletHelper.java
deleted file mode 100644
index 1148f20..0000000
--- a/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/util/ServletHelper.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-/* $Id$  */
-
-package org.apache.lenya.util;
-
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-
-import org.apache.cocoon.environment.Request;
-import org.apache.cocoon.spring.configurator.WebAppContextUtils;
-import org.apache.excalibur.source.SourceNotFoundException;
-import org.apache.excalibur.source.SourceResolver;
-import org.apache.lenya.cms.cocoon.source.SourceUtil;
-import org.apache.xpath.XPathAPI;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
-
-/**
- * Servlet utility class
- * 
- * @deprecated use org.apache.lenya.utils.ServletHelper instead because 
- * this class return the current servlet and with the C2.2 servlet protocol, we don't retrieve the "main" servlet (associated to the browser url)
- *  but the servlet generated by the servlet protocol.
- * we may have to build a servletHelper that allow to navigate throw the servlet stack and have information on each servlet. 
- * .
- */
-public final class ServletHelper {
-
-    /**
-     * Ctor.
-     */
-    private ServletHelper() {
-        // do nothing
-    }
-
-    /**
-     * Returns the URL inside the web application (without the context prefix).
-     * @param request The request.
-     * @return A string.
-     */
-    public static String getWebappURI(HttpServletRequest request) {
-        String context = request.getContextPath();
-        String requestUri = request.getRequestURI();
-        return getWebappURI(context, requestUri);
-    }
-
-    /**
-     * Returns the URL inside the web application (without the context prefix).
-     * @param request The request.
-     * @return A string.
-     */
-    public static String getWebappURI(Request request) {
-        String context = request.getContextPath();
-        String requestUri = request.getRequestURI();
-        return getWebappURI(context, requestUri);
-    }
-
-    /**
-     * Returns the URL inside the web application (without the context prefix).
-     * @param context The context prefix.
-     * @param requestUri The complete request URI.
-     * @return A string.
-     */
-    public static String getWebappURI(String context, String requestUri) {
-        
-        if (context == null) {
-            context = "";
-        }
-        String url = requestUri.substring(context.length());
-        if (url.length() > 0 && !url.startsWith("/")) {
-            url = "/" + url;
-        }
-        return url;
-        
-    }
-
-    /**
-     * Converts the request parameters to a map. If a key is mapped to multiple parameters, a string
-     * array is used as the value.
-     * @param request The request.
-     * @return A map.
-     */
-    public static Map getParameterMap(Request request) {
-        Map requestParameters = new HashMap();
-        for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
-            String key = (String) e.nextElement();
-            String[] values = request.getParameterValues(key);
-            Object value;
-            if (values.length == 1) {
-                value = values[0];
-            } else {
-                value = values;
-            }
-            requestParameters.put(key, value);
-        }
-        return requestParameters;
-    }
-
-    private static Boolean uploadEnabled = null;
-
-    /**
-     * Returns the value of enable-uploads in web.xml
-     * @return true if enable upload is true or not set in web.xml, else false
-     */
-    public static synchronized boolean isUploadEnabled() throws SourceNotFoundException,
-            ParserConfigurationException, SAXException, IOException, TransformerException {
-
-        if (ServletHelper.uploadEnabled == null) {
-
-            Node node;
-            String webappUrl = "context://WEB-INF/web.xml";
-            SourceResolver resolver = (SourceResolver) WebAppContextUtils
-                    .getCurrentWebApplicationContext().getBean(SourceResolver.ROLE);
-            Document document = SourceUtil.readDOM(webappUrl, resolver);
-            Element root = document.getDocumentElement();
-            node = XPathAPI.selectSingleNode(root,
-                    "/web-app/servlet/init-param[param-name='enable-uploads']/param-value/text()");
-
-            if (node == null) {
-                ServletHelper.uploadEnabled = Boolean.FALSE;
-            } else {
-                boolean enabled = node.getNodeValue().equals("true");
-                ServletHelper.uploadEnabled = Boolean.valueOf(enabled);
-            }
-        }
-        return ServletHelper.uploadEnabled.booleanValue();
-    }
-}
diff --git a/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/xml/Schema.java b/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/xml/SchemaImpl.java
similarity index 95%
rename from org.apache.lenya.core.impl/src/main/java/org/apache/lenya/xml/Schema.java
rename to org.apache.lenya.core.impl/src/main/java/org/apache/lenya/xml/SchemaImpl.java
index 386ca01..2271594 100644
--- a/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/xml/Schema.java
+++ b/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/xml/SchemaImpl.java
@@ -37,7 +37,7 @@
 /**
  * Validation schema.
  */
-public class Schema {
+public class SchemaImpl implements Schema {
 
     /**
      * Ctor.
@@ -46,7 +46,7 @@
      * @param schemaUri The schema URI.
      * @see org.apache.cocoon.components.validation.Validator
      */
-    public Schema(String language, String schemaUri) {
+    public SchemaImpl(String language, String schemaUri) {
         this.language = language;
         this.uri = schemaUri;
     }
diff --git a/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/xml/ValidationUtil.java b/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/xml/ValidationUtil.java
index fc54155..6463e69 100644
--- a/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/xml/ValidationUtil.java
+++ b/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/xml/ValidationUtil.java
@@ -26,7 +26,6 @@
 import org.apache.cocoon.components.validation.Validator;
 import org.apache.cocoon.spring.configurator.WebAppContextUtils;
 import org.apache.cocoon.xml.dom.DOMStreamer;
-import org.apache.lenya.cms.publication.Document;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.ErrorHandler;
 
@@ -40,11 +39,13 @@
      * @param handler The SAX error handler.
      * @throws Exception if an error occurs.
      */
+	/* never used
     public static void validate(Document document, ErrorHandler handler) throws Exception {
         org.w3c.dom.Document xmlDoc = DocumentHelper.readDocument(document.getInputStream());
         validate(xmlDoc, document.getResourceType().getSchema(), handler);
 
     }
+    */
 
     /**
      * @param xmlDoc The XML document.
diff --git a/org.apache.lenya.core.impl/src/main/resources/META-INF/cocoon/spring/lenya-core-impl-components.xml b/org.apache.lenya.core.impl/src/main/resources/META-INF/cocoon/spring/lenya-core-impl-components.xml
index 01ccaf7..8208c89 100644
--- a/org.apache.lenya.core.impl/src/main/resources/META-INF/cocoon/spring/lenya-core-impl-components.xml
+++ b/org.apache.lenya.core.impl/src/main/resources/META-INF/cocoon/spring/lenya-core-impl-components.xml
@@ -21,6 +21,23 @@
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
   http://cocoon.apache.org/schema/configurator http://cocoon.apache.org/schema/configurator/cocoon-configurator-1.0.1.xsd">
   
+  <bean name="org.apache.lenya.cms.publication.PublicationManager"
+    class="org.apache.lenya.cms.publication.PublicationManagerImpl">
+    <property name="nodeFactory" ref="org.apache.lenya.cms.repository.NodeFactory"/>
+    <property name="sourceResolver" ref="org.apache.excalibur.source.SourceResolver"/>
+    <property name="pubBaseUri" value="file://${lenya.home}/pubs"/>
+  </bean>
+  
+  <bean name="org.apache.lenya.cms.publication.DocumentFactoryBuilder"
+    class="org.apache.lenya.cms.publication.DocumentFactoryBuilderImpl">
+    <property name="publicationManager" ref="org.apache.lenya.cms.publication.PublicationManager"/>
+    <property name="metaDataCache" ref="org.apache.lenya.cms.metadata.MetaDataCache"/>
+    <property name="sourceResolver" ref="org.apache.excalibur.source.SourceResolver"/>
+    <property name="nodeFactory" ref="org.apache.lenya.cms.repository.NodeFactory"/>
+    <property name="resourceTypeResolver"
+      ref="org.apache.lenya.cms.publication.ResourceTypeResolver"/>
+  </bean>
+  
   <bean name="org.apache.lenya.cms.publication.Repository"
     class="org.apache.lenya.cms.publication.RepositoryImpl">
     <property name="repositoryManager" ref="org.apache.lenya.cms.repository.RepositoryManager"/>
@@ -35,12 +52,7 @@
     <property name="sharedItemStore" ref="org.apache.lenya.cms.repository.SharedItemStore"/>
   </bean>
 
-  <bean name="org.apache.lenya.cms.publication.PublicationManager"
-    class="org.apache.lenya.cms.publication.PublicationManagerImpl">
-    <property name="nodeFactory" ref="org.apache.lenya.cms.repository.NodeFactory"/>
-    <property name="sourceResolver" ref="org.apache.excalibur.source.SourceResolver"/>
-    <property name="pubBaseUri" value="file://${lenya.home}/pubs"/>
-  </bean>
+  
 
   <bean name="org.apache.lenya.cms.metadata.MetaDataRegistry"
     class="org.apache.lenya.cms.metadata.MetaDataRegistryWrapper">
@@ -51,15 +63,7 @@
   <bean name="org.apache.lenya.cms.metadata.MetaDataCache"
     class="org.apache.lenya.cms.metadata.MetaDataCache"/>
 
-  <bean name="org.apache.lenya.cms.publication.DocumentFactoryBuilder"
-    class="org.apache.lenya.cms.publication.DocumentFactoryBuilderImpl">
-    <property name="publicationManager" ref="org.apache.lenya.cms.publication.PublicationManager"/>
-    <property name="metaDataCache" ref="org.apache.lenya.cms.metadata.MetaDataCache"/>
-    <property name="sourceResolver" ref="org.apache.excalibur.source.SourceResolver"/>
-    <property name="nodeFactory" ref="org.apache.lenya.cms.repository.NodeFactory"/>
-    <property name="resourceTypeResolver"
-      ref="org.apache.lenya.cms.publication.ResourceTypeResolver"/>
-  </bean>
+  
 
   <bean name="org.apache.lenya.cms.publication.ResourceTypeResolver"
     class="org.apache.lenya.cms.publication.ResourceTypeResolverImpl"/>
diff --git a/org.apache.lenya.core.impl/src/test/resources/test-components.xml b/org.apache.lenya.core.impl/src/test/resources/test-components.xml
index a09f8f0..d3438aa 100644
--- a/org.apache.lenya.core.impl/src/test/resources/test-components.xml
+++ b/org.apache.lenya.core.impl/src/test/resources/test-components.xml
@@ -26,12 +26,9 @@
   <import resource="classpath:META-INF/cocoon/spring/lenya-core-observation-components.xml"/>
   <import resource="classpath:META-INF/cocoon/spring/lenya-core-repository-components.xml"/>
   <import resource="classpath:META-INF/cocoon/spring/lenya-core-resourcetype-components.xml"/>
-  <import resource="classpath:META-INF/cocoon/spring/lenya-module-cforms-components.xml"/>
-  <import resource="classpath:META-INF/cocoon/spring/lenya-module-links-components.xml"/>
-  <import resource="classpath:META-INF/cocoon/spring/lenya-module-opendocument-components.xml"/>
+<!--  <import resource="classpath:META-INF/cocoon/spring/lenya-module-opendocument-components.xml"/>-->
   <import resource="classpath:META-INF/cocoon/spring/lenya-module-sitetree-components.xml"/>
   <import resource="classpath:META-INF/cocoon/spring/lenya-module-sourcerepository-components.xml"/>
-  <import resource="classpath:META-INF/cocoon/spring/lenya-module-xhtml-components.xml"/>
   <import resource="classpath:META-INF/cocoon/spring/cocoon-xml-impl.xml"/>
   
 </beans>
diff --git a/org.apache.lenya.core.janitor/pom.xml b/org.apache.lenya.core.janitor/pom.xml
index d293000..b7158c0 100644
--- a/org.apache.lenya.core.janitor/pom.xml
+++ b/org.apache.lenya.core.janitor/pom.xml
@@ -25,7 +25,27 @@
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-repository</artifactId>
+      <artifactId>lenya-core-repository-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-repository-impl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-publication-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-observation</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-document-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-utils</artifactId>
     </dependency>
   </dependencies>
 </project>
diff --git a/org.apache.lenya.core.janitor/src/main/java/org/apache/lenya/cms/janitor/ContentJanitor.java b/org.apache.lenya.core.janitor/src/main/java/org/apache/lenya/cms/janitor/ContentJanitor.java
index e699daf..dc94149 100644
--- a/org.apache.lenya.core.janitor/src/main/java/org/apache/lenya/cms/janitor/ContentJanitor.java
+++ b/org.apache.lenya.core.janitor/src/main/java/org/apache/lenya/cms/janitor/ContentJanitor.java
@@ -28,7 +28,8 @@
 import org.apache.lenya.cms.publication.DocumentIdentifier;
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.publication.Repository;
-import org.apache.lenya.cms.publication.Session;
+//import org.apache.lenya.cms.publication.Session;
+import org.apache.lenya.cms.repository.Session;
 
 /**
  * The content janitor cleans up empty directories after a document is removed.
diff --git a/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/UuidToUrlModule.java b/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/UuidToUrlModule.java
index ce2522a..30d51a0 100644
--- a/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/UuidToUrlModule.java
+++ b/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/UuidToUrlModule.java
@@ -30,7 +30,7 @@
 import org.apache.lenya.cms.publication.Session;
 //import org.apache.lenya.util.ServletHelper;
 import org.apache.lenya.utils.ServletHelper;
-
+import org.apache.lenya.utils.URLInformation;
 /**
  * Transform lenya-document: URLs to web application URLs.
  * @see UuidToUrlRewriter
diff --git a/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/cocoon/transformation/UrlToUuidTransformer.java b/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/cocoon/transformation/UrlToUuidTransformer.java
index 7d79fd3..d6c313a 100644
--- a/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/cocoon/transformation/UrlToUuidTransformer.java
+++ b/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/cocoon/transformation/UrlToUuidTransformer.java
@@ -30,6 +30,7 @@
 import org.apache.lenya.cms.linking.UrlToUuidRewriter;
 import org.apache.lenya.cms.publication.Repository;
 import org.apache.lenya.cms.publication.Session;
+
 import org.xml.sax.SAXException;
 
 /**
diff --git a/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/LinkConverter.java b/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/LinkConverter.java
index 38f0836..4b75eaa 100644
--- a/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/LinkConverter.java
+++ b/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/LinkConverter.java
@@ -49,9 +49,13 @@
      * @param doc The document to convert.
      * @param useContextPath If the request's context path should be considered.
      */
-    public void convertUrlsToUuids(Document doc, boolean useContextPath) {
+    /*Florent : remove because document.getPublication create a cyclic dependency between document and publication
+     * use usecase.getpublicationId in the next method
+     * TODO : remove comment when ok
+     */
+    /*public void convertUrlsToUuids(Document doc, boolean useContextPath) {
         convertUrlsToUuids(doc.getPublication(), doc, useContextPath);
-    }
+    }*/
 
     /**
      * Converts all URL-based links to UUID-based links. The link URLs can originate from a
@@ -76,10 +80,13 @@
                             "Convert links: No XPaths for resource type [" + type.getName() + "]");
                 }
             } else {
-                Publication pub = examinedDocument.getPublication();
-                LinkRewriter incomingRewriter = new IncomingLinkRewriter(pub);
-                LinkRewriter urlToUuidRewriter = new UrlToUuidRewriter(examinedDocument
-                        .getSession());
+                //florent : remove cause of cyclic dependency document - publication
+            		//Publication pub = examinedDocument.getPublication();
+            		//LinkRewriter incomingRewriter = new IncomingLinkRewriter(pub);
+            	LinkRewriter incomingRewriter = new IncomingLinkRewriter(srcPub);
+                //florent : session is not still accessible throw document, so use publication instead
+            	//LinkRewriter urlToUuidRewriter = new UrlToUuidRewriter(examinedDocument.getSession());
+            	LinkRewriter urlToUuidRewriter = new UrlToUuidRewriter(srcPub.getSession());
 
                 org.w3c.dom.Document xml = DocumentHelper.readDocument(examinedDocument
                         .getInputStream());
@@ -111,8 +118,12 @@
                         }
                         final String srcPubPrefix = "/" + srcPub.getId() + "/";
                         if (srcPubUrl.startsWith(srcPubPrefix)) {
-                            final String destPubUrl = "/" + pub.getId() + "/"
-                                    + srcPubUrl.substring(srcPubPrefix.length());
+                            //florent : modification cause pub was remplaced by srcpub at the function beginning
+                        		//check concequences of this modification
+                        		// final String destPubUrl = "/" + pub.getId() + "/"
+                            //        + srcPubUrl.substring(srcPubPrefix.length());
+                        	final String destPubUrl = "/" + srcPub.getId() + "/"
+                                  + srcPubUrl.substring(srcPubPrefix.length());
                             if (urlToUuidRewriter.matches(destPubUrl)) {
                                 String rewrittenUrl = urlToUuidRewriter.rewrite(destPubUrl);
                                 attribute.setValue(rewrittenUrl);
diff --git a/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/LinkResolver.java b/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/LinkResolver.java
index b9d8e3d..756a28e 100644
--- a/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/LinkResolver.java
+++ b/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/LinkResolver.java
@@ -21,7 +21,7 @@
 
 import org.apache.lenya.cms.publication.Document;
 import org.apache.lenya.cms.publication.Session;
-
+import org.apache.lenya.cms.linking.LinkTarget;
 /**
  * <p>
  * Resolve a link from a document to another document using it's
@@ -88,8 +88,12 @@
      * @return A link target.
      * @throws MalformedURLException if the URI is invalid.
      */
-    LinkTarget resolve(Document currentDocument, String linkUri) throws MalformedURLException;
-
+  //florent : change the method signature by adding a session attribute because document don't still handle his session
+    //TODO : see if session have to be inside the implementation of linkTarget
+    //TODO :  remove comments when ok
+    //LinkTarget resolve(Document currentDocument, String linkUri) throws MalformedURLException;
+    LinkTarget resolve(Session session, Document currentDocument, String linkUri) throws MalformedURLException;
+    
     /**
      * Resolve a link. The link URI has to contain the UUID, language, area and publication ID.
      * @param session The session to use.
diff --git a/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/LinkResolverImpl.java b/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/LinkResolverImpl.java
index 01c0eb2..8a82b15 100644
--- a/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/LinkResolverImpl.java
+++ b/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/LinkResolverImpl.java
@@ -22,6 +22,7 @@
 import org.apache.avalon.framework.configuration.Configurable;
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.cocoon.ResourceNotFoundException;
 import org.apache.cocoon.util.AbstractLogEnabled;
 import org.apache.lenya.cms.publication.Area;
 import org.apache.lenya.cms.publication.Document;
@@ -38,8 +39,8 @@
      */
     public static final String ROLE = LinkResolverImpl.class.getName();
 
-    //TODO : florent : change the method signature by adding a session attribute because document don't still handle his session
-    // remove comments when ok
+    //florent : change the method signature by adding a session attribute because document don't still handle his session
+    //TODO :  remove comments when ok
     public LinkTarget resolve(Session session, Document currentDoc, String linkUri) throws MalformedURLException {
 
         Link link = new Link(linkUri);
@@ -123,13 +124,21 @@
         Area areaObj = pub.getArea(area);
         Document doc;
         if (areaObj.contains(uuid, language)) {
-            doc = areaObj.getDocument(uuid, language);
+            try {
+							doc = areaObj.getDocument(uuid, language);
+						} catch (ResourceNotFoundException e) {
+								throw new RuntimeException(e);
+						}
         } else {
             if (this.fallbackMode == MODE_FAIL) {
                 doc = null;
             } else if (this.fallbackMode == MODE_DEFAULT_LANGUAGE) {
                 if (areaObj.contains(uuid, pub.getDefaultLanguage())) {
-                    doc = pub.getArea(area).getDocument(uuid, pub.getDefaultLanguage(), revision);
+                    try {
+											doc = pub.getArea(area).getDocument(uuid, pub.getDefaultLanguage(), revision);
+										} catch (ResourceNotFoundException e) {
+												throw new RuntimeException(e);
+										}
                 } else {
                     doc = null;
                 }
diff --git a/org.apache.lenya.core.metadata.api/src/main/java/org/apache/lenya/cms/metadata/MetaDataRegistry.java b/org.apache.lenya.core.metadata.api/src/main/java/org/apache/lenya/cms/metadata/MetaDataRegistry.java
index db06f2a..dbe489e 100644
--- a/org.apache.lenya.core.metadata.api/src/main/java/org/apache/lenya/cms/metadata/MetaDataRegistry.java
+++ b/org.apache.lenya.core.metadata.api/src/main/java/org/apache/lenya/cms/metadata/MetaDataRegistry.java
@@ -17,6 +17,7 @@
  */
 package org.apache.lenya.cms.metadata;
 
+
 /**
  * Meta data registry.
  */
@@ -43,6 +44,14 @@
     boolean isRegistered(String namespaceUri) throws MetaDataException;
     
     /**
+     * Register an element set.
+     * @param namespaceUri The namespace URI.
+     * @param elementSet The element set.
+     * @throws MetaDataException if a set is already registered for this name.
+     */
+    void register(String namespaceUri, ElementSet elementSet) throws MetaDataException;
+    
+    /**
      * @return The registered namespace URIs.
      * @throws MetaDataException if an error occurs.
      */
diff --git a/org.apache.lenya.core.metadata.cocoon/pom.xml b/org.apache.lenya.core.metadata.cocoon/pom.xml
new file mode 100644
index 0000000..f7be9be
--- /dev/null
+++ b/org.apache.lenya.core.metadata.cocoon/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.lenya</groupId>
+    <artifactId>lenya-parent</artifactId>
+    <version>2.2.0-SNAPSHOT</version>
+    <relativePath>../org.apache.lenya.parent/pom.xml</relativePath>
+  </parent>
+  
+  <groupId>org.apache.lenya</groupId>
+  <artifactId>lenya-core-metadata-cocoon</artifactId>
+  <packaging>jar</packaging>
+  <name>Apache Lenya metadata cocoon</name>
+  <description>Manipulate metadatas with cocoon</description>
+  
+  <dependencies>
+  
+  <!-- TODO : see if all theses dependencies are required -->
+    <dependency>
+      <groupId>org.apache.cocoon</groupId>
+      <artifactId>cocoon-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cocoon</groupId>
+      <artifactId>cocoon-servlet-service-components</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cocoon</groupId>
+      <artifactId>cocoon-template-impl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cocoon</groupId>
+      <artifactId>cocoon-flowscript-impl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>servlet-api</artifactId>
+      <version>2.4</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/org.apache.lenya.core.metadata.cocoon/rcl.properties b/org.apache.lenya.core.metadata.cocoon/rcl.properties
new file mode 100644
index 0000000..ee8985e
--- /dev/null
+++ b/org.apache.lenya.core.metadata.cocoon/rcl.properties
@@ -0,0 +1,17 @@
+#
+# 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.
+#
+org.apache.lenya.lenya-core-metadata-cocoon.service%classes-dir=./target/classes
diff --git a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/MetaDataModule.java b/org.apache.lenya.core.metadata.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/MetaDataModule.java
similarity index 100%
rename from org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/MetaDataModule.java
rename to org.apache.lenya.core.metadata.cocoon/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/MetaDataModule.java
diff --git a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/modules/metadata/ChangeMetaData.java b/org.apache.lenya.core.metadata.cocoon/src/main/java/org/apache/lenya/modules/metadata/ChangeMetaData.java
similarity index 100%
rename from org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/modules/metadata/ChangeMetaData.java
rename to org.apache.lenya.core.metadata.cocoon/src/main/java/org/apache/lenya/modules/metadata/ChangeMetaData.java
diff --git a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/modules/metadata/LenyaMetaDataGenerator.java b/org.apache.lenya.core.metadata.cocoon/src/main/java/org/apache/lenya/modules/metadata/LenyaMetaDataGenerator.java
similarity index 100%
rename from org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/modules/metadata/LenyaMetaDataGenerator.java
rename to org.apache.lenya.core.metadata.cocoon/src/main/java/org/apache/lenya/modules/metadata/LenyaMetaDataGenerator.java
diff --git a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/modules/metadata/MetaDataTransformer.java b/org.apache.lenya.core.metadata.cocoon/src/main/java/org/apache/lenya/modules/metadata/MetaDataTransformer.java
similarity index 100%
rename from org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/modules/metadata/MetaDataTransformer.java
rename to org.apache.lenya.core.metadata.cocoon/src/main/java/org/apache/lenya/modules/metadata/MetaDataTransformer.java
diff --git a/org.apache.lenya.core.metadata.impl/pom.xml b/org.apache.lenya.core.metadata.impl/pom.xml
index f83a0ed..8f2a8bd 100644
--- a/org.apache.lenya.core.metadata.impl/pom.xml
+++ b/org.apache.lenya.core.metadata.impl/pom.xml
@@ -19,17 +19,44 @@
       <groupId>javax.servlet</groupId>
       <artifactId>servlet-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.avalon.framework</groupId>
-      <artifactId>avalon-framework-api</artifactId>
-    </dependency>
+<!--    <dependency>-->
+<!--      <groupId>org.apache.avalon.framework</groupId>-->
+<!--      <artifactId>avalon-framework-api</artifactId>-->
+<!--    </dependency>-->
     
     <!-- Lenya -->
-    
-    <dependency>
+        <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-api</artifactId>
+      <artifactId>lenya-core-metadata-api</artifactId>
     </dependency>
+      <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-document-api</artifactId>
+    </dependency>
+      <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-publication-api</artifactId>
+    </dependency>
+<!--    <dependency>-->
+<!--      <groupId>org.apache.lenya</groupId>-->
+<!--      <artifactId>lenya-core-publication-impl</artifactId>-->
+<!--    </dependency>-->
+        <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-repository-api</artifactId>
+    </dependency>
+     <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-repository-impl</artifactId>
+    </dependency>
+      <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-identity</artifactId>
+    </dependency>
+<!--    <dependency>-->
+<!--      <groupId>org.apache.lenya</groupId>-->
+<!--      <artifactId>lenya-core-api</artifactId>-->
+<!--    </dependency>-->
     <dependency>
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-usecase</artifactId>
@@ -37,10 +64,10 @@
 <!--    <dependency>-->
 <!--      <groupId>org.apache.lenya</groupId>-->
 <!--      <artifactId>lenya-core-workflow</artifactId>-->
+<!--    </dependency> -->
+<!--        <dependency>-->
+<!--      <groupId>org.apache.lenya</groupId>-->
+<!--      <artifactId>lenya-core-cocoon</artifactId>-->
 <!--    </dependency>-->
-        <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-cocoon</artifactId>
-    </dependency>
   </dependencies>
 </project>
diff --git a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/ElementSetWrapper.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/ElementSetWrapper.java
index 3a57a6d..ac672bd 100644
--- a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/ElementSetWrapper.java
+++ b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/ElementSetWrapper.java
@@ -20,12 +20,16 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.lenya.cms.repository.metadata.ElementSet;
-import org.apache.lenya.cms.repository.metadata.MetaDataException;
+//florent : 
+/*import org.apache.lenya.cms.repository.metadata.ElementSet;
+import org.apache.lenya.cms.repository.metadata.MetaDataException;*/
+import org.apache.lenya.cms.metadata.ElementSet;
+import org.apache.lenya.cms.metadata.MetaDataException;
 
 public class ElementSetWrapper implements org.apache.lenya.cms.metadata.ElementSet {
 
-    private org.apache.lenya.cms.repository.metadata.ElementSet delegate;
+    //florent private org.apache.lenya.cms.repository.metadata.ElementSet delegate;
+	private ElementSet delegate;
     private Map<String, ElementWrapper> elements = new HashMap<String, ElementWrapper>();
 
     public ElementSetWrapper(ElementSet delegate) {
@@ -51,7 +55,8 @@
     }
 
     public Element[] getElements() {
-        org.apache.lenya.cms.repository.metadata.Element[] elements = this.delegate.getElements();
+        //florent org.apache.lenya.cms.repository.metadata.Element[] elements = this.delegate.getElements();
+    	Element[] elements = this.delegate.getElements();
         Element[] wrappers = new Element[elements.length];
         for (int i = 0; i < elements.length; i++) {
             try {
diff --git a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/ElementWrapper.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/ElementWrapper.java
index 5f43b69..ae65885 100644
--- a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/ElementWrapper.java
+++ b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/ElementWrapper.java
@@ -17,11 +17,13 @@
  */
 package org.apache.lenya.cms.metadata;
 
-import org.apache.lenya.cms.repository.metadata.Element;
+//florent import org.apache.lenya.cms.repository.metadata.Element;
+import org.apache.lenya.cms.metadata.Element;
 
 public class ElementWrapper implements org.apache.lenya.cms.metadata.Element {
     
-    private org.apache.lenya.cms.repository.metadata.Element delegate;
+    //private org.apache.lenya.cms.repository.metadata.Element delegate;
+	private org.apache.lenya.cms.metadata.Element delegate;
 
     public ElementWrapper(Element delegate) {
         this.delegate = delegate;
diff --git a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/MetaDataRegistryWrapper.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/MetaDataRegistryWrapper.java
index 17d1ce3..f6434da 100644
--- a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/MetaDataRegistryWrapper.java
+++ b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/MetaDataRegistryWrapper.java
@@ -3,11 +3,14 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.lenya.cms.repository.metadata.MetaDataException;
+//florent import org.apache.lenya.cms.repository.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.MetaDataRegistry;
 
 public class MetaDataRegistryWrapper implements MetaDataRegistry {
 
-    private org.apache.lenya.cms.repository.metadata.MetaDataRegistry metaDataRegistry;
+    //florent private org.apache.lenya.cms.repository.metadata.MetaDataRegistry metaDataRegistry;
+	private MetaDataRegistry metaDataRegistry;
 
     private Map<String, ElementSetWrapper> elementSets = new HashMap<String, ElementSetWrapper>();
 
@@ -42,13 +45,21 @@
         }
     }
 
-    public void setRepositoryMetaDataRegistry(
-            org.apache.lenya.cms.repository.metadata.MetaDataRegistry metaDataRegistry) {
+    public void setRepositoryMetaDataRegistry(MetaDataRegistry metaDataRegistry) {
+            //florent org.apache.lenya.cms.repository.metadata.MetaDataRegistry metaDataRegistry) {
+    		
         this.metaDataRegistry = metaDataRegistry;
     }
 
-    public org.apache.lenya.cms.repository.metadata.MetaDataRegistry getRepositoryMetaDataRegistry() {
+    //florent public org.apache.lenya.cms.repository.metadata.MetaDataRegistry getRepositoryMetaDataRegistry() {
+    public MetaDataRegistry getRepositoryMetaDataRegistry() {
         return this.metaDataRegistry;
     }
 
+		public void register(String namespaceUri, ElementSet elementSet)
+				throws MetaDataException {
+			// TODO Auto-generated method stub
+			
+		}
+
 }
diff --git a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/MetaDataWrapper.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/MetaDataWrapper.java
index 9ed3a50..761909d 100644
--- a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/MetaDataWrapper.java
+++ b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/MetaDataWrapper.java
@@ -17,22 +17,28 @@
  */
 package org.apache.lenya.cms.metadata;
 
-import org.apache.lenya.cms.repository.metadata.MetaDataException;
+//florent import org.apache.lenya.cms.repository.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.MetaData;
 
 public class MetaDataWrapper implements MetaData {
 
-    private org.apache.lenya.cms.repository.metadata.MetaData delegate;
+    //florent private org.apache.lenya.cms.repository.metadata.MetaData delegate;
+	private MetaData delegate;
 
-    public MetaDataWrapper(org.apache.lenya.cms.repository.metadata.MetaData delegate) {
+    //florent public MetaDataWrapper(org.apache.lenya.cms.repository.metadata.MetaData delegate) {
+	public MetaDataWrapper(MetaData delegate) {
         this.delegate = delegate;
     }
 
-    protected org.apache.lenya.cms.repository.metadata.MetaData getDelegate() {
+    //florent protected org.apache.lenya.cms.repository.metadata.MetaData getDelegate() {
+	protected MetaData getDelegate() {
         return this.delegate;
     }
 
     public void addValue(String key, String value)
-            throws org.apache.lenya.cms.metadata.MetaDataException {
+            //florent throws org.apache.lenya.cms.metadata.MetaDataException {
+    throws MetaDataException {
         try {
             this.delegate.addValue(key, value);
         } catch (MetaDataException e) {
@@ -41,7 +47,8 @@
     }
 
     public void forcedReplaceBy(MetaData other)
-            throws org.apache.lenya.cms.metadata.MetaDataException {
+            //florent throws org.apache.lenya.cms.metadata.MetaDataException {
+    throws MetaDataException {
         MetaDataWrapper wrapper = (MetaDataWrapper) other;
         try {
             this.delegate.forcedReplaceBy(wrapper.getDelegate());
diff --git a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/usecases/Metadata.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/usecases/Metadata.java
deleted file mode 100644
index fddbff6..0000000
--- a/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/metadata/usecases/Metadata.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- * 
- */
-package org.apache.lenya.cms.metadata.usecases;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.lenya.cms.metadata.Element;
-import org.apache.lenya.cms.metadata.MetaData;
-import org.apache.lenya.cms.metadata.MetaDataRegistry;
-import org.apache.lenya.cms.publication.Document;
-import org.apache.lenya.cms.publication.Node;
-import org.apache.lenya.cms.site.usecases.SiteUsecase;
-import org.apache.lenya.cms.usecase.UsecaseException;
-import org.apache.lenya.cms.workflow.WorkflowUtil;
-
-/**
- * Usecase to edit metadata for a resource.
- * 
- * @version $Id$
- */
-public class Metadata extends SiteUsecase {
-    
-    private MetaDataRegistry metaDataRegistry;
-
-    /**
-     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getNodesToLock()
-     */
-    protected Node[] getNodesToLock() throws UsecaseException {
-        Node[] objects = new Node[0];
-        if(getSourceDocument() != null) {
-            objects = new Node[] { getSourceDocument() };
-        }
-        return objects;
-    }
-    
-    /**
-     * Object to pass a meta data entry to the view.
-     */
-    public static class MetaDataWrapper {
-        
-        private String[] values;
-        private Element element;
-        private boolean editable;
-        
-        /**
-         * @param element The element.
-         * @param values The values for the element.
-         * @param canChange If the element value can be changed via the GUI. A <code>true</code>
-         *     value is only effective if the element itself is editable.
-         */
-        public MetaDataWrapper(Element element, String[] values, boolean canChange) {
-            this.values = values;
-            this.element = element;
-            this.editable = element.isEditable() && canChange;
-        }
-        
-        /**
-         * @return The values for the element.
-         */
-        public String[] getValues() {
-            return this.values;
-        }
-        
-        /**
-         * @return The element.
-         */
-        public Element getElement() {
-            return this.element;
-        }
-        
-        /**
-         * @return If the value can be changed via the GUI.
-         */
-        public boolean isEditable() {
-            return this.editable;
-        }
-        
-    }
-
-    /**
-     * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters()
-     */
-    protected void initParameters() {
-        super.initParameters();
-        
-        Document doc = getSourceDocument();
-        if (doc == null) {
-            return;
-        }
-        
-
-        try {
-            boolean canChange = WorkflowUtil.canInvoke(doc, "edit");
-            
-            if (!canChange) {
-                addInfoMessage("cannot-change-metadata");
-            }
-            
-            List numbers = new ArrayList();
-            Map num2namespace = new HashMap();
-            List keyList = new ArrayList();
-
-            String[] namespaces = getMetaDataRegistry().getNamespaceUris();
-
-            for (int nsIndex = 0; nsIndex < namespaces.length; nsIndex++) {
-                MetaData meta = doc.getMetaData(namespaces[nsIndex]);
-                String[] keys = meta.getPossibleKeys();
-                for (int keyIndex = 0; keyIndex < keys.length; keyIndex++) {
-                    String key = "ns" + nsIndex + "." + keys[keyIndex];
-                    String[] values = meta.getValues(keys[keyIndex]);
-                    Element element = meta.getElementSet().getElement(keys[keyIndex]);
-                    setParameter(key, new MetaDataWrapper(element, values, canChange));
-                    keyList.add(key);
-                }
-                numbers.add("" + nsIndex);
-                num2namespace.put("" + nsIndex, namespaces[nsIndex]);
-            }
-
-            setParameter("numbers", numbers);
-            setParameter("namespaces", num2namespace);
-
-            Collections.sort(keyList);
-            setParameter("keys", keyList);
-
-        } catch (Exception e) {
-            getLogger().error("Unable to load meta data.", e);
-            addErrorMessage("Unable to load meta data: " + e.getMessage());
-        }
-    }
-
-    protected MetaDataRegistry getMetaDataRegistry() {
-        return metaDataRegistry;
-    }
-
-    public void setMetaDataRegistry(MetaDataRegistry metaDataRegistry) {
-        this.metaDataRegistry = metaDataRegistry;
-    }
-    
-}
diff --git a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/ContentSourceWrapper.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/ContentSourceWrapper.java
similarity index 100%
rename from org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/ContentSourceWrapper.java
rename to org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/ContentSourceWrapper.java
diff --git a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/MetaSourceWrapper.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/MetaSourceWrapper.java
similarity index 85%
rename from org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/MetaSourceWrapper.java
rename to org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/MetaSourceWrapper.java
index 314224f..3730c98 100644
--- a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/MetaSourceWrapper.java
+++ b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/MetaSourceWrapper.java
@@ -19,9 +19,14 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.excalibur.source.SourceResolver;
-import org.apache.lenya.cms.repository.metadata.MetaData;
-import org.apache.lenya.cms.repository.metadata.MetaDataException;
+/*florent : package name change
+ * import org.apache.lenya.cms.repository.metadata.MetaData;
+ * import org.apache.lenya.cms.repository.metadata.MetaDataException;
 import org.apache.lenya.cms.repository.metadata.MetaDataOwner;
+ */
+import org.apache.lenya.cms.metadata.MetaData;
+import org.apache.lenya.cms.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.MetaDataOwner;
 
 /**
  * Provides access to a meta data source.
diff --git a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/ModifiableMetaDataHandler.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/ModifiableMetaDataHandler.java
similarity index 97%
rename from org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/ModifiableMetaDataHandler.java
rename to org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/ModifiableMetaDataHandler.java
index 75e710f..bb94092 100644
--- a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/ModifiableMetaDataHandler.java
+++ b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/ModifiableMetaDataHandler.java
@@ -24,7 +24,8 @@
 import java.util.Map;
 
 import org.apache.excalibur.source.SourceResolver;
-import org.apache.lenya.cms.repository.metadata.MetaDataException;
+//import org.apache.lenya.cms.repository.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.MetaDataException;
 import org.apache.lenya.xml.DocumentHelper;
 import org.apache.lenya.xml.NamespaceHelper;
 import org.w3c.dom.Element;
diff --git a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNode.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNode.java
similarity index 96%
rename from org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNode.java
rename to org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNode.java
index ff5b698..bd1d310 100644
--- a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNode.java
+++ b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNode.java
@@ -27,20 +27,24 @@
 import org.apache.excalibur.source.TraversableSource;
 import org.apache.lenya.cms.observation.RepositoryEventDescriptor;
 import org.apache.lenya.cms.observation.RepositoryEvent;
+import org.apache.lenya.cms.observation.RepositoryEventImpl;
 import org.apache.lenya.cms.rc.CheckInEntry;
 import org.apache.lenya.cms.rc.RCML;
 import org.apache.lenya.cms.rc.RCMLEntry;
 import org.apache.lenya.cms.rc.RevisionControlException;
-import org.apache.lenya.cms.repository.metadata.MetaData;
-import org.apache.lenya.cms.repository.metadata.MetaDataException;
+//florent :
+/*import org.apache.lenya.cms.repository.metadata.MetaData;
+import org.apache.lenya.cms.repository.metadata.MetaDataException;*/
+import org.apache.lenya.cms.metadata.MetaData;
+import org.apache.lenya.cms.metadata.MetaDataException;
 import org.apache.lenya.transaction.Lock;
 import org.apache.lenya.transaction.TransactionException;
 import org.apache.lenya.transaction.Transactionable;
+import org.apache.lenya.ac.Identity;
 
 /**
  * A repository node.
  * 
- * @version $Id$
  */
 public class SourceNode extends AbstractLogEnabled implements Node, Transactionable {
 
@@ -185,7 +189,7 @@
     protected int getCurrentRevisionNumber() throws RepositoryException {
         CheckInEntry entry;
         try {
-            entry = getRcml().getLatestCheckInEntry();
+            entry = (CheckInEntry)getRcml().getLatestCheckInEntry();
         } catch (RevisionControlException e) {
             throw new RepositoryException(e);
         }
@@ -342,7 +346,7 @@
     }
 
     protected void enqueueEvent(Object descriptor) {
-        RepositoryEvent event = new RepositoryEvent(getRepositorySession(), this, descriptor);
+        RepositoryEvent event = new RepositoryEventImpl(getRepositorySession(), this, descriptor);
         getRepositorySession().enqueueEvent(event);
     }
 
@@ -408,7 +412,7 @@
 
     public long getLastModified() throws RepositoryException {
         try {
-            CheckInEntry entry = getRcml().getLatestCheckInEntry();
+            CheckInEntry entry = (CheckInEntry)getRcml().getLatestCheckInEntry();
             if (entry != null) {
                 return entry.getTime();
             } else {
diff --git a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeFactory.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeFactory.java
similarity index 100%
rename from org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeFactory.java
rename to org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeFactory.java
diff --git a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeHistory.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeHistory.java
similarity index 100%
rename from org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeHistory.java
rename to org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeHistory.java
diff --git a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeMetaData.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeMetaData.java
similarity index 94%
rename from org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeMetaData.java
rename to org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeMetaData.java
index 7f39f6b..a5c1678 100644
--- a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeMetaData.java
+++ b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeMetaData.java
@@ -22,11 +22,17 @@
 import java.util.Set;
 
 import org.apache.cocoon.util.AbstractLogEnabled;
-import org.apache.lenya.cms.repository.metadata.Element;
+//florent
+/*import org.apache.lenya.cms.repository.metadata.Element;
 import org.apache.lenya.cms.repository.metadata.ElementSet;
 import org.apache.lenya.cms.repository.metadata.MetaData;
 import org.apache.lenya.cms.repository.metadata.MetaDataException;
-import org.apache.lenya.cms.repository.metadata.MetaDataRegistry;
+import org.apache.lenya.cms.repository.metadata.MetaDataRegistry;*/
+import org.apache.lenya.cms.metadata.Element;
+import org.apache.lenya.cms.metadata.ElementSet;
+import org.apache.lenya.cms.metadata.MetaData;
+import org.apache.lenya.cms.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.MetaDataRegistry;
 
 /**
  * Source-node-based meta data.
diff --git a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeMetaDataHandler.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeMetaDataHandler.java
similarity index 92%
rename from org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeMetaDataHandler.java
rename to org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeMetaDataHandler.java
index 69c9538..9595055 100644
--- a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeMetaDataHandler.java
+++ b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeMetaDataHandler.java
@@ -26,12 +26,18 @@
 import org.apache.excalibur.source.SourceResolver;
 import org.apache.lenya.cms.cocoon.source.SourceUtil;
 import org.apache.lenya.cms.metadata.dublincore.DublinCore;
-import org.apache.lenya.cms.publication.PageEnvelope;
-import org.apache.lenya.cms.repository.metadata.ElementSet;
+//import org.apache.lenya.cms.publication.PageEnvelope;
+//florent
+/*import org.apache.lenya.cms.repository.metadata.ElementSet;
 import org.apache.lenya.cms.repository.metadata.MetaData;
 import org.apache.lenya.cms.repository.metadata.MetaDataException;
 import org.apache.lenya.cms.repository.metadata.MetaDataOwner;
-import org.apache.lenya.cms.repository.metadata.MetaDataRegistry;
+import org.apache.lenya.cms.repository.metadata.MetaDataRegistry;*/
+import org.apache.lenya.cms.metadata.ElementSet;
+import org.apache.lenya.cms.metadata.MetaData;
+import org.apache.lenya.cms.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.MetaDataOwner;
+import org.apache.lenya.cms.metadata.MetaDataRegistry;
 import org.apache.lenya.xml.DocumentHelper;
 import org.apache.lenya.xml.NamespaceHelper;
 import org.w3c.dom.Document;
@@ -143,8 +149,11 @@
     }
 
     protected void loadLegacyMetaData(Document xml) throws MetaDataException {
-        NamespaceHelper helper = new NamespaceHelper(PageEnvelope.NAMESPACE, "", xml);
-
+        //florent : remove the call to page enveloppe in order to remover cyclic dependencie to publication-impl
+    	//TODO : create a module that contains all namespace used in Lenya
+    	//NamespaceHelper helper = new NamespaceHelper(PageEnvelope.NAMESPACE, "", xml);
+    	NamespaceHelper helper = new NamespaceHelper("http://apache.org/cocoon/lenya/page-envelope/1.0", "", xml);
+    	
         Element metaElement = helper.getFirstChild(xml.getDocumentElement(), "meta");
 
         Element internalElement = helper.getFirstChild(metaElement, "internal");
diff --git a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeRCML.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeRCML.java
similarity index 100%
rename from org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeRCML.java
rename to org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeRCML.java
diff --git a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeRcmlFactory.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeRcmlFactory.java
similarity index 100%
rename from org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeRcmlFactory.java
rename to org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeRcmlFactory.java
diff --git a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeRevision.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeRevision.java
similarity index 95%
rename from org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeRevision.java
rename to org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeRevision.java
index 7c68341..3163a41 100644
--- a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceNodeRevision.java
+++ b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceNodeRevision.java
@@ -29,14 +29,18 @@
 import org.apache.lenya.cms.rc.CheckInEntry;
 import org.apache.lenya.cms.rc.RCML;
 import org.apache.lenya.cms.rc.RCMLEntry;
-import org.apache.lenya.cms.repository.metadata.MetaData;
-import org.apache.lenya.cms.repository.metadata.MetaDataException;
+//florent
+/*import org.apache.lenya.cms.repository.metadata.MetaData;
+import org.apache.lenya.cms.repository.metadata.MetaDataException;*/
+import org.apache.lenya.cms.metadata.MetaData;
+import org.apache.lenya.cms.metadata.MetaDataException;
 
 /**
  * Revision implementation.
  */
-public class SourceNodeRevision extends AbstractLogEnabled implements Revision {
-
+public class SourceNodeRevision extends AbstractLogEnabled implements Revision, ContentHolder {
+//florent : add contentHolder implements here as it was remove in Revision...
+	
     private SourceNode node;
     private int number;
     private long time = -1;
diff --git a/org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceWrapper.java b/org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceWrapper.java
similarity index 100%
rename from org.apache.lenya.module.sourcerepository/src/main/java/org/apache/lenya/cms/repository/SourceWrapper.java
rename to org.apache.lenya.core.metadata.impl/src/main/java/org/apache/lenya/cms/repository/SourceWrapper.java
diff --git a/org.apache.lenya.core.observation/pom.xml b/org.apache.lenya.core.observation/pom.xml
index 183ea19..04da6ac 100644
--- a/org.apache.lenya.core.observation/pom.xml
+++ b/org.apache.lenya.core.observation/pom.xml
@@ -15,17 +15,25 @@
   <packaging>jar</packaging>
   <name>Apache Lenya Core Observation</name>
   <dependencies>
+<!--    <dependency>-->
+<!--      <groupId>org.apache.avalon.framework</groupId>-->
+<!--      <artifactId>avalon-framework-api</artifactId>-->
+<!--    </dependency>-->
+<!--    <dependency>-->
+<!--      <groupId>org.apache.lenya</groupId>-->
+<!--      <artifactId>lenya-core-api</artifactId>-->
+<!--    </dependency>-->
     <dependency>
-      <groupId>org.apache.avalon.framework</groupId>
-      <artifactId>avalon-framework-api</artifactId>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-repository-api</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-api</artifactId>
+      <artifactId>lenya-core-document-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-repository</artifactId>
-    </dependency>
+<!--        <dependency>-->
+<!--      <groupId>org.apache.lenya</groupId>-->
+<!--      <artifactId>lenya-core-publication</artifactId>-->
+<!--    </dependency>-->
   </dependencies>
 </project>
diff --git a/org.apache.lenya.core.observation/src/main/java/org/apache/lenya/cms/observation/ObservationException.java b/org.apache.lenya.core.observation/src/main/java/org/apache/lenya/cms/observation/ObservationException.java
new file mode 100644
index 0000000..01c1ce9
--- /dev/null
+++ b/org.apache.lenya.core.observation/src/main/java/org/apache/lenya/cms/observation/ObservationException.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.observation;
+
+/**
+ * Observation-specific exception.
+ */
+public class ObservationException extends Exception {
+
+    private static final long serialVersionUID = -4025029670092614593L;
+
+    /**
+     * 
+     */
+    public ObservationException() {
+        super();
+    }
+
+    /**
+     * @param arg0
+     * @param arg1
+     */
+    public ObservationException(String arg0, Throwable arg1) {
+        super(arg0, arg1);
+    }
+
+    /**
+     * @param arg0
+     */
+    public ObservationException(String arg0) {
+        super(arg0);
+    }
+
+    /**
+     * @param arg0
+     */
+    public ObservationException(Throwable arg0) {
+        super(arg0);
+    }
+
+}
diff --git a/org.apache.lenya.core.observation/src/main/java/org/apache/lenya/cms/observation/ObservationRegistry.java b/org.apache.lenya.core.observation/src/main/java/org/apache/lenya/cms/observation/ObservationRegistry.java
new file mode 100644
index 0000000..97b8b5f
--- /dev/null
+++ b/org.apache.lenya.core.observation/src/main/java/org/apache/lenya/cms/observation/ObservationRegistry.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.observation;
+
+/**
+ * Observation registry.
+ */
+public interface ObservationRegistry extends RepositoryListener {
+
+    /**
+     * The Avalon service role.
+     */
+    String ROLE = ObservationRegistry.class.getName();
+
+    /**
+     * @param listener The listener.
+     * @param source The event source to listen to.
+     * @throws ObservationException if the listener is already registered for this event source.
+     */
+    void registerListener(RepositoryListener listener, Object source) throws ObservationException;
+    
+    /**
+     * Registers a listener which is notified for all events.
+     * @param listener The listener.
+     * @throws ObservationException if the listener is already registered.
+     */
+    void registerListener(RepositoryListener listener) throws ObservationException;
+
+}
diff --git a/org.apache.lenya.core.properties/pom.xml b/org.apache.lenya.core.properties/pom.xml
index 7fe3c1c..76bc0c9 100644
--- a/org.apache.lenya.core.properties/pom.xml
+++ b/org.apache.lenya.core.properties/pom.xml
@@ -32,6 +32,14 @@
       <artifactId>lenya-core-api</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-publication-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-utils</artifactId>
+    </dependency>
+    <dependency>
       <groupId>commons-configuration</groupId>
       <artifactId>commons-configuration</artifactId>
     </dependency>
diff --git a/org.apache.lenya.core.properties/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/PropertiesModule.java b/org.apache.lenya.core.properties/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/PropertiesModule.java
index 389b5ae..9b07c39 100644
--- a/org.apache.lenya.core.properties/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/PropertiesModule.java
+++ b/org.apache.lenya.core.properties/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/PropertiesModule.java
@@ -43,8 +43,10 @@
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.publication.Repository;
 import org.apache.lenya.cms.publication.Session;
-import org.apache.lenya.cms.publication.URLInformation;
-import org.apache.lenya.util.ServletHelper;
+//import org.apache.lenya.cms.publication.URLInformation;
+//import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.URLInformation;
+import org.apache.lenya.utils.ServletHelper;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
@@ -105,8 +107,10 @@
     protected Configuration getProperties(Map objectModel) throws ConfigurationException {
         Configuration properties;
         Request request = ObjectModelHelper.getRequest(objectModel);
-        String webappUrl = ServletHelper.getWebappURI(request);
-        URLInformation info = new URLInformation(webappUrl);
+        //florent 
+        //String webappUrl = ServletHelper.getWebappURI(request);
+        //URLInformation info = new URLInformation(webappUrl);
+        URLInformation info = new URLInformation();
         String pubId = info.getPublicationId();
         Session session = this.repository.getSession(request);
         if (session.existsPublication(pubId)) {
diff --git a/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/DocumentFactory.java b/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/DocumentFactory.java
index 048b8ae..c5009b4 100644
--- a/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/DocumentFactory.java
+++ b/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/DocumentFactory.java
@@ -20,7 +20,6 @@
 /**
  * A DocumentIdentityMap avoids the multiple instanciation of a document object.
  * 
- * @version $Id$
  */
 public interface DocumentFactory {
 
@@ -105,4 +104,9 @@
      * @return If a publication with this ID exists.
      */
     boolean existsPublication(String id);
+    
+    void setPublicationManager(PublicationManager pubManager);
+    
+    PublicationManager getPublicationManager();
+
 }
diff --git a/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/DocumentManager.java b/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/DocumentManager.java
index 77fab08..e963562 100644
--- a/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/DocumentManager.java
+++ b/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/DocumentManager.java
@@ -38,8 +38,11 @@
      * @throws PublicationException if a document which destinationDocument depends on does not
      *             exist.
      */
+    //florent commented cause of change in document api
+    /*
     void copy(Document sourceDocument, DocumentLocator destination) throws PublicationException;
-
+		*/
+    
     /**
      * Copies a document to another area.
      * @param sourceDocument The document to copy.
@@ -47,8 +50,11 @@
      * @throws PublicationException if a document which the destination document depends on does not
      *             exist.
      */
+    //florent commented cause of change in document api
+    /*
     void copyToArea(Document sourceDocument, String destinationArea) throws PublicationException;
-
+	*/
+    
     /**
      * Copies a document set to another area.
      * @param documentSet The document set to copy.
@@ -56,8 +62,11 @@
      * @throws PublicationException if a document which one of the destination documents depends on
      *             does not exist.
      */
+    //florent commented cause of change in document api
+    /*
     void copyToArea(DocumentSet documentSet, String destinationArea) throws PublicationException;
-
+	*/
+    
     /**
      * Creates a new document in the same publication the <code>parentDocument</code> belongs to
      * with the given parameters:
@@ -74,10 +83,12 @@
      * @throws DocumentBuildException if the document can not be created
      * @throws PublicationException if the document is already contained.
      */
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     Document add(Document sourceDocument, String area, String path, String language,
             String extension, String navigationTitle, boolean visibleInNav)
             throws DocumentBuildException, PublicationException;
-
+	*/
     /**
      * Creates a new document with the given parameters:
      * @param resourceType the document type (aka resource type) of the new document
@@ -94,11 +105,14 @@
      * @throws DocumentBuildException if the document can not be created
      * @throws PublicationException if the document is already contained.
      */
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     Document add(ResourceType resourceType, String contentSourceUri,
             Publication pub, String area, String path, String language, String extension,
             String navigationTitle, boolean visibleInNav) throws DocumentBuildException,
             PublicationException;
-
+	*/
+    
     /**
      * Creates a new document without adding it to the site structure.
      * @param resourceType the document type (aka resource type) of the new document
@@ -112,10 +126,13 @@
      * @throws DocumentBuildException if the document can not be created
      * @throws PublicationException if the document is already contained.
      */
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     Document add(ResourceType resourceType, String contentSourceUri,
             Publication pub, String area, String language, String extension)
             throws DocumentBuildException, PublicationException;
-
+	*/
+    
     /**
      * Adds a new version of a document with a different language and / or in a different area.
      * 
@@ -127,9 +144,11 @@
      * @throws DocumentBuildException if the document can not be created
      * @throws PublicationException if the document is already contained.
      */
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     Document addVersion(Document sourceDocument, String area, String language)
             throws DocumentBuildException, PublicationException;
-
+	*/
     /**
      * Adds a new version of a document with a different language and / or in a different area.
      * 
@@ -142,16 +161,21 @@
      * @throws DocumentBuildException if the document can not be created
      * @throws PublicationException if the document is already contained.
      */
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     Document addVersion(Document sourceDocument, String area, String language, boolean addToSite)
             throws DocumentBuildException, PublicationException;
-
+	*/
     /**
      * Deletes a document from the content repository and from the site structure.
      * @param document The document to delete.
      * @throws PublicationException when something went wrong.
      */
+    //florent commented cause of change in document api
+    /*
     void delete(Document document) throws PublicationException;
-
+	*/
+    
     /**
      * Moves a document from one location to another.
      * @param sourceDocument The source document.
@@ -159,8 +183,11 @@
      * @throws PublicationException if a document which the destination document depends on does not
      *             exist.
      */
+    //florent commented cause of change in document api
+    /*
     void move(Document sourceDocument, DocumentLocator destination) throws PublicationException;
-
+	*/
+    
     /**
      * Moves a document set from one location to another. A source is moved to the destination of
      * the same position in the set.
@@ -169,8 +196,10 @@
      * @throws PublicationException if a document which the destination document depends on does not
      *             exist.
      */
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     void move(DocumentSet sources, DocumentSet destinations) throws PublicationException;
-
+	*/
     /**
      * Copies a document set from one location to another. A source is copied to the destination of
      * the same position in the set.
@@ -179,8 +208,11 @@
      * @throws PublicationException if a document which the destination document depends on does not
      *             exist.
      */
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     void copy(DocumentSet sources, DocumentSet destinations) throws PublicationException;
-
+	*/
+    
     /**
      * Moves a document to another location, incl. all requiring documents. If a sitetree is used,
      * this means that the whole subtree is moved.
@@ -190,9 +222,11 @@
      * @param targetPath The target path.
      * @throws PublicationException if an error occurs.
      */
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     void moveAll(Area sourceArea, String sourcePath, Area targetArea, String targetPath)
             throws PublicationException;
-
+	*/
     /**
      * Moves all language versions of a document to another location.
      * @param sourceArea The source area.
@@ -201,9 +235,11 @@
      * @param targetPath The target path.
      * @throws PublicationException if the documents could not be moved.
      */
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     void moveAllLanguageVersions(Area sourceArea, String sourcePath, Area targetArea,
             String targetPath) throws PublicationException;
-
+	*/
     /**
      * Copies a document to another location, incl. all requiring documents. If a sitetree is used,
      * this means that the whole subtree is copied.
@@ -213,9 +249,12 @@
      * @param targetPath The target path.
      * @throws PublicationException if an error occurs.
      */
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     void copyAll(Area sourceArea, String sourcePath, Area targetArea, String targetPath)
             throws PublicationException;
-
+	*/
+    
     /**
      * Copies all language versions of a document to another location.
      * @param sourceArea The source area.
@@ -224,29 +263,38 @@
      * @param targetPath The target path.
      * @throws PublicationException if the documents could not be copied.
      */
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     void copyAllLanguageVersions(Area sourceArea, String sourcePath, Area targetArea,
             String targetPath) throws PublicationException;
-
+	*/
+    
     /**
      * Deletes a document, incl. all requiring documents. If a sitetree is used, this means that the
      * whole subtree is deleted.
      * @param document The document.
      * @throws PublicationException if an error occurs.
      */
-    void deleteAll(Document document) throws PublicationException;
+  //florent commented cause of change in document api
+    //void deleteAll(Document document) throws PublicationException;
 
     /**
      * Deletes all language versions of a document.
      * @param document The document.
      * @throws PublicationException if the documents could not be copied.
      */
+    //florent commented cause of change in document api
+    /*
     void deleteAllLanguageVersions(Document document) throws PublicationException;
-
+	*/
+    
     /**
      * Deletes a set of documents.
      * @param documents The documents.
      * @throws PublicationException if an error occurs.
      */
+    //florent commented cause of change in document api
+    /*
     void delete(DocumentSet documents) throws PublicationException;
-
+	*/
 }
\ No newline at end of file
diff --git a/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/Repository.java b/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/Repository.java
index 1d7b0db..78491b6 100644
--- a/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/Repository.java
+++ b/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/Repository.java
@@ -19,6 +19,8 @@
 
 import javax.servlet.http.HttpServletRequest;
 import org.apache.lenya.cms.publication.Session;
+
+
 //import org.apache.lenya.ac.Identity;
 
 public interface Repository {
@@ -26,6 +28,7 @@
     Session getSession(HttpServletRequest request);
     
     //florent : remove as it create cycliq dependencies.
+    //note : can be re-enable now as identity is in lenya-core-identity
     // suppress this comment when ok
     //Session startSession(Identity identity, boolean modifiable);
 
diff --git a/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/site/SiteManager.java b/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/site/SiteManager.java
new file mode 100644
index 0000000..a1c83e3
--- /dev/null
+++ b/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/site/SiteManager.java
@@ -0,0 +1,182 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.lenya.cms.site;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentLocator;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.Session;
+
+/**
+ * <p>
+ * A site structure management component.
+ * </p>
+ * 
+ * <p>
+ * A site manager has a dependence relation, which is always applied to documents of a single
+ * language. This means a document may not require a document of another language. Dependence on a
+ * set of resources must be a strict partial order <strong>&lt; </strong>:
+ * </p>
+ * <ul>
+ * <li><em>irreflexive:</em> d <strong>&lt; </strong>d does not hold for any resource d</li>
+ * <li><em>antisymmetric:</em> d <strong>&lt; </strong>e and e <strong>&lt; </strong>d implies d=e</li>
+ * <li><em>transitive:</em> d <strong>&lt; </strong>e and e <strong>&lt; </strong>f implies d
+ * <strong>&lt; </strong>f</li>
+ * </ul>
+ * 
+ * @version $Id$
+ */
+public interface SiteManager {
+
+    /**
+     * The Avalon role.
+     */
+    String ROLE = SiteManager.class.getName();
+
+    /**
+     * Checks if a resource requires another one.
+     * @param dependingResource The depending resource.
+     * @param requiredResource The required resource.
+     * @return A boolean value.
+     * @throws SiteException if an error occurs.
+     */
+    boolean requires(SiteNode dependingResource, SiteNode requiredResource) throws SiteException;
+
+    /**
+     * Returns the resources which are required by a certain resource.
+     * 
+     * @param session The session to operate on.
+     * @param locator The depending locator.
+     * @return An array of resources.
+     * @throws SiteException if an error occurs.
+     */
+    DocumentLocator[] getRequiredResources(Session session, DocumentLocator locator)
+            throws SiteException;
+
+    /**
+     * Returns the resources which require a certain resource.
+     * 
+     * @param resource The required resource.
+     * @return An array of resources.
+     * @throws SiteException if an error occurs.
+     */
+    SiteNode[] getRequiringResources(SiteNode resource) throws SiteException;
+
+    /**
+     * Adds a document to the site structure.
+     * @param path The path.
+     * @param document The document to add.
+     * @throws SiteException if the document is already contained.
+     */
+    void add(String path, Document document) throws SiteException;
+
+    /**
+     * Sets a document to the site structure.
+     * @param path The path.
+     * @param document The document to add.
+     * @throws SiteException if the document is already contained or if the path doesn't exist.
+     */
+    void set(String path, Document document) throws SiteException;
+
+    /**
+     * Checks if the site structure contains a certain resource in a certain area.
+     * 
+     * @param resource The resource.
+     * @return A boolean value.
+     * @throws SiteException if an error occurs.
+     */
+    boolean contains(Document resource) throws SiteException;
+
+    /**
+     * Checks if the site structure contains any language version of a certain resource in a certain
+     * area.
+     * 
+     * @param resource The resource.
+     * @return A boolean value.
+     * @throws SiteException if an error occurs.
+     */
+    boolean containsInAnyLanguage(Document resource) throws SiteException;
+
+    /**
+     * Copies a document in the site structure.
+     * 
+     * @param sourceDocument The source document.
+     * @param destinationDocument The destination document.
+     * @throws SiteException when something went wrong.
+     */
+    void copy(Document sourceDocument, Document destinationDocument) throws SiteException;
+
+    /**
+     * Sets the visibility of a node in the navigation. It is meant to hide specific nodes within
+     * the "public" navigation whereas the node is visible within the info/site area.
+     * 
+     * @param document The document.
+     * @param visibleInNav The visibility.
+     * @throws SiteException if an error occurs.
+     */
+    void setVisibleInNav(Document document, boolean visibleInNav) throws SiteException;
+
+    /**
+     * Returns the visibility of a node in the navigation.
+     * 
+     * @param document The document.
+     * @return A boolean value.
+     * @throws SiteException if an error occurs.
+     */
+    boolean isVisibleInNav(Document document) throws SiteException;
+
+    /**
+     * Returns all documents in a certain area.
+     * 
+     * @param publication The publication.
+     * @param area The area.
+     * @return An array of documents.
+     * @throws SiteException if an error occurs.
+     */
+    Document[] getDocuments(Publication publication, String area) throws SiteException;
+
+    /**
+     * Sorts a set of nodes using the "requires" relation.
+     * 
+     * @param nodes The set.
+     * @return A sorted array of nodes.
+     * @throws SiteException if an error occurs.
+     */
+    SiteNode[] sortAscending(SiteNode[] nodes) throws SiteException;
+
+    /**
+     * @param publication The publication.
+     * @param area The area.
+     * @return The object that holds the site structure information.
+     * @throws SiteException if an error occurs.
+     */
+    SiteStructure getSiteStructure(Publication publication, String area) throws SiteException;
+
+    /**
+     * Checks if the document does already exist. If it does, returns a non-existing document with a
+     * similar document ID. If it does not, the original document is returned.
+     * @param session The session.
+     * @param locator The locator.
+     * @return A locator.
+     * @throws SiteException if the new document could not be built.
+     */
+    DocumentLocator getAvailableLocator(Session session, DocumentLocator locator)
+            throws SiteException;
+
+}
diff --git a/org.apache.lenya.core.publication.impl/pom.xml b/org.apache.lenya.core.publication.impl/pom.xml
index 68bf69c..3cf37bd 100644
--- a/org.apache.lenya.core.publication.impl/pom.xml
+++ b/org.apache.lenya.core.publication.impl/pom.xml
@@ -28,6 +28,36 @@
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-publication-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-document-api</artifactId>
+    </dependency>
+    <!-- This dependencie is just cause by call to static DocumentLocator.getLocator
+      in DefaultDocumentBuilder -->
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-document-impl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-repository-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-repository-impl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-utils</artifactId>
+    </dependency>
+     <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-proxy</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-identity</artifactId>
+    </dependency>
 <!--    <dependency>-->
 <!--      <groupId>org.apache.lenya</groupId>-->
 <!--      <artifactId>lenya-core-metadata</artifactId>-->
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/AreaImpl.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/AreaImpl.java
index 82cc17f..3ede48a 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/AreaImpl.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/AreaImpl.java
@@ -63,6 +63,9 @@
         if (getSite().containsByUuid(uuid, language)) {
             return true;
         } else {
+        	return false;
+        	//florent : comment as is create dependencie to document-impl and seems not useful as the containsbyUuid has to give the result
+        	/*
             String sourceUri = DocumentImpl.getSourceURI(pub, name, uuid, language);
             try {
                 org.apache.lenya.cms.repository.Session repoSession = ((SessionHolder) this.session)
@@ -71,7 +74,7 @@
                 return node.exists();
             } catch (RepositoryException e) {
                 throw new RuntimeException(e);
-            }
+            }*/
         }
     }
 
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/DefaultDocumentBuilder.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/DefaultDocumentBuilder.java
index bd3ad6e..32d4424 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/DefaultDocumentBuilder.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/DefaultDocumentBuilder.java
@@ -195,7 +195,7 @@
             throw new MalformedURLException("Path [" + path + "] does not start with '/'!");
         }
 
-        return DocumentLocator.getLocator(publication.getId(), info.getArea(), path, language);
+        return DocumentLocatorImpl.getLocator(publication.getId(), info.getArea(), path, language);
     }
 
     /**
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/DocumentManagerImpl.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/DocumentManagerImpl.java
index 9883135..b0fbd0c 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/DocumentManagerImpl.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/DocumentManagerImpl.java
@@ -38,6 +38,7 @@
 import org.apache.excalibur.source.SourceResolver;
 import org.apache.lenya.cms.metadata.MetaData;
 import org.apache.lenya.cms.metadata.MetaDataException;
+import org.apache.lenya.cms.publication.util.DocumentSet;
 import org.apache.lenya.cms.publication.util.DocumentSetImpl;
 import org.apache.lenya.cms.publication.util.DocumentVisitor;
 import org.apache.lenya.cms.repository.Node;
@@ -55,7 +56,6 @@
 /**
  * DocumentManager implementation.
  * 
- * @version $Id$
  */
 public class DocumentManagerImpl extends AbstractLogEnabled implements DocumentManager {
 
@@ -68,17 +68,19 @@
      *      java.lang.String, java.lang.String, java.lang.String, java.lang.String,
      *      java.lang.String, boolean)
      */
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     public Document add(Document sourceDocument, String area, String path, String language,
             String extension, String navigationTitle, boolean visibleInNav)
             throws DocumentBuildException, PublicationException {
-
+    		
         Document document = add(sourceDocument.getResourceType(), sourceDocument.getInputStream(),
                 sourceDocument.getPublication(), area, path, language, extension, navigationTitle,
                 visibleInNav, sourceDocument.getMimeType());
 
         copyMetaData(sourceDocument, document);
         return document;
-    }
+    }*/
 
     /**
      * Copies meta data from one document to another. If the destination document is a different
@@ -106,11 +108,13 @@
             throw new PublicationException(e);
         }
     }
-
+    
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     public Document add(ResourceType documentType, String initialContentsURI, Publication pub,
             String area, String path, String language, String extension, String navigationTitle,
-            boolean visibleInNav) throws DocumentBuildException, DocumentException,
-            PublicationException {
+            boolean visibleInNav) 
+    			throws DocumentBuildException, PublicationException {
 
         Area areaObj = pub.getArea(area);
         SiteStructure site = areaObj.getSite();
@@ -123,8 +127,10 @@
 
         addToSiteManager(path, document, navigationTitle, visibleInNav);
         return document;
-    }
-
+    }*/
+    
+    //florent : comment cause of document.getPublication() not still in api
+    /*
     protected Document add(ResourceType documentType, InputStream initialContentsStream,
             Publication pub, String area, String path, String language, String extension,
             String navigationTitle, boolean visibleInNav, String mimeType)
@@ -142,11 +148,11 @@
 
         addToSiteManager(path, document, navigationTitle, visibleInNav);
         return document;
-    }
+    }*/
 
     public Document add(ResourceType documentType, String initialContentsURI, Publication pub,
             String area, String language, String extension) throws DocumentBuildException,
-            DocumentException, PublicationException {
+            PublicationException {
 
         String uuid = getUuidGenerator().nextUUID();
         Source source = null;
@@ -173,7 +179,7 @@
 
     protected Document add(ResourceType documentType, InputStream initialContentsStream,
             Publication pub, String area, String language, String extension, String mimeType)
-            throws DocumentBuildException, DocumentException, PublicationException {
+            throws DocumentBuildException, PublicationException {
 
         String uuid = getUuidGenerator().nextUUID();
         return add(documentType, uuid, initialContentsStream, pub, area, language, extension,
@@ -199,8 +205,11 @@
             document.setMimeType(mimeType);
 
             // Write Lenya-internal meta-data
-            MetaData lenyaMetaData = document.getMetaData(DocumentImpl.METADATA_NAMESPACE);
-            lenyaMetaData.setValue(DocumentImpl.METADATA_CONTENT_TYPE, "xml");
+            //florent remove document-impl dependencie
+            //MetaData lenyaMetaData = document.getMetaData(DocumentImpl.METADATA_NAMESPACE);
+            // lenyaMetaData.setValue(DocumentImpl.METADATA_CONTENT_TYPE, "xml");
+            MetaData lenyaMetaData = document.getMetaData(Document.METADATA_NAMESPACE);
+            lenyaMetaData.setValue(Document.METADATA_CONTENT_TYPE, "xml");
 
             if (getLogger().isDebugEnabled()) {
                 getLogger().debug("Create");
@@ -252,11 +261,15 @@
         }
     }
 
+    //florent commented cause of change in document api
+    /*
     protected void addToSiteManager(String path, Document document, String navigationTitle,
             boolean visibleInNav) throws PublicationException {
         addToSiteManager(path, document, navigationTitle, visibleInNav, null);
-    }
-
+    }*/
+    
+    //florent commented cause of change in document api
+    /*
     protected void addToSiteManager(String path, Document document, String navigationTitle,
             boolean visibleInNav, String followingSiblingPath) throws PublicationException {
         SiteStructure site = document.area().getSite();
@@ -266,7 +279,7 @@
         site.add(path, document);
         document.getLink().setLabel(navigationTitle);
         document.getLink().getNode().setVisible(visibleInNav);
-    }
+    }*/
 
     /**
      * Template method to copy a document. Override {@link #copyDocumentSource(Document, Document)}
@@ -274,12 +287,14 @@
      * @see org.apache.lenya.cms.publication.DocumentManager#copy(org.apache.lenya.cms.publication.Document,
      *      org.apache.lenya.cms.publication.DocumentLocator)
      */
+    //florent commented cause of change in document api
+    /*
     public void copy(Document sourceDoc, DocumentLocator destination) throws PublicationException {
 
         if (!destination.getPublicationId().equals(sourceDoc.getPublication().getId())) {
             throw new PublicationException("Can't copy to a different publication!");
         }
-
+        
         SiteStructure destSite = sourceDoc.getPublication().getArea(destination.getArea())
                 .getSite();
         String destPath = destination.getPath();
@@ -294,8 +309,10 @@
                     .isVisible());
         }
 
-    }
-
+    }*/
+    
+    //florent commented cause of change in document api
+    /*
     protected void copyInSiteStructure(Document sourceDoc, Document destDoc, String destPath)
             throws PublicationException, DocumentException, SiteException {
 
@@ -352,11 +369,13 @@
                 }
             }
         }
-    }
+    }*/
 
     /**
      * @see org.apache.lenya.cms.publication.DocumentManager#delete(org.apache.lenya.cms.publication.Document)
      */
+    //florent commented cause of change in document api
+    /*
     public void delete(Document document) throws PublicationException {
         if (!document.exists()) {
             throw new PublicationException("Document [" + document + "] does not exist!");
@@ -367,12 +386,14 @@
         }
 
         document.delete();
-    }
+    }*/
 
     /**
      * @see org.apache.lenya.cms.publication.DocumentManager#move(org.apache.lenya.cms.publication.Document,
      *      org.apache.lenya.cms.publication.DocumentLocator)
      */
+    //florent commented cause of change in document api
+    /*
     public void move(Document sourceDocument, DocumentLocator destination)
             throws PublicationException {
 
@@ -394,19 +415,21 @@
         sourceDocument.getLink().setLabel(label);
         sourceDocument.getLink().getNode().setVisible(visible);
 
-    }
+    }*/
 
     /**
      * @see org.apache.lenya.cms.publication.DocumentManager#copyToArea(org.apache.lenya.cms.publication.Document,
      *      java.lang.String)
-     */
-  //florent : seems never use, imply cyclic dependencies
+     */    
+    //florent commented cause of change in document api
     /*
     public void copyToArea(Document sourceDoc, String destinationArea) throws PublicationException {
         String language = sourceDoc.getLanguage();
         copyToVersion(sourceDoc, destinationArea, language);
-    }
-
+    }*/
+    
+    //florent commented cause of change in document api
+    /*
     protected void copyToVersion(Document sourceDoc, String destinationArea, String language)
             throws DocumentException, DocumentBuildException, PublicationException, SiteException {
 
@@ -427,7 +450,7 @@
      * @see org.apache.lenya.cms.publication.DocumentManager#copyToArea(org.apache.lenya.cms.publication.util.DocumentSet,
      *      java.lang.String)
      */
-  //florent : seems never use, imply cyclic dependencies
+    //florent commented cause of change in document api
     /*
     public void copyToArea(DocumentSet documentSet, String destinationArea)
             throws PublicationException {
@@ -437,6 +460,8 @@
         }
     }*/
 
+    //florent commented cause of change in document api
+    /*
     public void moveAll(Area sourceArea, String sourcePath, Area targetArea, String targetPath)
             throws PublicationException {
         SiteStructure site = sourceArea.getSite();
@@ -456,7 +481,7 @@
             moveAllLanguageVersions(sourceArea, sourcePath + subPath, targetArea, targetPath
                     + subPath);
         }
-    }
+    }*/
 
     protected List preOrder(SiteNode node) {
         List list = new ArrayList();
@@ -468,6 +493,8 @@
         return list;
     }
 
+    //florent commented cause of change in document api
+    /*
     public void moveAllLanguageVersions(Area sourceArea, String sourcePath, Area targetArea,
             String targetPath) throws PublicationException {
 
@@ -504,8 +531,10 @@
         } catch (Exception e) {
             throw new PublicationException(e);
         }
-    }
-
+    }*/
+    
+    //florent commented cause of change in document api
+    /*
     public void copyAll(Area sourceArea, String sourcePath, Area targetArea, String targetPath)
             throws PublicationException {
 
@@ -519,8 +548,10 @@
             String nodeTargetPath = targetPath + nodeSourcePath.substring(sourcePath.length());
             copyAllLanguageVersions(sourceArea, nodeSourcePath, targetArea, nodeTargetPath);
         }
-    }
+    }*/
 
+    //florent commented cause of change in document api
+    /*
     public void copyAllLanguageVersions(Area sourceArea, String sourcePath, Area targetArea,
             String targetPath) throws PublicationException {
         Publication pub = sourceArea.getPublication();
@@ -545,7 +576,7 @@
                 copyDocumentSource(sourceVersion, targetDoc);
             }
         }
-    }
+    }*/
 
     /**
      * Copies a document source.
@@ -654,6 +685,8 @@
     /**
      * @see org.apache.lenya.cms.publication.DocumentManager#deleteAll(org.apache.lenya.cms.publication.Document)
      */
+    //florent commented cause of change in document api
+    /*
     public void deleteAll(Document document) throws PublicationException {
         NodeSet subsite = SiteUtil.getSubSite(document.getLink().getNode());
         for (NodeIterator i = subsite.descending(); i.hasNext();) {
@@ -664,17 +697,19 @@
                 delete(doc);
             }
         }
-    }
+    }*/
 
     /**
      * @see org.apache.lenya.cms.publication.DocumentManager#deleteAllLanguageVersions(org.apache.lenya.cms.publication.Document)
      */
+    //florent commented cause of change in document api
+    /*
     public void deleteAllLanguageVersions(Document document) throws PublicationException {
         String[] languages = document.getLanguages();
         for (int i = 0; i < languages.length; i++) {
             delete(document.getTranslation(languages[i]));
         }
-    }
+    }*/
 
     /**
      * Visitor to delete documents.
@@ -698,8 +733,12 @@
         /**
          * @see org.apache.lenya.cms.publication.util.DocumentVisitor#visitDocument(org.apache.lenya.cms.publication.Document)
          */
+        //florent : comment cause of document.getPublication() not still in api
+        /*
         public void visitDocument(Document document) throws PublicationException {
             getDocumentManager().deleteAllLanguageVersions(document);
+        }*/
+        public void visitDocument(Document document) throws PublicationException {
         }
 
     }
@@ -707,6 +746,8 @@
     /**
      * @see org.apache.lenya.cms.publication.DocumentManager#delete(org.apache.lenya.cms.publication.util.DocumentSet)
      */
+    //florent commented cause of change in document api
+    /*
     public void delete(DocumentSet documents) throws PublicationException {
 
         if (documents.isEmpty()) {
@@ -724,38 +765,25 @@
             throw new PublicationException(e);
         }
 
-    }
+    }*/
 
     /**
      * @see org.apache.lenya.cms.publication.DocumentManager#move(org.apache.lenya.cms.publication.util.DocumentSet,
      *      org.apache.lenya.cms.publication.util.DocumentSet)
      */
+    //florent commented cause of change in document api
+    /*
     public void move(DocumentSet sources, DocumentSet destinations) throws PublicationException {
         copy(sources, destinations);
         delete(sources);
-        /*
-         * Document[] sourceDocs = sources.getDocuments(); Document[] targetDocs =
-         * destinations.getDocuments();
-         * 
-         * if (sourceDocs.length != targetDocs.length) { throw new PublicationException( "The number
-         * of source and destination documents must be equal!"); }
-         * 
-         * Map source2target = new HashMap(); for (int i = 0; i < sourceDocs.length; i++) {
-         * source2target.put(sourceDocs[i], targetDocs[i]); }
-         * 
-         * DocumentSet sortedSources = new DocumentSet(sourceDocs);
-         * SiteUtil.sortAscending(this.manager, sortedSources); Document[] sortedSourceDocs =
-         * sortedSources.getDocuments();
-         * 
-         * for (int i = 0; i < sortedSourceDocs.length; i++) { move(sortedSourceDocs[i], (Document)
-         * source2target.get(sortedSourceDocs[i])); }
-         */
-    }
+    }*/
 
     /**
      * @see org.apache.lenya.cms.publication.DocumentManager#copy(org.apache.lenya.cms.publication.util.DocumentSet,
      *      org.apache.lenya.cms.publication.util.DocumentSet)
      */
+    //florent commented cause of change in document api
+    /*
     public void copy(DocumentSet sources, DocumentSet destinations) throws PublicationException {
         Document[] sourceDocs = sources.getDocuments();
         Document[] targetDocs = destinations.getDocuments();
@@ -778,8 +806,10 @@
             copy(sortedSourceDocs[i], ((Document) source2target.get(sortedSourceDocs[i]))
                     .getLocator());
         }
-    }
-
+    }*/
+    
+    //florent commented cause of change in document api
+    /*
     protected void sortAscending(DocumentSet set) throws PublicationException {
 
         if (!set.isEmpty()) {
@@ -814,8 +844,10 @@
             }
 
         }
-    }
-
+    }*/
+    
+    //florent commented cause of change in document api
+    /*
     public Document addVersion(Document sourceDocument, String area, String language,
             boolean addToSiteStructure) throws DocumentBuildException, PublicationException {
         Document document = addVersion(sourceDocument, area, language);
@@ -828,16 +860,16 @@
 
         return document;
     }
-
+    
     public Document addVersion(Document sourceDocument, String area, String language)
-            throws DocumentBuildException, DocumentException, PublicationException {
+            throws DocumentBuildException, PublicationException {
         Document document = add(sourceDocument.getResourceType(), sourceDocument.getUUID(),
                 sourceDocument.getInputStream(), sourceDocument.getPublication(), area, language,
                 sourceDocument.getSourceExtension(), sourceDocument.getMimeType());
         copyMetaData(sourceDocument, document);
 
         return document;
-    }
+    }*/
 
     public SourceResolver getSourceResolver() {
         return sourceResolver;
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/HistoryWrapper.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/HistoryWrapper.java
index b96394f..84ee20c 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/HistoryWrapper.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/HistoryWrapper.java
@@ -18,6 +18,8 @@
 package org.apache.lenya.cms.publication;
 
 import org.apache.lenya.cms.repository.RepositoryException;
+import org.apache.lenya.cms.repository.History;
+import org.apache.lenya.cms.repository.Revision;
 
 public class HistoryWrapper implements History {
 
@@ -28,15 +30,21 @@
     }
 
     public Revision getLatestRevision() {
-        return new RevisionWrapper(this.delegate.getLatestRevision());
+        //florent : don't know where this come...
+    	//return new RevisionWrapper(this.delegate.getLatestRevision());
+    	return this.delegate.getLatestRevision();
     }
 
     public Revision getRevision(int number)
-            throws org.apache.lenya.cms.publication.RepositoryException {
+            //florent throws org.apache.lenya.cms.publication.RepositoryException {
+    throws RepositoryException {
         try {
-            return new RevisionWrapper(this.delegate.getRevision(number));
+        //florent : don't know where this come...
+        	//return new RevisionWrapper(this.delegate.getLatestRevision());
+            return this.delegate.getRevision(number);
         } catch (RepositoryException e) {
-            throw new org.apache.lenya.cms.publication.RepositoryException(e);
+            //florent throw new org.apache.lenya.cms.publication.RepositoryException(e);
+        	throw new RepositoryException(e);
         }
     }
 
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/PageEnvelopeFactory.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/PageEnvelopeFactory.java
index 8ebadd3..15a5493 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/PageEnvelopeFactory.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/PageEnvelopeFactory.java
@@ -24,7 +24,9 @@
 
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Request;
-import org.apache.lenya.util.ServletHelper;
+//florent import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
+import org.apache.lenya.utils.URLInformation;
 
 /**
  * Common entry point for creating page envelopes.
@@ -61,7 +63,8 @@
             throws PageEnvelopeException {
         Request request = ObjectModelHelper.getRequest(objectModel);
         String contextPath = request.getContextPath();
-        String webappUrl = ServletHelper.getWebappURI(request);
+        //florent String webappUrl = ServletHelper.getWebappURI(request);
+        String webappUrl = new URLInformation().getWebappUrl();
         return getPageEnvelope(contextPath, webappUrl, pub);
     }
 
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/PublicationConfiguration.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/PublicationConfiguration.java
index e1638a9..d5b6bef 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/PublicationConfiguration.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/PublicationConfiguration.java
@@ -227,7 +227,7 @@
                 String area = proxyConfigs[i].getAttribute(ATTRIBUTE_AREA);
 
                 Object key = getProxyKey(area, Boolean.valueOf(ssl).booleanValue());
-                Proxy proxy = new Proxy(getDefaultProxyUrl(area));
+                Proxy proxy = new ProxyImpl(getDefaultProxyUrl(area));
                 proxy.setUrl(url);
                 this.areaSsl2proxy.put(key, proxy);
                 if (getLogger().isDebugEnabled()) {
@@ -323,7 +323,9 @@
      * Set the path mapper
      * @param _mapper The path mapper
      */
-    public void setPathMapper(DefaultDocumentIdToPathMapper _mapper) {
+    //florent : use interface instead of impl
+    //public void setPathMapper(DefaultDocumentIdToPathMapper _mapper) {
+    public void setPathMapper(DocumentIdToPathMapper _mapper) {
         assert _mapper != null;
         this.mapper = _mapper;
     }
@@ -442,7 +444,7 @@
         String key = getProxyKey(area, isSslProtected);
         Proxy proxy = (Proxy) this.areaSsl2proxy.get(key);
         if (proxy == null) {
-            proxy = new Proxy(getDefaultProxyUrl(area));
+            proxy = new ProxyImpl(getDefaultProxyUrl(area));
             this.areaSsl2proxy.put(key, proxy);
         }
         return proxy;
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/PublicationImpl.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/PublicationImpl.java
index d84c8c2..3d39ed5 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/PublicationImpl.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/PublicationImpl.java
@@ -32,7 +32,6 @@
 
 /**
  * A publication.
- * @version $Id$
  */
 public class PublicationImpl extends AbstractLogEnabled implements Publication, RepositoryItem {
 
@@ -164,7 +163,9 @@
         delegate.setDefaultLanguage(language);
     }
 
-    public void setPathMapper(DefaultDocumentIdToPathMapper mapper) {
+    //florent : to remove dependencie with document-impl 
+    //public void setPathMapper(DefaultDocumentIdToPathMapper mapper) {
+    public void setPathMapper(DocumentIdToPathMapper mapper) {
         delegate.setPathMapper(mapper);
     }
 
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/RevisionWrapper.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/RevisionWrapper.java
index ff2e1aa..348b767 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/RevisionWrapper.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/RevisionWrapper.java
@@ -17,6 +17,13 @@
  */
 package org.apache.lenya.cms.publication;
 
+import java.io.InputStream;
+
+import org.apache.lenya.cms.metadata.MetaData;
+import org.apache.lenya.cms.metadata.MetaDataException;
+import org.apache.lenya.cms.repository.RepositoryException;
+import org.apache.lenya.cms.repository.Revision;
+
 public class RevisionWrapper implements Revision {
     
     private org.apache.lenya.cms.repository.Revision delegate;
@@ -36,5 +43,47 @@
     public String getUserId() {
         return this.delegate.getUserId();
     }
+    
+    /*** begin unimplemented method */
+    //florent : this method are added unimplemented due to the use of repository.Revision and not still of publication.Revision
+		public long getLastModified() throws RepositoryException {
+			// TODO Auto-generated method stub
+			return 0;
+		}
+
+		public long getContentLength() throws RepositoryException {
+			// TODO Auto-generated method stub
+			return 0;
+		}
+
+		public String getSourceURI() {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		public boolean exists() throws RepositoryException {
+			// TODO Auto-generated method stub
+			return false;
+		}
+
+		public InputStream getInputStream() throws RepositoryException {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		public String getMimeType() throws RepositoryException {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		public MetaData getMetaData(String namespaceUri) throws MetaDataException {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		public String[] getMetaDataNamespaceUris() throws MetaDataException {
+			// TODO Auto-generated method stub
+			return null;
+		}
 
 }
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/SessionImpl.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/SessionImpl.java
index f7deacd..ac76eb1 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/SessionImpl.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/SessionImpl.java
@@ -23,11 +23,12 @@
 import org.apache.lenya.ac.Identity;
 import org.apache.lenya.cms.observation.RepositoryEvent;
 import org.apache.lenya.cms.observation.RepositoryEventFactory;
+import org.apache.lenya.cms.repository.RepositoryException;
 import org.apache.lenya.cms.repository.SessionHolder;
 import org.apache.lenya.transaction.UnitOfWork;
 
 /**
- * @deprecated solve the concurrency beetween lenya-core-repository/o.a.l.cms.repository.SessionImpl and lenya-core-impl/o.a.l.cms.publication.SEssionImpl
+ * @deprecated have to solve the concurrency beetween lenya-core-repository/o.a.l.cms.repository.SessionImpl and lenya-publication-impl/o.a.l.cms.publication.SEssionImpl
  */
 public class SessionImpl implements Session, SessionHolder {
 
@@ -79,7 +80,8 @@
     }
 
     public Identity getIdentity() {
-        return ((IdentityWrapper) getRepositorySession().getIdentity()).getIdentity();
+        //return ((IdentityWrapper) getRepositorySession().getIdentity()).getIdentity();
+    	return getRepositorySession().getIdentity();
     }
 
     /**
@@ -116,7 +118,9 @@
      * @param identity The identity.
      */
     public void setIdentity(Identity identity) {
-        getRepositorySession().setIdentity(new IdentityWrapper(identity));
+        //florent : now we only use one identity class
+    	//getRepositorySession().setIdentity(new IdentityWrapper(identity));
+    	getRepositorySession().setIdentity(identity);
     }
 
     private UriHandler uriHandler;
@@ -145,7 +149,9 @@
         if (existsPublication(id)) {
             throw new RepositoryException("The publication '" + id + "' already exists.");
         }
-        DocumentFactoryImpl factory = (DocumentFactoryImpl) getDocumentFactory();
+        //florent : remove document-impl dependencie 
+        //DocumentFactoryImpl factory = (DocumentFactoryImpl) getDocumentFactory();
+        DocumentFactory factory = (DocumentFactory) getDocumentFactory();
         factory.getPublicationManager().addPublication(id);
         return getPublication(id);
     }
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/SingleLanguageIdentityMapper.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/SingleLanguageIdentityMapper.java
index a9fd0dc..7e57258 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/SingleLanguageIdentityMapper.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/SingleLanguageIdentityMapper.java
@@ -27,14 +27,15 @@
  * such as the "blog" publication.
  * @version $Id$
  */
+/*florent comment as it create dependencie with document-impl. See how to enable or remove this
 public class SingleLanguageIdentityMapper extends IdentityDocumentIdToPathMapper {
-
+/*
     /**
      * The parameter <code>language</code> is ignored, since this mapper is used for situations where only one language version of a document exists
      * @see org.apache.lenya.cms.publication.IdentityDocumentIdToPathMapper#getSuffix(java.lang.String)
      */
-    protected String getSuffix(String language) {
+  /*  protected String getSuffix(String language) {
         return "";
     }
 
-}
+}*/
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/TransactionLock.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/TransactionLock.java
index 24f32dd..a9b3126 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/TransactionLock.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/TransactionLock.java
@@ -20,6 +20,7 @@
 /**
  * Global transaction lock.
  */
+//@Deprecated duplicate with o.a.l.transaction.TransactionLock. Use this instead.
 public class TransactionLock {
 
     /**
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/util/DocumentHelper.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/util/DocumentHelper.java
index 276cf2f..6257355 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/util/DocumentHelper.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/util/DocumentHelper.java
@@ -35,8 +35,10 @@
 import org.apache.lenya.cms.publication.PublicationException;
 import org.apache.lenya.cms.publication.Repository;
 import org.apache.lenya.cms.publication.Session;
-import org.apache.lenya.cms.publication.URLInformation;
-import org.apache.lenya.util.ServletHelper;
+//florent import org.apache.lenya.cms.publication.URLInformation;
+// import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.URLInformation;
+import org.apache.lenya.utils.ServletHelper;
 import org.springframework.web.context.WebApplicationContext;
 
 /**
@@ -60,7 +62,8 @@
         Session session = repo.getSession(request);
 
         this.objectModel = _objectModel;
-        URLInformation info = new URLInformation(ServletHelper.getWebappURI(request));
+        //florent URLInformation info = new URLInformation(ServletHelper.getWebappURI(request));
+        URLInformation info = new URLInformation();
         this.publication = session.getPublication(info.getPublicationId());
     }
 
@@ -81,7 +84,8 @@
         String url = null;
 
             Request request = ObjectModelHelper.getRequest(this.objectModel);
-            String webappUrl = ServletHelper.getWebappURI(request);
+            //florent String webappUrl = ServletHelper.getWebappURI(request);
+            String webappUrl = new URLInformation().getWebappUrl();
             Document envDocument = this.publication.getSession().getUriHandler().getDocument(
                     webappUrl);
             if (uuid == null) {
@@ -89,7 +93,8 @@
             }
 
             if (documentArea == null) {
-                URLInformation info = new URLInformation(webappUrl);
+                //florent URLInformation info = new URLInformation(webappUrl);
+            	URLInformation info = new URLInformation();
                 String completeArea = info.getCompleteArea();
                 documentArea = completeArea;
             }
@@ -125,7 +130,8 @@
         String contextPath;
         try {
             Request request = ObjectModelHelper.getRequest(this.objectModel);
-            String webappUrl = ServletHelper.getWebappURI(request);
+            //florent String webappUrl = ServletHelper.getWebappURI(request);
+            String webappUrl = new URLInformation().getWebappUrl();
             Document document = this.publication.getSession().getUriHandler()
                     .getDocument(webappUrl);
 
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/util/LanguageVersions.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/util/LanguageVersions.java
index bf9f163..a73719a 100644
--- a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/util/LanguageVersions.java
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/publication/util/LanguageVersions.java
@@ -20,13 +20,14 @@
 
 package org.apache.lenya.cms.publication.util;
 
+import org.apache.cocoon.ResourceNotFoundException;
 import org.apache.lenya.cms.publication.Document;
 import org.apache.lenya.cms.publication.DocumentException;
 
 /**
  * Document set containing all language versions of a document.
  */
-public class LanguageVersions extends DocumentSet {
+public class LanguageVersions extends DocumentSetImpl {
 
     /**
      * Ctor.
@@ -40,7 +41,11 @@
         for (int i = 0; i < languages.length; i++) {
             if (!document.getLanguage().equals(languages[i])) {
                 Document languageVersion;
-                languageVersion = document.getTranslation(languages[i]);
+                try {
+									languageVersion = document.getTranslation(languages[i]);
+								} catch (ResourceNotFoundException rnfe) {
+									throw new DocumentException(rnfe);
+								}
                 add(languageVersion);
             }
         }
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/AbstractLink.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/AbstractLink.java
new file mode 100644
index 0000000..34adf16
--- /dev/null
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/AbstractLink.java
@@ -0,0 +1,128 @@
+/*
+ * 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.
+ *
+ */
+
+/* @version $Id$ */
+
+package org.apache.lenya.cms.site;
+
+import org.apache.cocoon.ResourceNotFoundException;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.Publication;
+
+/**
+ * The AbstractLink class encapsulates a string label and a associated language.
+ */
+public abstract class AbstractLink implements Link {
+    private String label = null;
+    private String language = null;
+
+    /**
+     * Creates a new AbstractLink object.
+     * @param node The site node.
+     * @param _label the actual label
+     * @param _language the language
+     */
+    public AbstractLink(SiteNode node, String _label, String _language) {
+        this.label = _label;
+        this.language = _language;
+        this.node = node;
+    }
+
+    /**
+     * Get the actual label of the AbstractLink object
+     * 
+     * @return the actual label as a String
+     */
+    public String getLabel() {
+        return this.label;
+    }
+
+    /**
+     * Get the language of this AbstractLink object
+     * 
+     * @return the language
+     */
+
+    public String getLanguage() {
+        return this.language;
+    }
+
+    /**
+     * (non-Javadoc)
+     * @see java.lang.Object#toString()
+     */
+    public String toString() {
+        return getLabel() + " " + getLanguage();
+    }
+
+    /**
+     * (non-Javadoc)
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    public boolean equals(Object obj) {
+        boolean equals = false;
+
+        if (getClass().isInstance(obj)) {
+            AbstractLink otherLabel = (AbstractLink) obj;
+            equals = getLabel().equals(otherLabel.getLabel())
+                    && getLanguage().equals(otherLabel.getLanguage());
+        }
+
+        return equals;
+    }
+
+    /**
+     * (non-Javadoc)
+     * @see java.lang.Object#hashCode()
+     */
+    public int hashCode() {
+        return getLabel().hashCode() + getLanguage().hashCode();
+    }
+
+    private SiteNode node;
+
+    public Document getDocument() {
+        SiteNode node = getNode();
+        String uuid = node.getUuid();
+        if (uuid == null) {
+            throw new UnsupportedOperationException("The node [" + node + "] has no UUID.");
+        }
+        Publication pub = node.getStructure().getPublication();
+        String area = node.getStructure().getArea();
+        try {
+					return pub.getArea(area).getDocument(uuid, getLanguage());
+				} catch (ResourceNotFoundException e) {
+					throw new UnsupportedOperationException(e);
+				} catch (org.apache.lenya.cms.publication.ResourceNotFoundException e) {
+					throw new UnsupportedOperationException(e);
+				}
+    }
+
+    public SiteNode getNode() {
+        return this.node;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+        save();
+    }
+
+    protected void save() {
+    }
+
+}
\ No newline at end of file
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/AbstractSiteManager.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/AbstractSiteManager.java
new file mode 100644
index 0000000..0f2f784
--- /dev/null
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/AbstractSiteManager.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.lenya.cms.site;
+
+import java.util.Arrays;
+import java.util.Comparator;
+
+import org.apache.cocoon.util.AbstractLogEnabled;
+
+/**
+ * Abstract base class for site managers.
+ * 
+ * @version $Id$
+ */
+public abstract class AbstractSiteManager extends AbstractLogEnabled implements SiteManager {
+
+    /**
+     * @see org.apache.lenya.cms.site.SiteManager#sortAscending(org.apache.lenya.cms.publication.util.DocumentSet)
+     */
+    public SiteNode[] sortAscending(SiteNode[] nodes) throws SiteException {
+        if (nodes.length > 0) {
+
+            if (!check(new NodeSet(nodes))) {
+                throw new SiteException("The dependence relation is not a strict partial order!");
+            }
+
+            SiteNode[] sortedNodes = (SiteNode[]) Arrays.asList(nodes).toArray(
+                    new SiteNode[nodes.length]);
+            Arrays.sort(sortedNodes, new NodeComparator());
+            return sortedNodes;
+        } else {
+            return nodes;
+        }
+    }
+
+    /**
+     * Checks if the dependence relation is a strict partial order.
+     * 
+     * @param set The document set to check.
+     * @return A boolean value.
+     * @throws SiteException when something went wrong.
+     */
+    protected boolean check(NodeSet set) throws SiteException {
+        boolean isStrictPartialOrder = isIrreflexive(set) && isAntisymmetric(set)
+                && isTransitive(set);
+        return isStrictPartialOrder;
+    }
+
+    /**
+     * Checks if the dependence relation is antisymmetric.
+     * 
+     * @param set The document set to check.
+     * @return A boolean value.
+     * @throws SiteException when something went wrong.
+     */
+    protected boolean isAntisymmetric(NodeSet set) throws SiteException {
+        SiteNode[] resources = set.getNodes();
+        boolean isAntisymmetric = true;
+        for (int i = 0; i < resources.length; i++) {
+            for (int j = i + 1; j < resources.length; j++) {
+                if (requires(resources[i], resources[j]) && requires(resources[j], resources[i])
+                        && !(resources[i] == resources[j])) {
+                    isAntisymmetric = false;
+                }
+            }
+        }
+        return isAntisymmetric;
+    }
+
+    /**
+     * Checks if the dependence relation is transitive.
+     * 
+     * @param set The document set to check.
+     * @return A boolean value.
+     * @throws SiteException when something went wrong.
+     */
+    protected boolean isTransitive(NodeSet set) throws SiteException {
+        SiteNode[] resources = set.getNodes();
+        boolean isTransitive = true;
+        for (int i = 0; i < resources.length; i++) {
+            for (int j = i + 1; j < resources.length; j++) {
+                for (int k = j + 1; k < resources.length; k++) {
+                    if (requires(resources[i], resources[j])
+                            && requires(resources[j], resources[k])
+                            && !requires(resources[i], resources[k])) {
+                        isTransitive = false;
+                    }
+                }
+            }
+        }
+        return isTransitive;
+    }
+
+    /**
+     * Checks if the dependence relation is irreflexive.
+     * 
+     * @param set The document set.
+     * @return A boolean value
+     * @throws SiteException
+     */
+    protected boolean isIrreflexive(NodeSet set) throws SiteException {
+        SiteNode[] resources = set.getNodes();
+        boolean isIrreflexive = true;
+        for (int i = 0; i < resources.length; i++) {
+            if (requires(resources[i], resources[i])) {
+                isIrreflexive = false;
+            }
+        }
+        return isIrreflexive;
+    }
+
+    /**
+     * Compares nodes according to the dependence relation.
+     */
+    public class NodeComparator implements Comparator {
+
+        /**
+         * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+         */
+        public int compare(Object arg0, Object arg1) {
+            int result = 0;
+            if (arg0 instanceof SiteNode && arg1 instanceof SiteNode) {
+                SiteNode doc1 = (SiteNode) arg0;
+                SiteNode doc2 = (SiteNode) arg1;
+
+                try {
+                    if (AbstractSiteManager.this.requires(doc1, doc2)) {
+                        result = 1;
+                    } else if (AbstractSiteManager.this.requires(doc2, doc1)) {
+                        result = -1;
+                    }
+                } catch (SiteException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+            return result;
+        }
+    }
+
+}
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/AbstractSiteNode.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/AbstractSiteNode.java
new file mode 100644
index 0000000..bcd161f
--- /dev/null
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/AbstractSiteNode.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site;
+
+import java.util.Arrays;
+
+import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.cocoon.util.AbstractLogEnabled;
+import org.apache.commons.lang.Validate;
+import org.apache.commons.logging.Log;
+import org.apache.lenya.cms.publication.Publication;
+
+/**
+ * Abstract site node implementation.
+ */
+public abstract class AbstractSiteNode extends AbstractLogEnabled implements SiteNode {
+
+    private String path;
+    private SiteStructure structure;
+    private String uuid;
+
+    protected AbstractSiteNode(Publication publication, SiteStructure structure, String path,
+            String uuid, Log logger)
+    {
+    	Validate.notNull(structure);
+    	Validate.notNull(path);
+        Validate.isTrue(path.startsWith("/"), "Path must start with /");
+        Validate.notNull(uuid);
+        this.structure = structure;
+        this.path = path;
+        this.uuid = uuid;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public SiteStructure getStructure() {
+        return this.structure;
+    }
+
+    public boolean equals(Object obj) {
+        if (obj == null || !(obj instanceof SiteNode)) {
+            return false;
+        }
+        String thisKey = getKey(getStructure().getPublication(),
+                getStructure().getArea(),
+                getPath());
+        SiteNode node = (SiteNode) obj;
+        String nodeKey = getKey(node.getStructure().getPublication(),
+                node.getStructure().getArea(),
+                node.getPath());
+        return thisKey.equals(nodeKey);
+    }
+
+    public int hashCode() {
+        return getKey(getStructure().getPublication(), getStructure().getArea(), getPath()).hashCode();
+    }
+
+    protected static String getKey(Publication pub, String area, String docId) {
+        return pub.getId() + ":" + area + ":" + docId;
+    }
+
+    public SiteNode getParent() throws SiteException {
+        String id = getPath().substring(1);
+        String[] steps = id.split("/");
+        if (steps.length == 1) {
+            throw new SiteException("The node [" + getPath() + "] is a top-level node.");
+        } else {
+            int lastIndex = id.lastIndexOf("/");
+            String parentId = id.substring(0, lastIndex);
+            return getStructure().getNode("/" + parentId);
+        }
+    }
+    
+    public boolean isTopLevel() {
+        return getPath().lastIndexOf("/") == 0;
+    }
+
+    public String getUuid() {
+        return this.uuid;
+    }
+
+    public boolean hasLink(String language) {
+        return Arrays.asList(getLanguages()).contains(language);
+    }
+
+}
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/NodeIterator.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/NodeIterator.java
new file mode 100644
index 0000000..9806b82
--- /dev/null
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/NodeIterator.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.commons.lang.Validate;
+
+/**
+ * Node iterator.
+ */
+public class NodeIterator {
+
+    private Iterator delegate;
+    
+    /**
+     * @param collection The collection to iterate over.
+     */
+    public NodeIterator(Collection collection) {
+        Validate.notNull(collection);
+        this.delegate = collection.iterator();
+    }
+    
+    /**
+     * @param nodes The nodes to iterate over.
+     */
+    public NodeIterator(SiteNode[] nodes) {
+    	Validate.notNull(nodes);
+        this.delegate = Arrays.asList(nodes).iterator();
+    }
+    
+    /**
+     * @return A site node.
+     * @see Iterator#next()
+     */
+    public SiteNode next() {
+        return (SiteNode) this.delegate.next();
+    }
+    
+    /**
+     * @return A boolean value.
+     * @see Iterator#hasNext()
+     */
+    public boolean hasNext() {
+        return this.delegate.hasNext();
+    }
+    
+}
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/NodeSet.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/NodeSet.java
new file mode 100644
index 0000000..0a04a13
--- /dev/null
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/NodeSet.java
@@ -0,0 +1,204 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.cocoon.spring.configurator.WebAppContextUtils;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentException;
+import org.apache.lenya.cms.publication.util.DocumentSet;
+
+/**
+ * A set containing nodes.
+ */
+public class NodeSet {
+
+    /**
+     * Ctor.
+     * @param manager The service manager.
+     */
+    public NodeSet() {
+    }
+
+    /**
+     * Ctor.
+     * @param _nodes The initial nodes.
+     */
+    public NodeSet(SiteNode[] _nodes) {
+        for (int i = 0; i < _nodes.length; i++) {
+            add(_nodes[i]);
+        }
+    }
+
+    /**
+     * Ctor.
+     * @param documents The corresponding documents to derive nodes from.
+     */
+    //florent : seems never use and incompatible with document.getLink() remove
+    /*
+    public NodeSet(DocumentSet documents) {
+        Document[] docs = documents.getDocuments();
+        for (int i = 0; i < docs.length; i++) {
+            SiteNode node;
+            try {
+                node = docs[i].getLink().getNode();
+            } catch (DocumentException e) {
+                throw new RuntimeException(e);
+            }
+            if (!contains(node)) {
+                add(node);
+            }
+        }
+    }*/
+
+    /**
+     * @param node A node.
+     * @return If the node is contained.
+     */
+    public boolean contains(SiteNode node) {
+        return getSet().contains(node);
+    }
+
+    private Set nodes = new HashSet();
+
+    /**
+     * Returns the list object that stores the documents.
+     * @return A list.
+     */
+    protected Set getSet() {
+        return this.nodes;
+    }
+
+    /**
+     * Returns the documents contained in this set.
+     * 
+     * @return An array of documents.
+     */
+    public SiteNode[] getNodes() {
+        return (SiteNode[]) this.nodes.toArray(new SiteNode[this.nodes.size()]);
+    }
+
+    /**
+     * Adds a node to this set.
+     * @param node The node to add.
+     */
+    public void add(SiteNode node) {
+        assert node != null;
+        assert !this.nodes.contains(node);
+        this.nodes.add(node);
+    }
+
+    /**
+     * Checks if this set is empty.
+     * @return A boolean value.
+     */
+    public boolean isEmpty() {
+        return getSet().isEmpty();
+    }
+
+    /**
+     * Removes a node.
+     * @param resource The node.
+     */
+    public void remove(SiteNode resource) {
+        assert resource != null;
+        assert getSet().contains(resource);
+        getSet().remove(resource);
+    }
+
+    /**
+     * Removes all nodes.
+     */
+    public void clear() {
+        getSet().clear();
+    }
+
+    /**
+     * @return An iterator iterating in undetermined order.
+     */
+    public NodeIterator iterator() {
+        return new NodeIterator(getNodes());
+    }
+
+    /**
+     * @return An iterator iterating in ascending order.
+     */
+    public NodeIterator ascending() {
+        SiteNode[] nodes = getNodesAscending();
+        return new NodeIterator(nodes);
+    }
+
+    /**
+     * @return An iterator iterating in descending order.
+     */
+    public NodeIterator descending() {
+        SiteNode[] nodes = getNodesAscending();
+        List list = Arrays.asList(nodes);
+        Collections.reverse(list);
+        return new NodeIterator(list);
+    }
+
+    protected SiteNode[] getNodesAscending() {
+        if (isEmpty()) {
+            return new SiteNode[0];
+        }
+
+        try {
+            String hint = getNodes()[0].getStructure().getPublication().getSiteManagerHint();
+            SiteManager siteManager = (SiteManager) WebAppContextUtils.getCurrentWebApplicationContext().getBean(
+                    SiteManager.class.getName() + "/" + hint);
+            return siteManager.sortAscending(getNodes());
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * @return All documents referenced by this node set.
+     */
+    public Document[] getDocuments() {
+        List documents = new ArrayList();
+        for (NodeIterator i = iterator(); i.hasNext();) {
+            SiteNode node = i.next();
+            String[] langs = node.getLanguages();
+            for (int l = 0; l < langs.length; l++) {
+                try {
+                    documents.add(node.getLink(langs[l]).getDocument());
+                } catch (SiteException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+        return (Document[]) documents.toArray(new Document[documents.size()]);
+    }
+
+    /**
+     * Adds all nodes from a node set to this.
+     * @param set The set.
+     */
+    public void addAll(NodeSet set) {
+        this.nodes.addAll(set.getSet());
+    }
+
+}
diff --git a/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/SiteUtil.java b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/SiteUtil.java
new file mode 100644
index 0000000..53a27d7
--- /dev/null
+++ b/org.apache.lenya.core.publication.impl/src/main/java/org/apache/lenya/cms/site/SiteUtil.java
@@ -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.
+ *
+ */
+package org.apache.lenya.cms.site;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.cocoon.spring.configurator.WebAppContextUtils;
+import org.apache.lenya.cms.publication.DocumentLocator;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.Session;
+
+/**
+ * Utility to handle site structures.
+ * 
+ * @version $Id$
+ */
+public class SiteUtil {
+
+    private SiteUtil() {
+    }
+
+    /**
+     * Returns a sub-site starting with a certain node, which includes the node itself and all nodes
+     * which require this node, in preorder.
+     * 
+     * @param node The top-level document.
+     * @return A document set.
+     * @throws SiteException if an error occurs.
+     */
+    public static NodeSet getSubSite(SiteNode node) throws SiteException {
+        SiteManager siteManager = null;
+        SiteNode[] subsite;
+        try {
+            String hint = node.getStructure().getPublication().getSiteManagerHint();
+            siteManager = (SiteManager) WebAppContextUtils.getCurrentWebApplicationContext()
+                    .getBean(SiteManager.class.getName() + "/" + hint);
+
+            Set nodes = new HashSet();
+            nodes.add(node);
+
+            SiteNode[] requiringNodes = siteManager.getRequiringResources(node);
+            for (int i = 0; i < requiringNodes.length; i++) {
+                nodes.add(requiringNodes[i]);
+            }
+
+            subsite = (SiteNode[]) nodes.toArray(new SiteNode[nodes.size()]);
+        } catch (Exception e) {
+            throw new SiteException(e);
+        }
+        return new NodeSet(subsite);
+    }
+
+    /**
+     * @see org.apache.lenya.cms.site.SiteManager#getAvailableLocator(DocumentFactory,
+     *      DocumentLocator)
+     * @param factory The factory.
+     * @param locator The locator.
+     * @return A document.
+     * @throws SiteException if an error occurs.
+     */
+    public static DocumentLocator getAvailableLocator(Session session,
+            DocumentLocator locator) throws SiteException {
+        SiteManager siteManager = null;
+        try {
+            Publication pub = session.getPublication(locator.getPublicationId());
+            siteManager = (SiteManager) WebAppContextUtils.getCurrentWebApplicationContext()
+                    .getBean(SiteManager.ROLE + "/" + pub.getSiteManagerHint());
+            return siteManager.getAvailableLocator(session, locator);
+        } catch (Exception e) {
+            throw new SiteException(e);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DefaultDocumentBuilderTest.java b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DefaultDocumentBuilderTest.java
index 3924da2..9f34a17 100644
--- a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DefaultDocumentBuilderTest.java
+++ b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DefaultDocumentBuilderTest.java
@@ -16,23 +16,17 @@
  *
  */
 
-/* $Id$  */
-
 package org.apache.lenya.cms.publication;
 
-/**
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class DefaultDocumentBuilderTest extends DefaultDocumentTest {
 
-    /**
-     * @throws PublicationException 
-     * @see org.apache.lenya.cms.publication.DefaultDocumentTest#getDocument(DocumentTestSet)
-     */
-    protected Document getDocument(DocumentTestSet set) throws PublicationException {
-        Publication pub = getSession().getPublication("test");
-        return getSession().getUriHandler().getDocument("/" + pub.getId() + "/" + set.getArea() + set.getUrl());
-    }
-}
\ No newline at end of file
+//public class DefaultDocumentBuilderTest extends DefaultDocumentTest {
+//
+//    /**
+//     * @throws PublicationException 
+//     * @see org.apache.lenya.cms.publication.DefaultDocumentTest#getDocument(DocumentTestSet)
+//     */
+//    protected Document getDocument(DocumentTestSet set) throws PublicationException {
+//        Publication pub = getSession().getPublication("test");
+//        return getSession().getUriHandler().getDocument("/" + pub.getId() + "/" + set.getArea() + set.getUrl());
+//    }
+//}
\ No newline at end of file
diff --git a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DefaultDocumentTest.java b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DefaultDocumentTest.java
index c927eba..b34fedb 100644
--- a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DefaultDocumentTest.java
+++ b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DefaultDocumentTest.java
@@ -19,17 +19,17 @@
 /* $Id$  */
 
 package org.apache.lenya.cms.publication;
-
+/*
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.lenya.cms.AbstractAccessControlTest;
-
+*/
 /**
  * 
  * To change the template for this generated type comment go to Window>Preferences>Java>Code
  * Generation>Code and Comments
  */
-public class DefaultDocumentTest extends AbstractAccessControlTest {
+/*public class DefaultDocumentTest extends AbstractAccessControlTest {
     
     private static final Log logger = LogFactory.getLog(DefaultDocumentTest.class);
 
@@ -37,13 +37,13 @@
             new DocumentTestSet("/index.html", "/index", Publication.AUTHORING_AREA, "en", "html"),
             new DocumentTestSet("/index_de.html", "/index", Publication.AUTHORING_AREA, "de",
                     "html") };
-
+*/
     /**
      * Tests a document test set.
      * @param testSet The test set.
      * @throws PublicationException
      */
-    protected void doDocumentTest(DocumentTestSet testSet) throws PublicationException {
+ /*   protected void doDocumentTest(DocumentTestSet testSet) throws PublicationException {
         Document document = getDocument(testSet);
         logger.info("UUID:         " + document.getUUID());
         logger.info("Area:         " + document.getArea());
@@ -64,96 +64,96 @@
 
         logger.info("-----------------------------------------------");
     }
-
+*/
     /**
      * Tests the default document.
      * @throws PublicationException
      */
-    public void testDefaultDocument() throws PublicationException {
-        for (int i = 0; i < testSets.length; i++) {
-            doDocumentTest(testSets[i]);
-        }
-    }
+//    public void testDefaultDocument() throws PublicationException {
+//        for (int i = 0; i < testSets.length; i++) {
+//            doDocumentTest(testSets[i]);
+//        }
+//    }
 
-    /**
-     * Returns the test document for a given test set.
-     * @param testSet A document test set.
-     * @return A document.
-     * @throws PublicationException
-     */
-    protected Document getDocument(DocumentTestSet testSet) throws PublicationException {
-
-        Publication pub = getSession().getPublication("test");
-        String uuid = pub.getArea(testSet.getArea()).getSite().getNode(testSet.getPath()).getUuid();
-        DocumentIdentifier id = new DocumentIdentifier(pub.getId(), testSet.getArea(), uuid, testSet
-                .getLanguage());
-        DocumentImpl document = new DocumentImpl(getSession(), id, -1);
-        document.setExtension(testSet.getExtension());
-
-        return document;
-    }
-
-    /**
-     * Utility class to store test data for a document.
-     */
-    protected static class DocumentTestSet {
-        private String url;
-        private String path;
-        private String extension;
-        private String area;
-        private String language;
-
-        /**
-         * Ctor.
-         * @param _url The url.
-         * @param _path The path.
-         * @param _area The area.
-         * @param _language The language.
-         * @param _extension The extension.
-         */
-        public DocumentTestSet(String _url, String _path, String _area, String _language,
-                String _extension) {
-            this.url = _url;
-            this.path = _path;
-            this.area = _area;
-            this.language = _language;
-            this.extension = _extension;
-        }
-
-        /**
-         * @return The area.
-         */
-        public String getArea() {
-            return this.area;
-        }
-
-        /**
-         * @return The extension.
-         */
-        public String getExtension() {
-            return this.extension;
-        }
-
-        /**
-         * @return The path.
-         */
-        public String getPath() {
-            return this.path;
-        }
-
-        /**
-         * @return The language.
-         */
-        public String getLanguage() {
-            return this.language;
-        }
-
-        /**
-         * @return The URL.
-         */
-        public String getUrl() {
-            return this.url;
-        }
-    }
-
-}
\ No newline at end of file
+//    /**
+//     * Returns the test document for a given test set.
+//     * @param testSet A document test set.
+//     * @return A document.
+//     * @throws PublicationException
+//     */
+//    protected Document getDocument(DocumentTestSet testSet) throws PublicationException {
+//
+//        Publication pub = getSession().getPublication("test");
+//        String uuid = pub.getArea(testSet.getArea()).getSite().getNode(testSet.getPath()).getUuid();
+//        DocumentIdentifier id = new DocumentIdentifier(pub.getId(), testSet.getArea(), uuid, testSet
+//                .getLanguage());
+//        DocumentImpl document = new DocumentImpl(getSession(), id, -1);
+//        document.setExtension(testSet.getExtension());
+//
+//        return document;
+//    }
+//
+//    /**
+//     * Utility class to store test data for a document.
+//     */
+//    protected static class DocumentTestSet {
+//        private String url;
+//        private String path;
+//        private String extension;
+//        private String area;
+//        private String language;
+//
+//        /**
+//         * Ctor.
+//         * @param _url The url.
+//         * @param _path The path.
+//         * @param _area The area.
+//         * @param _language The language.
+//         * @param _extension The extension.
+//         */
+//        public DocumentTestSet(String _url, String _path, String _area, String _language,
+//                String _extension) {
+//            this.url = _url;
+//            this.path = _path;
+//            this.area = _area;
+//            this.language = _language;
+//            this.extension = _extension;
+//        }
+//
+//        /**
+//         * @return The area.
+//         */
+//        public String getArea() {
+//            return this.area;
+//        }
+//
+//        /**
+//         * @return The extension.
+//         */
+//        public String getExtension() {
+//            return this.extension;
+//        }
+//
+//        /**
+//         * @return The path.
+//         */
+//        public String getPath() {
+//            return this.path;
+//        }
+//
+//        /**
+//         * @return The language.
+//         */
+//        public String getLanguage() {
+//            return this.language;
+//        }
+//
+//        /**
+//         * @return The URL.
+//         */
+//        public String getUrl() {
+//            return this.url;
+//        }
+//    }
+//
+//}
\ No newline at end of file
diff --git a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DocumentFactoryTest.java b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DocumentFactoryTest.java
index 1f8daa2..72f826a 100644
--- a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DocumentFactoryTest.java
+++ b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DocumentFactoryTest.java
@@ -17,22 +17,23 @@
  */
 package org.apache.lenya.cms.publication;
 
-import org.apache.commons.logging.Log;
+/*import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.lenya.cms.AbstractAccessControlTest;
+*/
 
 /**
  * Document factory test.
  */
-public class DocumentFactoryTest extends AbstractAccessControlTest {
+/*public class DocumentFactoryTest extends AbstractAccessControlTest {
     
     private static final Log logger = LogFactory.getLog(DocumentFactoryTest.class);
-
+*/
     /**
      * Tests the meta data.
      * @throws Exception
      */
-    public void testDocumentFactory() throws Exception {
+ /*   public void testDocumentFactory() throws Exception {
         Session session = getSession();
         
         DocumentFactoryBuilder builder = (DocumentFactoryBuilder) getBeanFactory().getBean(DocumentFactoryBuilder.class.getName());
@@ -52,4 +53,4 @@
         assertSame(docA1, docB1);
     }
 
-}
+}*/
diff --git a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DocumentLocatorTest.java b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DocumentLocatorTest.java
index c98d536..1236d8e 100644
--- a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DocumentLocatorTest.java
+++ b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DocumentLocatorTest.java
@@ -17,45 +17,45 @@
  */
 package org.apache.lenya.cms.publication;
 
-import junit.framework.TestCase;
-
-/**
- *
- */
-public class DocumentLocatorTest extends TestCase {
-
-    /**
-     * 
-     */
-    public void testDocumentLocator() {
-        
-        String pubId = "pub";
-        String area = "area";
-        String area2 = "area2";
-        String languageDe = "de";
-        String languageEn = "en";
-        
-        DocumentLocator root = DocumentLocator.getLocator(pubId, area, "", languageDe);
-        DocumentLocator foo = DocumentLocator.getLocator(pubId, area, "/foo", languageDe);
-        DocumentLocator fooBar = DocumentLocator.getLocator(pubId, area, "/foo/bar", languageDe);
-        DocumentLocator fooBarBaz = DocumentLocator.getLocator(pubId, area, "/foo/bar/baz", languageDe);
-
-        DocumentLocator fooEn = DocumentLocator.getLocator(pubId, area, "/foo", languageEn);
-        DocumentLocator foo2 = DocumentLocator.getLocator(pubId, area2, "/foo", languageDe);
-
-        assertEquals(foo.getParent(), root);
-        assertEquals(fooBar.getParent(), foo);
-        assertEquals(fooBarBaz.getParent(), fooBar);
-        
-        assertEquals(root.getDescendant("foo"), foo);
-        assertEquals(foo.getDescendant("bar/baz"), fooBarBaz);
-        
-        assertEquals(foo.getChild("bar"), fooBar);
-        
-        assertEquals(foo.getLanguageVersion(languageEn), fooEn);
-        
-        assertEquals(foo.getAreaVersion(area2), foo2);
-        
-    }
-    
-}
+//import junit.framework.TestCase;
+//
+///**
+// *
+// */
+//public class DocumentLocatorTest extends TestCase {
+//
+//    /**
+//     * 
+//     */
+//    public void testDocumentLocator() {
+//        
+//        String pubId = "pub";
+//        String area = "area";
+//        String area2 = "area2";
+//        String languageDe = "de";
+//        String languageEn = "en";
+//        
+//        DocumentLocator root = DocumentLocator.getLocator(pubId, area, "", languageDe);
+//        DocumentLocator foo = DocumentLocator.getLocator(pubId, area, "/foo", languageDe);
+//        DocumentLocator fooBar = DocumentLocator.getLocator(pubId, area, "/foo/bar", languageDe);
+//        DocumentLocator fooBarBaz = DocumentLocator.getLocator(pubId, area, "/foo/bar/baz", languageDe);
+//
+//        DocumentLocator fooEn = DocumentLocator.getLocator(pubId, area, "/foo", languageEn);
+//        DocumentLocator foo2 = DocumentLocator.getLocator(pubId, area2, "/foo", languageDe);
+//
+//        assertEquals(foo.getParent(), root);
+//        assertEquals(fooBar.getParent(), foo);
+//        assertEquals(fooBarBaz.getParent(), fooBar);
+//        
+//        assertEquals(root.getDescendant("foo"), foo);
+//        assertEquals(foo.getDescendant("bar/baz"), fooBarBaz);
+//        
+//        assertEquals(foo.getChild("bar"), fooBar);
+//        
+//        assertEquals(foo.getLanguageVersion(languageEn), fooEn);
+//        
+//        assertEquals(foo.getAreaVersion(area2), foo2);
+//        
+//    }
+//    
+//}
diff --git a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DocumentManagerTest.java b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DocumentManagerTest.java
index 5ce755c..d0f661d 100644
--- a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DocumentManagerTest.java
+++ b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DocumentManagerTest.java
@@ -16,7 +16,7 @@
  *
  */
 package org.apache.lenya.cms.publication;
-
+/*
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -29,19 +29,19 @@
 import org.apache.lenya.cms.site.SiteStructure;
 import org.apache.lenya.cms.site.SiteUtil;
 import org.apache.lenya.util.StringUtil;
-
+*/
 /**
  * Document manager test.
  */
-public class DocumentManagerTest extends AbstractAccessControlTest {
+/*public class DocumentManagerTest extends AbstractAccessControlTest {
 
     private DocumentManager docManager;
-
+*/
     /**
      * Do the test.
      * @throws Exception
      */
-    public void testDocumentManager() throws Exception {
+/*    public void testDocumentManager() throws Exception {
         doTestMoveAll(getDocManager(), "/doctypes", "/tutorial/doctypes");
         doTestMoveAll(getDocManager(), "/tutorial/doctypes", "/doctypes");
         doTestCopyAll(getDocManager(), "/doctypes", "/tutorial/doctypes");
@@ -190,4 +190,4 @@
         }
         return docManager;
     }
-}
+}*/
diff --git a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DublinCoreTest.java b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DublinCoreTest.java
index a2cd9c1..e421efe 100644
--- a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DublinCoreTest.java
+++ b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/DublinCoreTest.java
@@ -18,26 +18,26 @@
 
 package org.apache.lenya.cms.publication;
 
-import org.apache.lenya.cms.AbstractAccessControlTest;
+/*import org.apache.lenya.cms.AbstractAccessControlTest;
 import org.apache.lenya.cms.metadata.MetaData;
 import org.apache.lenya.cms.metadata.dublincore.DublinCore;
+*/
 
 /**
  * Dublin Core test.
  * 
- * @version $Id$
  */
-public class DublinCoreTest extends AbstractAccessControlTest {
+/*public class DublinCoreTest extends AbstractAccessControlTest {
 
     private static final String AREA = "authoring";
     private static final String PATH = "/tutorial";
     private static final String LANGUAGE = "de";
-
+*/
     /**
      * Test the fetching, modification and refetching of a dc core object.
      * @throws Exception 
      */
-    final public void testModifySaveAndReload() throws Exception {
+/*    final public void testModifySaveAndReload() throws Exception {
         
         login("lenya");
         
@@ -70,4 +70,4 @@
         doc.unlock();
     }
 
-}
+}*/
diff --git a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/PublicationTest.java b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/PublicationTest.java
index eac3f2c..0c174c4 100644
--- a/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/PublicationTest.java
+++ b/org.apache.lenya.core.publication.impl/src/test/java/org/apache/lenya/cms/publication/PublicationTest.java
@@ -16,7 +16,7 @@
  *
  */
 package org.apache.lenya.cms.publication;
-
+/*
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
@@ -24,17 +24,17 @@
 import org.apache.excalibur.source.SourceResolver;
 import org.apache.excalibur.source.TraversableSource;
 import org.apache.lenya.cms.AbstractAccessControlTest;
-
+*/
 /**
  * Publication test.
  */
-public class PublicationTest extends AbstractAccessControlTest {
+//public class PublicationTest extends AbstractAccessControlTest {
 
     /**
      * Tests the publication functionality.
      * @throws Exception
      */
-    public void testPublication() throws Exception {
+/*    public void testPublication() throws Exception {
         String[] pubIds = getSession().getPublicationIds();
         for (String id : pubIds) {
             doTestPublication(getSession().getPublication(id));
@@ -93,3 +93,4 @@
     }
 
 }
+*/
\ No newline at end of file
diff --git a/org.apache.lenya.core.repository.api/pom.xml b/org.apache.lenya.core.repository.api/pom.xml
index a7e3b69..2057a41 100644
--- a/org.apache.lenya.core.repository.api/pom.xml
+++ b/org.apache.lenya.core.repository.api/pom.xml
@@ -23,7 +23,11 @@
   <dependency>
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-metadata-api</artifactId>
-    </dependency>  
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-identity</artifactId>
+    </dependency>    
     
   <!-- TODO : see if all theses dependencies are required -->
     <dependency>
diff --git a/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/publication/Repository.java b/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/publication/Repository.java
new file mode 100644
index 0000000..0e1b47d
--- /dev/null
+++ b/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/publication/Repository.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.publication;
+
+import javax.servlet.http.HttpServletRequest;
+//florent : changed cause of module change of this class
+//import org.apache.lenya.cms.publication.Session;
+import org.apache.lenya.cms.repository.Session;
+
+//import org.apache.lenya.ac.Identity;
+
+public interface Repository {
+    
+    Session getSession(HttpServletRequest request);
+    
+    //florent : remove as it create cycliq dependencies.
+    //note : can be re-enable now as identity is in lenya-core-identity
+    // suppress this comment when ok
+    //Session startSession(Identity identity, boolean modifiable);
+
+    void removeSession(HttpServletRequest request);
+    
+}
diff --git a/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/repository/RepositoryManager.java b/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/repository/RepositoryManager.java
index afa6817..4cebcd2 100644
--- a/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/repository/RepositoryManager.java
+++ b/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/repository/RepositoryManager.java
@@ -17,11 +17,11 @@
  */
 package org.apache.lenya.cms.repository;
 
-import org.apache.lenya.transaction.Identity;
+//florent import org.apache.lenya.transaction.Identity;
+import org.apache.lenya.ac.Identity;
 
 /**
  * Repository manager.
- * @version $Id:$
  */
 public interface RepositoryManager {
 
diff --git a/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/repository/Revision.java b/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/repository/Revision.java
index 1805bab..31e3a8d 100644
--- a/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/repository/Revision.java
+++ b/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/repository/Revision.java
@@ -20,7 +20,10 @@
 /**
  * A revision.
  */
-public interface Revision extends ContentHolder {
+public interface Revision extends ContentHolder{
+//florent : remove while not implement abstract method of contenHolder
+// sourceNodeRevision implement it, but have to implement them in RevisionWrapper.java
+//extends ContentHolder {
     
     /**
      * @return The revision number.
diff --git a/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/repository/Session.java b/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/repository/Session.java
index 841cd21..70a5c72 100644
--- a/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/repository/Session.java
+++ b/org.apache.lenya.core.repository.api/src/main/java/org/apache/lenya/cms/repository/Session.java
@@ -20,7 +20,10 @@
 import org.apache.lenya.cms.observation.RepositoryEvent;
 import org.apache.lenya.cms.observation.RepositoryListener;
 import org.apache.lenya.transaction.ConcurrentModificationException;
-import org.apache.lenya.transaction.Identity;
+//florent remove this identity as duplication of the core-ac one 
+//import org.apache.lenya.transaction.Identity;
+import org.apache.lenya.ac.Identity;
+
 import org.apache.lenya.transaction.UnitOfWork;
 
 /**
diff --git a/org.apache.lenya.core.repository.impl/pom.xml b/org.apache.lenya.core.repository.impl/pom.xml
index 821021c..f0de736 100644
--- a/org.apache.lenya.core.repository.impl/pom.xml
+++ b/org.apache.lenya.core.repository.impl/pom.xml
@@ -19,6 +19,32 @@
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-repository-api</artifactId>
     </dependency>
+     <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-publication-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-metadata-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-observation</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-transaction-impl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-identity</artifactId>
+    </dependency>
+    
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>servlet-api</artifactId>
+      <scope>provided</scope>
+    </dependency>
     <dependency>
       <groupId>commons-logging</groupId>
       <artifactId>commons-logging</artifactId>
@@ -31,6 +57,11 @@
       <groupId>org.apache.cocoon</groupId>
       <artifactId>cocoon-util</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.cocoon</groupId>
+      <artifactId>cocoon-core</artifactId>
+    </dependency>
+    
     <!-- TODO: remove dependencies on Avalon and Excalibur -->
     <dependency>
       <groupId>org.apache.avalon.framework</groupId>
diff --git a/org.apache.lenya.core.observation/src/main/java/org/apache/lenya/cms/observation/RepositoryEventFactory.java b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/observation/RepositoryEventFactory.java
similarity index 91%
rename from org.apache.lenya.core.observation/src/main/java/org/apache/lenya/cms/observation/RepositoryEventFactory.java
rename to org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/observation/RepositoryEventFactory.java
index f91a1f1..8ecc0eb 100644
--- a/org.apache.lenya.core.observation/src/main/java/org/apache/lenya/cms/observation/RepositoryEventFactory.java
+++ b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/observation/RepositoryEventFactory.java
@@ -20,7 +20,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.lenya.cms.publication.Document;
-import org.apache.lenya.cms.publication.DocumentImpl;
+//florent import org.apache.lenya.cms.publication.DocumentImpl;
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.repository.Node;
 import org.apache.lenya.cms.repository.Session;
@@ -39,7 +39,7 @@
      * @return An event.
      */
     public static final RepositoryEvent createEvent(Session session, Object descriptor) {
-        return new RepositoryEvent(session, descriptor);
+        return new RepositoryEventImpl(session, descriptor);
     }
 
     /**
@@ -48,6 +48,7 @@
      * @param descriptor The descriptor.
      * @return An event.
      */
+    /* florent : seems not used and create a dependencie to lenya-document-impl
     public static final RepositoryEvent createEvent(Document doc, Object descriptor) {
         Node node = ((DocumentImpl) doc).getRepositoryNode();
         RepositoryEvent event = new RepositoryEvent(node.getRepositorySession(),
@@ -59,7 +60,7 @@
         }
         return event;
 
-    }
+    }*/
 
     /**
      * Creates a repository event for a node.
@@ -76,7 +77,7 @@
         if (doc != null) {
             event = createEvent(doc, descriptor);
         } else {
-            event = new RepositoryEvent(node.getRepositorySession(), descriptor);
+            event = new RepositoryEventImpl(node.getRepositorySession(), descriptor);
             event.setNodeUri(node.getSourceURI());
         }
         return event;
@@ -124,7 +125,9 @@
                 logger.info("No document found for node [" + sourceUri + "]");
             }
 
-        } catch (Exception e) {
+        //florent } catch (Exception e) {
+        } catch (org.apache.cocoon.ResourceNotFoundException e) {
+            
             throw new RuntimeException(e);
         }
         return doc;
diff --git a/org.apache.lenya.core.observation/src/main/java/org/apache/lenya/cms/observation/RepositoryLogger.java b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/observation/RepositoryLogger.java
similarity index 100%
rename from org.apache.lenya.core.observation/src/main/java/org/apache/lenya/cms/observation/RepositoryLogger.java
rename to org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/observation/RepositoryLogger.java
diff --git a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/publication/RepositoryImpl.java b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/publication/RepositoryImpl.java
index 8271223..328eb55 100644
--- a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/publication/RepositoryImpl.java
+++ b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/publication/RepositoryImpl.java
@@ -24,6 +24,9 @@
 import org.apache.lenya.ac.Identity;
 import org.apache.lenya.cms.repository.RepositoryException;
 import org.apache.lenya.cms.repository.RepositoryManager;
+import org.apache.lenya.cms.repository.SessionImpl;
+import org.apache.lenya.cms.repository.Session;
+
 
 public class RepositoryImpl implements Repository {
 
@@ -33,6 +36,7 @@
     public Session getSession(HttpServletRequest request) {
         Validate.notNull(request);
         SessionImpl session = (SessionImpl) request.getAttribute(Session.class.getName());
+        
         if (session == null) {
             Identity identity = getIdentity(request);
             // attach a read-only repository session to the HTTP request
@@ -54,6 +58,7 @@
                     "Can't start a modifiable session without an identity.");
         }
 
+        /*florent : user the repository session 
         IdentityWrapper wrapper = new IdentityWrapper(identity);
         org.apache.lenya.cms.repository.Session repoSession;
         try {
@@ -61,7 +66,8 @@
         } catch (RepositoryException e) {
             throw new RuntimeException(e);
         }
-        SessionImpl session = new SessionImpl(this, repoSession);
+        SessionImpl session = new SessionImpl(this, repoSession);*/
+        SessionImpl session = new SessionImpl(identity,modifiable);
         session.setDocumentFactoryBuilder(this.documentFactoryBuilder);
         return session;
     }
diff --git a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/rc/FileReservedCheckOutException.java b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/rc/FileReservedCheckOutException.java
index 8b86efe..9c4e6ca 100644
--- a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/rc/FileReservedCheckOutException.java
+++ b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/rc/FileReservedCheckOutException.java
@@ -46,7 +46,7 @@
         this.source = _source;
 
         try {
-            CheckOutEntry coe = rcml.getLatestCheckOutEntry();
+            CheckOutEntry coe = (CheckOutEntry)rcml.getLatestCheckOutEntry();
 
             this.checkOutUsername = coe.getIdentity();
             this.checkOutDate = new Date(coe.getTime());
diff --git a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/RepositoryManagerImpl.java b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/RepositoryManagerImpl.java
index c5e4e9e..3819729 100644
--- a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/RepositoryManagerImpl.java
+++ b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/RepositoryManagerImpl.java
@@ -20,8 +20,10 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.lenya.cms.observation.ObservationRegistry;
-import org.apache.lenya.transaction.Identity;
-
+//florent import org.apache.lenya.transaction.Identity;
+import org.apache.lenya.ac.Identity;
+import org.apache.lenya.cms.repository.SessionImpl;
+import org.apache.lenya.cms.repository.Session;
 /**
  * Repository manager implementation.
  * @version $Id:$
diff --git a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/SessionImpl.java b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/SessionImpl.java
index f54f12e..563fdba 100644
--- a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/SessionImpl.java
+++ b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/SessionImpl.java
@@ -30,8 +30,11 @@
 import org.apache.lenya.cms.observation.ObservationRegistry;
 import org.apache.lenya.cms.observation.RepositoryEvent;
 import org.apache.lenya.cms.observation.RepositoryListener;
+import org.apache.lenya.cms.publication.DocumentFactoryBuilder;
 import org.apache.lenya.transaction.ConcurrentModificationException;
-import org.apache.lenya.transaction.Identity;
+//florent : change this clase with the core-ac one in order to remove duplications
+//import org.apache.lenya.transaction.Identity;
+import org.apache.lenya.ac.Identity;
 import org.apache.lenya.transaction.IdentityMap;
 import org.apache.lenya.transaction.IdentityMapImpl;
 import org.apache.lenya.transaction.Lock;
@@ -45,7 +48,7 @@
 /**
  * Repository session.
  * 
- * @deprecated solve the concurrency beetween lenya-core-repository/o.a.l.cms.repository.SessionImpl and lenya-core-impl/o.a.l.cms.publication.SEssionImpl 
+ * @deprecated have to solve the concurrency beetween lenya-core-repository/o.a.l.cms.repository.SessionImpl and lenya-publication-impl/o.a.l.cms.publication.SEssionImpl 
  */
 public class SessionImpl implements Session {
     
@@ -75,7 +78,8 @@
      * @param identity The identity.
      * @param modifiable Determines if the repository items in this session can be modified.
      */
-    protected SessionImpl(Identity identity, boolean modifiable) {
+    //florent protected SessionImpl(Identity identity, boolean modifiable) {
+    public SessionImpl(Identity identity, boolean modifiable) {
 
         this.identityMap = new IdentityMapImpl();
         this.identity = identity;
@@ -281,4 +285,10 @@
         this.holder = holder;
     }
 
+    //florent : add for use the repository session inside the repository module...
+    private DocumentFactoryBuilder documentFactoryBuilder;
+
+    public void setDocumentFactoryBuilder(DocumentFactoryBuilder documentFactoryBuilder) {
+      this.documentFactoryBuilder = documentFactoryBuilder;
+  }
 }
diff --git a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/SharedItemStoreImpl.java b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/SharedItemStoreImpl.java
index ef0debe..d4d3210 100644
--- a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/SharedItemStoreImpl.java
+++ b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/SharedItemStoreImpl.java
@@ -20,7 +20,9 @@
 import org.apache.cocoon.util.AbstractLogEnabled;
 import org.apache.lenya.cms.observation.RepositoryEvent;
 import org.apache.lenya.cms.observation.RepositoryListener;
-import org.apache.lenya.transaction.Identity;
+//florent remove this identity as duplication of the core-ac one 
+//import org.apache.lenya.transaction.Identity;
+import org.apache.lenya.ac.Identity;
 import org.apache.lenya.transaction.Lock;
 import org.apache.lenya.transaction.Lockable;
 import org.apache.lenya.transaction.TransactionException;
diff --git a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/metadata/impl/ConfigurableElementSet.java b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/metadata/impl/ConfigurableElementSet.java
index f2ff55f..a9c8dce 100644
--- a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/metadata/impl/ConfigurableElementSet.java
+++ b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/metadata/impl/ConfigurableElementSet.java
@@ -28,10 +28,15 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.excalibur.source.Source;
 import org.apache.excalibur.source.SourceResolver;
-import org.apache.lenya.cms.repository.metadata.Element;
+//florent : remove deprecated import, cause duplicate classes
+/*import org.apache.lenya.cms.repository.metadata.Element;
 import org.apache.lenya.cms.repository.metadata.ElementSet;
 import org.apache.lenya.cms.repository.metadata.MetaDataException;
-import org.apache.lenya.cms.repository.metadata.MetaDataRegistry;
+import org.apache.lenya.cms.repository.metadata.MetaDataRegistry;*/
+import org.apache.lenya.cms.metadata.Element;
+import org.apache.lenya.cms.metadata.ElementSet;
+import org.apache.lenya.cms.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.MetaDataRegistry;
 
 /**
  * Avalon-based element set.
diff --git a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/metadata/impl/ElementImpl.java b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/metadata/impl/ElementImpl.java
index fdee1bc..89c3820 100644
--- a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/metadata/impl/ElementImpl.java
+++ b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/metadata/impl/ElementImpl.java
@@ -17,8 +17,11 @@
  */
 package org.apache.lenya.cms.repository.metadata.impl;
 
-import org.apache.lenya.cms.repository.metadata.Element;
-import org.apache.lenya.cms.repository.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.Element;
+import org.apache.lenya.cms.metadata.MetaDataException;
+//florent : remove deprecated classes cause of duplications 
+/*import org.apache.lenya.cms.repository.metadata.Element;
+import org.apache.lenya.cms.repository.metadata.MetaDataException;*/
 
 /**
  * Element implementation.
diff --git a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/metadata/impl/MetaDataRegistryImpl.java b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/metadata/impl/MetaDataRegistryImpl.java
index 2bd5b01..5562e30 100644
--- a/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/metadata/impl/MetaDataRegistryImpl.java
+++ b/org.apache.lenya.core.repository.impl/src/main/java/org/apache/lenya/cms/repository/metadata/impl/MetaDataRegistryImpl.java
@@ -21,9 +21,13 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.lenya.cms.repository.metadata.ElementSet;
-import org.apache.lenya.cms.repository.metadata.MetaDataException;
-import org.apache.lenya.cms.repository.metadata.MetaDataRegistry;
+import org.apache.lenya.cms.metadata.ElementSet;
+import org.apache.lenya.cms.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.MetaDataRegistry;
+//florent : remove deprecated classes cause of duplications 
+//import org.apache.lenya.cms.repository.metadata.ElementSet;
+//import org.apache.lenya.cms.repository.metadata.MetaDataException;
+//import org.apache.lenya.cms.repository.metadata.MetaDataRegistry;
 
 /**
  * Meta data registry implementation.
diff --git a/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/MockFactory.java b/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/MockFactory.java
index 715f20f..08a12ed 100644
--- a/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/MockFactory.java
+++ b/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/MockFactory.java
@@ -16,7 +16,7 @@
  *
  */
 package org.apache.lenya.transaction;
-
+/*
 public class MockFactory implements IdentifiableFactory {
     
     private UnitOfWork unit;
@@ -33,4 +33,4 @@
         return "mock";
     }
 
-}
+}*/
diff --git a/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/MockRevisionController.java b/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/MockRevisionController.java
index c398922..80234d3 100644
--- a/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/MockRevisionController.java
+++ b/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/MockRevisionController.java
@@ -16,7 +16,7 @@
  *
  */
 package org.apache.lenya.transaction;
-
+/*
 import java.util.HashMap;
 import java.util.Map;
 
@@ -70,4 +70,4 @@
         
     }
 
-}
+}*/
diff --git a/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/MockTransactionable.java b/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/MockTransactionable.java
index e901dd3..10511fc 100644
--- a/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/MockTransactionable.java
+++ b/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/MockTransactionable.java
@@ -17,6 +17,7 @@
  */
 package org.apache.lenya.transaction;
 
+/*
 import org.apache.lenya.cms.publication.IdentityWrapper;
 import org.apache.lenya.cms.repository.RepositoryException;
 
@@ -79,10 +80,10 @@
         String user = MockRevisionController.getHistory(this).getCheckOutUser();
         return user != null && user.equals(getUserId());
     }
-    
+     
     private String getUserId() {
-        IdentityWrapper wrapper = (IdentityWrapper) ((UnitOfWorkImpl) this.unit).getIdentity();
-        return wrapper.getIdentity().getUser().getId();
+    	IdentityWrapper wrapper = (IdentityWrapper) ((UnitOfWorkImpl) this.unit).getIdentity();
+      return wrapper.getIdentity().getUser().getId();
     }
 
     private Lock lock;
@@ -110,4 +111,4 @@
         return this.id;
     }
 
-}
+}*/
diff --git a/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/TransactionTest.java b/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/TransactionTest.java
index 16c03fd..e13d78a 100644
--- a/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/TransactionTest.java
+++ b/org.apache.lenya.core.repository.impl/src/test/java/org/apache/lenya/transaction/TransactionTest.java
@@ -16,7 +16,7 @@
  *
  */
 package org.apache.lenya.transaction;
-
+/*
 import org.apache.cocoon.core.container.ContainerTestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -73,4 +73,4 @@
         lenyaT1.unlock();
     }
 
-}
+}*/
diff --git a/org.apache.lenya.core.resourcetype/pom.xml b/org.apache.lenya.core.resourcetype/pom.xml
index 3295e71..172c376 100644
--- a/org.apache.lenya.core.resourcetype/pom.xml
+++ b/org.apache.lenya.core.resourcetype/pom.xml
@@ -24,5 +24,13 @@
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-impl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-document-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/org.apache.lenya.core.resourcetype/src/main/java/org/apache/lenya/cms/publication/ResourceTypeImpl.java b/org.apache.lenya.core.resourcetype/src/main/java/org/apache/lenya/cms/publication/ResourceTypeImpl.java
index 72f49c2..6b486b6 100644
--- a/org.apache.lenya.core.resourcetype/src/main/java/org/apache/lenya/cms/publication/ResourceTypeImpl.java
+++ b/org.apache.lenya.core.resourcetype/src/main/java/org/apache/lenya/cms/publication/ResourceTypeImpl.java
@@ -32,6 +32,7 @@
 import org.apache.excalibur.source.Source;
 import org.apache.excalibur.source.SourceResolver;
 import org.apache.lenya.xml.Schema;
+import org.apache.lenya.xml.SchemaImpl;
 
 /**
  * Resource type.
@@ -99,7 +100,7 @@
         if (schemaConf != null) {
             String uri = schemaConf.getAttribute(ATTRIBUTE_URI);
             String language = schemaConf.getAttribute(ATTRIBUTE_NAMESPACE);
-            this.schema = new Schema(language, uri);
+            this.schema = new SchemaImpl(language, uri);
         }
 
         // determine the sample content locations.
diff --git a/org.apache.lenya.core.sitemanagement/pom.xml b/org.apache.lenya.core.sitemanagement/pom.xml
index 8e3f473..7e648be 100644
--- a/org.apache.lenya.core.sitemanagement/pom.xml
+++ b/org.apache.lenya.core.sitemanagement/pom.xml
@@ -20,6 +20,7 @@
       <artifactId>servlet-api</artifactId>
       <scope>provided</scope>
     </dependency>
+    
     <dependency>
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-api</artifactId>
@@ -30,11 +31,24 @@
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-workflow</artifactId>
+      <artifactId>lenya-core-publication-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-document-api</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-monitoring</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-metadata-impl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-utils</artifactId>
+    </dependency>
+    
   </dependencies>
 </project>
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Archive.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Archive.java
new file mode 100644
index 0000000..f0c1247
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Archive.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import org.apache.lenya.cms.publication.Publication;
+
+/**
+ * Archive usecase handler.
+ * 
+ * @version $Id:$
+ */
+public class Archive extends MoveSubsite {
+
+    /**
+     * @see org.apache.lenya.cms.site.usecases.MoveSubsite#getSourceAreas()
+     */
+    protected String[] getSourceAreas() {
+        return new String[] { Publication.AUTHORING_AREA };
+    }
+
+    /**
+     * @see org.apache.lenya.cms.site.usecases.MoveSubsite#getTargetArea()
+     */
+    protected String getTargetArea() {
+        return Publication.ARCHIVE_AREA;
+    }
+
+    /**
+     * @see org.apache.lenya.cms.site.usecases.MoveSubsite#getEvent()
+     */
+    protected String getEvent() {
+        return "archive";
+    }
+
+
+}
\ No newline at end of file
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Assets.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Assets.java
new file mode 100644
index 0000000..8d281b8
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Assets.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentException;
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.util.ServletHelper;
+
+/**
+ * Usecase to add Assets to a resource.
+ * 
+ * @version $Id$
+ */
+public class Assets extends SiteUsecase {
+    
+    protected static final String PARAMETER_UPLOAD_ENABLED = "uploadEnabled";
+    protected static final String MESSAGE_UPLOAD_DISABLED = "upload-disabled";
+
+    protected void prepareView() throws Exception {
+        super.prepareView();
+        
+        if (getSourceDocument() != null) {
+            try {
+                Document[] resourceDocs = getResourceDocuments();
+                setParameter("resourceDocuments", resourceDocs);
+            } catch (final Exception e) {
+                throw new RuntimeException(e);
+            }
+            
+            if (!ServletHelper.isUploadEnabled()) {
+                addErrorMessage(MESSAGE_UPLOAD_DISABLED);
+                setParameter(PARAMETER_UPLOAD_ENABLED, Boolean.FALSE);
+            }
+        }
+    }
+
+    protected Document[] getResourceDocuments() throws DocumentException, SiteException {
+        List list = new ArrayList();
+        Document[] docs = getSourceDocument().area().getDocuments();
+        SiteNode node = getSourceDocument().getLink().getNode();
+        for (int i = 0; i < docs.length; i++) {
+            if (docs[i].hasLink() && !docs[i].getLink().getNode().isTopLevel()
+                    && docs[i].getLink().getNode().getParent().getPath().equals(node.getPath())
+                    && docs[i].getResourceType().getName().equals("resource")) {
+                list.add(docs[i]);
+            }
+        }
+        return (Document[]) list.toArray(new Document[list.size()]);
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ChangeLabel.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ChangeLabel.java
new file mode 100644
index 0000000..ad9d313
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ChangeLabel.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentException;
+import org.apache.lenya.cms.publication.Node;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.cms.usecase.DocumentUsecase;
+import org.apache.lenya.cms.usecase.UsecaseException;
+import org.apache.lenya.cms.workflow.WorkflowUtil;
+import org.apache.lenya.cms.workflow.usecases.UsecaseWorkflowHelper;
+
+/**
+ * Change the label of a document.
+ * 
+ * @version $Id$
+ */
+public class ChangeLabel extends DocumentUsecase {
+
+    protected static final String LABEL = "label";
+    protected static final String DOCUMENT_ID = "documentId";
+
+    protected String getEvent() {
+        return "edit";
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckPreconditions()
+     */
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+        if (hasErrors()) {
+            return;
+        }
+
+        Document doc = getSourceDocument();
+        if (!getSourceDocument().getArea().equals(Publication.AUTHORING_AREA)) {
+            addErrorMessage("This usecase can only be invoked in the authoring area!");
+        }
+
+        UsecaseWorkflowHelper.checkWorkflow(this, getEvent(), doc, getLogger());
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getNodesToLock()
+     */
+    protected Node[] getNodesToLock() throws UsecaseException {
+        List nodes = new ArrayList();
+        if (getSourceDocument() != null) {
+            SiteStructure structure = getSourceDocument().area().getSite();
+            nodes.add(structure);
+        }
+
+        return (Node[]) nodes.toArray(new Node[nodes.size()]);
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters()
+     */
+    protected void initParameters() {
+        super.initParameters();
+        Document document = getSourceDocument();
+        try {
+            if (document != null && document.exists()) {
+                setParameter(DOCUMENT_ID, document.getUUID());
+                setParameter(LABEL, document.getLink().getLabel());
+            }
+        } catch (final DocumentException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckExecutionConditions()
+     */
+    protected void doCheckExecutionConditions() throws Exception {
+        String label = getParameterAsString(LABEL);
+        if (label.trim().equals("")) {
+            addErrorMessage("missing-navigation-title");
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
+     */
+    protected void doExecute() throws Exception {
+        super.doExecute();
+
+        Document document = getSourceDocument();
+        String label = getParameterAsString(LABEL).trim();
+        document.getLink().setLabel(label);
+
+        WorkflowUtil.invoke(document, getEvent());
+
+    }
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ChangeNodeID.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ChangeNodeID.java
new file mode 100644
index 0000000..99bfa53
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ChangeNodeID.java
@@ -0,0 +1,195 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentBuildException;
+import org.apache.lenya.cms.publication.DocumentBuilder;
+import org.apache.lenya.cms.publication.DocumentException;
+import org.apache.lenya.cms.publication.DocumentLocator;
+import org.apache.lenya.cms.publication.DocumentManager;
+import org.apache.lenya.cms.publication.Node;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.site.NodeIterator;
+import org.apache.lenya.cms.site.NodeSet;
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.cms.site.SiteUtil;
+import org.apache.lenya.cms.usecase.DocumentUsecase;
+import org.apache.lenya.cms.usecase.UsecaseException;
+
+/**
+ * Change the node ID of a document.
+ * 
+ * @version $Id$
+ */
+public class ChangeNodeID extends DocumentUsecase {
+
+    protected static final String NODE_ID = "nodeId";
+    private DocumentManager documentManager;
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters()
+     */
+    protected void initParameters() {
+        super.initParameters();
+        Document document = getSourceDocument();
+        if (document != null) {
+            setParameter(NODE_ID, document.getName());
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getNodesToLock()
+     */
+    protected Node[] getNodesToLock() throws UsecaseException {
+
+        List nodes = new ArrayList();
+
+        try {
+            if (getSourceDocument() != null) {
+                Node siteNode = getSourceDocument().area().getSite();
+                nodes.add(siteNode);
+
+                Document sourceDocument = getSourceDocument();
+
+                NodeSet subsite = SiteUtil.getSubSite(sourceDocument.getLink().getNode());
+                for (NodeIterator i = subsite.iterator(); i.hasNext();) {
+                    SiteNode node = i.next();
+                    String[] languages = node.getLanguages();
+                    for (int l = 0; l < languages.length; l++) {
+                        Document doc = node.getLink(languages[l]).getDocument();
+                        nodes.add(doc);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            throw new UsecaseException(e);
+        }
+
+        return (Node[]) nodes.toArray(new Node[nodes.size()]);
+    }
+
+    protected List getAllLanguageVersionNodes(Document doc) throws DocumentException, DocumentBuildException {
+        String[] languages = doc.getLanguages();
+        List nodes = new ArrayList();
+        for (int i = 0; i < languages.length; i++) {
+            nodes.add(doc.getTranslation(languages[i]));
+        }
+        return nodes;
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckPreconditions()
+     */
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+        if (hasErrors()) {
+            return;
+        }
+
+        if (!getSourceDocument().getArea().equals(Publication.AUTHORING_AREA)) {
+            addErrorMessage("This usecase can only be invoked in the authoring area!");
+        } else {
+            if (getSourceDocument().existsAreaVersion(Publication.LIVE_AREA)) {
+                addErrorMessage("This usecase cannot be invoked when the live version exists!");
+            }
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckExecutionConditions()
+     */
+    protected void doCheckExecutionConditions() throws Exception {
+        super.doCheckExecutionConditions();
+
+        String nodeId = getParameterAsString(NODE_ID);
+        DocumentBuilder builder = getSourceDocument().getPublication().getDocumentBuilder();
+        if (!builder.isValidDocumentName(nodeId)) {
+            addErrorMessage("The document ID is not valid.");
+        } else {
+            DocumentLocator target = getTargetLocator();
+            Publication pub = getSession().getPublication(target.getPublicationId());
+            SiteStructure site = pub.getArea(target.getArea()).getSite();
+            if (site.contains(target.getPath(), target.getLanguage())) {
+                addErrorMessage("The document does already exist.");
+            }
+        }
+    }
+
+    protected DocumentLocator getTargetLocator() throws DocumentBuildException, SiteException,
+            DocumentException {
+        String nodeId = getParameterAsString(NODE_ID);
+        Document doc = getSourceDocument();
+        DocumentLocator loc = DocumentLocator.getLocator(doc.getPublication().getId(), doc
+                .getArea(), doc.getPath(), doc.getLanguage());
+        DocumentLocator parent = loc.getParent();
+        return parent.getChild(nodeId);
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
+     */
+    protected void doExecute() throws Exception {
+        super.doExecute();
+
+        Document targetDoc;
+        Document source = getSourceDocument();
+        DocumentLocator target = getTargetLocator();
+        getDocumentManager().moveAll(source.area(), source.getPath(), source.area(), target.getPath());
+        targetDoc = target.getDocument(getSession());
+
+        setTargetDocument(targetDoc);
+    }
+
+    /**
+     * Returns the resulting document when the node ID would be changed.
+     * @return A document.
+     */
+    protected String getNewDocumentId() {
+        String nodeId = getParameterAsString(NODE_ID);
+
+        String oldPath;
+        try {
+            oldPath = getSourceDocument().getPath();
+        } catch (DocumentException e) {
+            throw new RuntimeException(e);
+        }
+        int lastSlashIndex = oldPath.lastIndexOf("/");
+        String strippedDocumentId = oldPath.substring(0, lastSlashIndex + 1);
+        String newDocumentId = strippedDocumentId + nodeId;
+
+        return newDocumentId;
+    }
+
+    protected DocumentManager getDocumentManager() {
+        return documentManager;
+    }
+
+    /**
+     * TODO: Bean wiring
+     */
+    public void setDocumentManager(DocumentManager documentManager) {
+        this.documentManager = documentManager;
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ChangeVisibility.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ChangeVisibility.java
new file mode 100644
index 0000000..f872fc1
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ChangeVisibility.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentException;
+import org.apache.lenya.cms.publication.Node;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.cms.usecase.DocumentUsecase;
+import org.apache.lenya.cms.usecase.Usecase;
+import org.apache.lenya.cms.usecase.UsecaseException;
+import org.apache.lenya.cms.workflow.WorkflowUtil;
+import org.apache.lenya.cms.workflow.usecases.UsecaseWorkflowHelper;
+
+/**
+ * Switch the navigation visibility of a document.
+ */
+public class ChangeVisibility extends DocumentUsecase {
+
+    protected String getEvent() {
+        return "edit";
+    }
+
+    public Object getParameter(String name) {
+        if (name.equals(Usecase.PARAMETER_ITEM_STATE)) {
+            Document doc = getSourceDocument();
+            try {
+                return doc != null ? Boolean.valueOf(doc.getLink().getNode().isVisible()) : null;
+            } catch (DocumentException e) {
+                throw new RuntimeException(e);
+            }
+        } else {
+            return super.getParameter(name);
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckPreconditions()
+     */
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+        if (hasErrors()) {
+            return;
+        }
+
+        Document doc = getSourceDocument();
+        if (!getSourceDocument().getArea().equals(Publication.AUTHORING_AREA)) {
+            addErrorMessage("This usecase can only be invoked in the authoring area!");
+        }
+
+        String[] languages = doc.getLanguages();
+        for (int i = 0; i < languages.length; i++) {
+            Document version = doc.getTranslation(languages[i]);
+            UsecaseWorkflowHelper.checkWorkflow(this, getEvent(), version, getLogger());
+        }
+    }
+
+    protected void doExecute() throws Exception {
+        super.doExecute();
+        Document doc = getSourceDocument();
+        SiteNode node = doc.getLink().getNode();
+        node.setVisible(!node.isVisible());
+
+        String[] languages = doc.getLanguages();
+        for (int i = 0; i < languages.length; i++) {
+            Document version = doc.getTranslation(languages[i]);
+            WorkflowUtil.invoke(version, getEvent());
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getNodesToLock()
+     */
+    protected Node[] getNodesToLock() throws UsecaseException {
+        List nodes = new ArrayList();
+        if (getSourceDocument() != null) {
+            SiteStructure structure = getSourceDocument().area().getSite();
+            nodes.add(structure);
+        }
+
+        return (Node[]) nodes.toArray(new Node[nodes.size()]);
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Clipboard.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Clipboard.java
new file mode 100644
index 0000000..afbe2c4
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Clipboard.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.ResourceNotFoundException;
+import org.apache.lenya.cms.publication.Session;
+
+/**
+ * Clipboard for cut/copy/paste of documents. The clipping method is either {@link #METHOD_CUT} or
+ * {@link #METHOD_COPY}.
+ * 
+ * @version $Id$
+ */
+public class Clipboard {
+
+    private String publicationId;
+    private String area;
+    private String uuid;
+    private String language;
+    private int method;
+
+    /**
+     * The "cut" method.
+     */
+    public static final int METHOD_CUT = 0;
+
+    /**
+     * The "copy" method.
+     */
+    public static final int METHOD_COPY = 1;
+
+    /**
+     * Ctor.
+     * @param document The document to put on the clipboard.
+     * @param _method The clipping method.
+     */
+    public Clipboard(Document document, int _method) {
+        this.publicationId = document.getPublication().getId();
+        this.area = document.getArea();
+        this.uuid = document.getUUID();
+        this.language = document.getLanguage();
+        this.method = _method;
+    }
+
+    /**
+     * Returns the document for the current session.
+     * @param session The session.
+     * @return A document.
+     * @throws ResourceNotFoundException if the document does not exist.
+     */
+    public Document getDocument(Session session) throws ResourceNotFoundException {
+        return session.getPublication(this.publicationId).getArea(this.area).getDocument(this.uuid,
+                this.language);
+    }
+
+    /**
+     * @return The ID of the publication the document belongs to.
+     */
+    public String getPublicationId() {
+        return this.publicationId;
+    }
+
+    /**
+     * Returns the method of this clipboard.
+     * @return An integer.
+     */
+    public int getMethod() {
+        return this.method;
+    }
+}
\ No newline at end of file
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ClipboardHelper.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ClipboardHelper.java
new file mode 100644
index 0000000..5b94f6f
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ClipboardHelper.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+/**
+ * Helper class for clipboard handling.
+ * 
+ * @version $Id$
+ */
+public class ClipboardHelper {
+
+    /**
+     * Returns the clipboard attachted to the session.
+     * @param context The context containing the session.
+     * @return A clipboard or <code>null</code> if no clipboard is attached to
+     *         the session.
+     */
+    public Clipboard getClipboard(HttpServletRequest request) {
+        HttpSession session = request.getSession();
+        return (Clipboard) session.getAttribute(getSessionAttributeName());
+    }
+    
+    /**
+     * @return The name of the session attribute to hold the clipboard.
+     */
+    protected String getSessionAttributeName() {
+        return Clipboard.class.getName();
+    }
+
+    /**
+     * Saves the clipboard to the session.
+     * @param context The context.
+     * @param clipboard The clipboard.
+     */
+    public void saveClipboard(HttpServletRequest request, Clipboard clipboard) {
+        HttpSession session = request.getSession();
+        session.setAttribute(getSessionAttributeName(), clipboard);
+    }
+    
+    /**
+     * Removes the clipboard from the session.
+     * @param context The context.
+     */
+    public void removeClipboard(HttpServletRequest request) {
+        HttpSession session = request.getSession();
+        session.removeAttribute(getSessionAttributeName());
+    }
+    
+}
\ No newline at end of file
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Copy.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Copy.java
new file mode 100644
index 0000000..a2f1eed
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Copy.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.cocoon.processing.ProcessInfoProvider;
+import org.apache.cocoon.spring.configurator.WebAppContextUtils;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.usecase.DocumentUsecase;
+
+/**
+ * Copy a document into the clipboard.
+ * 
+ * @version $Id$
+ */
+public class Copy extends DocumentUsecase {
+
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+        if (hasErrors()) {
+            return;
+        }
+        if (!getSourceDocument().getArea().equals(Publication.AUTHORING_AREA)) {
+            addErrorMessage("only-in-authoring-area");
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
+     */
+    protected void doExecute() throws Exception {
+        super.doExecute();
+
+        Clipboard clipboard = new Clipboard(getSourceDocument(), Clipboard.METHOD_COPY);
+        ClipboardHelper helper = new ClipboardHelper();
+        helper.saveClipboard(getRequest(), clipboard);
+    }
+
+    protected HttpServletRequest getRequest() {
+        ProcessInfoProvider process = (ProcessInfoProvider) WebAppContextUtils
+                .getCurrentWebApplicationContext().getBean(ProcessInfoProvider.ROLE);
+        return process.getRequest();
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Create.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Create.java
new file mode 100644
index 0000000..8fb71bd
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Create.java
@@ -0,0 +1,389 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.cocoon.processing.ProcessInfoProvider;
+import org.apache.cocoon.spring.configurator.WebAppContextUtils;
+import org.apache.lenya.ac.Identity;
+import org.apache.lenya.ac.User;
+import org.apache.lenya.cms.metadata.MetaData;
+import org.apache.lenya.cms.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.dublincore.DublinCore;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentManager;
+//florent import org.apache.lenya.cms.publication.Node;
+import org.apache.lenya.cms.repository.Node;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.ResourceType;
+import org.apache.lenya.cms.publication.ResourceTypeResolver;
+import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.cms.usecase.AbstractUsecase;
+import org.apache.lenya.cms.usecase.UsecaseException;
+
+/**
+ * <p>
+ * Abstract superclass for usecases to create a document.
+ * </p>
+ * <p>
+ * You can pass the following parameters into the usecase:
+ * </p>
+ * <ul>
+ * <li><strong>path</strong> - the path of the document to create (optional)</li>
+ * </ul>
+ * 
+ * @version $Id$
+ */
+public abstract class Create extends AbstractUsecase {
+
+    protected static final String RESOURCE_TYPES = "resourceTypes";
+    protected static final String LANGUAGE = "language";
+    protected static final String LANGUAGES = "languages";
+    protected static final String PATH = "path";
+    protected static final String NODE_NAME = "nodeName";
+    protected static final String VISIBLEINNAV = "visibleInNav";
+    protected static final String SAMPLE = "sample";
+    protected static final String SAMPLES = "samples";
+
+    private DocumentManager documentManager;
+    private ResourceTypeResolver resourceTypeResolver;
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckPreconditions()
+     */
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+
+        if (!getArea().equals(Publication.AUTHORING_AREA)) {
+            addErrorMessage("This usecase can only be invoked in the authoring area!");
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getNodesToLock()
+     */
+    protected Node[] getNodesToLock() throws UsecaseException {
+        try {
+            SiteStructure structure = getPublication().getArea(getArea()).getSite();
+            Node[] nodes = { structure };
+            return nodes;
+        } catch (Exception e) {
+            throw new UsecaseException(e);
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckExecutionConditions()
+     */
+    protected void doCheckExecutionConditions() throws Exception {
+        String navigationTitle = getDublinCoreParameter(DublinCore.ELEMENT_TITLE);
+        if (navigationTitle.trim().equals("")) {
+            addErrorMessage("missing-navigation-title");
+        }
+
+        if (getInitialDocument() == null) {
+            String[] samples = (String[]) getParameter(SAMPLES);
+            String sample = getParameterAsString(SAMPLE);
+            if (samples != null && samples.length > 1 && (sample == null || sample.equals(""))) {
+                addErrorMessage("missing-page-layout");
+            }
+        }
+
+        if (isPathValid()) {
+            String path = getNewDocumentPath();
+            SiteStructure site = getPublication().getArea(getArea()).getSite();
+            if (!createVersion() && site.contains(path)) {
+                String[] params = { path };
+                addErrorMessage("path-already-exists", params);
+            }
+        }
+
+        String doctypeName = getDocumentTypeName();
+        if (getParameterAsString(SAMPLE) == null && doctypeName != null) {
+            initSampleParameters();
+        }
+    }
+
+    /**
+     * This method is used by {@link #doCheckExecutionConditions()} to check if the path entered by
+     * the user is valid. If not, checking the existence of the new document in the site structure
+     * is omitted because this operation could cause errors.
+     * @return A boolean value.
+     */
+    protected boolean isPathValid() {
+        return true;
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
+     */
+    protected void doExecute() throws Exception {
+        super.doExecute();
+
+        // create new document
+        ResourceType resourceType = null;
+
+        String language = getParameterAsString(LANGUAGE);
+        Document initialDocument = getInitialDocument();
+
+        Document document;
+
+        String title = getDublinCoreParameter(DublinCore.ELEMENT_TITLE).trim();
+
+        if (createVersion()) {
+            document = documentManager.addVersion(initialDocument, getArea(), language, true);
+            document.getLink().setLabel(title);
+        } else {
+            if (initialDocument == null) {
+                resourceType = getResourceTypeResolver().getResourceType(getDocumentTypeName());
+                String sampleName = getParameterAsString(SAMPLE, resourceType.getSampleNames()[0]);
+                ResourceType.Sample sample = resourceType.getSample(sampleName);
+                document = documentManager.add(resourceType, sample.getUri(),
+                        getPublication(), getArea(), getNewDocumentPath(), language,
+                        getSourceExtension(), title, getVisibleInNav());
+                document.setMimeType(sample.getMimeType());
+            } else {
+                document = documentManager.add(initialDocument, getArea(), getNewDocumentPath(),
+                        language, getSourceExtension(), title, getVisibleInNav());
+            }
+        }
+
+        setMetaData(document);
+
+        // the location to navigate to after completion of usecase
+        setDefaultTargetURL(document.getCanonicalWebappURL());
+    }
+
+    protected String getDublinCoreParameter(String name) {
+        Object param = getParameter(DUBLIN_CORE_PREFIX + name);
+        if (param != null && getParameter(DUBLIN_CORE_PREFIX + name).getClass().isArray()) {
+            String[] values = (String[]) getParameter(DUBLIN_CORE_PREFIX + name);
+            StringBuffer paramValue = new StringBuffer();
+            for (int i = 0; i < values.length; i++) {
+                String value = values[i];
+                if (i > 0)
+                    paramValue.append(',').append(value);
+                else
+                    paramValue.append(value);
+            }
+            return paramValue.toString();
+        }
+        return getParameterAsString(DUBLIN_CORE_PREFIX + name, null);
+    }
+
+    protected void setDublinCoreParameter(String name, String value) {
+        setParameter(DUBLIN_CORE_PREFIX + name, value);
+    }
+
+    protected abstract boolean createVersion();
+
+    /**
+     * @return the extension to use for the document source.
+     */
+    protected abstract String getSourceExtension();
+
+    /**
+     * @return the name of the document being created in the usecase
+     */
+    protected abstract String getNewDocumentName();
+
+    /**
+     * @return the id of the new document being created in the usecase
+     */
+    protected abstract String getNewDocumentPath();
+
+    /**
+     * If the document created in the usecase shall have initial contents copied from an existing
+     * document, construct that document in this method.
+     * 
+     * @return A document.
+     */
+    protected Document getInitialDocument() {
+        return null;
+    }
+
+    /**
+     * @return The type of the created document.
+     */
+    protected abstract String getDocumentTypeName();
+
+    protected static final String DUBLIN_CORE_PREFIX = "dublincore.";
+
+    /**
+     * Sets the meta data of the created document.
+     * 
+     * @param document The document.
+     * @throws MetaDataException if an error occurs.
+     */
+    protected void setMetaData(Document document) throws MetaDataException {
+
+        if (document == null)
+            throw new IllegalArgumentException("parameter document may not be null");
+
+        MetaData dcMetaData = document.getMetaData(DublinCore.DC_NAMESPACE);
+        String[] dcKeys = dcMetaData.getAvailableKeys();
+
+        for (int i = 0; i < dcKeys.length; i++) {
+            String param = getDublinCoreParameter(dcKeys[i]);
+            if (param != null) {
+                dcMetaData.setValue(dcKeys[i], param);
+            }
+        }
+
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters()
+     */
+    protected void initParameters() {
+        super.initParameters();
+
+        ProcessInfoProvider process = (ProcessInfoProvider) WebAppContextUtils
+                .getCurrentWebApplicationContext().getBean(ProcessInfoProvider.ROLE);
+        HttpServletRequest request = process.getRequest();
+        HttpSession session = request.getSession(false);
+        Identity identity = (Identity) session.getAttribute(Identity.class.getName());
+        User user = identity.getUser();
+        if (user != null) {
+            setDublinCoreParameter(DublinCore.ELEMENT_CREATOR, user.getId());
+        } else {
+            setDublinCoreParameter(DublinCore.ELEMENT_CREATOR, "");
+        }
+
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        setDublinCoreParameter(DublinCore.ELEMENT_DATE, format.format(new GregorianCalendar()
+                .getTime()));
+
+        String doctypeName = getDocumentTypeName();
+        if (doctypeName != null) {
+            initSampleParameters();
+            setParameter(RESOURCE_TYPES, Collections.EMPTY_LIST);
+        } else {
+            String[] resourceTypes = getPublication().getResourceTypeNames();
+            setParameter(RESOURCE_TYPES, Arrays.asList(resourceTypes));
+        }
+    }
+
+    protected void initSampleParameters() {
+        ResourceType resourceType = null;
+        try {
+            resourceType = getResourceTypeResolver().getResourceType(getDocumentTypeName());
+            String[] samples = resourceType.getSampleNames();
+            if (samples.length == 0) {
+                addErrorMessage("The resource type [" + resourceType.getName()
+                        + "] doesn't provide any samples!");
+            } else {
+                setParameter(SAMPLES, samples);
+                String presetSample = getParameterAsString(SAMPLE);
+                if (presetSample == null) {
+                    setParameter(SAMPLE, samples[0]);
+                } else {
+                    List sampleList = Arrays.asList(samples);
+                    if (!sampleList.contains(presetSample)) {
+                        getLogger().warn(
+                                "Sample [" + presetSample + "] not defined, using default sample.");
+                        setParameter(SAMPLE, samples[0]);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * @return The source document or <code>null</code> if the usecase was not invoked on a
+     *         document.
+     */
+    protected Document getSourceDocument() {
+        Document document = null;
+        String url = getSourceURL();
+        try {
+            if (getSession().getUriHandler().isDocument(url)) {
+                document = getSession().getUriHandler().getDocument(url);
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return document;
+    }
+
+    /**
+     * @return The new document.
+     */
+    protected Document getNewDocument() {
+        try {
+            String path = getNewDocumentPath();
+            String language = getParameterAsString(LANGUAGE);
+            return getPublication().getArea(getArea()).getSite().getNode(path).getLink(language)
+                    .getDocument();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * @return The area without the "info-" prefix.
+     */
+    public String getArea() {
+        URLInformation info = new URLInformation(getSourceURL());
+        return info.getArea();
+    }
+
+    /**
+     * @return the visibleInNav Attribute of the document being created in the usecase
+     */
+    protected boolean getVisibleInNav() {
+        if (getParameterAsString(VISIBLEINNAV).equals("false")) {
+            return false;
+        }
+        return true;
+    }
+
+    protected DocumentManager getDocumentManager() {
+        return documentManager;
+    }
+
+    /**
+     * TODO: Bean wiring
+     */
+    public void setDocumentManager(DocumentManager documentManager) {
+        this.documentManager = documentManager;
+    }
+
+    protected ResourceTypeResolver getResourceTypeResolver() {
+        return resourceTypeResolver;
+    }
+
+    /**
+     * TODO: Bean wiring
+     */
+    public void setResourceTypeResolver(ResourceTypeResolver resourceTypeResolver) {
+        this.resourceTypeResolver = resourceTypeResolver;
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/CreateDocument.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/CreateDocument.java
new file mode 100644
index 0000000..b91c82d
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/CreateDocument.java
@@ -0,0 +1,222 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.util.Arrays;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentBuilder;
+import org.apache.lenya.cms.publication.DocumentException;
+import org.apache.lenya.cms.publication.DocumentLocator;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.PublicationException;
+import org.apache.lenya.cms.site.SiteStructure;
+
+/**
+ * Usecase to create a document.
+ * 
+ * @version $Id$
+ */
+public class CreateDocument extends Create {
+
+    protected static final String PARENT_PATH = "parentPath";
+
+    protected static final String DOCUMENT_TYPE = "doctype";
+
+    protected static final String RELATION = "relation";
+    protected static final String RELATIONS = "relations";
+    protected static final String RELATION_CHILD = "child";
+    protected static final String RELATION_BEFORE = "sibling before";
+    protected static final String RELATION_AFTER = "sibling after";
+    protected static final String PATH_PROVIDED = "pathProvided";
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters()
+     */
+    protected void initParameters() {
+        super.initParameters();
+
+        Document parent = getSourceDocument();
+        if (parent == null) {
+            setParameter(PARENT_PATH, "");
+        } else {
+            setParameter(LANGUAGE,parent.getLanguage());
+            try {
+                setParameter(PARENT_PATH, parent.getPath());
+            } catch (DocumentException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        String[] languages = getPublication().getLanguages();
+        if (languages.length == 0) {
+            addErrorMessage("The publication doesn't contain any languages!");
+        }
+        setParameter(LANGUAGES, languages);
+
+        Document sourceDoc = getSourceDocument();
+        String[] childOnly = { RELATION_CHILD };
+        String[] childAndAfter = { RELATION_CHILD, RELATION_AFTER };
+        String[] relations = sourceDoc == null ? childOnly : childAndAfter;
+        
+        setParameter(RELATIONS, relations);
+        setParameter(RELATION, RELATION_CHILD);
+
+        String path = getParameterAsString(PATH);
+        boolean provided = path != null && !path.equals("");
+        setParameter(PATH_PROVIDED, Boolean.valueOf(provided));
+    }
+
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+        if (getParameterAsBoolean(PATH_PROVIDED, false)) {
+            validateProvidedPath();
+        }
+    }
+
+    protected void validateProvidedPath() throws PublicationException {
+        String path = getParameterAsString(PATH);
+        Publication pub = getPublication();
+        SiteStructure site = pub.getArea(getArea()).getSite();
+        if (site.contains(path)) {
+            addErrorMessage("path-already-exists");
+        }
+        else if (path.length() <= 2 || !path.startsWith("/") || path.endsWith("/")) {
+            addErrorMessage("invalid-path");
+        }
+        else {
+            String[] steps = path.substring(1).split("/");
+            DocumentBuilder builder = pub.getDocumentBuilder();
+            for (int i = 0; i < steps.length; i++) {
+                if (!builder.isValidDocumentName(steps[i])) {
+                    addErrorMessage("node-name-special-characters");
+                }
+            }
+            if (steps.length > 1) {
+                String parentPath = path.substring(0, path.lastIndexOf("/"));
+                if (!site.contains(parentPath)) {
+                    addErrorMessage("parent-does-not-exist");
+                }
+            }
+        }
+    }
+
+    /**
+     * Override this method to support other relations.
+     * @return The supported relations.
+     */
+    protected String[] getSupportedRelations() {
+        return new String[] { RELATION_CHILD, RELATION_AFTER };
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckExecutionConditions()
+     */
+    protected void doCheckExecutionConditions() throws Exception {
+        super.doCheckExecutionConditions();
+
+        String relation = getParameterAsString(RELATION);
+
+        if (!Arrays.asList(getSupportedRelations()).contains(relation)) {
+            addErrorMessage("The relation '" + relation + "' is not supported.");
+        }
+
+        if (getParameterAsBoolean(PATH_PROVIDED, false)) {
+            validateProvidedPath();
+        } else {
+            String nodeName = getNodeName();
+            if (nodeName.equals("")) {
+                addErrorMessage("missing-node-name");
+            } else if (!getPublication().getDocumentBuilder().isValidDocumentName(nodeName)) {
+                addErrorMessage("node-name-special-characters");
+            }
+        }
+    }
+
+    protected String getNodeName() {
+        return getParameterAsString(NODE_NAME).trim();
+    }
+
+    protected boolean isPathValid() {
+        String nodeName = getNewDocumentName();
+        DocumentBuilder builder = getPublication().getDocumentBuilder();
+        return !nodeName.trim().equals("") && builder.isValidDocumentName(nodeName);
+    }
+
+    /**
+     * @see Create#getNewDocumentName()
+     */
+    protected String getNewDocumentName() {
+        String nodeName;
+        if (getParameterAsBoolean(PATH_PROVIDED, false)) {
+            final String path = getParameterAsString(PATH);
+            nodeName = path.substring(path.lastIndexOf("/") + 1);
+        } else {
+            nodeName = getNodeName();
+        }
+        return nodeName;
+    }
+
+    /**
+     * @return The relation between the source document and the created
+     *         document.
+     */
+    protected String getRelation() {
+        return getParameterAsString(RELATION);
+    }
+
+    /**
+     * @see Create#getNewDocumentPath()
+     */
+    protected String getNewDocumentPath() {
+        if (getParameterAsBoolean(PATH_PROVIDED, false)) {
+            return getParameterAsString(PATH);
+        } else {
+            String relation = getRelation();
+            Document sourceDoc = getSourceDocument();
+            if (sourceDoc == null) {
+                return "/" + getNewDocumentName();
+            } else {
+                DocumentLocator sourceLoc = getSourceDocument().getLocator();
+                if (relation.equals(RELATION_CHILD)) {
+                    return sourceLoc.getChild(getNewDocumentName()).getPath();
+                } else if (relation.equals(RELATION_BEFORE) || relation.equals(RELATION_AFTER)) {
+                    return sourceLoc.getParent().getChild(getNewDocumentName()).getPath();
+                } else {
+                    throw new IllegalStateException("unsupported relation " + relation);
+                }
+            }
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.site.usecases.Create#getDocumentTypeName()
+     */
+    protected String getDocumentTypeName() {
+        return getParameterAsString(DOCUMENT_TYPE);
+    }
+
+    protected String getSourceExtension() {
+        return "xml";
+    }
+
+    protected boolean createVersion() {
+        return false;
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/CreateLanguage.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/CreateLanguage.java
new file mode 100644
index 0000000..247ad7f
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/CreateLanguage.java
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentBuildException;
+import org.apache.lenya.cms.publication.DocumentException;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.ResourceType;
+
+/**
+ * Usecase to create a new language version of a resource.
+ * 
+ * @version $Id$
+ */
+public class CreateLanguage extends Create {
+
+    private String documentTypeName;
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckPreconditions()
+     */
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+
+        if (getSourceDocument() == null) {
+            addErrorMessage("This operation must be invoked on a document.");
+            return;
+        }
+
+        String area = getSourceDocument().getArea();
+        if (!area.equals(Publication.AUTHORING_AREA)) {
+            addErrorMessage("This operation is only supported in the authoring area.");
+            return;
+        }
+
+        if (getNonExistingLanguages().isEmpty()) {
+            addErrorMessage("All language versions already exist.");
+        }
+    }
+
+    /**
+     * @return All languages supported by the publication for which this document does not yet have
+     *         a version
+     * @throws DocumentBuildException if an error occurs.
+     * @throws DocumentException if an error occurs.
+     */
+    protected List getNonExistingLanguages() throws DocumentBuildException, DocumentException {
+        Document source = getSourceDocument();
+        List nonExistingLanguages = new ArrayList();
+        String[] languages = source.getPublication().getLanguages();
+        for (int i = 0; i < languages.length; i++) {
+            if (!source.existsTranslation(languages[i])) {
+                nonExistingLanguages.add(languages[i]);
+            }
+        }
+        return nonExistingLanguages;
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters()
+     */
+    protected void initParameters() {
+        super.initParameters();
+
+        Document source = getSourceDocument();
+        if (source != null) {
+            try {
+                setParameter(PATH, source.getPath());
+                List nonExistingLanguages = getNonExistingLanguages();
+                setParameter(LANGUAGES, nonExistingLanguages
+                        .toArray(new String[nonExistingLanguages.size()]));
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    /**
+     * For new language version of a document, name is the same as that document's
+     * @see Create#getNewDocumentName()
+     */
+    protected String getNewDocumentName() {
+        return getSourceDocument().getName();
+    }
+
+    /**
+     * For new language version of a document, the path is the same as that document's
+     * @see Create#getNewDocumentPath()
+     */
+    protected String getNewDocumentPath() {
+        try {
+            return getSourceDocument().getPath();
+        } catch (DocumentException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * New language version of a document: use that document's content
+     * @see Create#getInitialDocument()
+     */
+    protected Document getInitialDocument() {
+        return getSourceDocument();
+    }
+
+    /**
+     * @see Create#getDocumentTypeName()
+     */
+    protected String getDocumentTypeName() {
+        if (this.documentTypeName == null && getSourceDocument() != null) {
+            try {
+                ResourceType type = getSourceDocument().getResourceType();
+                this.documentTypeName = type.getName();
+
+                List nonExistingLanguages = getNonExistingLanguages();
+                setParameter(LANGUAGES, nonExistingLanguages
+                        .toArray(new String[nonExistingLanguages.size()]));
+
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return this.documentTypeName;
+    }
+
+    protected String getSourceExtension() {
+        return getSourceDocument().getSourceExtension();
+    }
+
+    protected boolean createVersion() {
+        return true;
+    }
+
+}
\ No newline at end of file
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Cut.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Cut.java
new file mode 100644
index 0000000..4780739
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Cut.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.cocoon.processing.ProcessInfoProvider;
+import org.apache.cocoon.spring.configurator.WebAppContextUtils;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.cms.usecase.DocumentUsecase;
+
+/**
+ * Cut a document into the clipboard.
+ * 
+ * @version $Id$
+ */
+public class Cut extends DocumentUsecase {
+
+    protected static final String MESSAGE_ISLIVE = "cut-error-islive";
+
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+        if (hasErrors()) {
+            return;
+        }
+
+        Document doc = getSourceDocument();
+        if (!doc.getArea().equals(Publication.AUTHORING_AREA)) {
+            addErrorMessage("only-in-authoring-area");
+        }
+        SiteStructure liveSite = doc.getPublication().getArea(Publication.LIVE_AREA).getSite();
+        if (liveSite.contains(doc.getPath())) {
+            addErrorMessage(MESSAGE_ISLIVE);
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
+     */
+    protected void doExecute() throws Exception {
+        super.doExecute();
+
+        Clipboard clipboard = new Clipboard(getSourceDocument(), Clipboard.METHOD_CUT);
+        ClipboardHelper helper = new ClipboardHelper();
+        helper.saveClipboard(getRequest(), clipboard);
+    }
+
+    protected HttpServletRequest getRequest() {
+        ProcessInfoProvider process = (ProcessInfoProvider) WebAppContextUtils
+                .getCurrentWebApplicationContext().getBean(ProcessInfoProvider.ROLE);
+        return process.getRequest();
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Delete.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Delete.java
new file mode 100644
index 0000000..d7374be
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Delete.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import org.apache.lenya.cms.publication.Publication;
+
+/**
+ * Delete a document and all its descendants, including all language versions. The documents are
+ * moved to the trash.
+ * 
+ * @version $Id$
+ */
+public class Delete extends MoveSubsite {
+
+    /**
+     * @see org.apache.lenya.cms.site.usecases.MoveSubsite#getSourceAreas()
+     */
+    protected String[] getSourceAreas() {
+        return new String[] { Publication.AUTHORING_AREA, Publication.ARCHIVE_AREA };
+    }
+
+    /**
+     * @see org.apache.lenya.cms.site.usecases.MoveSubsite#getTargetArea()
+     */
+    protected String getTargetArea() {
+        return Publication.TRASH_AREA;
+    }
+
+    /**
+     * @see org.apache.lenya.cms.site.usecases.MoveSubsite#getEvent()
+     */
+    protected String getEvent() {
+        return "delete";
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/DeleteLanguage.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/DeleteLanguage.java
new file mode 100644
index 0000000..d63e17f
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/DeleteLanguage.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.Node;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.util.DocumentHelper;
+import org.apache.lenya.cms.usecase.DocumentUsecase;
+import org.apache.lenya.cms.usecase.UsecaseException;
+
+/**
+ * Delete a language version.
+ * 
+ * @version $Id$
+ */
+public class DeleteLanguage extends DocumentUsecase {
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckPreconditions()
+     */
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+        if (hasErrors()) {
+            return;
+        }
+
+        Document doc = getSourceDocument();
+        
+        if (!doc.getArea().equals(Publication.AUTHORING_AREA)) {
+            addErrorMessage("This usecase can only be invoked in the authoring area!");
+        } else if (doc.getLanguages().length == 1) {
+            addErrorMessage("The last language version cannot be removed.");
+        }
+        
+        if (doc.existsVersion(Publication.LIVE_AREA, doc.getLanguage())) {
+            addErrorMessage("The document can't be deleted if a live version exists.");
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getNodesToLock()
+     */
+    protected Node[] getNodesToLock() throws UsecaseException {
+        List nodes = new ArrayList();
+        if(getSourceDocument() != null) {
+            Node docNode = getSourceDocument();
+            Node siteNode = getSourceDocument().area().getSite();
+            nodes.add(docNode);
+            nodes.add(siteNode);
+        }
+        return (Node[]) nodes.toArray(new Node[nodes.size()]);
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
+     */
+    protected void doExecute() throws Exception {
+        super.doExecute();
+
+        Document document = getSourceDocument();
+        document.getLink().delete();
+        document.delete();
+
+        setTargetDocument(DocumentHelper.getExistingLanguageVersion(document));
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/EmptyTrash.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/EmptyTrash.java
new file mode 100644
index 0000000..fa2bda0
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/EmptyTrash.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentManager;
+import org.apache.lenya.cms.repository.Node;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.PublicationException;
+//florent import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.utils.URLInformation;
+import org.apache.lenya.cms.publication.util.DocumentSet;
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.cms.usecase.AbstractUsecase;
+import org.apache.lenya.cms.usecase.UsecaseException;
+
+/**
+ * Empty the trash.
+ * 
+ * @version $Id$
+ */
+public class EmptyTrash extends AbstractUsecase {
+
+    protected static final String DOCUMENTS = "documents";
+
+    private DocumentManager documentManager;
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters()
+     */
+    protected void initParameters() {
+        super.initParameters();
+        try {
+            Document[] documents = getTrashDocuments();
+            setParameter(DOCUMENTS, Arrays.asList(documents));
+        } catch (SiteException e) {
+            throw new RuntimeException(e);
+        } catch (PublicationException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Lock the following objects:
+     * <ul>
+     * <li>all involved documents in the trash area</li>
+     * <li>the document trash site structure</li>
+     * </ul>
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getNodesToLock()
+     */
+    protected Node[] getNodesToLock() throws UsecaseException {
+        List nodes = new ArrayList();
+        try {
+            //florent String pubId = new URLInformation(getSourceURL()).getPublicationId();
+        	String pubId = new URLInformation().getPublicationId();
+            Publication publication = getSession().getPublication(pubId);
+            Document[] docs = getTrashDocuments();
+            for (int i = 0; i < docs.length; i++) {
+                nodes.add(docs[i]);
+            }
+            SiteStructure structure = publication.getArea(Publication.TRASH_AREA).getSite();
+            nodes.add(structure);
+        } catch (Exception e) {
+            throw new UsecaseException(e);
+        }
+        return (Node[]) nodes.toArray(new Node[nodes.size()]);
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
+     */
+    protected void doExecute() throws Exception {
+        super.doExecute();
+        Document[] documents = getTrashDocuments();
+        DocumentSet set = new DocumentSet(documents);
+        getDocumentManager().delete(set);
+    }
+
+    /**
+     * @return The documents in the trash area.
+     * @throws PublicationException if an error occurs.
+     * @throws SiteException if an error occurs.
+     */
+    protected Document[] getTrashDocuments() throws PublicationException, SiteException {
+        //florent String pubId = new URLInformation(getSourceURL()).getPublicationId();
+    	String pubId = new URLInformation().getPublicationId();
+        Publication pub = getSession().getPublication(pubId);
+        return pub.getArea(Publication.TRASH_AREA).getDocuments();
+    }
+
+    protected DocumentManager getDocumentManager() {
+        return documentManager;
+    }
+
+    /**
+     * TODO: Bean wiring
+     */
+    public void setDocumentManager(DocumentManager documentManager) {
+        this.documentManager = documentManager;
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ForceCheckIn.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ForceCheckIn.java
new file mode 100644
index 0000000..9c04763
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ForceCheckIn.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Vector;
+import java.util.WeakHashMap;
+
+import javax.servlet.http.HttpSession;
+
+import org.apache.lenya.ac.Identity;
+import org.apache.lenya.ac.User;
+import org.apache.lenya.cms.metadata.dublincore.DublinCoreHelper;
+import org.apache.lenya.cms.publication.Document;
+//import org.apache.lenya.cms.publication.Node;
+import org.apache.lenya.cms.repository.Node;
+import org.apache.lenya.cms.usecase.DocumentUsecase;
+import org.apache.lenya.modules.monitoring.SessionListener;
+
+/**
+ * Force a document to be checked in (override a checkout).
+ */
+public class ForceCheckIn extends DocumentUsecase {
+
+    private static final String IDENTITY = Identity.class.getName();
+    private static final String HISTORY = "org.apache.lenya.cms.cocoon.acting.History";
+
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+
+        Document doc = getSourceDocument();
+        if (doc == null) {
+            return;
+        }
+        
+        Node node = doc;
+        if (!node.isCheckedOut()) {
+            String[] params = { DublinCoreHelper.getTitle(doc, true) };
+            addErrorMessage("not-checked-out", params);
+        }
+    }
+
+    protected void prepareView() throws Exception {
+        Node node = getSourceDocument();
+        if (node.isCheckedOut()) {
+            String userId = node.getCheckoutUserId();
+            User currentUser = getSession().getIdentity().getUser();
+            if (currentUser == null || !userId.equals(currentUser.getId())) {
+                String[] params = { userId };
+                if (isLoggedIn(userId)) {
+                    addInfoMessage("user-logged-in", params);
+                }
+                else {
+                    addInfoMessage("user-not-logged-in", params);
+                }
+            }
+        }
+    }
+
+    protected boolean isLoggedIn(String userId) {
+        String pubId = getSourceDocument().getPublication().getId();
+        SessionListener sessions = new SessionListener();
+        WeakHashMap allSessions = sessions.getAllSessions();
+        
+        boolean loggedIn = false;
+        Iterator userit = allSessions.entrySet().iterator();
+        while (userit.hasNext()) {
+            Map.Entry entry = (Map.Entry) userit.next();
+            HttpSession nextsession = (HttpSession) entry.getValue();
+
+            Identity identity = (Identity) nextsession.getAttribute(IDENTITY);
+
+            if(identity == null) {
+                continue;
+            }
+
+            User user = identity.getUser();
+            Vector history = (Vector) nextsession.getAttribute(HISTORY);
+            String publicationID = getPublicationIDfromHistory(history);
+            if (publicationID.equals(pubId) && user != null && user.getId().equals(userId)) {
+                loggedIn = true;
+            }
+        }
+        return loggedIn;
+    }
+
+    protected void doExecute() throws Exception {
+        super.doExecute();
+        getSourceDocument().forceCheckIn();
+    }
+
+    /**
+     * Extract the publicationID from the history information stored in the
+     * session
+     * 
+     * @param history The history stored in the session.. An entry looks like \/
+     *        <publication-id>/authoring/index.html
+     * @return A publication ID.
+     */
+    private String getPublicationIDfromHistory(Vector history) {
+        String firstElement = history.firstElement().toString();
+        String publicationID = firstElement.substring(1, firstElement.indexOf("/", 1));
+        return publicationID;
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ForceLiveCheckIn.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ForceLiveCheckIn.java
new file mode 100644
index 0000000..8e70a4e
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/ForceLiveCheckIn.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+//florent import org.apache.lenya.cms.publication.Node;
+import org.apache.lenya.cms.repository.Node;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.PublicationException;
+import org.apache.lenya.cms.usecase.AbstractUsecase;
+
+/**
+ * Force check in of the live node 
+ * 
+ */
+public class ForceLiveCheckIn extends AbstractUsecase {
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckPreconditions()
+     */
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+        Publication pub = getPublication();
+        if(pub == null) {
+            return;
+        }
+        Node node = getNode();
+        if (!node.isCheckedOut()) {
+            String[] params = { "Live" };
+            addErrorMessage("not-checked-out", params);
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
+     */
+    protected void doExecute() throws Exception {
+        super.doExecute();
+
+        getNode().forceCheckIn();
+
+    }
+
+    private Node getNode() throws PublicationException {
+        return getPublication().getArea(Publication.LIVE_AREA).getSite();
+    }
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Move.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Move.java
new file mode 100644
index 0000000..caf073e
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Move.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import org.apache.lenya.cms.site.usecases.SiteUsecase;
+import org.apache.lenya.cms.usecase.UsecaseException;
+
+/**
+ * Usecase to move a resource.
+ * 
+ * @version $Id$
+ */
+public class Move extends SiteUsecase {
+
+    /**
+     * Ctor.
+     */
+    public Move() {
+        super();
+    }
+
+    /**
+     * Validates the request parameters.
+     * @throws UsecaseException if an error occurs.
+     */
+    void validate() throws UsecaseException {
+        // do nothing
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckExecutionConditions()
+     */
+    protected void doCheckExecutionConditions() throws Exception {
+        validate();
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
+     */
+    protected void doExecute() throws Exception {
+        super.doExecute();
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.Usecase#setParameter(java.lang.String,
+     *      java.lang.Object)
+     */
+    public void setParameter(String name, Object value) {
+        super.setParameter(name, value);
+    }
+}
\ No newline at end of file
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/MoveSubsite.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/MoveSubsite.java
new file mode 100644
index 0000000..62f11fa
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/MoveSubsite.java
@@ -0,0 +1,220 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang.Validate;
+import org.apache.lenya.cms.publication.Area;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentLocator;
+import org.apache.lenya.cms.publication.DocumentManager;
+import org.apache.lenya.cms.publication.Node;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.PublicationException;
+import org.apache.lenya.cms.site.Link;
+import org.apache.lenya.cms.site.NodeSet;
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.cms.site.SiteUtil;
+import org.apache.lenya.cms.usecase.DocumentUsecase;
+import org.apache.lenya.cms.usecase.UsecaseException;
+import org.apache.lenya.cms.workflow.WorkflowUtil;
+import org.apache.lenya.cms.workflow.usecases.UsecaseWorkflowHelper;
+import org.apache.lenya.workflow.Workflowable;
+
+/**
+ * Usecase to move a subsite to another area.
+ * 
+ * @version $Id:$
+ */
+public abstract class MoveSubsite extends DocumentUsecase {
+
+    /**
+     * @return The possible source areas.
+     */
+    protected abstract String[] getSourceAreas();
+
+    /**
+     * @return The target area.
+     */
+    protected abstract String getTargetArea();
+
+    private DocumentManager documentManager;
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckPreconditions()
+     */
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+        if (hasErrors()) {
+            return;
+        }
+
+        List sourceAreas = Arrays.asList(getSourceAreas());
+        if (!sourceAreas.contains(getSourceDocument().getArea())) {
+            addErrorMessage("This usecase can only be invoked in the authoring area!");
+        } else {
+
+            Document document = getSourceDocument();
+
+            NodeSet subsite = SiteUtil.getSubSite(document.getLink().getNode());
+            Document[] docs = subsite.getDocuments();
+            for (int i = 0; i < docs.length; i++) {
+                if (docs[i].existsAreaVersion(Publication.LIVE_AREA)) {
+                    Document liveVersion = docs[i].getAreaVersion(Publication.LIVE_AREA);
+                    addErrorMessage("delete-doc-live", new String[] { liveVersion.toString() });
+                }
+                UsecaseWorkflowHelper.checkWorkflow(this, getEvent(), docs[i], getLogger());
+            }
+        }
+    }
+
+    /**
+     * @return The workflow event.
+     */
+    protected abstract String getEvent();
+
+    /**
+     * Lock all source documents and the site structure repository nodes because changes to the site
+     * structure would compromise the operation.
+     */
+    protected Node[] getNodesToLock() throws UsecaseException {
+        Set nodes = new HashSet();
+
+        if (getSourceDocument() != null) {
+            try {
+
+                SiteStructure sourceSite = getSourceDocument().area().getSite();
+                SiteStructure targetSite = getSourceDocument().getPublication().getArea(
+                        getTargetArea()).getSite();
+
+                nodes.add(sourceSite);
+                nodes.add(targetSite);
+
+                Document[] docs = SiteUtil.getSubSite(getSourceDocument().getLink().getNode())
+                        .getDocuments();
+                for (int i = 0; i < docs.length; i++) {
+                    nodes.add(docs[i]);
+                }
+
+            } catch (PublicationException e) {
+                throw new UsecaseException(e);
+            }
+        }
+
+        return (Node[]) nodes.toArray(new Node[nodes.size()]);
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
+     */
+    protected void doExecute() throws Exception {
+
+        String targetAreaName = getTargetArea();
+        Document doc = getSourceDocument();
+        Document[] sources = SiteUtil.getSubSite(doc.getLink().getNode()).getDocuments();
+        Area targetArea = doc.getPublication().getArea(targetAreaName);
+
+        DocumentLocator targetLoc = doc.getLocator().getAreaVersion(targetAreaName);
+        targetLoc = SiteUtil.getAvailableLocator(getSession(), targetLoc);
+
+        for (int i = 0; i < sources.length; i++) {
+            WorkflowUtil.invoke(sources[i], getEvent(), true);
+
+            if (this.getClass().getName().equals(Restore.class.getName())) {
+                Workflowable workflowable = WorkflowUtil.getWorkflowable(sources[i]);
+                String state = workflowable.getLatestVersion().getState();
+                if (!state.equals("authoring")) {
+                    addErrorMessage("The state is [" + state + "] instead of [authoring]!");
+                }
+            }
+
+        }
+
+        getDocumentManager().moveAll(doc.area(), doc.getPath(), targetArea, targetLoc.getPath());
+
+        setTargetDocument(doc.getAreaVersion(targetAreaName));
+
+    }
+
+    public String getTargetURL(boolean success) {
+        if (getTargetArea().equals(Publication.AUTHORING_AREA)) {
+            return super.getTargetURL(success);
+        }
+
+        String url;
+        if (!success) {
+            url = getSourceURL();
+        } else {
+            try {
+                Document document = getTargetDocument(success);
+                SiteStructure site = document.getPublication().getArea(Publication.AUTHORING_AREA)
+                        .getSite();
+                return getTargetUrl(site, document.getPath()) + getExitQueryString();
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return url + getExitQueryString();
+    }
+
+    protected static String getTargetUrl(SiteStructure site, String path) throws SiteException {
+        if (path.length() == 0) {
+            return "/" + site.getPublication().getId() + "/" + site.getArea() + "/";
+        } else if (site.contains(path)) {
+            SiteNode node = site.getNode(path);
+            if (node.getLanguages().length > 0) {
+                Link link;
+                String defaultLanguage = site.getPublication().getDefaultLanguage();
+                if (node.hasLink(defaultLanguage)) {
+                    link = node.getLink(defaultLanguage);
+                } else {
+                    link = node.getLink(node.getLanguages()[0]);
+                }
+                return link.getDocument().getCanonicalWebappURL();
+            } else {
+                return getTargetUrl(site, getParentPath(path));
+            }
+        } else {
+            return getTargetUrl(site, getParentPath(path));
+        }
+    }
+
+    protected static String getParentPath(String path) {
+        Validate.notNull(path);
+        Validate.notEmpty(path);
+        return path.substring(0, path.lastIndexOf("/"));
+    }
+
+    protected DocumentManager getDocumentManager() {
+        return documentManager;
+    }
+
+    /**
+     * TODO: Bean wiring
+     */
+    public void setDocumentManager(DocumentManager documentManager) {
+        this.documentManager = documentManager;
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Overview.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Overview.java
new file mode 100644
index 0000000..43adffc
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Overview.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+
+import org.apache.lenya.cms.metadata.MetaData;
+import org.apache.lenya.cms.metadata.dublincore.DublinCore;
+import org.apache.lenya.cms.publication.Area;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.cms.site.usecases.SiteUsecase;
+import org.apache.lenya.cms.workflow.WorkflowUtil;
+import org.apache.lenya.workflow.Version;
+import org.apache.lenya.workflow.Workflow;
+import org.apache.lenya.workflow.WorkflowManager;
+import org.apache.lenya.workflow.Workflowable;
+
+/**
+ * Usecase to display the overview tab in the site area for a document.
+ * 
+ * @version $Id$
+ */
+public class Overview extends SiteUsecase {
+
+    protected static final String LASTMODIFIED = "lastmodified";
+    protected static final String LANGUAGES = "languages";
+    protected static final String STATE = "state";
+    protected static final String ISLIVE = "isLive";
+    protected static final String VISIBLE_IN_NAVIGATION = "visibleInNav";
+    protected static final String WORKFLOW_VARIABLE_ISLIVE = "is_live";
+    protected static final String PARAM_NUMBER_OF_DOCUMENTS = "numberOfDocuments";
+    protected static final String PARAM_NUMBER_OF_SITE_NODES = "numberOfSiteNodes";
+    
+    private WorkflowManager workflowManager;
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters()
+     */
+    protected void initParameters() {
+        super.initParameters();
+
+        try {
+            Document doc = getSourceDocument();
+            if (doc == null) {
+                URLInformation info = new URLInformation(getSourceURL());
+                Publication pub = getSession().getPublication(info.getPublicationId());
+                Area area = pub.getArea(info.getArea());
+                setParameter(PARAM_NUMBER_OF_DOCUMENTS, new Integer(area.getDocuments().length));
+                setParameter(PARAM_NUMBER_OF_SITE_NODES, new Integer(area.getSite().getNodes().length));
+            }
+            else {
+                // read parameters from Dublin Core meta-data
+                MetaData dc = doc.getMetaData(DublinCore.DC_NAMESPACE);
+                setParameter(DublinCore.ELEMENT_TITLE, dc.getFirstValue(DublinCore.ELEMENT_TITLE));
+                setParameter(DublinCore.ELEMENT_DESCRIPTION, dc
+                        .getFirstValue(DublinCore.ELEMENT_DESCRIPTION));
+
+                // read parameters from document attributes
+                setParameter(LANGUAGES, doc.getLanguages());
+                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
+                String lastModified = format
+                        .format(new Date(getSourceDocument().getLastModified()));
+                setParameter(LASTMODIFIED, lastModified);
+                boolean visible = doc.getLink().getNode().isVisible();
+                setParameter(VISIBLE_IN_NAVIGATION, Boolean.valueOf(visible));
+
+                Workflowable workflowable = WorkflowUtil.getWorkflowable(doc);
+                if (getWorkflowManager().hasWorkflow(workflowable)) {
+                    Workflow workflow = getWorkflowManager().getWorkflowSchema(workflowable);
+                    String[] variableNames = workflow.getVariableNames();
+                    Version latestVersion = workflowable.getLatestVersion();
+                    Boolean isLive = null;
+                    if (latestVersion != null) {
+                        setParameter(STATE, latestVersion.getState());
+                        if (Arrays.asList(variableNames).contains(WORKFLOW_VARIABLE_ISLIVE)) {
+                            isLive = Boolean.valueOf(latestVersion
+                                    .getValue(WORKFLOW_VARIABLE_ISLIVE));
+                        }
+                    } else {
+                        setParameter(STATE, workflow.getInitialState());
+                        if (Arrays.asList(variableNames).contains(WORKFLOW_VARIABLE_ISLIVE)) {
+                            isLive = Boolean.valueOf(workflow
+                                    .getInitialValue(WORKFLOW_VARIABLE_ISLIVE));
+                        }
+                    }
+                    setParameter(ISLIVE, isLive);
+                } else {
+                    setParameter(STATE, "");
+                }
+            }
+
+        } catch (final Exception e) {
+            addErrorMessage("Could not read a value. See log files for details.");
+            getLogger().error("Could not read value for Overview usecase. ", e);
+        }
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckPreconditions()
+     */
+    protected void doCheckPreconditions() throws Exception {
+        // don't complain if document is null
+    }
+
+    protected WorkflowManager getWorkflowManager() {
+        return workflowManager;
+    }
+
+    /**
+     * TODO: Bean wiring
+     */
+    public void setWorkflowManager(WorkflowManager workflowManager) {
+        this.workflowManager = workflowManager;
+    }
+
+}
\ No newline at end of file
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Paste.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Paste.java
new file mode 100644
index 0000000..ff22639
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Paste.java
@@ -0,0 +1,234 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.cocoon.processing.ProcessInfoProvider;
+import org.apache.cocoon.spring.configurator.WebAppContextUtils;
+import org.apache.lenya.cms.publication.Area;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentBuildException;
+import org.apache.lenya.cms.publication.DocumentException;
+import org.apache.lenya.cms.publication.DocumentLocator;
+import org.apache.lenya.cms.publication.DocumentManager;
+import org.apache.lenya.cms.publication.Node;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.cms.site.NodeSet;
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.cms.site.SiteUtil;
+import org.apache.lenya.cms.usecase.AbstractUsecase;
+import org.apache.lenya.cms.usecase.UsecaseException;
+
+/**
+ * Paste a document from the clipboard.
+ * 
+ * @version $Id$
+ */
+public class Paste extends AbstractUsecase {
+
+    protected static final String CLIPBOARD_LABEL = "clipboardLabel";
+
+    private DocumentManager documentManager;
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckPreconditions()
+     */
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+
+        if (hasErrors()) {
+            return;
+        }
+
+        if (!getArea().getName().equals(Publication.AUTHORING_AREA)) {
+            addErrorMessage("only-in-authoring-area");
+        }
+
+        Clipboard clipboard = new ClipboardHelper().getClipboard(getRequest());
+        if (clipboard == null) {
+            addErrorMessage("clipboard-empty");
+        } else {
+            Document doc = getSourceDocument();
+            if (doc != null) {
+                Document clippedDoc = clipboard.getDocument(getSession());
+                String uuid = clippedDoc.getUUID();
+                SiteNode node = doc.getLink().getNode();
+                if (clipboard.getMethod() == Clipboard.METHOD_CUT) {
+                    if (willPasteInOwnSubtree(node, uuid)) {
+                        addErrorMessage("will-paste-in-own-subtree");
+                    }
+                }
+            }
+        }
+    }
+
+    protected boolean willPasteInOwnSubtree(SiteNode node, String uuid) throws SiteException {
+        String nodeUuid = node.getUuid();
+        if (nodeUuid.equals(uuid)) {
+            return true;
+        } else if (!node.isTopLevel()) {
+            return willPasteInOwnSubtree(node.getParent(), uuid);
+        } else {
+            return false;
+        }
+    }
+
+    protected Document getSourceDocument() {
+        Document doc = null;
+        String sourceUrl = getParameterAsString(SOURCE_URL);
+        if (getSession().getUriHandler().isDocument(sourceUrl)) {
+            doc = getSession().getUriHandler().getDocument(sourceUrl);
+        }
+        return doc;
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters()
+     */
+    protected void initParameters() {
+        super.initParameters();
+
+        Clipboard clipboard = new ClipboardHelper().getClipboard(getRequest());
+        if (clipboard != null) {
+            String label;
+            try {
+                label = clipboard.getDocument(getSession()).getLink().getLabel();
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            setParameter(CLIPBOARD_LABEL, label);
+        }
+    }
+
+    protected Publication getPublication() {
+        URLInformation info = new URLInformation(getSourceURL());
+        String pubId = info.getPublicationId();
+        return getSession().getPublication(pubId);
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getNodesToLock()
+     */
+    protected Node[] getNodesToLock() throws UsecaseException {
+        List nodes = new ArrayList();
+
+        try {
+
+            Clipboard clipboard = new ClipboardHelper().getClipboard(getRequest());
+            if (clipboard != null) {
+
+                Node siteNode = getArea().getSite();
+                nodes.add(siteNode);
+
+                Publication pub = getPublication();
+                Document clippedDocument = clipboard.getDocument(getSession());
+
+                NodeSet subsite = SiteUtil.getSubSite(clippedDocument.getLink().getNode());
+                Document[] subsiteDocs = subsite.getDocuments();
+
+                for (int i = 0; i < subsiteDocs.length; i++) {
+                    if (clipboard.getMethod() == Clipboard.METHOD_CUT) {
+                        nodes.add(subsiteDocs[i]);
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+            throw new UsecaseException(e);
+        }
+
+        return (Node[]) nodes.toArray(new Node[nodes.size()]);
+    }
+
+    protected Area getArea() {
+        Publication pub = getPublication();
+        URLInformation info = new URLInformation(getSourceURL());
+        return pub.getArea(info.getArea());
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
+     */
+    protected void doExecute() throws Exception {
+        super.doExecute();
+
+        ClipboardHelper helper = new ClipboardHelper();
+
+        HttpServletRequest request = getRequest();
+        Clipboard clipboard = helper.getClipboard(request);
+        Publication pub = getPublication();
+        Document clippedDocument = clipboard.getDocument(getSession());
+
+        final String targetPath = getTargetPath();
+        final Area area = clippedDocument.area();
+        if (clipboard.getMethod() == Clipboard.METHOD_COPY) {
+            getDocumentManager().copyAll(area, clippedDocument.getPath(), area, targetPath);
+        } else if (clipboard.getMethod() == Clipboard.METHOD_CUT) {
+            getDocumentManager().moveAll(area, clippedDocument.getPath(), area, targetPath);
+        } else {
+            throw new RuntimeException("This clipboard method is not supported!");
+        }
+
+        helper.removeClipboard(request);
+    }
+
+    protected String getTargetPath() throws SiteException, DocumentBuildException,
+            ServiceException, DocumentException {
+        Clipboard clipboard = new ClipboardHelper().getClipboard(getRequest());
+        Publication pub = getPublication();
+        Document clippedDocument = clipboard.getDocument(getSession());
+
+        String targetArea = getArea().getName();
+        String language = clippedDocument.getLanguage();
+        String nodeId = clippedDocument.getName();
+
+        Document sourceDoc = getSourceDocument();
+        String basePath = sourceDoc != null ? sourceDoc.getPath() : "";
+
+        String potentialPath = basePath + "/" + nodeId;
+
+        DocumentLocator potentialLoc = DocumentLocator.getLocator(getPublication().getId(),
+                targetArea, potentialPath, language);
+        return SiteUtil.getAvailableLocator(getSession(), potentialLoc).getPath();
+    }
+
+    protected HttpServletRequest getRequest() {
+        ProcessInfoProvider process = (ProcessInfoProvider) WebAppContextUtils
+                .getCurrentWebApplicationContext().getBean(ProcessInfoProvider.ROLE);
+        return process.getRequest();
+    }
+
+    protected DocumentManager getDocumentManager() {
+        return documentManager;
+    }
+
+    /**
+     * TODO: Bean wiring
+     */
+    public void setDocumentManager(DocumentManager documentManager) {
+        this.documentManager = documentManager;
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Restore.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Restore.java
new file mode 100644
index 0000000..6ece53a
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Restore.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import org.apache.lenya.cms.publication.Area;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentLocator;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.site.SiteUtil;
+import org.apache.lenya.cms.workflow.WorkflowUtil;
+import org.apache.lenya.workflow.Workflowable;
+
+/**
+ * Restore usecase handler.
+ * 
+ * @version $Id:$
+ */
+public class Restore extends MoveSubsite {
+
+    /**
+     * @see org.apache.lenya.cms.site.usecases.MoveSubsite#getSourceAreas()
+     */
+    protected String[] getSourceAreas() {
+        return new String[] { Publication.TRASH_AREA, Publication.ARCHIVE_AREA };
+    }
+
+    /**
+     * @see org.apache.lenya.cms.site.usecases.MoveSubsite#getTargetArea()
+     */
+    protected String getTargetArea() {
+        return Publication.AUTHORING_AREA;
+    }
+
+    /**
+     * @see org.apache.lenya.cms.site.usecases.MoveSubsite#getEvent()
+     */
+    protected String getEvent() {
+        return "restore";
+    }
+
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+
+        String targetAreaName = getTargetArea();
+        Document doc = getSourceDocument();
+        if (doc == null) {
+            return;
+        }
+        // Check to see if parent node exists in target to prevent ghost nodes
+        Area targetArea = doc.getPublication().getArea(targetAreaName);
+        DocumentLocator targetLoc = doc.getLocator().getAreaVersion(targetAreaName);
+        targetLoc = SiteUtil.getAvailableLocator(getSession(), targetLoc);
+        String targetPath = targetLoc.getPath();
+        targetPath = targetPath.substring(0, targetPath.lastIndexOf('/'));
+        if (!targetArea.getSite().contains(targetPath)) {
+            addErrorMessage("The authoring path [" + targetPath + "] does not exist.");
+        }
+    }
+
+    protected void doCheckPostconditions() throws Exception {
+        super.doCheckPostconditions();
+
+        Document doc = getTargetDocument(true);
+        Workflowable workflowable = WorkflowUtil.getWorkflowable(doc);
+        String state = workflowable.getLatestVersion().getState();
+        if (!state.equals("authoring")) {
+            addErrorMessage("The state is [" + state + "] instead of [authoring]!");
+        }
+
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Revisions.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Revisions.java
new file mode 100644
index 0000000..470a5ee
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Revisions.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.History;
+import org.apache.lenya.cms.workflow.WorkflowUtil;
+import org.apache.lenya.workflow.Version;
+import org.apache.lenya.workflow.Workflow;
+import org.apache.lenya.workflow.Workflowable;
+
+/**
+ * Usecase to display revisions of a resource.
+ * 
+ * @version $Id$
+ */
+public class Revisions extends SiteUsecase {
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters() TODO filter out checkin
+     *      entries
+     */
+    protected void initParameters() {
+        super.initParameters();
+        Document sourceDoc = getSourceDocument();
+        if (sourceDoc != null) {
+            try {
+                History history = sourceDoc.getHistory();
+
+                int[] numbers = history.getRevisionNumbers();
+                Document[] revisions = new Document[numbers.length];
+                for (int i = 0; i < numbers.length; i++) {
+                    revisions[i] = sourceDoc.getRevision(numbers[i]);
+                }
+                setParameter("revisions", revisions);
+
+                Boolean canRollback = Boolean
+                        .valueOf(WorkflowUtil.canInvoke(sourceDoc, getEvent()));
+                setParameter("canRollback", canRollback);
+
+                if (WorkflowUtil.hasWorkflow(sourceDoc)) {
+                    Workflowable workflowable = WorkflowUtil.getWorkflowable(sourceDoc);
+                    Version latestVersion = workflowable.getLatestVersion();
+                    String state;
+                    if (latestVersion != null) {
+                        state = latestVersion.getState();
+                    } else {
+                        Workflow workflow = WorkflowUtil.getWorkflowSchema(sourceDoc);
+                        state = workflow.getInitialState();
+                    }
+                    setParameter("workflowState", state);
+                }
+            } catch (final Exception e) {
+                throw new RuntimeException(e);
+            }
+
+            /*
+             * // since we need both state and canInvoke, we could deal with the avalon // component
+             * ourselves rather than using WorkflowUtil - saves one // service manager lookup. //
+             * problem is that DocumentWorkflowable is not public and Workflowable is abstract :(
+             * 
+             * WorkflowManager wfManager = null; String workflowState; Boolean canRollback; try {
+             * wfManager = (WorkflowManager) this.manager.lookup(WorkflowManager.ROLE); Workflowable
+             * workflowable = new DocumentWorkflowable( this.manager,
+             * getDocumentFactory().getSession(), sourceDoc, getLogger() ); workflowState =
+             * workflowable.getLatestVersion().getState(); canRollback = new
+             * Boolean(wfManager.canInvoke(workflowable, WORKFLOW_EVENT_EDIT)); } catch
+             * (ServiceException e) { throw new RuntimeException(e); } finally { if (wfManager !=
+             * null) { manager.release(wfManager); } } setParameter("workflowState", workflowState);
+             * setParameter("canRollback", canRollback);
+             */
+
+        }
+    }
+
+    protected String getEvent() {
+        return getParameterAsString("workflowEvent");
+    }
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Rollback.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Rollback.java
new file mode 100644
index 0000000..c5a7f43
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/Rollback.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import org.apache.lenya.cms.usecase.DocumentUsecase;
+import org.apache.lenya.cms.usecase.UsecaseException;
+import org.apache.lenya.cms.workflow.WorkflowUtil;
+import org.apache.lenya.cms.workflow.usecases.UsecaseWorkflowHelper;
+
+/**
+ * Rollback.
+ */
+public class Rollback extends DocumentUsecase {
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getNodesToLock()
+     */
+    protected org.apache.lenya.cms.publication.Node[] getNodesToLock() throws UsecaseException {
+        org.apache.lenya.cms.publication.Node[] objects = { getSourceDocument() };
+        return objects;
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckPreconditions()
+     */
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+        UsecaseWorkflowHelper.checkWorkflow(this, getEvent(), getSourceDocument(), getLogger());
+    }
+
+    /**
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
+     */
+    protected void doExecute() throws Exception {
+        super.doExecute();
+
+        int revision = getParameterAsInteger("rollbackRevision", -1);
+
+        getSourceDocument().rollback(revision);
+
+        WorkflowUtil.invoke(getSourceDocument(), getEvent());
+    }
+
+    protected String getEvent() {
+        return getParameterAsString("workflowEvent");
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/SiteOverview.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/SiteOverview.java
new file mode 100644
index 0000000..be30877
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/SiteOverview.java
@@ -0,0 +1,279 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentException;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.PublicationException;
+import org.apache.lenya.cms.publication.RepositoryException;
+import org.apache.lenya.cms.publication.ResourceType;
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.usecase.AbstractUsecase;
+import org.apache.lenya.cms.workflow.WorkflowUtil;
+import org.apache.lenya.workflow.Version;
+import org.apache.lenya.workflow.Workflow;
+import org.apache.lenya.workflow.WorkflowException;
+import org.apache.lenya.workflow.Workflowable;
+
+/**
+ * Overview over all documents.
+ */
+public class SiteOverview extends AbstractUsecase {
+
+    protected static final String ALL_DOCUMENTS = "allDocuments";
+    protected static final String DOCUMENTS = "documents";
+    protected static final String FILTER_WORKFLOW_STATE_VALUES = "filterWorkflowStateValues";
+    protected static final String FILTER_RESOURCE_TYPE_VALUES = "filterResourceTypeValues";
+
+    protected static final String KEY_PATH = "keyPath";
+    protected static final String KEY_RESOURCE_TYPE = "keyResourceType";
+    protected static final String KEY_WORKFLOW_STATE = "keyWorkflowState";
+    protected static final String KEY_LANGUAGE = "keyLanguage";
+    protected static final String KEY_LAST_MODIFIED = "keyLastModified";
+    protected static final String KEY_URL = "keyUrl";
+    protected static final String KEY_CHECKED_OUT = "keyCheckedOut";
+    protected static final String KEY_CONTENT_LENGTH = "keyContentLength";
+    protected static final String PARAMETER_KEYS = "keys";
+
+    protected static final String[] KEYS = { KEY_PATH, KEY_LANGUAGE, KEY_RESOURCE_TYPE,
+            KEY_WORKFLOW_STATE, KEY_LAST_MODIFIED, KEY_CONTENT_LENGTH, KEY_CHECKED_OUT };
+
+    protected static final String FILTER_RESOURCE_TYPE = "filterResourceType";
+    protected static final String FILTER_WORKFLOW_STATE = "filterWorkflowState";
+    protected static final String FILTER_LANGUAGE = "filterLanguage";
+    protected static final String PARAMETER_FILTERS = "filters";
+
+    protected static final String[] FILTERS = { FILTER_LANGUAGE, FILTER_RESOURCE_TYPE,
+            FILTER_WORKFLOW_STATE };
+
+    protected static final String VALUE_ALL = "- all -";
+
+    protected static final String SORT = "sort";
+
+    protected static final String ORDER = "order";
+
+    protected static final String DESC = "desc";
+    protected static final String ASC = "asc";
+
+    protected void prepareView() throws Exception {
+        super.prepareView();
+        setDefaultParameter(SORT, KEY_PATH);
+        setDefaultParameter(ORDER, ASC);
+
+        try {
+            Document[] documents = getDocuments();
+            List entries = new ArrayList();
+            for (int i = 0; i < documents.length; i++) {
+                entries.add(createEntry(documents[i]));
+            }
+
+            prepareFilters(entries);
+
+            List filteredDocuments = filter(entries);
+            sort(filteredDocuments);
+            setParameter(DOCUMENTS, filteredDocuments);
+
+            setParameter(PARAMETER_KEYS, Arrays.asList(KEYS));
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    protected void setDefaultParameter(String name, String value) {
+        if (getParameter(name) == null) {
+            setParameter(name, value);
+        }
+    }
+
+    protected Entry createEntry(Document doc) throws DocumentException, WorkflowException,
+            RepositoryException {
+        Entry entry = new Entry();
+        if (doc.hasLink()) {
+            entry.setValue(KEY_PATH, doc.getPath());
+        } else {
+            entry.setValue(KEY_PATH, "not in site structure");
+        }
+        entry.setValue(KEY_RESOURCE_TYPE, ResourceType.I18N_PREFIX
+                + doc.getResourceType().getName());
+        entry.setValue(KEY_LANGUAGE, doc.getLanguage());
+        entry.setValue(KEY_URL, doc.getCanonicalWebappURL());
+        entry.setValue(KEY_CONTENT_LENGTH, "" + (doc.getContentLength() / 1000));
+
+        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String lastModified = format.format(new Date(doc.getLastModified()));
+        entry.setValue(KEY_LAST_MODIFIED, lastModified);
+
+        if (WorkflowUtil.hasWorkflow(doc)) {
+            Workflowable workflowable = WorkflowUtil.getWorkflowable(doc);
+            Version latestVersion = workflowable.getLatestVersion();
+            String state;
+            if (latestVersion != null) {
+                state = latestVersion.getState();
+            } else {
+                Workflow workflow = WorkflowUtil.getWorkflowSchema(doc);
+                state = workflow.getInitialState();
+            }
+            entry.setValue(KEY_WORKFLOW_STATE, state);
+        } else {
+            entry.setValue(KEY_WORKFLOW_STATE, "");
+        }
+
+        if (doc.isCheckedOut()) {
+            entry.setValue(KEY_CHECKED_OUT, doc.getCheckoutUserId());
+        } else {
+            entry.setValue(KEY_CHECKED_OUT, "");
+        }
+        return entry;
+    }
+
+    protected void prepareFilters(List entries) {
+        for (int i = 0; i < FILTERS.length; i++) {
+            SortedSet filterValues = new TreeSet();
+            filterValues.add(VALUE_ALL);
+
+            String key = "key" + FILTERS[i].substring("filter".length());
+
+            for (Iterator docs = entries.iterator(); docs.hasNext();) {
+                Entry entry = (Entry) docs.next();
+                filterValues.add(entry.getValue(key));
+            }
+            setParameter(FILTERS[i] + "Values", filterValues);
+            setDefaultParameter(FILTERS[i], VALUE_ALL);
+        }
+        setParameter(PARAMETER_FILTERS, Arrays.asList(FILTERS));
+    }
+
+    protected void sort(List documents) {
+        String sort = getParameterAsString(SORT);
+        String order = getParameterAsString(ORDER, ASC);
+        if (sort != null) {
+            Comparator comparator = new EntryComparator(sort, order);
+            Collections.sort(documents, comparator);
+        }
+    }
+
+    protected List filter(List entries) {
+        List filteredDocuments = new ArrayList(entries);
+
+        for (int i = 0; i < FILTERS.length; i++) {
+            String key = "key" + FILTERS[i].substring("filter".length());
+            String filterValue = getParameterAsString(FILTERS[i]);
+            if (!filterValue.equals(VALUE_ALL)) {
+                Entry[] allEntries = (Entry[]) filteredDocuments
+                        .toArray(new Entry[filteredDocuments.size()]);
+                for (int entryIndex = 0; entryIndex < allEntries.length; entryIndex++) {
+                    if (!allEntries[entryIndex].getValue(key).equals(filterValue)) {
+                        filteredDocuments.remove(allEntries[entryIndex]);
+                    }
+                }
+            }
+        }
+        return filteredDocuments;
+    }
+
+    /**
+     * @return The documents in the authoring area.
+     * @throws PublicationException if an error occurs.
+     * @throws SiteException if an error occurs.
+     */
+    protected Document[] getDocuments() throws PublicationException, SiteException {
+        return getPublication().getArea(Publication.AUTHORING_AREA).getDocuments();
+    }
+
+    /**
+     * Comparator for entries.
+     */
+    public static class EntryComparator implements Comparator {
+
+        private String key;
+        private String order;
+
+        /**
+         * @param key The key to compare.
+         * @param order The order string ({@link SiteOverview#ASC} or {@link SiteOverview#DESC}).
+         */
+        public EntryComparator(String key, String order) {
+            this.key = key;
+            this.order = order;
+        }
+
+        /**
+         * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+         */
+        public int compare(Object arg0, Object arg1) {
+            Entry e1 = (Entry) arg0;
+            Entry e2 = (Entry) arg1;
+
+            String value1 = e1.getValue(this.key);
+            String value2 = e2.getValue(this.key);
+            if (this.order.equals(DESC))
+                return value2.compareTo(value1);
+            else
+                return value1.compareTo(value2);
+        }
+
+    }
+
+    /**
+     * Stores document-related information.
+     */
+    public static class Entry {
+
+        private Map values = new HashMap();
+
+        /**
+         * Ctor.
+         */
+        public Entry() {
+        }
+
+        /**
+         * @param key The key.
+         * @param value The value.
+         */
+        public void setValue(String key, String value) {
+            this.values.put(key, value);
+        }
+
+        /**
+         * @param key The key.
+         * @return The value.
+         */
+        public String getValue(String key) {
+            return (String) this.values.get(key);
+        }
+
+    }
+
+}
diff --git a/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/SiteUsecase.java b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/SiteUsecase.java
new file mode 100644
index 0000000..f98ad05
--- /dev/null
+++ b/org.apache.lenya.core.sitemanagement/src/main/java/org/apache/lenya/cms/site/usecases/SiteUsecase.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.site.usecases;
+
+import org.apache.lenya.cms.usecase.DocumentUsecase;
+
+/**
+ * Super class for site related usecases.
+ * 
+ * @version $Id$
+ */
+public class SiteUsecase extends DocumentUsecase {
+
+
+}
\ No newline at end of file
diff --git a/org.apache.lenya.core.transaction.impl/src/main/java/org/apache/lenya/transaction/ConcurrentModificationException.java b/org.apache.lenya.core.transaction.api/src/main/java/org/apache/lenya/transaction/ConcurrentModificationException.java
similarity index 100%
rename from org.apache.lenya.core.transaction.impl/src/main/java/org/apache/lenya/transaction/ConcurrentModificationException.java
rename to org.apache.lenya.core.transaction.api/src/main/java/org/apache/lenya/transaction/ConcurrentModificationException.java
diff --git a/org.apache.lenya.core.transaction.api/src/main/java/org/apache/lenya/transaction/Identity.java b/org.apache.lenya.core.transaction.api/src/main/java/org/apache/lenya/transaction/Identity.java
index cbe0044..097e94d 100644
--- a/org.apache.lenya.core.transaction.api/src/main/java/org/apache/lenya/transaction/Identity.java
+++ b/org.apache.lenya.core.transaction.api/src/main/java/org/apache/lenya/transaction/Identity.java
@@ -17,6 +17,9 @@
  */
 package org.apache.lenya.transaction;
 
+/**
+ * @deprecated use of /lenya-core-ac/src/main/java/org/apache/lenya/ac/Identity.java is more clean
+ */
 public interface Identity {
     
     String getUserId();
diff --git a/org.apache.lenya.core.transaction.impl/src/main/java/org/apache/lenya/transaction/LockException.java b/org.apache.lenya.core.transaction.api/src/main/java/org/apache/lenya/transaction/LockException.java
similarity index 100%
rename from org.apache.lenya.core.transaction.impl/src/main/java/org/apache/lenya/transaction/LockException.java
rename to org.apache.lenya.core.transaction.api/src/main/java/org/apache/lenya/transaction/LockException.java
diff --git a/org.apache.lenya.core.transaction.impl/pom.xml b/org.apache.lenya.core.transaction.impl/pom.xml
index 4d10236..b21babc 100644
--- a/org.apache.lenya.core.transaction.impl/pom.xml
+++ b/org.apache.lenya.core.transaction.impl/pom.xml
@@ -21,6 +21,10 @@
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-transaction-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-identity</artifactId>
+    </dependency>
   <!-- TODO : see if all theses dependencies are required -->
     <dependency>
       <groupId>org.apache.cocoon</groupId>
diff --git a/org.apache.lenya.core.transaction.impl/src/main/java/org/apache/lenya/cms/publication/IdentityWrapper.java b/org.apache.lenya.core.transaction.impl/src/main/java/org/apache/lenya/cms/publication/IdentityWrapper.java
index e503bbc..62a81c4 100644
--- a/org.apache.lenya.core.transaction.impl/src/main/java/org/apache/lenya/cms/publication/IdentityWrapper.java
+++ b/org.apache.lenya.core.transaction.impl/src/main/java/org/apache/lenya/cms/publication/IdentityWrapper.java
@@ -17,9 +17,11 @@
  */
 package org.apache.lenya.cms.publication;
 
-import org.apache.lenya.transaction.Identity;
+//florent : remove deprecated import org.apache.lenya.transaction.Identity;
+import org.apache.lenya.ac.Identity;
 
-public class IdentityWrapper implements Identity {
+public class IdentityWrapper {
+//florent : create a interface of ac.Identity and add this statement implements Identity {
     
     private org.apache.lenya.ac.Identity identity;
     
diff --git a/org.apache.lenya.core.transaction.impl/src/main/java/org/apache/lenya/transaction/UnitOfWorkImpl.java b/org.apache.lenya.core.transaction.impl/src/main/java/org/apache/lenya/transaction/UnitOfWorkImpl.java
index 4ee668c..b63b6ae 100644
--- a/org.apache.lenya.core.transaction.impl/src/main/java/org/apache/lenya/transaction/UnitOfWorkImpl.java
+++ b/org.apache.lenya.core.transaction.impl/src/main/java/org/apache/lenya/transaction/UnitOfWorkImpl.java
@@ -26,6 +26,7 @@
 import org.apache.commons.lang.Validate;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.lenya.ac.Identity;
 
 /**
  * Default implementation of a unit of work.
diff --git a/org.apache.lenya.core.usecase/pom.xml b/org.apache.lenya.core.usecase/pom.xml
index a3ba714..fae48a8 100644
--- a/org.apache.lenya.core.usecase/pom.xml
+++ b/org.apache.lenya.core.usecase/pom.xml
@@ -83,7 +83,14 @@
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-utils</artifactId>
     </dependency>
-    
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-ac</artifactId>
+    </dependency>
+     <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-transaction-impl</artifactId>
+    </dependency>
     <!-- Tests -->
     <dependency>
       <groupId>junit</groupId>
diff --git a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/ac/usecase/impl/UsecaseAuthorizerImpl.java b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/ac/usecase/impl/UsecaseAuthorizerImpl.java
index f1ad87e..080eccb 100644
--- a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/ac/usecase/impl/UsecaseAuthorizerImpl.java
+++ b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/ac/usecase/impl/UsecaseAuthorizerImpl.java
@@ -35,8 +35,10 @@
 import org.apache.lenya.cms.ac.PolicyUtil;
 import org.apache.lenya.cms.ac.usecase.UsecaseAuthorizer;
 import org.apache.lenya.cms.publication.Publication;
-import org.apache.lenya.cms.publication.URLInformation;
-import org.apache.lenya.util.ServletHelper;
+//flo : remove when ok import org.apache.lenya.cms.publication.URLInformation;
+//import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.URLInformation;
+import org.apache.lenya.utils.ServletHelper;
 
 /**
  * Authorizer for usecases.
@@ -167,8 +169,10 @@
         // Check if the service has been parameterized with a
         // configuration URI. This can be used for testing purposes etc.
         if (configurationUri == null) {
-            String webappUrl = ServletHelper.getWebappURI(request);
-            URLInformation info = new URLInformation(webappUrl);
+            //florent : change on url information
+        		/*String webappUrl = ServletHelper.getWebappURI(request);
+            URLInformation info = new URLInformation(webappUrl);*/
+        	URLInformation info = new URLInformation();
             configurationUri = getConfigurationUri(info.getPublicationId());
         }
 
diff --git a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/matching/UsecaseRegistrationMatcher.java b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/matching/UsecaseRegistrationMatcher.java
index 38a0bd2..bf899eb 100644
--- a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/matching/UsecaseRegistrationMatcher.java
+++ b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/matching/UsecaseRegistrationMatcher.java
@@ -34,8 +34,9 @@
 import org.apache.cocoon.sitemap.PatternException;
 import org.apache.cocoon.util.AbstractLogEnabled;
 import org.apache.lenya.cms.usecase.UsecaseResolver;
-import org.apache.lenya.util.ServletHelper;
-
+//flo : remove when ok import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
+import org.apache.lenya.utils.URLInformation;
 /**
  * Matches if the request calls a usecase which is registered for the Usecase Framework.
  */
@@ -66,7 +67,8 @@
             UsecaseResolver resolver = null;
             try {
                resolver = (UsecaseResolver) this.manager.lookup(UsecaseResolver.ROLE);
-               String url = ServletHelper.getWebappURI(request);
+               //florent : String url = ServletHelper.getWebappURI(request);
+               String url = new URLInformation().getWebappUrl();
                if (resolver.isRegistered(url, usecaseName)) {
                    result = Collections.EMPTY_MAP;
                }
diff --git a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java
index c291308..d8b0eaf 100644
--- a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java
+++ b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java
@@ -43,7 +43,8 @@
 import org.apache.lenya.cms.usecase.Usecase;
 import org.apache.lenya.cms.usecase.UsecaseMessage;
 import org.apache.lenya.cms.usecase.UsecaseResolver;
-import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.ServletHelper;
+import org.apache.lenya.utils.URLInformation;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.AttributesImpl;
@@ -247,11 +248,13 @@
 
         getLogger().debug("Setting up transformer");
 
-        this.sourceUrl = ServletHelper.getWebappURI(this.request);
+        //flo : remove when ok this.sourceUrl = ServletHelper.getWebappURI(this.request);
+        this.sourceUrl = new URLInformation().getWebappUrl();
 
         try {
             this.roles = PolicyUtil.getRoles(this.request);
-            String webappUrl = ServletHelper.getWebappURI(this.request);
+            //flo : remove when ok String webappUrl = ServletHelper.getWebappURI(this.request);
+            String webappUrl = new URLInformation().getWebappUrl();
             Session session = this.repository.getSession(this.request);
             this.publication = session.getUriHandler().getPublication(webappUrl);
 
diff --git a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/AbstractUsecase.java b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/AbstractUsecase.java
index c94803a..29e526f 100644
--- a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/AbstractUsecase.java
+++ b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/AbstractUsecase.java
@@ -32,13 +32,19 @@
 import org.apache.cocoon.spring.configurator.WebAppContextUtils;
 import org.apache.cocoon.util.AbstractLogEnabled;
 import org.apache.lenya.cms.publication.LockException;
-import org.apache.lenya.cms.publication.Node;
+//flo : to suppress when ok import org.apache.lenya.cms.publication.Node;
+import org.apache.lenya.cms.repository.Node;
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.publication.Repository;
-import org.apache.lenya.cms.publication.RepositoryException;
+//flo : import org.apache.lenya.cms.publication.RepositoryException;
+import org.apache.lenya.cms.repository.RepositoryException;
 import org.apache.lenya.cms.publication.Session;
-import org.apache.lenya.cms.publication.TransactionLock;
+//flo : import org.apache.lenya.cms.publication.TransactionLock;
+import org.apache.lenya.transaction.TransactionLock;
 import org.apache.lenya.utils.URLInformation;
+//flo : add identity dependencie
+import org.apache.lenya.ac.Identity;
+
 
 /**
  * Abstract usecase implementation.
@@ -59,6 +65,8 @@
     
     protected static final String ERROR_OBJECTS_CHECKED_OUT = "objects-checked-out";
     
+    //florent : deal with the retrieve of identity
+    protected HttpServletRequest request;
 
     protected static final StateMachine.Transition[] TRANSITIONS = {
             new StateMachine.Transition("start", "preChecked", EVENT_CHECK_PRECONDITIONS),
@@ -559,7 +567,9 @@
     public final void initialize() {
         ProcessInfoProvider processInfo = (ProcessInfoProvider) WebAppContextUtils
                 .getCurrentWebApplicationContext().getBean(ProcessInfoProvider.ROLE);
-        HttpServletRequest request = processInfo.getRequest();
+        //florent : deal with identity
+        //HttpServletRequest request = processInfo.getRequest();
+        this.request = processInfo.getRequest();
         Session session = this.repository.getSession(request);
         setSession(session);
         setParameter(PARAMETER_STATE_MACHINE, new StateMachine(MODEL));
@@ -706,7 +716,12 @@
      */
     protected void startTransaction() {
         if (this.commitEnabled && !this.getTransactionPolicy().equals(TRANSACTION_POLICY_READONLY)) {
-            setSession(this.repository.startSession(getSession().getIdentity(), true));
+            //florent : deal with identity 
+        		//setSession(this.repository.startSession(getSession().getIdentity(), true));
+        	//this under don't work as startSession was suppress from repository api
+        	//setSession(this.repository.startSession(Identity.getIdentity(this.request.getSession(false)), true));
+        	setSession(this.repository.getSession(this.request));
+        	
         }
     }
 
@@ -729,9 +744,16 @@
                 if (!objects[i].isLocked()) {
                     objects[i].lock();
                 }
-                if (!getTransactionPolicy().equals(TRANSACTION_POLICY_OPTIMISTIC)
+                //florent : remove the .getIdentity
+                /*if (!getTransactionPolicy().equals(TRANSACTION_POLICY_OPTIMISTIC)
                         && !objects[i].isCheckedOutBySession(getSession().getId(), getSession()
-                                .getIdentity().getUser().getId())) {
+                                .getIdentity().getUser().getId())) {*/
+                
+                if (!getTransactionPolicy().equals(TRANSACTION_POLICY_OPTIMISTIC)
+                    && !objects[i].isCheckedOutBySession(
+                    				getSession().getId(), 
+                    				Identity.getIdentity(this.request.getSession(false)).getUser().getId())
+                    				) {
                     objects[i].checkout(checkoutRestrictedToSession());
                 }
             }
@@ -742,11 +764,17 @@
 
     protected boolean canCheckOut(Node[] objects) throws RepositoryException {
         boolean canExecute = true;
-
+        
         for (int i = 0; i < objects.length; i++) {
-            if (objects[i].isCheckedOut()
+        	//florent : change for workaround session.getIdentity
+            /*if (objects[i].isCheckedOut()
                     && !objects[i].isCheckedOutBySession(getSession().getId(), getSession()
-                            .getIdentity().getUser().getId())) {
+                            .getIdentity().getUser().getId())) {*/
+        	if (objects[i].isCheckedOut()
+              && !objects[i].isCheckedOutBySession(
+              			getSession().getId(), 
+              			Identity.getIdentity(this.request.getSession(false)).getUser().getId())
+              			) {
                 if (getLogger().isDebugEnabled()) {
                     getLogger().debug(
                             "AbstractUsecase::lockInvolvedObjects() can not execute, object ["
diff --git a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/DocumentUsecase.java b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/DocumentUsecase.java
index 281ffd7..0fe4feb 100644
--- a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/DocumentUsecase.java
+++ b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/DocumentUsecase.java
@@ -74,7 +74,10 @@
     protected Document getSourceDocument() {
         Document doc = (Document) getParameter(DOCUMENT);
         Session session = getSession();
-        if (doc == null || doc.getSession() != session) {
+        //florent : remove a part of this test because document don't still handle his session...
+        //really not sure of consequences, have to understand and find a test
+        //if (doc == null || doc.getSession() != session) {
+        if (doc == null) {
             String sourceUrl = getParameterAsString(SOURCE_URL);
             if (session.getUriHandler().isDocument(sourceUrl)) {
                 doc = session.getUriHandler().getDocument(sourceUrl);
@@ -116,8 +119,11 @@
     public String getTargetURL(boolean success) {
         Document document = getTargetDocument(success);
         String documentUrl = document.getCanonicalDocumentURL();
-        String url = "/" + document.getPublication().getId() + "/" + document.getArea()
-                + documentUrl;
+        /*	florent : cause of changes in document api, remove when ok
+         * 	String url = "/" + document.getPublication().getId() + "/" + document.getArea()
+                + documentUrl;*/
+        String url = "/" + document.getPublicationId() + "/" + document.getArea()
+        + documentUrl;
         return url + getExitQueryString();
     }
 
diff --git a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/impl/UsecaseInvokerImpl.java b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/impl/UsecaseInvokerImpl.java
index 08e2297..29b1570 100644
--- a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/impl/UsecaseInvokerImpl.java
+++ b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/impl/UsecaseInvokerImpl.java
@@ -37,7 +37,8 @@
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.publication.Repository;
 import org.apache.lenya.cms.publication.Session;
-import org.apache.lenya.cms.publication.URLInformation;
+//flo : remove when ok import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.utils.URLInformation;
 import org.apache.lenya.cms.usecase.Usecase;
 import org.apache.lenya.cms.usecase.UsecaseException;
 import org.apache.lenya.cms.usecase.UsecaseInvoker;
@@ -72,7 +73,8 @@
                 .getBean(ProcessInfoProvider.ROLE);
         HttpServletRequest request = process.getRequest();
         Session session = this.repository.getSession(request);
-        URLInformation info = new URLInformation(webappUrl);
+        //florent : URLInformation info = new URLInformation(webappUrl);
+        URLInformation info = new URLInformation();
         Publication pub = session.getPublication(info.getPublicationId());
         Role[] roles = PolicyUtil.getRoles(request);
 
diff --git a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/scheduling/impl/UsecaseSchedulerImpl.java b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/scheduling/impl/UsecaseSchedulerImpl.java
index eb2fd80..a729328 100644
--- a/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/scheduling/impl/UsecaseSchedulerImpl.java
+++ b/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/scheduling/impl/UsecaseSchedulerImpl.java
@@ -37,7 +37,8 @@
 import org.apache.lenya.ac.Identity;
 import org.apache.lenya.ac.Machine;
 import org.apache.lenya.ac.User;
-import org.apache.lenya.cms.publication.URLInformation;
+//flo : remove when ok import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.utils.URLInformation;
 import org.apache.lenya.cms.usecase.Usecase;
 import org.apache.lenya.cms.usecase.scheduling.UsecaseScheduler;
 
@@ -163,7 +164,8 @@
     }
 
     protected String getPublicationName(Usecase usecase) {
-        URLInformation info = new URLInformation(usecase.getSourceURL());
+        //florent URLInformation info = new URLInformation(usecase.getSourceURL());
+    	URLInformation info = new URLInformation();
         return info.getPublicationId();
     }
 
diff --git a/org.apache.lenya.core.usecase/src/main/resources/COB-INF/sitemap.xmap b/org.apache.lenya.core.usecase/src/main/resources/COB-INF/sitemap.xmap
index 66e93d8..e345f34 100644
--- a/org.apache.lenya.core.usecase/src/main/resources/COB-INF/sitemap.xmap
+++ b/org.apache.lenya.core.usecase/src/main/resources/COB-INF/sitemap.xmap
@@ -50,46 +50,49 @@
         which is matched here.
       -->
       <map:match pattern="usecases-view/*">
-        
+
+              
+	
         <map:generate type="jx" src="{flow-attr:usecase/view/viewURI}"/>
         <map:serialize type="servletService">
           <map:parameter name="service" value="servlet:gui:/service/style-cms-page"/>
         </map:serialize>
-        
-        <map:transform type="browser-update"/>
-        <map:transform type="cinclude"/>
-        <map:transform type="forms" />
-        
-        <map:transform type="proxy-usecase"/>
-        <map:transform src="xslt/proxyUrl2text.xsl"/>
-        
-        <map:transform src="cocoon://lenya-screen.xsl"/>
-        <map:transform type="i18n">
-          <map:parameter name="locale" value="{request:locale}"/>
-        </map:transform>
-        <!-- Strip xhtml namespace from <head> and <body> element -->
-        <map:transform src="fallback://lenya/xslt/cforms/strip-xhtml-namespace.xsl"/>
-        <map:transform src="fallback://lenya/xslt/cforms/forms-samples-styling.xsl">
-          <map:parameter name="resources-uri" value="{page-envelope:context-prefix}/cforms"/>
-        </map:transform>
-        <map:transform src="fallback://lenya/xslt/cforms/add-xhtml-namespace.xsl"/>
-        <map:match pattern="usecases-view/menu/**">
-          <map:transform src="cocoon://lenya-page/{page-envelope:publication-id}/{page-envelope:area}/default.xml"/>
-        </map:match>
-        <map:select type="ajax-request">
-          <map:when test="true">
-            <map:serialize type="xml"/>
-          </map:when>
-        </map:select>
-        <map:select type="request-parameter">
-          <map:parameter name="parameter-name" value="asXML"/>
-          <map:when test="true">
-            <map:serialize type="xml"/>
-          </map:when>
-        </map:select>
-        
-        <map:transform type="proxy-xhtml"/>
-        <map:transform src="fallback://lenya/xslt/util/strip_namespaces.xsl"/>
+<!--        -->
+<!--        <map:transform type="browser-update"/>-->
+<!--        <map:transform type="cinclude"/>-->
+<!--        <map:transform type="forms" />-->
+<!--        -->
+<!--        <map:transform type="proxy-usecase"/>-->
+<!--        <map:transform src="xslt/proxyUrl2text.xsl"/>-->
+<!--        -->
+<!--        <map:transform src="cocoon://lenya-screen.xsl"/>-->
+<!--          //ancienne technique <map:parameter name="locale" value="{request:locale}"/>-->
+<!--        <map:transform type="i18n">-->
+<!--		    	<map:parameter name="locale" value="{jxpath:$cocoon/request/locale}"/>	-->
+<!--        </map:transform>-->
+<!--         Strip xhtml namespace from <head> and <body> element  -->
+<!--        <map:transform src="fallback://lenya/xslt/cforms/strip-xhtml-namespace.xsl"/>-->
+<!--        <map:transform src="fallback://lenya/xslt/cforms/forms-samples-styling.xsl">-->
+<!--          <map:parameter name="resources-uri" value="{page-envelope:context-prefix}/cforms"/>-->
+<!--        </map:transform>-->
+<!--        <map:transform src="fallback://lenya/xslt/cforms/add-xhtml-namespace.xsl"/>-->
+<!--        <map:match pattern="usecases-view/menu/**">-->
+<!--          <map:transform src="cocoon://lenya-page/{page-envelope:publication-id}/{page-envelope:area}/default.xml"/>-->
+<!--        </map:match>-->
+<!--        <map:select type="ajax-request">-->
+<!--          <map:when test="true">-->
+<!--            <map:serialize type="xml"/>-->
+<!--          </map:when>-->
+<!--        </map:select>-->
+<!--        <map:select type="request-parameter">-->
+<!--          <map:parameter name="parameter-name" value="asXML"/>-->
+<!--          <map:when test="true">-->
+<!--            <map:serialize type="xml"/>-->
+<!--          </map:when>-->
+<!--        </map:select>-->
+<!--        -->
+<!--        <map:transform type="proxy-xhtml"/>-->
+<!--        <map:transform src="fallback://lenya/xslt/util/strip_namespaces.xsl"/>-->
         <map:serialize type="xml"/>
         
       </map:match>
@@ -102,18 +105,30 @@
         <map:call continuation="{1}"/>
       </map:match>
       
-      <map:match type="usecase" pattern="*">
-        <map:call function="executeUsecase">
-          <map:parameter name="usecaseName" value="{request-param:lenya.usecase}"/>
-        </map:call>
-      </map:match>
-      
       <map:match pattern="service/usecase/*">
         <map:call function="executeUsecase">
           <map:parameter name="usecaseName" value="{1}"/>
         </map:call>
       </map:match>
       
+      <!-- ////// différence entre les deux appels !!!
+        voir pour faire directement l'appel sous forme servlet:usecase:/service/...
+       -->
+      <map:match type="usecase" pattern="*">
+        <!-- ancien appel -->
+         <map:call function="executeUsecase">
+          <map:parameter name="usecaseName" value="{request-param:lenya.usecase}"/>
+        </map:call> 
+        <!--  nouveau -->
+<!--        <map:generate src="cocoon:/service/usecase/{request-param:lenya.usecase}"/>-->
+<!--        <map:serialize type="xml"/>-->
+        <!-- test -->
+<!--        <map:generate src="sitemap.xmap"/>-->
+<!--        <map:serialize type="xml"/>-->
+      </map:match>
+      
+      
+      
     </map:pipeline>
     
     <map:handle-errors>
diff --git a/org.apache.lenya.core.usecase/src/main/resources/COB-INF/usecases.js b/org.apache.lenya.core.usecase/src/main/resources/COB-INF/usecases.js
index 9875a71..23b71a1 100644
--- a/org.apache.lenya.core.usecase/src/main/resources/COB-INF/usecases.js
+++ b/org.apache.lenya.core.usecase/src/main/resources/COB-INF/usecases.js
@@ -33,16 +33,49 @@
 function getUsecase(usecaseName) {
     var flowHelper;
     var request;
+    //var urlInformation;
     var sourceUrl;
     var usecaseResolver;
     var usecase;
+    	log("error", "==================================== test =============================================");
+    	
+    	log("error", "usecaseName = " + usecaseName);
+    	
         flowHelper = cocoon.getComponent("org.apache.lenya.cms.cocoon.flow.FlowHelper");
+        
+        log("error", "flowHelper = " + flowHelper);
+        
         request = flowHelper.getRequest(cocoon);
-        sourceUrl = Packages.org.apache.lenya.util.ServletHelper.getWebappURI(request);
+        
+        log("error", "request = " + request);
+        
+        //sourceUrl = Packages.org.apache.lenya.util.ServletHelper.getWebappURI(request);
+        sourceUrl = Packages.org.apache.lenya.utils.ServletHelper.getCurrentURI();
+        
+        //urlInformation = cocoon.getComponent("org.apache.lenya.utils.URLInformation");
+        //sourceURL = urlInformation.getWebappUrl();
+        
+        log("error", "sourceUrl = " + sourceUrl);
+        
         usecaseResolver = cocoon.getComponent("org.apache.lenya.cms.usecase.UsecaseResolver");
+        
+        log("error", "usecaseResolver = " + usecaseResolver);
+        
         usecase = usecaseResolver.resolve(sourceUrl, usecaseName);
-        usecase.setSourceURL(sourceUrl);
-        usecase.setName(usecaseName);
+        
+        /**
+         * TODO : remove this code : duplicate from usecaseResolver.resolve
+         */
+        /*usecase.setSourceURL(sourceUrl);
+        usecase.setName(usecaseName);*/
+        
+        log("error", "usecase = " + usecase);
+        
+        
+        
+        
+        
+        log("error", "==================================== FIN test =============================================");
     try {
     } catch (exception) {
         log("error", "Error in getUsecase(): " + exception);
@@ -228,7 +261,9 @@
     if (! viewUri.startsWith("/")) {
         // a local URI must be handled by usecase.xmap, which assumes a prefix "usecases-view/[menu|nomenu]/
         // that determines whether the menu is to be displayed. this mechanism is used by most lenya core usecases.
-        viewUri = "usecases-view/" + (view.showMenu() ? "menu" : "nomenu");
+        //viewUri = "usecases-view/" + (view.showMenu() ? "menu" : "nomenu");
+    	viewUri = "lenya/modules/usecase/usecases-view/" + (view.showMenu() ? "menu" : "nomenu");
+    	
     }
     if (view.createContinuation()) {
         log("debug", "Creating view and continuation, calling Cocoon with viewUri = [" + viewUri + "]");
@@ -342,18 +377,42 @@
     
     var preconditionsOK;
 
+    log("error", "==================================== IN EXecute usecase =============================================");
+
+    
         usecaseName = cocoon.parameters["usecaseName"];
+        
+        log("error", "usecasename = " + usecaseName);
+        
         usecase = getUsecase(usecaseName);
+        
+        log("error", "get usecase ok");
+        
         passRequestParameters(usecase);
+        
+        log("error", "requestParamaters ok");
+        
         usecase.checkPreconditions();
+        
+        log("error", "checkPreconditions");
+        
         preconditionsOK = !usecase.hasErrors();
+        
+        log("error", "No Errors ? " + preconditionsOK);
+        
         if (preconditionsOK && !usecase.getTransactionPolicy().equals(Usecase.TRANSACTION_POLICY_OPTIMISTIC)) {
             usecase.lockInvolvedObjects();
         }
+        
+        log("error", "get the view");
+        
         view = usecase.getView();
         if (view) {
             usecase.setupView();
         }
+        
+        log("error", "view is OK");
+        
         log("debug", "Successfully prepared usecase.", usecaseName);
     try {
     } catch (exception) {
@@ -367,6 +426,9 @@
     // If the usecase has a view uri, this means we want to display something 
     // to the user before proceeding. This also means the usecase can consist
     // of several steps; repeated until the user chooses to submit or cancel.
+	log("error", "new test %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
+	log("error", "valeur de view" + view.getViewURI());
+	log("error", "new test %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
     if (view != null && view.getViewURI()) {
         var continuation = null;
         do {
@@ -426,6 +488,9 @@
     //getTargetURL takes a boolean that is true on success:
     targetUrl = usecase.getTargetURL(state == "success");
     log("debug", "Completed, redirecting to url = [" + targetUrl + "]", usecaseName);
+    
+    log("error", "==================================== FIN execute usecase =============================================");
+    
     // jump to the appropriate URL:
     redirect(targetUrl);
 }
diff --git a/org.apache.lenya.core.usecase/src/test/java/org/apache/lenya/cms/usecase/AbstractUsecaseTest.java b/org.apache.lenya.core.usecase/src/test/java/org/apache/lenya/cms/usecase/AbstractUsecaseTest.java
index b143a5a..2dce2c0 100644
--- a/org.apache.lenya.core.usecase/src/test/java/org/apache/lenya/cms/usecase/AbstractUsecaseTest.java
+++ b/org.apache.lenya.core.usecase/src/test/java/org/apache/lenya/cms/usecase/AbstractUsecaseTest.java
@@ -17,7 +17,7 @@
  */
 package org.apache.lenya.cms.usecase;
 
-import java.util.HashMap;
+/*import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -26,74 +26,78 @@
 import org.apache.lenya.cms.publication.Session;
 import org.apache.lenya.cms.usecase.impl.TestUsecaseInvoker;
 import org.junit.Test;
+*/
 
 /**
  * Usecase test base class.
  */
-public abstract class AbstractUsecaseTest extends AbstractAccessControlTest {
+//florent : TODO : re-enable it when solve AbstractAccessControlTest
 
-    /**
-     * The test.
-     * @throws Exception
-     */
-	@Test
-    public void testUsecase() throws Exception {
-
-        Session session = getSession();
-        prepareUsecase();
-
-        UsecaseInvoker invoker = null;
-        try {
-            invoker = (UsecaseInvoker) getManager().lookup(TestUsecaseInvoker.ROLE);
-            invoker.setTestSession(session);
-            invoker.invoke(getRequest().getPathInfo(), getUsecaseName(), getParameters());
-            
-            this.targetUrl = invoker.getTargetUrl();
-
-            List errorMessages = invoker.getErrorMessages();
-            for (Iterator i = errorMessages.iterator(); i.hasNext();) {
-                UsecaseMessage message = (UsecaseMessage) i.next();
-                String m = message.getMessage();
-                String[] params = message.getParameters();
-                if (params != null) {
-                    for (int j = 0; j < params.length; j++) {
-                        m += " [" + params[j] + "]";
-                    }
-                }
-                getLogger().error("Usecase error: " + m);
-            }
-
-            assertEquals(invoker.getResult(), UsecaseInvoker.SUCCESS);
-            assertEquals(invoker.getErrorMessages().size(), 0);
-        } finally {
-            if (invoker != null) {
-                getManager().release(invoker);
-            }
-        }
-
-        checkPostconditions();
-
-    }
-    	
-    private String targetUrl;
-    
-    protected String getTargetUrl() {
-        if (this.targetUrl == null) {
-            throw new IllegalStateException("The usecase has not yet been executed.");
-        }
-        return this.targetUrl;
-    }
-
-    protected void prepareUsecase() throws Exception {
-    }
-
-    protected Map getParameters() {
-        return new HashMap();
-    }
-
-    protected abstract String getUsecaseName();
-
-    protected void checkPostconditions() throws Exception {
-    }
-
-}
+//public abstract class AbstractUsecaseTest extends AbstractAccessControlTest {
+//
+//    /**
+//     * The test.
+//     * @throws Exception
+//     */
+//	@Test
+//    public void testUsecase() throws Exception {
+//
+//        Session session = getSession();
+//        prepareUsecase();
+//
+//        UsecaseInvoker invoker = null;
+//        try {
+//            invoker = (UsecaseInvoker) getManager().lookup(TestUsecaseInvoker.ROLE);
+//            invoker.setTestSession(session);
+//            invoker.invoke(getRequest().getPathInfo(), getUsecaseName(), getParameters());
+//            
+//            this.targetUrl = invoker.getTargetUrl();
+//
+//            List errorMessages = invoker.getErrorMessages();
+//            for (Iterator i = errorMessages.iterator(); i.hasNext();) {
+//                UsecaseMessage message = (UsecaseMessage) i.next();
+//                String m = message.getMessage();
+//                String[] params = message.getParameters();
+//                if (params != null) {
+//                    for (int j = 0; j < params.length; j++) {
+//                        m += " [" + params[j] + "]";
+//                    }
+//                }
+//                getLogger().error("Usecase error: " + m);
+//            }
+//
+//            assertEquals(invoker.getResult(), UsecaseInvoker.SUCCESS);
+//            assertEquals(invoker.getErrorMessages().size(), 0);
+//        } finally {
+//            if (invoker != null) {
+//                getManager().release(invoker);
+//            }
+//        }
+//
+//        checkPostconditions();
+//
+//    }
+//    	
+//    private String targetUrl;
+//    
+//    protected String getTargetUrl() {
+//        if (this.targetUrl == null) {
+//            throw new IllegalStateException("The usecase has not yet been executed.");
+//        }
+//        return this.targetUrl;
+//    }
+//
+//    protected void prepareUsecase() throws Exception {
+//    }
+//
+//    protected Map getParameters() {
+//        return new HashMap();
+//    }
+//
+//    protected abstract String getUsecaseName();
+//
+//    protected void checkPostconditions() throws Exception {
+//    }
+//
+//}
+//
\ No newline at end of file
diff --git a/org.apache.lenya.core.utils/src/main/java/org/apache/lenya/utils/ServletHelper.java b/org.apache.lenya.core.utils/src/main/java/org/apache/lenya/utils/ServletHelper.java
index e3bd388..1bac628 100644
--- a/org.apache.lenya.core.utils/src/main/java/org/apache/lenya/utils/ServletHelper.java
+++ b/org.apache.lenya.core.utils/src/main/java/org/apache/lenya/utils/ServletHelper.java
@@ -47,7 +47,6 @@
 /**
  * Servlet utility class
  * 
- * TODO : remove the lenya-core-api/o.a.l.util.ServletHelper
  */
 public final class ServletHelper {
 
diff --git a/org.apache.lenya.core.utils/src/test/java/org/apache/lenya/utils/test/README b/org.apache.lenya.core.utils/src/main/java/org/apache/lenya/utils/test/README
similarity index 100%
rename from org.apache.lenya.core.utils/src/test/java/org/apache/lenya/utils/test/README
rename to org.apache.lenya.core.utils/src/main/java/org/apache/lenya/utils/test/README
diff --git a/org.apache.lenya.core.utils/src/test/java/org/apache/lenya/utils/test/SpringEnv.java b/org.apache.lenya.core.utils/src/main/java/org/apache/lenya/utils/test/SpringEnv.java
similarity index 100%
rename from org.apache.lenya.core.utils/src/test/java/org/apache/lenya/utils/test/SpringEnv.java
rename to org.apache.lenya.core.utils/src/main/java/org/apache/lenya/utils/test/SpringEnv.java
diff --git a/org.apache.lenya.core.workflow/pom.xml b/org.apache.lenya.core.workflow/pom.xml
index fc77174..5551545 100644
--- a/org.apache.lenya.core.workflow/pom.xml
+++ b/org.apache.lenya.core.workflow/pom.xml
@@ -50,9 +50,12 @@
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-repository</artifactId>
+      <artifactId>lenya-core-repository-api</artifactId>
     </dependency>
-
+  <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-publication-impl</artifactId>
+    </dependency>
     <!-- Tests -->
     <dependency>
       <groupId>junit</groupId>
@@ -105,11 +108,11 @@
       <artifactId>lenya-module-sitetree</artifactId>
       <scope>runtime</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-module-sourcerepository</artifactId>
-      <scope>runtime</scope>
-    </dependency>
+<!--    <dependency>-->
+<!--      <groupId>org.apache.lenya</groupId>-->
+<!--      <artifactId>lenya-module-sourcerepository</artifactId>-->
+<!--      <scope>runtime</scope>-->
+<!--    </dependency>-->
     
   </dependencies>
 </project>
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/flow/FlowHelper.java b/org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/cocoon/flow/FlowHelper.java
similarity index 99%
rename from org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/flow/FlowHelper.java
rename to org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/cocoon/flow/FlowHelper.java
index ffb55fc..995eecd 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/flow/FlowHelper.java
+++ b/org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/cocoon/flow/FlowHelper.java
@@ -30,7 +30,6 @@
 
 /**
  * Flowscript utility class.
- * @version $Id$
  */
 public interface FlowHelper {
 
diff --git a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/flow/FlowHelperImpl.java b/org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/cocoon/flow/FlowHelperImpl.java
similarity index 98%
rename from org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/flow/FlowHelperImpl.java
rename to org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/cocoon/flow/FlowHelperImpl.java
index 3cea2a9..756403f 100644
--- a/org.apache.lenya.core.cocoon/src/main/java/org/apache/lenya/cms/cocoon/flow/FlowHelperImpl.java
+++ b/org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/cocoon/flow/FlowHelperImpl.java
@@ -36,10 +36,10 @@
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.publication.Repository;
 import org.apache.lenya.cms.publication.Session;
-import org.apache.lenya.cms.publication.URLInformation;
 import org.apache.lenya.cms.publication.util.DocumentHelper;
 import org.apache.lenya.cms.workflow.WorkflowUtil;
-import org.apache.lenya.util.ServletHelper;
+import org.apache.lenya.utils.URLInformation;
+import org.apache.lenya.utils.ServletHelper;
 import org.apache.lenya.workflow.WorkflowException;
 
 /**
diff --git a/org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/workflow/usecases/Deactivate.java b/org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/workflow/usecases/Deactivate.java
index 3cda976..859b89e 100644
--- a/org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/workflow/usecases/Deactivate.java
+++ b/org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/workflow/usecases/Deactivate.java
@@ -72,7 +72,9 @@
                 addErrorMessage("This usecase can only be invoked when the live version exists.");
             } else {
                 checkChildren();
-                setParameter(LINKS_TO_DOCUMENT, new LinkList(doc));
+                //TODO : Florent : seems not to be used, and create cyclic, remove this code when compile ok
+                //if remove ok, suppress LINKS_TO_DOCUMENT declaration, just use here seems
+                //setParameter(LINKS_TO_DOCUMENT, new LinkList(doc));
             }
         }
     }
@@ -155,47 +157,48 @@
     /**
      * A list of links pointing to a document. Allows lazy loading from the usecase view.
      */
-    public class LinkList {
-        
-        private Document document;
-        private Document[] documents;
-        
-        /**
-         * @param doc The document to resolve the links from.
-         */
-        public LinkList(Document doc) {
-            this.document = doc;
-        }
-        
-        /**
-         * @return The link documents.
-         */
-        public Document[] getDocuments() {
-            if (this.documents == null) {
-                this.documents = getLinksToDocument();
-            }
-            return this.documents;
-        }
-        
-        protected Document[] getLinksToDocument() {
-            Set docs = new HashSet();
-            LinkManager linkMgr = Deactivate.this.getLinkManager();
-            try {
-                Document liveVersion = this.document.getAreaVersion(Publication.LIVE_AREA);
-                Document[] referencingDocs = linkMgr.getReferencingDocuments(liveVersion);
-                for (int d = 0; d < referencingDocs.length; d++) {
-                    Document doc = referencingDocs[d];
-                    if (doc.getArea().equals(Publication.LIVE_AREA)) {
-                        docs.add(doc);
-                    }
-                }
-            } catch (Exception e) {
-                throw new RuntimeException(e);
-            }
-            return (Document[]) docs.toArray(new Document[docs.size()]);
-        }
-
-    }
+    //TODO : Florent : seems not to be used, and create cyclic, remove this code when compile ok
+//    public class LinkList {
+//        
+//        private Document document;
+//        private Document[] documents;
+//        
+//        /**
+//         * @param doc The document to resolve the links from.
+//         */
+//        public LinkList(Document doc) {
+//            this.document = doc;
+//        }
+//        
+//        /**
+//         * @return The link documents.
+//         */
+//        public Document[] getDocuments() {
+//            if (this.documents == null) {
+//                this.documents = getLinksToDocument();
+//            }
+//            return this.documents;
+//        }
+//        
+//        protected Document[] getLinksToDocument() {
+//            Set docs = new HashSet();
+//            LinkManager linkMgr = Deactivate.this.getLinkManager();
+//            try {
+//                Document liveVersion = this.document.getAreaVersion(Publication.LIVE_AREA);
+//                Document[] referencingDocs = linkMgr.getReferencingDocuments(liveVersion);
+//                for (int d = 0; d < referencingDocs.length; d++) {
+//                    Document doc = referencingDocs[d];
+//                    if (doc.getArea().equals(Publication.LIVE_AREA)) {
+//                        docs.add(doc);
+//                    }
+//                }
+//            } catch (Exception e) {
+//                throw new RuntimeException(e);
+//            }
+//            return (Document[]) docs.toArray(new Document[docs.size()]);
+//        }
+//
+//    }
 
     protected DocumentManager getDocumentManager() {
         return documentManager;
diff --git a/org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/workflow/usecases/MultiWorkflow.java b/org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/workflow/usecases/MultiWorkflow.java
index 615839d..5ac820d 100644
--- a/org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/workflow/usecases/MultiWorkflow.java
+++ b/org.apache.lenya.core.workflow/src/main/java/org/apache/lenya/cms/workflow/usecases/MultiWorkflow.java
@@ -34,7 +34,8 @@
 import org.apache.lenya.cms.publication.DocumentException;
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.publication.PublicationException;
-import org.apache.lenya.cms.publication.URLInformation;
+//florent import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.cms.utils.URLInformation;
 import org.apache.lenya.cms.site.SiteException;
 import org.apache.lenya.cms.site.SiteNode;
 import org.apache.lenya.cms.site.SiteStructure;
diff --git a/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/Revision.java b/org.apache.lenya.deprecated/src/main/java/org/apache/lenya/cms/publication/Revision.java
similarity index 80%
rename from org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/Revision.java
rename to org.apache.lenya.deprecated/src/main/java/org/apache/lenya/cms/publication/Revision.java
index 843d26e..486c925 100644
--- a/org.apache.lenya.core.publication.api/src/main/java/org/apache/lenya/cms/publication/Revision.java
+++ b/org.apache.lenya.deprecated/src/main/java/org/apache/lenya/cms/publication/Revision.java
@@ -1,5 +1,8 @@
 package org.apache.lenya.cms.publication;
 
+/*
+ * @deprecated : this is a duplicate class of lenya-repository-api revision.
+ */
 public interface Revision {
 
     /**
diff --git a/org.apache.lenya.deprecated/src/main/java/org/apache/lenya/cms/repository/metadata/ElementSet.java b/org.apache.lenya.deprecated/src/main/java/org/apache/lenya/cms/repository/metadata/ElementSet.java
index 5d409b1..0e13ccb 100644
--- a/org.apache.lenya.deprecated/src/main/java/org/apache/lenya/cms/repository/metadata/ElementSet.java
+++ b/org.apache.lenya.deprecated/src/main/java/org/apache/lenya/cms/repository/metadata/ElementSet.java
@@ -20,7 +20,7 @@
 /**
  * Definition of a set of meta data elements.
  * 
- * @deprecated duplicate of o.a.l.cms.metadata
+ * @deprecated duplicate of o.a.l.cms.metadata in module lenya-core-metadata-api
  */
 public interface ElementSet {
     
diff --git a/org.apache.lenya.module.editors/src/main/java/org/apache/lenya/cms/editors/forms/OneFormEditor.java b/org.apache.lenya.module.editors/src/main/java/org/apache/lenya/cms/editors/forms/OneFormEditor.java
index 6c8c997..4832714 100644
--- a/org.apache.lenya.module.editors/src/main/java/org/apache/lenya/cms/editors/forms/OneFormEditor.java
+++ b/org.apache.lenya.module.editors/src/main/java/org/apache/lenya/cms/editors/forms/OneFormEditor.java
@@ -192,7 +192,9 @@
         try {
             SourceUtil.writeDOM(content, document.getOutputStream());
             LinkConverter converter = new LinkConverter(getLogger());
-            converter.convertUrlsToUuids(document, false);
+          //florent : cause changes in linkconverter
+            //converter.convertUrlsToUuids(getSourceDocument(), false);
+            converter.convertUrlsToUuids(getPublication(),getSourceDocument(), false);
         } catch (Exception e) {
             addErrorMessage(e.getMessage());
         }
diff --git a/org.apache.lenya.module.fckeditor/src/main/java/org/apache/lenya/cms/editors/fckeditor/Fckeditor.java b/org.apache.lenya.module.fckeditor/src/main/java/org/apache/lenya/cms/editors/fckeditor/Fckeditor.java
index 4a38b0a..580f663 100644
--- a/org.apache.lenya.module.fckeditor/src/main/java/org/apache/lenya/cms/editors/fckeditor/Fckeditor.java
+++ b/org.apache.lenya.module.fckeditor/src/main/java/org/apache/lenya/cms/editors/fckeditor/Fckeditor.java
@@ -230,7 +230,9 @@
             }
             // Convert URLs back to UUIDs. convert() does a save
             LinkConverter converter = new LinkConverter(getLogger());
-            converter.convertUrlsToUuids(getSourceDocument(), false);
+            //florent : cause changes in linkconverter
+            //converter.convertUrlsToUuids(getSourceDocument(), false);
+            converter.convertUrlsToUuids(getPublication(),getSourceDocument(), false);
 
             xmlDoc = DocumentHelper.readDocument(getSourceDocument().getInputStream());
 
diff --git a/org.apache.lenya.module.lenyadoc/pom.xml b/org.apache.lenya.module.lenyadoc/pom.xml
index 0feb54d..e9e6854 100644
--- a/org.apache.lenya.module.lenyadoc/pom.xml
+++ b/org.apache.lenya.module.lenyadoc/pom.xml
@@ -33,7 +33,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-repository</artifactId>
+      <artifactId>lenya-core-repository-api</artifactId>
     </dependency>
   </dependencies>
 </project>
diff --git a/org.apache.lenya.module.lucene/pom.xml b/org.apache.lenya.module.lucene/pom.xml
index 3b8af4d..3d42404 100644
--- a/org.apache.lenya.module.lucene/pom.xml
+++ b/org.apache.lenya.module.lucene/pom.xml
@@ -46,7 +46,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-repository</artifactId>
+      <artifactId>lenya-core-repository-api</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
diff --git a/org.apache.lenya.module.notification/pom.xml b/org.apache.lenya.module.notification/pom.xml
index 3bf9d43..d606f51 100644
--- a/org.apache.lenya.module.notification/pom.xml
+++ b/org.apache.lenya.module.notification/pom.xml
@@ -31,7 +31,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-repository</artifactId>
+      <artifactId>lenya-core-repository-api</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
diff --git a/org.apache.lenya.module.simplesite/pom.xml b/org.apache.lenya.module.simplesite/pom.xml
index e2a4c41..3b1477b 100644
--- a/org.apache.lenya.module.simplesite/pom.xml
+++ b/org.apache.lenya.module.simplesite/pom.xml
@@ -27,7 +27,7 @@
     <!-- TODO: remove after refactoring -->
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-repository</artifactId>
+      <artifactId>lenya-core-repository-api</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
diff --git a/org.apache.lenya.module.sitetree/pom.xml b/org.apache.lenya.module.sitetree/pom.xml
index cda4bee..03ed873 100644
--- a/org.apache.lenya.module.sitetree/pom.xml
+++ b/org.apache.lenya.module.sitetree/pom.xml
@@ -28,25 +28,22 @@
       <artifactId>cocoon-xml-impl</artifactId>
       <scope>runtime</scope>
     </dependency>
+
+<!--    <dependency>-->
+<!--      <groupId>org.apache.lenya</groupId>-->
+<!--      <artifactId>lenya-core-linking</artifactId>-->
+<!--    </dependency>-->
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-api</artifactId>
+      <artifactId>lenya-core-repository-api</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-impl</artifactId>
+      <artifactId>lenya-core-sitemanagement</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-linking</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-repository</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-usecase</artifactId>
-    </dependency>
+<!--    <dependency>-->
+<!--      <groupId>org.apache.lenya</groupId>-->
+<!--      <artifactId>lenya-core-usecase</artifactId>-->
+<!--    </dependency>-->
   </dependencies>
 </project>
diff --git a/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/site/tree2/DelegatingSiteTree.java b/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/site/tree2/DelegatingSiteTree.java
index 2e0fd98..8cb2435 100644
--- a/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/site/tree2/DelegatingSiteTree.java
+++ b/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/site/tree2/DelegatingSiteTree.java
@@ -35,13 +35,12 @@
 import org.apache.lenya.cms.site.Link;
 import org.apache.lenya.cms.site.SiteException;
 import org.apache.lenya.cms.site.SiteNode;
-import org.apache.lenya.cms.site.SiteStructure;
 import org.apache.lenya.cms.site.tree.SiteTree;
 
 /**
  * Site tree implementation which delegates all operations to a shared site tree.
  */
-public class DelegatingSiteTree implements SiteStructure, SiteTree, RepositoryItem {
+public class DelegatingSiteTree implements SiteTree, RepositoryItem {
 
     private Area area;
     private Map links = new HashMap();
diff --git a/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/site/tree2/SiteTreeImpl.java b/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/site/tree2/SiteTreeImpl.java
index 2c305cd..f420c59 100644
--- a/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/site/tree2/SiteTreeImpl.java
+++ b/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/site/tree2/SiteTreeImpl.java
@@ -42,7 +42,7 @@
 /**
  * Simple site tree implementation.
  */
-public class SiteTreeImpl implements SiteStructure, SiteTree, Persistable, RepositoryItem {
+public class SiteTreeImpl implements SiteTree, Persistable, RepositoryItem {
 
     private Area area;
     private RootNode root;
diff --git a/org.apache.lenya.module.sourcerepository/pom.xml b/org.apache.lenya.module.sourcerepository/pom.xml
index afa3240..cc640bf 100644
--- a/org.apache.lenya.module.sourcerepository/pom.xml
+++ b/org.apache.lenya.module.sourcerepository/pom.xml
@@ -21,12 +21,36 @@
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-repository</artifactId>
+      <artifactId>lenya-core-repository-api</artifactId>
+    </dependency>
+       <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-repository-impl</artifactId>
     </dependency>
     <!-- FIXME: only necessary because of XML handling helper classes -->
     <dependency>
       <groupId>org.apache.lenya</groupId>
       <artifactId>lenya-core-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-impl</artifactId>
+    </dependency>
+        <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-utils</artifactId>
+    </dependency>
+         <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-publication-api</artifactId>
+    </dependency>
+    <!--   <dependency> -->
+    <!--   <groupId>org.apache.lenya</groupId> -->
+    <!--   <artifactId>lenya-core-metadata-api</artifactId> -->
+    <!-- </dependency> -->
+    <!--     <dependency> -->
+    <!--   <groupId>org.apache.lenya</groupId> -->
+    <!--   <artifactId>lenya-core-metadata-impl</artifactId> -->
+    <!-- </dependency> -->
   </dependencies>
 </project>
diff --git a/org.apache.lenya.module.svg/pom.xml b/org.apache.lenya.module.svg/pom.xml
index 7a84930..acd091d 100644
--- a/org.apache.lenya.module.svg/pom.xml
+++ b/org.apache.lenya.module.svg/pom.xml
@@ -30,7 +30,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-metadata</artifactId>
+      <artifactId>lenya-core-metadata-api</artifactId>
     </dependency>
     
   </dependencies>
diff --git a/org.apache.lenya.module.tinymce/src/main/java/org/apache/lenya/cms/editors/tinymce/TinyMce.java b/org.apache.lenya.module.tinymce/src/main/java/org/apache/lenya/cms/editors/tinymce/TinyMce.java
index 4449961..e2e5acf 100644
--- a/org.apache.lenya.module.tinymce/src/main/java/org/apache/lenya/cms/editors/tinymce/TinyMce.java
+++ b/org.apache.lenya.module.tinymce/src/main/java/org/apache/lenya/cms/editors/tinymce/TinyMce.java
@@ -169,7 +169,9 @@
         org.apache.lenya.cms.publication.Document doc = getSourceDocument();
         saveXMLFile(encoding, content, doc);
         LinkConverter converter = new LinkConverter(getLogger());
-        converter.convertUrlsToUuids(doc, false);
+      //florent : cause changes in linkconverter
+        //converter.convertUrlsToUuids(doc, false);
+        converter.convertUrlsToUuids(getPublication(),doc, false);
 
         WorkflowUtil.invoke(doc, getEvent());
     }
diff --git a/org.apache.lenya.optional.jcrsource/pom.xml b/org.apache.lenya.optional.jcrsource/pom.xml
index 4af534f..7ea6757 100644
--- a/org.apache.lenya.optional.jcrsource/pom.xml
+++ b/org.apache.lenya.optional.jcrsource/pom.xml
@@ -49,11 +49,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-metadata</artifactId>
+      <artifactId>lenya-core-metadata-api</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-repository</artifactId>
+      <artifactId>lenya-core-repository-api</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
diff --git a/org.apache.lenya.parent/pom.xml b/org.apache.lenya.parent/pom.xml
index 63735da..71c005d 100644
--- a/org.apache.lenya.parent/pom.xml
+++ b/org.apache.lenya.parent/pom.xml
@@ -250,6 +250,10 @@
           <version>2.1-alpha-2</version>
           -->
         </plugin>
+        <plugin>
+          <artifactId>maven-eclipse-plugin</artifactId>
+          <version>2.5</version>
+        </plugin>
         <!--
         <plugin>
           <artifactId>maven-checkstyle-plugin</artifactId>
@@ -553,6 +557,16 @@
         <artifactId>cocoon-sitemap-components</artifactId>
         <version>1.1.0-SNAPSHOT</version>
     </dependency>
+    <dependency>
+        <groupId>org.apache.cocoon</groupId>
+        <artifactId>cocoon-util</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+        <groupId>org.apache.cocoon</groupId>
+        <artifactId>cocoon-pipeline-api</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </dependency>
       <!-- Lenya -->
       
       <!-- Core -->
@@ -593,7 +607,27 @@
       </dependency>
       <dependency>
         <groupId>org.apache.lenya</groupId>
-        <artifactId>lenya-core-impl-tests</artifactId>
+        <artifactId>lenya-core-cocoon</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.lenya</groupId>
+        <artifactId>lenya-core-publication-api</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.lenya</groupId>
+        <artifactId>lenya-core-publication-impl</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.lenya</groupId>
+        <artifactId>lenya-core-document-api</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.lenya</groupId>
+        <artifactId>lenya-core-document-impl</artifactId>
         <version>${project.version}</version>
       </dependency>
       <dependency>
@@ -608,7 +642,12 @@
       </dependency>
       <dependency>
         <groupId>org.apache.lenya</groupId>
-        <artifactId>lenya-core-metadata</artifactId>
+        <artifactId>lenya-core-metadata-api</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.lenya</groupId>
+        <artifactId>lenya-core-metadata-impl</artifactId>
         <version>${project.version}</version>
       </dependency>
       <dependency>
@@ -623,7 +662,22 @@
       </dependency>
       <dependency>
         <groupId>org.apache.lenya</groupId>
-        <artifactId>lenya-core-repository</artifactId>
+        <artifactId>lenya-core-repository-api</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.lenya</groupId>
+        <artifactId>lenya-core-repository-impl</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.lenya</groupId>
+        <artifactId>lenya-core-transaction-api</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.lenya</groupId>
+        <artifactId>lenya-core-transaction-impl</artifactId>
         <version>${project.version}</version>
       </dependency>
       <dependency>
@@ -661,6 +715,16 @@
         <artifactId>lenya-core-utils</artifactId>
         <version>${project.version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.lenya</groupId>
+        <artifactId>lenya-core-proxy</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.lenya</groupId>
+        <artifactId>lenya-core-identity</artifactId>
+        <version>${project.version}</version>
+      </dependency>
       <!-- Tests -->
       <dependency>
         <groupId>org.apache.lenya</groupId>
diff --git a/org.apache.lenya.webapp/pom.xml b/org.apache.lenya.webapp/pom.xml
index 7ed2c0f..ee6a4b7 100644
--- a/org.apache.lenya.webapp/pom.xml
+++ b/org.apache.lenya.webapp/pom.xml
@@ -150,7 +150,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
-      <artifactId>lenya-core-metadata</artifactId>
+      <artifactId>lenya-core-metadata-api</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.lenya</groupId>
diff --git a/org.apache.lenya.webapp/rcl.properties b/org.apache.lenya.webapp/rcl.properties
index 037b341..b5d6552 100644
--- a/org.apache.lenya.webapp/rcl.properties
+++ b/org.apache.lenya.webapp/rcl.properties
@@ -18,6 +18,7 @@
 org.apache.lenya.core.gui.block%classes-dir=../org.apache.lenya.core.gui/target/classes
 org.apache.lenya.core.usecase.block%classes-dir=../org.apache.lenya.core.usecase/target/classes
 org.apache.lenya.core.i18n.block%classes-dir=../org.apache.lenya.core.i18n/target/classes
+org.apache.lenya.core.sitemanagement.block%classes-dir=../org.apache.lenya.core.sitemanagement/target/classes
 org.apache.lenya.module.prettyprinting.block%classes-dir=../org.apache.lenya.module.prettyprinting/target/classes
 org.apache.lenya.module.svg.block%classes-dir=../org.apache.lenya.module.svg/target/classes
 org.apache.lenya.module.export.block%classes-dir=../org.apache.lenya.module.export/target/classes
diff --git a/pom.xml b/pom.xml
index 85138ec..00f4429 100644
--- a/pom.xml
+++ b/pom.xml
@@ -51,21 +51,31 @@
     <module>org.apache.lenya.core.gui</module>
     <module>org.apache.lenya.core.i18n</module>
     <module>org.apache.lenya.core.impl</module>
-    <module>org.apache.lenya.core.impl.tests</module>
-    <module>org.apache.lenya.core.janitor</module>
+    <!-- <module>org.apache.lenya.core.janitor</module> -->
     <module>org.apache.lenya.core.ldap</module>
     <module>org.apache.lenya.core.linking</module>
-    <module>org.apache.lenya.core.metadata</module>
+    <module>org.apache.lenya.core.metadata.api</module>
+    <module>org.apache.lenya.core.metadata.impl</module>
     <module>org.apache.lenya.core.monitoring</module>
     <module>org.apache.lenya.core.observation</module>
     <module>org.apache.lenya.core.properties</module>
-    <module>org.apache.lenya.core.repository</module>
+    <module>org.apache.lenya.core.repository.api</module>
+    <module>org.apache.lenya.core.repository.impl</module>
     <module>org.apache.lenya.core.resourcetype</module>
     <module>org.apache.lenya.core.sitemanagement</module>
     <module>org.apache.lenya.core.templating</module>
     <module>org.apache.lenya.core.usecase</module>
     <module>org.apache.lenya.core.workflow</module>
     <module>org.apache.lenya.core.utils</module>
+    <module>org.apache.lenya.core.cocoon</module>
+    <module>org.apache.lenya.core.publication.api</module>
+    <module>org.apache.lenya.core.publication.impl</module>
+    <module>org.apache.lenya.core.document.api</module>
+    <module>org.apache.lenya.core.document.impl</module>
+    <module>org.apache.lenya.core.transaction.api</module>
+    <module>org.apache.lenya.core.transaction.impl</module>
+    <module>org.apache.lenya.core.identity</module>
+    <module>org.apache.lenya.core.proxy</module>
     <module>org.apache.lenya.module.blog</module>
     <module>org.apache.lenya.module.bxe</module>
     <module>org.apache.lenya.module.cforms</module>
@@ -103,6 +113,7 @@
     <module>org.apache.lenya.optional.jcrsource</module>
     <module>org.apache.lenya.webapp</module>
     <module>org.apache.lenya.webapp.welcome</module>
+    <module>org.apache.lenya.deprecated</module>
   </modules>
 
   <scm>