Index: main/plugin-core/i18n/messages_en.xml
===================================================================
--- main/plugin-core/i18n/messages_en.xml	(revision 31811)
+++ main/plugin-core/i18n/messages_en.xml	(working copy)
@@ -163,12 +174,39 @@
 	<message key="PLUGINS_CORE_ADMINISTRATOR_STATUS_MONITORING_DISKIO_DESCRIPTION">This graph displays the disk I/O operations over time (reads and writes).</message>
 
 	<!-- ADMINISTRATOR PLUGINS -->
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_LABEL">Plugins by file</message> 
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_DESC">Open a tool showing the plugins by file in form of a tree. Allows to activate/deactivate plugins.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_SERVER_ERROR">An error has occurred while retrieving the tree's properties.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_ROOT_TEXT">Plugins</message>
+
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYEXTENSIONPOINT_LABEL">Plugins by extension point</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYEXTENSIONPOINT_DESC">Open a tool showing the plugins by extension point in form of a tree. Allows to activate/deactivate plugins.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYEXTENSIONPOINT_SERVER_ERROR">An error has occurred while retrieving the tree's properties.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYEXTENSIONPOINT_ROOT_TEXT">Plugins</message>
+	
+	<message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_WORKSPACES_LABEL">Workspaces</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_WORKSPACES_DESC">Open a tool allowing to see the worksapces in form of a tree.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_WORKSPACES_SERVER_ERROR">An error has occurred while retrieving the tree's properties.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_WORKSPACES_ROOT_TEXT">Workspaces</message>
+    
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DOCUMENTATION_LABEL">Documentation</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DOCUMENTATION_DESC">See the documentation corresponding to the selected node.</message>
+    
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_ACTIVATE_LABEL">Activate</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_ACTIVATE_DESC">Activates the selected feature.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DEACTIVATE_LABEL">Deactivate</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DEACTIVATE_DESC">Deactivate the selected feature.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_SELECT_LABEL">Select</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_SELECT_DESC">Selects the extension point.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_LABEL">Changes</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_DESC">Applies the changes made.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_ERROR">An error has occurred while applying the modifications.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_PENDING">The tree will not be up to date until the modifications are applied.</message>
+	
 	<message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_LABEL">Plugins</message>
 	<message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DESCRIPTION">Show all applications plugins</message>
 	<message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_HANDLE">Management</message>
 	<message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHOOSE">Select</message>
-	<message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_ACTIVATE">Activate</message>
-	<message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DEACTIVATE">Deactivate</message>
 	<message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES">Changes</message>
 	<message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DOC">Documentation</message>
 	<message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CANCEL">Quit</message>
Index: main/plugin-core/i18n/messages_fr.xml
===================================================================
--- main/plugin-core/i18n/messages_fr.xml	(revision 31811)
+++ main/plugin-core/i18n/messages_fr.xml	(working copy)
@@ -161,20 +175,39 @@
     <message key="PLUGINS_CORE_ADMINISTRATOR_STATUS_MONITORING_DISKIO_DESCRIPTION">Ce graphique montre l'activé des disques (lectures et écritures).</message>
 
     <!-- ADMINISTRATOR PLUGINS -->
-    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_LABEL">Plugins et Workspaces</message>
-    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DESCRIPTION">Affiche tous les plugins et workspaces de l'application</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_LABEL">Plugins par fichier</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_DESC">Ouvre un outil permettant de visualiser les plugins par fichiers sous forme d'un arbre. Permet d'activer/désactiver des plugins.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_SERVER_ERROR">Une erreur est survenue lors de la récupération des propriétés de l'arbre.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_ROOT_TEXT">Plugins</message>
+    
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYEXTENSIONPOINT_LABEL">Plugins par point d'extension</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYEXTENSIONPOINT_DESC">Ouvre un outil permettant de visualiser les plugins par point d'extension sous forme d'un arbre. Permet d'activer/désactiver des plugins.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYEXTENSIONPOINT_SERVER_ERROR">Une erreur est survenue lors de la récupération des propriétés de l'arbre.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYEXTENSIONPOINT_ROOT_TEXT">Plugins</message>
+    
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_WORKSPACES_LABEL">Workspaces</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_WORKSPACES_DESC">Ouvre un outil permettant de visualiser les workspaces sous forme d'un arbre.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_WORKSPACES_SERVER_ERROR">Une erreur est survenue lors de la récupération des propriétés de l'arbre.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_TOOL_WORKSPACES_ROOT_TEXT">Workspaces</message>
+
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DOCUMENTATION_LABEL">Documentation</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DOCUMENTATION_DESC">Voir la documentation rattachée au noeud sélectionné.</message>
+    
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_ACTIVATE_LABEL">Activer</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_ACTIVATE_DESC">Permet d'activer la feature sélectionnée.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DEACTIVATE_LABEL">Désactiver</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DEACTIVATE_DESC">Permet de désactiver la feature sélectionnée.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_SELECT_LABEL">Sélectionner</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_SELECT_DESC">Sélectionne le point d'extension.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_LABEL">Changements</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_DESC">Applique les changements réalisés.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_ERROR">Une erreur s'est produit lors de l'application des changements.</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_PENDING">Attention, l'arbre ne sera à jour que lorsque les changements auront été appliqués.</message>
+
     <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_HANDLE">Gestion</message>
     <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHOOSE">Sélectionner</message>
-    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_ACTIVATE">Activer</message>
-    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DEACTIVATE">Désactiver</message>
     <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES">Changements</message>
-    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DOC">Documentation</message>
-    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CANCEL">Quitter</message>
-    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_TITLE">Liste des plugins et workspaces</message>
-    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_HELP">Aide</message>
-    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_HELP_TEXT">Cet écran affiche la liste des plugins et workspaces qui ont été chargés au démarrage de l'application.&lt;br/&gt;&lt;br/&gt;Vous pouvez afficher 3 vues en sélectionnant les onglets dans le sommaire :&lt;br/&gt;Par plugins : cette vue correspond à l'arborescence physique des plugins sur le disque.&lt;br/&gt;Par point d'extension : il s'agit d'une vue logique où les plugins sont regroupés par type.&lt;br/&gt;Par workspace : il s'agit de la liste des workspaces.&lt;br/&gt;&lt;br/&gt;Le bouton documentation vous permet de voir la documentation des plugins. C'est une action contextuelle, en sélectionnant un noeud donné dans l'arbre vous obtiendrez la documentation rattachée.</message>
     <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_NO_PLUGINS">Aucun plugin n'est enregistré</message>
-    <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_PLUGINS">Plugins</message>
     <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_EXTENSION_POINTS">Points d'extension</message>
     <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_NO_EXTENSION">Aucun point d'extension n'est enregistré</message>
     <message key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_PLUGIN_VIEW">Plugins par fichiers</message>
Index: main/plugin-core/pages/administrator/plugins/list.xsl
===================================================================
--- main/plugin-core/pages/administrator/plugins/list.xsl	(revision 31811)
+++ main/plugin-core/pages/administrator/plugins/list.xsl	(nonexistent)
@@ -1,444 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Copyright 2012 Anyware Services
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   -->
-<xsl:stylesheet version="1.0" 
-                xmlns:i18n="http://apache.org/cocoon/i18n/2.1" 
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:plugin="http://www.ametys.org/schema/plugin">
-
-    <xsl:param name="contextPath"/>
-    <xsl:param name="pluginName"/>
-    <xsl:param name="workspaceName"/>
-    <xsl:param name="workspaceURI"/>
-    
-    <xsl:variable name="workspaceContext"><xsl:value-of select="$contextPath"/><xsl:value-of select="$workspaceURI"/></xsl:variable>
-    
-    <xsl:variable name="resourcesPath"><xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources</xsl:variable>
-    
-	<xsl:template match="/root/list">
-        <html>
-            <head>
-                <title><i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_TITLE"/></title>
-            </head>
-				<script>
-					<script type="text/javascript" src="{$resourcesPath}/js/Ametys/plugins/core/administration/Plugins.js"></script>
-	            	<script type="text/javascript">
-						Ametys.plugins.core.administration.Plugins.initialize ("<xsl:value-of select="$pluginName"/>");
-						
-						var pluginTreeNode = {
-				            expanded: true,
-                       		icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/root.png",
-				            text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_PLUGINS"/>",
-				            children: [
-                                <xsl:choose>
-                                    <xsl:when test="count(plugins/plugin) = 0">
-                                    	{
-                                    		icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugins.png",
-                                    		text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_NO_PLUGINS"/>",
-                                    		leaf: true
-                                    	}
-                                    </xsl:when>
-                                 	<xsl:otherwise>
-							            <xsl:for-each select="plugins/plugin">
-							             	<xsl:sort select="@name"/>
-							             	
-							             	<xsl:if test="position() != 1">,</xsl:if> 
-							             	<xsl:call-template name="tree-plugin"/>
-							            </xsl:for-each>
-					            	</xsl:otherwise>
-					            </xsl:choose>
-				            ]
-				        };
-
-						var pluginTreeNode2 = {
-				            expanded: true,
-                       		icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/root.png",
-				            text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_EXTENSION_POINTS"/>",
-				            children: [
-                                <xsl:choose>
-                                    <xsl:when test="count(extension-points/*) = 0">
-                                    	{
-                                    		icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-point.png",
-                                    		text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_NO_EXTENSION"/>",
-                                    		leaf: true
-                                    	}
-                                    </xsl:when>
-                                 	<xsl:otherwise>
-                                 		{
-                                    		icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-point.png",
-                                    		text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_SEP"/>",
-                                    		leaf: <xsl:value-of select="count(extension-points/single-extension-point)"/> == 0,
-                                    		children: [
-									            <xsl:for-each select="extension-points/single-extension-point">
-									             	<xsl:sort select="@id"/>
-									             	
-									             	<xsl:if test="position() != 1">,</xsl:if> 
-									             	<xsl:call-template name="tree2-extensionpoint"/>
-									            </xsl:for-each>
-                                    		]
-                                    	}
-                                    	,
-                                    		
-                                 		{
-                                    		icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-point-multiple.png",
-                                    		text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_EP"/>",
-                                    		leaf: <xsl:value-of select="count(extension-points/extension-point)"/> == 0,
-                                    		children: [
-									            <xsl:for-each select="extension-points/extension-point">
-									             	<xsl:sort select="@id"/>
-									             	
-									             	<xsl:if test="position() != 1">,</xsl:if> 
-									             	<xsl:call-template name="tree2-extensionpoint"/>
-									            </xsl:for-each>
-									        ]
-									    }
-					            	</xsl:otherwise>
-					            </xsl:choose>
-				            ]
-				        };
-						
-						var pluginTreeNode3 = {
-				            expanded: true,
-                       		icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/root.png",
-				            text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_WORKSPACE_VIEW"/>",
-				            children: [
-                                <xsl:choose>
-                                    <xsl:when test="count(workspaces/workspace) = 0">
-                                    	{
-                                    		icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/workspace.png",
-                                    		text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_NO_WORKSPACE"/>",
-                                    		leaf: true
-                                    	}
-                                    </xsl:when>
-                                 	<xsl:otherwise>
-							            <xsl:for-each select="workspaces/workspace">
-							             	<xsl:sort select="."/>
-							             	
-							             	<xsl:if test="position() != 1">,</xsl:if> 
-							             	<xsl:call-template name="tree3-workspace"/>
-							            </xsl:for-each>
-					            	</xsl:otherwise>
-					            </xsl:choose>
-				            ]
-				        };
-						
-						createPanel = function () 
-						{
-							return Ametys.plugins.core.administration.Plugins.createPanel (pluginTreeNode, pluginTreeNode2, pluginTreeNode3);
-						}						            			
-	            	</script>
-            </script>	
-            
-        </html>
-    </xsl:template>
-    
-    <xsl:template name="tree-plugin">
-        {
-       		icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugins.png",
-            text: "<xsl:value-of select="@name"/>",
-            type: "plugin",
-            pluginName : "<xsl:value-of select="@name"/>",
-            <xsl:choose>
-            	<xsl:when test="count(feature) != 0">
-            		leaf: false,
-            		children: [
-            			<xsl:for-each select="feature"> 
-            				<xsl:sort select="@name"/>
-
-							<xsl:if test="position() != 1">,</xsl:if>
-							<xsl:call-template name="tree-feature"/>            				
-            			</xsl:for-each>
-            		]
-            	</xsl:when>
-            	<xsl:otherwise>
-            		leaf: true
-            	</xsl:otherwise>
-            </xsl:choose>
-        }
-    </xsl:template>
-    
-    <xsl:template name="tree-feature">
-		{
-			<xsl:variable name="featureName" select="@name"/>
-			<xsl:variable name="pluginName" select="../@name"/>
-		
-			icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugin<xsl:if test="@inactive = 'true'">-inactive</xsl:if>.png",
-			text: "<xsl:value-of select="@name"/><xsl:if test="@inactive = 'true'"> &lt;span style='font-style: italic; color: #7f7f7f'&gt;<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_INACTIVE_{@cause}"/>&lt;/span&gt;</xsl:if>",
-			type: "feature",
-			active: <xsl:value-of select="not(@inactive = 'true')"/>,
-			cause: "<xsl:value-of select="@cause"/>",
-            pluginName : "<xsl:value-of select="$pluginName"/>",
-            featureName : "<xsl:value-of select="$featureName"/>",
-                                                            
-            <xsl:choose>
-            	<xsl:when test="count(component) != 0 or count(extensionPoint) != 0">
-            		leaf: false,
-            		children: [
-						<xsl:for-each select="component">
-							<xsl:sort select="." />
-							
-							<xsl:if test="position() != 1">,</xsl:if>
-							<xsl:call-template name="tree-component"/>
-						</xsl:for-each>
-						<xsl:for-each select="extensionPoint">
-							<xsl:sort select="@name" />
-							
-							<xsl:if test="position() != 1 or count(../component) != 0">,</xsl:if>
-							<xsl:call-template name="tree-extensionpoint"/>
-						</xsl:for-each>
-            		]
-            	</xsl:when>
-            	<xsl:when test="/root/plugins/plugin:plugin[@name=$pluginName]/plugin:feature[@name=$featureName]/*/*">
-            		leaf: false,
-            		children: [
-						<xsl:for-each select="/root/plugins/plugin:plugin[@name=$pluginName]/plugin:feature[@name=$featureName]/plugin:components/plugin:component">
-							<xsl:sort select="@role" />
-							
-							<xsl:if test="position() != 1">,</xsl:if>
-							<xsl:call-template name="tree-inactive-component"/>
-						</xsl:for-each>
-						<xsl:for-each select="/root/plugins/plugin:plugin[@name=$pluginName]/plugin:feature[@name=$featureName]/plugin:extensions/plugin:extension[not(@point = preceding-sibling::*/@point)]">
-							<xsl:sort select="@point" />
-							
-							<xsl:if test="position() != 1 or count(/root/plugins/plugin:plugin[@name=$pluginName]/plugin:feature[@name=$featureName]/plugin:components/plugin:component) != 0">,</xsl:if>
-							<xsl:call-template name="tree-inactive-extensionpoint"/>
-						</xsl:for-each>
-            		]
-            	</xsl:when>
-            	<xsl:otherwise>
-            		leaf: true
-            	</xsl:otherwise>
-            </xsl:choose>
-		}
-    
-    </xsl:template>
-    
-    <xsl:template name="tree-component">
-		{
-			icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/composant.png",
-			text: "<xsl:value-of select="." />",
-			type: "component",
-			pluginName: "<xsl:value-of select="../../@name"/>",
-			featureName: "<xsl:value-of select="../@name"/>",
-			componentName: "<xsl:value-of select="." />",
-			leaf: true
-    	}
-    </xsl:template>
-        
-    <xsl:template name="tree-inactive-component">
-		{
-			icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/composant-inactive.png",
-			text: "<xsl:value-of select="@role" />",
-			type: "component",
-			pluginName: "<xsl:value-of select="../../../@name"/>",
-			featureName: "<xsl:value-of select="../../@name"/>",
-			componentName: "<xsl:value-of select="@role" />",
-			leaf: true
-    	}
-    </xsl:template>
-    
-    <xsl:template name="tree-extensionpoint">
-    	<xsl:variable name="name" select="@name"/>
-		{
-			icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-point<xsl:if test="/root/list/extension-points/extension-point[@id = $name]">-multiple</xsl:if>.png",
-			text: "<xsl:value-of select="$name" />",
-			isMultiple: "<xsl:value-of select="count(/root/list/extension-points/extension-point[@id = $name]) != 0"/>",
-			type: "extension-point",
-			pluginName: "<xsl:value-of select="../../@name"/>",
-			extensionPointName: "<xsl:value-of select="$name" />",
-			
-            <xsl:choose>
-            	<xsl:when test="count(extension) != 0">
-            		leaf: false,
-            		children: [
-						<xsl:for-each select="extension">
-							<xsl:sort select="." />
-							
-							<xsl:if test="position() != 1">,</xsl:if>
-							<xsl:call-template name="tree-extension"/>
-						</xsl:for-each>
-            		]
-            	</xsl:when>
-            	<xsl:otherwise>
-            		leaf: true
-            	</xsl:otherwise>
-            </xsl:choose>
-    	}
-    </xsl:template>
-    
-    <xsl:template name="tree-inactive-extensionpoint">
-    	<xsl:variable name="name" select="@point"/>
-		{
-			icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-point<xsl:if test="/root/list/extension-points/extension-point[@id = $name]">-multiple</xsl:if>.png",
-			text: "<xsl:value-of select="$name" />",
-			isMultiple: "<xsl:value-of select="count(/root/list/extension-points/extension-point[@id = $name]) != 0"/>",
-			type: "extension-point",
-			pluginName: "<xsl:value-of select="../../../@name"/>",
-			extensionPointName: "<xsl:value-of select="$name" />",
-			
-       		leaf: false,
-       		children: [
-				<xsl:for-each select="../plugin:extension[@point = $name]">
-					<xsl:sort select="@id" />
-					
-					<xsl:if test="position() != 1">,</xsl:if>
-					<xsl:call-template name="tree-inactive-extension"/>
-				</xsl:for-each>
-       		]
-    	}
-    </xsl:template>
-
-    <xsl:template name="tree-extension">
-		{
-			icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension.png",
-			text: "<xsl:value-of select="." />",
-			type: "extension",
-			pluginName: "<xsl:value-of select="../../../@name"/>",
-			featureName: "<xsl:value-of select="../../@name"/>",
-			extensionId: "<xsl:value-of select="." />",
-			leaf: true
-    	}
-    </xsl:template>
-
-    <xsl:template name="tree-inactive-extension">
-		{
-			icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-inactive.png",
-			text: "<xsl:value-of select="@id" />",
-			type: "extension",
-			pluginName: "<xsl:value-of select="../../../@name"/>",
-			featureName: "<xsl:value-of select="../../@name"/>",
-			extensionId: "<xsl:value-of select="@id" />",
-			leaf: true
-    	}
-    </xsl:template>
-    
-    <xsl:template name="tree2-extensionpoint">
-        <xsl:variable name="name" select="@id"/>
-		{
-			icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-point<xsl:if test="local-name() != 'single-extension-point'">-multiple</xsl:if>.png",
-			text: "<xsl:value-of select="@id" />",
-			isMultiple: "<xsl:value-of select="local-name() != 'single-extension-point'"/>",
-			type: "extension-point",
-			pluginName: "<xsl:value-of select="/root/list/plugins/plugin[feature/extensionPoint[@name = $name]]/@name"/>",
-			extensionPointName: "<xsl:value-of select="@id" />",
-
-            <xsl:choose>
-            	<xsl:when test="count(/root/plugins/plugin:plugin/plugin:feature/plugin:extensions/plugin:extension[@point = $name]) != 0">
-            		leaf: false,
-            		children: [
-						<xsl:for-each select="/root/plugins/plugin:plugin/plugin:feature/plugin:extensions/plugin:extension[@point = $name]">
-							<xsl:sort select="@point" />
-							
-							<xsl:if test="position() != 1">,</xsl:if>
-							<xsl:variable name="id" select="@id"/>
-							<xsl:choose>
-								<xsl:when test="/root/list/plugins/plugin/feature/extensionPoint[@name = $name]/extension[. = $id]">
-									<xsl:for-each select="/root/list/plugins/plugin/feature/extensionPoint[@name = $name]/extension[. = $id]">
-										<xsl:call-template name="tree2-extension"/>
-									</xsl:for-each>
-								</xsl:when>
-								<xsl:otherwise>
-									<xsl:call-template name="tree2-inactive-extension"/>
-								</xsl:otherwise>
-							</xsl:choose>
-						</xsl:for-each>
-            		]
-            	</xsl:when>
-            	<xsl:otherwise>
-            		leaf: true
-            	</xsl:otherwise>
-            </xsl:choose>
-    	}
-    </xsl:template>
-
-    <xsl:template name="tree2-extension">
-		{
-			icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension.png",
-			text: "<xsl:value-of select="." />",
-			leaf: false,
-			type: "extension",
-			pluginName: "<xsl:value-of select="../../../@name"/>",
-			featureName: "<xsl:value-of select="../../@name"/>",
-			extensionId: "<xsl:value-of select="." />",
-			children: [
-				{
-					icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugin.png",
-					text: "<xsl:value-of select="../../@name"/>",
-					type: "feature",
-					active: true,
-					pluginName: "<xsl:value-of select="../../../@name"/>",
-					featureName: "<xsl:value-of select="../../@name"/>",
-					leaf: false,
-					children: [
-						{
-							icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugins.png",
-							text: "<xsl:value-of select="../../../@name"/>",
-							type: "plugin",
-							pluginName: "<xsl:value-of select="../../../@name"/>",
-							leaf: true
-						}
-					]
-				}
-			]
-    	}
-    </xsl:template>
-    
-
-    <xsl:template name="tree2-inactive-extension">
-    	<xsl:variable name="pluginName" select="../../../@name"/>
-    	<xsl:variable name="featureName" select="../../@name"/>
-    	<xsl:variable name="cause" select="/root/list/plugins/plugin[@name = $pluginName]/feature[@name = $featureName]/@cause"/>
-		{
-			icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-inactive.png",
-			text: "<xsl:value-of select="@id" />",
-			leaf: false,
-			type: "extension",
-			pluginName: "<xsl:value-of select="$pluginName"/>",
-			featureName: "<xsl:value-of select="$featureName"/>",
-			extensionId: "<xsl:value-of select="@id" />",
-			children: [
-				{
-					icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugin-inactive.png",
-					text: "<xsl:value-of select="$featureName"/> &lt;span style='font-style: italic; color: #7f7f7f'&gt;<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_INACTIVE_{$cause}"/>&lt;/span&gt;",
-					type: "feature",
-					active: false,
-					cause: "<xsl:value-of select="$cause"/>",
-					pluginName: "<xsl:value-of select="$pluginName"/>",
-					featureName: "<xsl:value-of select="$featureName"/>",
-					leaf: false,
-					children: [
-						{
-							icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugins.png",
-							text: "<xsl:value-of select="$pluginName"/>",
-							type: "plugin",
-							pluginName: "<xsl:value-of select="$pluginName"/>",
-							leaf: true
-						}
-					]
-				}
-			]
-    	}
-    </xsl:template>
-    
-    <xsl:template name="tree3-workspace">
-		{
-			icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/workspace<xsl:if test="@inactive = 'true'">-inactive</xsl:if>.png",
-			text: "<xsl:value-of select="." /><xsl:if test="@inactive = 'true'"> &lt;span style='font-style: italic; color: #7f7f7f'&gt;<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_INACTIVE_{@cause}"/>&lt;/span&gt;</xsl:if><xsl:if test=". = ../@default"> &lt;span style='font-style: italic; color: #7f7f7f'&gt;<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_WORKSPACE_DEFAULT"/>&lt;/span&gt;</xsl:if>",
-			leaf: true
-    	}
-    </xsl:template>
-    
-</xsl:stylesheet>
\ No newline at end of file
Index: main/plugin-core/pages/administrator/plugins/plugins-by-extension-point.xsl
===================================================================
--- main/plugin-core/pages/administrator/plugins/plugins-by-extension-point.xsl	(revision 0)
+++ main/plugin-core/pages/administrator/plugins/plugins-by-extension-point.xsl	(revision 0)
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2012 Anyware Services
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+   -->
+<xsl:stylesheet version="1.0" 
+                xmlns:i18n="http://apache.org/cocoon/i18n/2.1" 
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:plugin="http://www.ametys.org/schema/plugin">
+
+    <xsl:param name="contextPath"/>
+    <xsl:param name="pluginName"/>
+    <xsl:param name="workspaceName"/>
+    <xsl:param name="workspaceURI"/>
+    
+    <xsl:variable name="workspaceContext"><xsl:value-of select="$contextPath"/><xsl:value-of select="$workspaceURI"/></xsl:variable>
+    
+    <xsl:variable name="resourcesPath"><xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources</xsl:variable>
+    
+    <xsl:template match="/">
+        <plugins-by-extension-point>
+            {
+                children:
+                {
+                   expanded: true,
+                   icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/root.png",
+                   text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_EXTENSION_POINTS"/>",
+                   children: [
+                       <xsl:choose>
+                           <xsl:when test="count(root/list/extension-points/*) = 0">
+                               {
+                                   icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-point.png",
+                                   text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_NO_EXTENSION"/>",
+                                   leaf: true
+                               }
+                           </xsl:when>
+                           <xsl:otherwise>
+                               {
+                                   icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-point.png",
+                                   text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_SEP"/>",
+                                   leaf: <xsl:value-of select="count(root/list/extension-points/single-extension-point)"/> == 0,
+                                   children: [
+                                       <xsl:for-each select="root/list/extension-points/single-extension-point">
+                                           <xsl:sort select="@id"/>
+                                           
+                                           <xsl:if test="position() != 1">,</xsl:if> 
+                                           <xsl:call-template name="tree-extensionpoint"/>
+                                       </xsl:for-each>
+                                   ]
+                               }
+                               ,
+                               {
+                                   icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-point-multiple.png",
+                                   text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_EP"/>",
+                                   leaf: <xsl:value-of select="count(root/list/extension-points/extension-point)"/> == 0,
+                                   children: [
+                                       <xsl:for-each select="root/list/extension-points/extension-point">
+                                           <xsl:sort select="@id"/>
+                                           
+                                           <xsl:if test="position() != 1">,</xsl:if> 
+                                           <xsl:call-template name="tree-extensionpoint"/>
+                                       </xsl:for-each>
+                                   ]
+                               }
+                           </xsl:otherwise>
+                       </xsl:choose>
+                   ]
+               }
+           }
+        </plugins-by-extension-point>
+    </xsl:template>
+    
+    <xsl:template name="tree-extensionpoint">
+        <xsl:variable name="name" select="@id"/>
+        {
+            icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-point<xsl:if test="local-name() != 'single-extension-point'">-multiple</xsl:if>.png",
+            text: "<xsl:value-of select="@id" />",
+            isMultiple: "<xsl:value-of select="local-name() != 'single-extension-point'"/>",
+            type: "extension-point",
+            pluginName: "<xsl:value-of select="/root/list/plugins/plugin[feature/extensionPoint[@name = $name]]/@name"/>",
+            extensionPointName: "<xsl:value-of select="@id" />",
+
+            <xsl:choose>
+                <xsl:when test="count(/root/plugins/plugin:plugin/plugin:feature/plugin:extensions/plugin:extension[@point = $name]) != 0">
+                    leaf: false,
+                    children: [
+                        <xsl:for-each select="/root/plugins/plugin:plugin/plugin:feature/plugin:extensions/plugin:extension[@point = $name]">
+                            <xsl:sort select="@point" />
+                            
+                            <xsl:if test="position() != 1">,</xsl:if>
+                            <xsl:variable name="id" select="@id"/>
+                            <xsl:choose>
+                                <xsl:when test="/root/list/plugins/plugin/feature/extensionPoint[@name = $name]/extension[. = $id]">
+                                    <xsl:for-each select="/root/list/plugins/plugin/feature/extensionPoint[@name = $name]/extension[. = $id]">
+                                        <xsl:call-template name="tree-extension"/>
+                                    </xsl:for-each>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:call-template name="tree-inactive-extension"/>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:for-each>
+                    ]
+                </xsl:when>
+                <xsl:otherwise>
+                    leaf: true
+                </xsl:otherwise>
+            </xsl:choose>
+        }
+    </xsl:template>
+
+    <xsl:template name="tree-extension">
+        {
+            icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension.png",
+            text: "<xsl:value-of select="." />",
+            leaf: false,
+            type: "extension",
+            pluginName: "<xsl:value-of select="../../../@name"/>",
+            featureName: "<xsl:value-of select="../../@name"/>",
+            extensionId: "<xsl:value-of select="." />",
+            children: [
+                {
+                    icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugin.png",
+                    text: "<xsl:value-of select="../../@name"/>",
+                    type: "feature",
+                    active: true,
+                    pluginName: "<xsl:value-of select="../../../@name"/>",
+                    featureName: "<xsl:value-of select="../../@name"/>",
+                    leaf: false,
+                    children: [
+                        {
+                            icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugins.png",
+                            text: "<xsl:value-of select="../../../@name"/>",
+                            type: "plugin",
+                            pluginName: "<xsl:value-of select="../../../@name"/>",
+                            leaf: true
+                        }
+                    ]
+                }
+            ]
+        }
+    </xsl:template>
+
+    <xsl:template name="tree-inactive-extension">
+        <xsl:variable name="pluginName" select="../../../@name"/>
+        <xsl:variable name="featureName" select="../../@name"/>
+        <xsl:variable name="cause" select="/root/list/plugins/plugin[@name = $pluginName]/feature[@name = $featureName]/@cause"/>
+        {
+            icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-inactive.png",
+            text: "<xsl:value-of select="@id" />",
+            leaf: false,
+            type: "extension",
+            pluginName: "<xsl:value-of select="$pluginName"/>",
+            featureName: "<xsl:value-of select="$featureName"/>",
+            extensionId: "<xsl:value-of select="@id" />",
+            children: [
+                {
+                    icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugin-inactive.png",
+                    text: "<xsl:value-of select="$featureName"/> &lt;span style='font-style: italic; color: #7f7f7f'&gt;<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_INACTIVE_{$cause}"/>&lt;/span&gt;",
+                    type: "feature",
+                    active: false,
+                    cause: "<xsl:value-of select="$cause"/>",
+                    pluginName: "<xsl:value-of select="$pluginName"/>",
+                    featureName: "<xsl:value-of select="$featureName"/>",
+                    leaf: false,
+                    children: [
+                        {
+                            icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugins.png",
+                            text: "<xsl:value-of select="$pluginName"/>",
+                            type: "plugin",
+                            pluginName: "<xsl:value-of select="$pluginName"/>",
+                            leaf: true
+                        }
+                    ]
+                }
+            ]
+        }
+    </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
Index: main/plugin-core/pages/administrator/plugins/plugins-by-file.xsl
===================================================================
--- main/plugin-core/pages/administrator/plugins/plugins-by-file.xsl	(revision 0)
+++ main/plugin-core/pages/administrator/plugins/plugins-by-file.xsl	(revision 0)
@@ -0,0 +1,242 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2012 Anyware Services
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+   -->
+<xsl:stylesheet version="1.0" 
+                xmlns:i18n="http://apache.org/cocoon/i18n/2.1" 
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:plugin="http://www.ametys.org/schema/plugin">
+
+    <xsl:param name="contextPath"/>
+    <xsl:param name="pluginName"/>
+    <xsl:param name="workspaceName"/>
+    <xsl:param name="workspaceURI"/>
+    
+    <xsl:variable name="workspaceContext"><xsl:value-of select="$contextPath"/><xsl:value-of select="$workspaceURI"/></xsl:variable>
+    <xsl:variable name="resourcesPath"><xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources</xsl:variable>
+    
+    <xsl:template match="/">
+        <root>
+            {
+	            'children': 
+	            {
+	                'expanded': true,
+	                'icon': "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/root.png",
+	                'text': "<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_ROOT_TEXT'/>",
+	                'children': [
+	                            <xsl:choose>
+	                                <xsl:when test="count(root/list/plugins/plugin) = 0">
+	                                   {
+	                                       'icon': "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugins.png",
+	                                       'text': "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_NO_PLUGINS"/>",
+	                                       'leaf': true
+	                                   }
+	                                </xsl:when>
+	                               <xsl:otherwise>
+	                                   <xsl:for-each select="root/list/plugins/plugin">
+		                                <xsl:sort select="@name"/>
+		                                
+		                                <xsl:if test="position() != 1">,</xsl:if> 
+		                                <xsl:call-template name="tree-plugin"/>
+		                            </xsl:for-each>
+		                        </xsl:otherwise>
+	                    </xsl:choose>
+	                ]
+	            }
+            }
+        </root>
+    </xsl:template>
+    
+    <xsl:template name="tree-plugin">
+        {
+            'icon': "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugins.png",
+            'text': "<xsl:value-of select="@name"/>",
+            'type': "plugin",
+            'pluginName' : "<xsl:value-of select="@name"/>",
+            <xsl:choose>
+                <xsl:when test="count(feature) != 0">
+                    'leaf': false,
+                    'children': [
+                        <xsl:for-each select="feature"> 
+                            <xsl:sort select="@name"/>
+
+                            <xsl:if test="position() != 1">,</xsl:if>
+                            <xsl:call-template name="tree-feature"/>                            
+                        </xsl:for-each>
+                    ]
+                </xsl:when>
+                <xsl:otherwise>
+                    'leaf': true
+                </xsl:otherwise>
+            </xsl:choose>
+        }
+    </xsl:template>
+    
+    <xsl:template name="tree-feature">
+        {
+            <xsl:variable name="featureName" select="@name"/>
+            <xsl:variable name="pluginName" select="../@name"/>
+        
+            'icon': "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/plugin<xsl:if test="@inactive = 'true'">-inactive</xsl:if>.png",
+            'text': "<xsl:value-of select="@name"/><xsl:if test="@inactive = 'true'"> &lt;span style='font-style: italic; color: #7f7f7f'&gt;<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_INACTIVE_{@cause}"/>&lt;/span&gt;</xsl:if>",
+            'type': "feature",
+            'active': <xsl:value-of select="not(@inactive = 'true')"/>,
+            'cause': "<xsl:value-of select="@cause"/>",
+            'pluginName' : "<xsl:value-of select="$pluginName"/>",
+            'featureName': "<xsl:value-of select="$featureName"/>",
+                                                            
+            <xsl:choose>
+                <xsl:when test="count(component) != 0 or count(extensionPoint) != 0">
+                    'leaf': false,
+                    'children': [
+                        <xsl:for-each select="component">
+                            <xsl:sort select="." />
+                            
+                            <xsl:if test="position() != 1">,</xsl:if>
+                            <xsl:call-template name="tree-component"/>
+                        </xsl:for-each>
+                        <xsl:for-each select="extensionPoint">
+                            <xsl:sort select="@name" />
+                            
+                            <xsl:if test="position() != 1 or count(../component) != 0">,</xsl:if>
+                            <xsl:call-template name="tree-extensionpoint"/>
+                        </xsl:for-each>
+                    ]
+                </xsl:when>
+                <xsl:when test="/root/plugins/plugin:plugin[@name=$pluginName]/plugin:feature[@name=$featureName]/*/*">
+                    'leaf': false,
+                    'children': [
+                        <xsl:for-each select="/root/plugins/plugin:plugin[@name=$pluginName]/plugin:feature[@name=$featureName]/plugin:components/plugin:component">
+                            <xsl:sort select="@role" />
+                            
+                            <xsl:if test="position() != 1">,</xsl:if>
+                            <xsl:call-template name="tree-inactive-component"/>
+                        </xsl:for-each>
+                        <xsl:for-each select="/root/plugins/plugin:plugin[@name=$pluginName]/plugin:feature[@name=$featureName]/plugin:extensions/plugin:extension[not(@point = preceding-sibling::*/@point)]">
+                            <xsl:sort select="@point" />
+                            
+                            <xsl:if test="position() != 1 or count(/root/plugins/plugin:plugin[@name=$pluginName]/plugin:feature[@name=$featureName]/plugin:components/plugin:component) != 0">,</xsl:if>
+                            <xsl:call-template name="tree-inactive-extensionpoint"/>
+                        </xsl:for-each>
+                    ]
+                </xsl:when>
+                <xsl:otherwise>
+                    'leaf': true
+                </xsl:otherwise>
+            </xsl:choose>
+        }
+    
+    </xsl:template>
+    
+    <xsl:template name="tree-component">
+        {
+            'icon': "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/composant.png",
+            'text': "<xsl:value-of select="." />",
+            'type': "component",
+            'pluginName': "<xsl:value-of select="../../@name"/>",
+            'featureName': "<xsl:value-of select="../@name"/>",
+            'componentName': "<xsl:value-of select="." />",
+            'leaf': true
+        }
+    </xsl:template>
+        
+    <xsl:template name="tree-inactive-component">
+        {
+            'icon': "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/composant-inactive.png",
+            'text': "<xsl:value-of select="@role" />",
+            'type': "component",
+            'pluginName': "<xsl:value-of select="../../../@name"/>",
+            'featureName': "<xsl:value-of select="../../@name"/>",
+            'componentName': "<xsl:value-of select="@role" />",
+            'leaf': true
+        }
+    </xsl:template>
+    
+    <xsl:template name="tree-extensionpoint">
+        <xsl:variable name="name" select="@name"/>
+        {
+            'icon': "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-point<xsl:if test="/root/list/extension-points/extension-point[@id = $name]">-multiple</xsl:if>.png",
+            'text': "<xsl:value-of select="$name" />",
+            'isMultiple': "<xsl:value-of select="count(/root/list/extension-points/extension-point[@id = $name]) != 0"/>",
+            'type': "extension-point",
+            'pluginName': "<xsl:value-of select="../../@name"/>",
+            'extensionPointName': "<xsl:value-of select="$name" />",
+            
+            <xsl:choose>
+                <xsl:when test="count(extension) != 0">
+                    'leaf': false,
+                    'children': [
+                        <xsl:for-each select="extension">
+                            <xsl:sort select="." />
+                            
+                            <xsl:if test="position() != 1">,</xsl:if>
+                            <xsl:call-template name="tree-extension"/>
+                        </xsl:for-each>
+                    ]
+                </xsl:when>
+                <xsl:otherwise>
+                    'leaf': true
+                </xsl:otherwise>
+            </xsl:choose>
+        }
+    </xsl:template>
+    
+    <xsl:template name="tree-inactive-extensionpoint">
+        <xsl:variable name="name" select="@point"/>
+        {
+            'icon': "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-point<xsl:if test="/root/list/extension-points/extension-point[@id = $name]">-multiple</xsl:if>.png",
+            'text': "<xsl:value-of select="$name" />",
+            'isMultiple': "<xsl:value-of select="count(/root/list/extension-points/extension-point[@id = $name]) != 0"/>",
+            'type': "extension-point",
+            'pluginName': "<xsl:value-of select="../../../@name"/>",
+            'extensionPointName': "<xsl:value-of select="$name" />",
+            
+            'leaf': false,
+            'children': [
+                <xsl:for-each select="../plugin:extension[@point = $name]">
+                    <xsl:sort select="@id" />
+                    
+                    <xsl:if test="position() != 1">,</xsl:if>
+                    <xsl:call-template name="tree-inactive-extension"/>
+                </xsl:for-each>
+            ]
+        }
+    </xsl:template>
+
+    <xsl:template name="tree-extension">
+        {
+            'icon': "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension.png",
+            'text': "<xsl:value-of select="." />",
+            'type': "extension",
+            'pluginName': "<xsl:value-of select="../../../@name"/>",
+            'featureName': "<xsl:value-of select="../../@name"/>",
+            'extensionId': "<xsl:value-of select="." />",
+            'leaf': true
+        }
+    </xsl:template>
+
+    <xsl:template name="tree-inactive-extension">
+        {
+            'icon': "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/extension-inactive.png",
+            'text': "<xsl:value-of select="@id" />",
+            'type': "extension",
+            'pluginName': "<xsl:value-of select="../../../@name"/>",
+            'featureName': "<xsl:value-of select="../../@name"/>",
+            'extensionId': "<xsl:value-of select="@id" />",
+            'leaf': true
+        }
+    </xsl:template>
+    
+</xsl:stylesheet>
\ No newline at end of file
Index: main/plugin-core/pages/administrator/plugins/workspaces.xsl
===================================================================
--- main/plugin-core/pages/administrator/plugins/workspaces.xsl	(revision 0)
+++ main/plugin-core/pages/administrator/plugins/workspaces.xsl	(revision 0)
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2012 Anyware Services
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+   -->
+<xsl:stylesheet version="1.0" 
+                xmlns:i18n="http://apache.org/cocoon/i18n/2.1" 
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+    <xsl:param name="contextPath"/>
+    <xsl:param name="pluginName"/>
+    <xsl:param name="workspaceName"/>
+    <xsl:param name="workspaceURI"/>
+    
+    <xsl:variable name="workspaceContext"><xsl:value-of select="$contextPath"/><xsl:value-of select="$workspaceURI"/></xsl:variable>
+    
+    <xsl:variable name="resourcesPath"><xsl:value-of select="$contextPath"/>/plugins/<xsl:value-of select="$pluginName"/>/resources</xsl:variable>
+    
+    <xsl:template match="/">
+        <workspaces>
+	        {
+		        children:
+		        {
+		            expanded: true,
+		            icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/root.png",
+		            text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_WORKSPACE_VIEW"/>",
+		            children: [
+		                <xsl:choose>
+		                    <xsl:when test="count(workspaces/workspace) = 0">
+		                        {
+		                            icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/workspace.png",
+		                            text: "<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_NO_WORKSPACE"/>",
+		                            leaf: true
+		                        }
+		                    </xsl:when>
+		                    <xsl:otherwise>
+		                        <xsl:for-each select="workspaces/workspace">
+		                            <xsl:sort select="."/>
+		                            
+		                            <xsl:if test="position() != 1">,</xsl:if> 
+		                            <xsl:call-template name="tree-workspace"/>
+		                        </xsl:for-each>
+		                    </xsl:otherwise>
+		                </xsl:choose>
+		            ]
+		        }
+	        }
+        </workspaces>
+    </xsl:template>
+   
+    <xsl:template name="tree-workspace">
+        {
+            icon: "<xsl:value-of select="$resourcesPath"/>/img/administrator/plugins/workspace<xsl:if test="@inactive = 'true'">-inactive</xsl:if>.png",
+            text: "<xsl:value-of select="." /><xsl:if test="@inactive = 'true'"> &lt;span style='font-style: italic; color: #7f7f7f'&gt;<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_INACTIVE_{@cause}"/>&lt;/span&gt;</xsl:if><xsl:if test=". = ../@default"> &lt;span style='font-style: italic; color: #7f7f7f'&gt;<i18n:text i18n:key="PLUGINS_CORE_ADMINISTRATOR_PLUGINS_WORKSPACE_DEFAULT"/>&lt;/span&gt;</xsl:if>",
+            leaf: true
+        }
+    </xsl:template>
+    
+</xsl:stylesheet>
\ No newline at end of file
Index: main/plugin-core/plugin.xml
===================================================================
--- main/plugin-core/plugin.xml	(revision 31811)
+++ main/plugin-core/plugin.xml	(working copy)                 		 
@@ -1307,174 +1302,1109 @@
+            
+            <!-- +
+                 |  PLUGINS AND WORKSPACES
+                 + -->           
+            <!-- Plugins by file tab -->
+            <extension id="org.ametys.runtime.plugins.core.PluginsByFileTab"
+                       point="org.ametys.runtime.ribbon.RibbonTabsManager"
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.tab.TabController">
+                    <tool-role>^(uitool-admin-pluginsbyfile)$</tool-role>
+                </class>
+            </extension>
+            
+            <!-- Plugins by extension point tab -->
+            <extension id="org.ametys.runtime.plugins.core.PluginsByExtensionPointTab"
+                       point="org.ametys.runtime.ribbon.RibbonTabsManager"
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.tab.TabController">
+                    <tool-role>^(uitool-admin-pluginsbyextensionpoint)$</tool-role>
+                </class>
+            </extension>
+            
+            <!-- Tools -->
+            <extension id="org.ametys.runtime.plugins.core.PluginsByFile"  
+                       point="org.ametys.runtime.ribbon.RibbonControlsManager" 
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <!-- 
+                    This interaction allows the administrator to see plugins by file. Useful for developers.
+                 -->
+                <class name="Ametys.ribbon.element.ui.button.OpenToolButtonController">
+                    <opentool-role>uitool-admin-pluginsbyfile</opentool-role>
+                    
+                    <label i18n="true">PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_LABEL</label>
+                    <description i18n="true">PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_DESC</description>
+                    
+                    <icon-small file="true">img/administrator/plugins/icon_16x16.png</icon-small>
+                    <icon-medium file="true">img/administrator/plugins/icon_32x32.png</icon-medium>
+                    <icon-large file="true">img/administrator/plugins/icon_48x48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/core/administration/tool/PluginsTool.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.runtime.plugins.core.PluginsByExtensionPoint"  
+                       point="org.ametys.runtime.ribbon.RibbonControlsManager" 
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <!-- 
+                    This interaction allows the administrator to see plugins by file. Useful for developers.
+                 -->
+                <class name="Ametys.ribbon.element.ui.button.OpenToolButtonController">
+                    <opentool-role>uitool-admin-pluginsbyextensionpoint</opentool-role>
+                    
+                    <label i18n="true">PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYEXTENSIONPOINT_LABEL</label>
+                    <description i18n="true">PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYEXTENSIONPOINT_DESC</description>
+                    
+                    <icon-small file="true">img/administrator/plugins/icon_16x16.png</icon-small>
+                    <icon-medium file="true">img/administrator/plugins/icon_32x32.png</icon-medium>
+                    <icon-large file="true">img/administrator/plugins/icon_48x48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/core/administration/tool/PluginsTool.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.runtime.plugins.core.Workspaces"  
+                       point="org.ametys.runtime.ribbon.RibbonControlsManager" 
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <!-- 
+                    This interaction allows the administrator to see plugins by file. Useful for developers.
+                 -->
+                <class name="Ametys.ribbon.element.ui.button.OpenToolButtonController">
+                    <opentool-role>uitool-admin-workspaces</opentool-role>
+                    
+                    <label i18n="true">PLUGINS_CORE_ADMINISTRATOR_TOOL_WORKSPACES_LABEL</label>
+                    <description i18n="true">PLUGINS_CORE_ADMINISTRATOR_TOOL_WORKSPACES_DESC</description>
+                    
+                    <icon-small file="true">img/administrator/plugins/icon_16x16.png</icon-small>
+                    <icon-medium file="true">img/administrator/plugins/icon_32x32.png</icon-medium>
+                    <icon-large file="true">img/administrator/plugins/icon_48x48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/core/administration/tool/WorkspacesTool.js</file>
+                </scripts>
+            </extension>
+            
+            <!-- Factories -->
+            <extension id="org.ametys.runtime.plugins.core.PluginsByFileFactory"  
+                       point="org.ametys.runtime.ui.UIToolsFactoriesManager" 
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <!-- 
+                    This interaction allows the administrator to see plugins by file. Useful for developers.
+                 -->
+                <class name="Ametys.tool.factory.UniqueToolFactory">
+                    <role>uitool-admin-pluginsbyfile</role>
+                    <toolClass>Ametys.plugins.core.administration.tool.PluginsTool</toolClass>
+                    
+                    <proxyUrl>administrator/plugins-by-file</proxyUrl>
+                    
+                    <title i18n="true">PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_LABEL</title>
+                    <description i18n="true">PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYFILE_DESC</description>
+                    
+                    <icon-small file="true">img/administrator/plugins/icon_16x16.png</icon-small>
+                    <icon-medium file="true">img/administrator/plugins/icon_32x32.png</icon-medium>
+                    <icon-large file="true">img/administrator/plugins/icon_48x48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/core/administration/tool/PluginsTool.js</file>
+                </scripts>
+                <css>
+                    <file>css/administrator/plugins.css</file>
+                </css>
+                <default-location>c</default-location>
+            </extension>
+            
+            <extension id="org.ametys.runtime.plugins.core.PluginsByExtensionPointFactory"  
+                       point="org.ametys.runtime.ui.UIToolsFactoriesManager" 
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <!-- 
+                    This interaction allows the administrator to see plugins by file. Useful for developers.
+                 -->
+                <class name="Ametys.tool.factory.UniqueToolFactory">
+                    <role>uitool-admin-pluginsbyextensionpoint</role>
+                    <toolClass>Ametys.plugins.core.administration.tool.PluginsTool</toolClass>
+                        
+                    <proxyUrl>administrator/plugins-by-extension-point</proxyUrl>
+                        
+                    <title i18n="true">PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYEXTENSIONPOINT_LABEL</title>
+                    <description i18n="true">PLUGINS_CORE_ADMINISTRATOR_TOOL_PLUGINSBYEXTENSIONPOINT_DESC</description>
+                    
+                    <icon-small file="true">img/administrator/plugins/icon_16x16.png</icon-small>
+                    <icon-medium file="true">img/administrator/plugins/icon_32x32.png</icon-medium>
+                    <icon-large file="true">img/administrator/plugins/icon_48x48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/core/administration/tool/PluginsTool.js</file>
+                </scripts>
+                <css>
+                    <file>css/administrator/plugins.css</file>
+                </css>
+                <default-location>c</default-location>
+            </extension>
+            
+            <extension id="org.ametys.runtime.plugins.core.WorkspacesFactory"  
+                       point="org.ametys.runtime.ui.UIToolsFactoriesManager" 
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <!-- 
+                    This interaction allows the administrator to see plugins by file. Useful for developers.
+                 -->
+                <class name="Ametys.tool.factory.UniqueToolFactory">
+                    <role>uitool-admin-workspaces</role>
+                    <toolClass>Ametys.plugins.core.administration.tool.WorkspacesTool</toolClass>
+                    
+                    <title i18n="true">PLUGINS_CORE_ADMINISTRATOR_TOOL_WORKSPACES_LABEL</title>
+                    <description i18n="true">PLUGINS_CORE_ADMINISTRATOR_TOOL_WORKSPACES_DESC</description>
+                    
+                    <icon-small file="true">img/administrator/plugins/icon_16x16.png</icon-small>
+                    <icon-medium file="true">img/administrator/plugins/icon_32x32.png</icon-medium>
+                    <icon-large file="true">img/administrator/plugins/icon_48x48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/core/administration/tool/WorkspacesTool.js</file>
+                </scripts>
+                <default-location>c</default-location>
+            </extension>
+            
+            <!-- Actions -->
+            <extension id="org.ametys.runtime.plugins.core.plugins.Documentation"
+                       point="org.ametys.runtime.ribbon.RibbonControlsManager"
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.ui.ButtonController">
+                    <action>Ametys.plugins.core.administration.actions.PluginsActions.showDocumentation</action>
+                    <selection-target-type>^(plugin-by-file-node|plugin-by-extension-point-node)$</selection-target-type>
+                
+                    <label i18n="true">PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DOCUMENTATION_LABEL</label>
+                    <description i18n="true">PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DOCUMENTATION_DESC</description>
+
+                    <icon-small file="true">img/administrator/plugins/icon_16x16.png</icon-small>
+                    <icon-medium file="true">img/administrator/plugins/icon_32x32.png</icon-medium>
+                    <icon-large file="true">img/administrator/plugins/icon_48x48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/core/administration/actions/PluginsActions.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.runtime.plugins.core.plugins.Activate"
+                       point="org.ametys.runtime.ribbon.RibbonControlsManager"
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.ui.ButtonController">
+                    <action>Ametys.plugins.core.administration.actions.PluginsActions.activate</action>
+                    
+                    <selection-target-type>^(plugin-by-file-node|plugin-by-extension-point-node)$</selection-target-type>
+                    <selection-target-parameter>
+                        <name>^inactiveFeature$</name>
+                        <value>true</value>
+                    </selection-target-parameter>                    
+                
+                    <label i18n="true">PLUGINS_CORE_ADMINISTRATOR_PLUGINS_ACTIVATE_LABEL</label>
+                    <description i18n="true">PLUGINS_CORE_ADMINISTRATOR_PLUGINS_ACTIVATE_DESC</description>
+
+                    <icon-small file="true">img/administrator/plugins/icon_16x16.png</icon-small>
+                    <icon-medium file="true">img/administrator/plugins/icon_32x32.png</icon-medium>
+                    <icon-large file="true">img/administrator/plugins/icon_48x48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/core/administration/actions/PluginsActions.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.runtime.plugins.core.plugins.Deactivate"
+                       point="org.ametys.runtime.ribbon.RibbonControlsManager"
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.ui.ButtonController">
+                    <action>Ametys.plugins.core.administration.actions.PluginsActions.deactivate</action>
+                    
+                    <selection-target-type>^(plugin-by-file-node|plugin-by-extension-point-node)$</selection-target-type>
+                    <selection-target-parameter>
+                        <name>^activeFeature$</name>
+                        <value>true</value>
+                    </selection-target-parameter>                    
+                
+                    <label i18n="true">PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DEACTIVATE_LABEL</label>
+                    <description i18n="true">PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DEACTIVATE_DESC</description>
+
+                    <icon-small file="true">img/administrator/plugins/icon_16x16.png</icon-small>
+                    <icon-medium file="true">img/administrator/plugins/icon_32x32.png</icon-medium>
+                    <icon-large file="true">img/administrator/plugins/icon_48x48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/core/administration/actions/PluginsActions.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.runtime.plugins.core.plugins.Select"
+                       point="org.ametys.runtime.ribbon.RibbonControlsManager"
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <class name="Ametys.ribbon.element.ui.ButtonController">
+                    <action>Ametys.plugins.core.administration.actions.PluginsActions.select</action>
+                    
+                    <selection-target-type>^(plugin-by-file-node|plugin-by-extension-point-node)$</selection-target-type>
+                    <selection-target-parameter>
+                        <name>selectable</name>
+                        <value>true</value>
+                    </selection-target-parameter>                    
+                
+                    <label i18n="true">PLUGINS_CORE_ADMINISTRATOR_PLUGINS_SELECT_LABEL</label>
+                    <description i18n="true">PLUGINS_CORE_ADMINISTRATOR_PLUGINS_SELECT_DESC</description>
+
+                    <icon-small file="true">img/administrator/plugins/icon_16x16.png</icon-small>
+                    <icon-medium file="true">img/administrator/plugins/icon_32x32.png</icon-medium>
+                    <icon-large file="true">img/administrator/plugins/icon_48x48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/core/administration/actions/PluginsActions.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.runtime.plugins.core.plugins.Changes"
+                       point="org.ametys.runtime.ribbon.RibbonControlsManager"
+                       class="org.ametys.runtime.ui.StaticClientSideElement">
+                <class name="Ametys.plugins.core.administration.controller.ChangesController">
+                    <action>Ametys.plugins.core.administration.actions.PluginsActions.changes</action>
+                    
+                    <disabled>true</disabled>
+                    
+                    <label i18n="true">PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_LABEL</label>
+                    <description i18n="true">PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_DESC</description>
+
+                    <icon-small file="true">img/administrator/plugins/icon_16x16.png</icon-small>
+                    <icon-medium file="true">img/administrator/plugins/icon_32x32.png</icon-medium>
+                    <icon-large file="true">img/administrator/plugins/icon_48x48.png</icon-large>
+                </class>
+                <scripts>
+                    <file>js/Ametys/plugins/core/administration/actions/PluginsActions.js</file>
+                    <file>js/Ametys/plugins/core/administration/controller/ChangesController.js</file>
+                </scripts>
+            </extension>
         </extensions>
     </feature>
Index: main/plugin-core/resources/css/administrator/plugins.css
===================================================================
--- main/plugin-core/resources/css/administrator/plugins.css	(revision 0)
+++ main/plugin-core/resources/css/administrator/plugins.css	(revision 0)
@@ -0,0 +1,25 @@
+/*
+ *  Copyright 2015 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+.plugins-tool .hint
+{
+    font: 11px/13px arial,tahoma,helvetica,sans-serif;
+    padding: 1px;
+    color: #404040;
+    line-height: 22px;
+    background-color: #FFFFC0;
+    padding: 0 5px; 
+} 
Index: main/plugin-core/resources/js/Ametys/plugins/core/administration/actions/PluginsActions.js
===================================================================
--- main/plugin-core/resources/js/Ametys/plugins/core/administration/actions/PluginsActions.js	(revision 0)
+++ main/plugin-core/resources/js/Ametys/plugins/core/administration/actions/PluginsActions.js	(revision 0)
@@ -0,0 +1,273 @@
+/*
+ *  Copyright 2015 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+/**
+ * Singleton class defining the actions related to the plugins and workpaces tools
+ * @private
+ */
+Ext.define('Ametys.plugins.core.administration.actions.PluginsActions', {
+	singleton: true,
+	
+	/**
+	 * @private
+	 * @property {Object} _SEP Map<String, String>
+	 * This association of single extension point name and extension to choose.
+	 * This association records the changes wanted until there are saved
+	 */
+	_SEP: {},
+	/**
+	 * @private
+	 * @property {Object} _EP Map<String, boolean>
+	 * This association of multiple extension point name and true to active / false to deactive.
+	 * This association records the changes wanted until there are saved
+	 */
+	_EP: {},
+	
+	/**
+	 * Reset the list of changes
+	 */
+	resetChangeList: function()
+	{
+		this._SEP = {}; 
+		this._EP = {};			
+	},
+	
+	/**
+	 * View the documentation of the selected node
+	 * @param {Ametys.ribbon.element.ui.ButtonController} controller The controller calling this function
+	 */
+	showDocumentation: function(controller)
+	{
+		var target = controller.getMatchingTargets()[0];
+		if (target != null)
+		{
+			var zoom = "";
+			var targetParameters = target.getParameters();
+			var type = targetParameters.type;
+			
+			switch (type)
+			{
+				case 'plugin': 
+					zoom = targetParameters.pluginName + "_main.html";
+					break;
+			
+				case 'feature': 
+					zoom = targetParameters.pluginName + "_features.html%23feature_" + targetParameters.featureName;
+					break;
+					
+				case 'component': 
+					zoom = targetParameters.pluginName + "_features.html%23feature_" + targetParameters.featureName + "_component_" + targetParameters.componentName;
+					break;
+					
+				case 'extension-point': 
+					zoom = targetParameters.pluginName + "_extensions.html%23extension_point_" + targetParameters.extensionPointName;
+					break;
+				
+				case 'extension': 
+					zoom = targetParameters.pluginName + "_features.html%23feature_" + targetParameters.featureName + "_extension_" + targetParameters.extensionId;
+					break;
+				
+				default: 
+					break;
+			}
+			
+			window.open(Ametys.getPluginDirectPrefix(controller._pluginName) + "/administrator/plugins/doc/index.html?zoom=" + zoom, "plugindoc", "");
+		}
+	},
+	
+	/**
+	 * Activate the feature corresponding to the selected node
+	 * @param {Ametys.ribbon.element.ui.ButtonController} controller The controller calling this function
+	 */
+	activate: function(controller)
+	{
+		var target = controller.getMatchingTargets()[0];
+		if (target != null)
+		{
+			var targetParameters = target.getParameters();
+			this._EP[targetParameters.pluginName + "/" + targetParameters.featureName] = true;
+			
+			Ext.MessageBox.alert("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_ALERT_TITLE'/>", "<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_ALERT_TEXT'/>");
+			this._sendModifyingMessage(targetParameters.pluginName);
+		}
+	},
+	
+	/**
+	 * Deactivate the feature corresponding to the selected node
+	 * @param {Ametys.ribbon.element.ui.ButtonController} controller The controller calling this function
+	 */
+	deactivate: function(controller)
+	{
+		var target = controller.getMatchingTargets()[0];
+		if (target != null)
+		{
+			var targetParameters = target.getParameters();
+			this._EP[targetParameters.pluginName + "/" + targetParameters.featureName] = false;
+			
+			Ext.MessageBox.alert("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_ALERT_TITLE'/>", "<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_ALERT_TEXT'/>");
+			this._sendModifyingMessage(targetParameters.pluginName);
+		}
+	},
+	
+	/**
+	 * Select the extension point
+	 * @param {Ametys.ribbon.element.ui.ButtonController} controller The controller calling this function
+	 */
+	select: function(controller)
+	{
+		var target = controller.getMatchingTargets()[0];
+		if (target != null)
+		{
+			var targetParameters = target.getParameters();
+			this._SEP[targetParameters.parentExtensionPointName] = targetParameters.parentExtensionPointName;
+			
+			Ext.MessageBox.alert("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_ALERT_TITLE'/>", "<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_ALERT_TEXT'/>");
+			this._sendModifyingMessage(targetParameters.pluginName);
+		}
+	},
+	
+	/**
+	 * Send a {Ametys.message.Message.MODIFIED} message
+	 * @param {String} pluginName the name of the targeted plugin
+	 */
+	_sendModifyingMessage: function(pluginName)
+	{
+		var targets = [];
+		var target = Ext.create('Ametys.message.MessageTarget', {
+				type: Ametys.message.MessageTarget.AMETYS_PLUGIN,
+				parameters: {name: pluginName}
+			});
+		
+		targets.push(target);
+		
+		if (targets.length > 0)
+		{			
+			Ext.create('Ametys.message.Message', {
+				type: Ametys.message.Message.MODIFYING,
+				targets: targets
+			});
+		}
+	},
+	
+	/**
+	 * Apply the changes made on the tree
+	 * @param {Ametys.ribbon.element.ui.ButtonController} controller The controller calling this function
+	 */
+	changes: function(controller)
+	{
+		Ext.MessageBox.alert("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_BEWARE_TITLE'/>", 
+				"<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_BEWARE_TEXT'/>",
+				Ext.bind(function ()
+				{
+					var sepchanges = "";
+					for (var i in this._SEP)
+					{
+						sepchanges += i + " : " + this._SEP[i] + "<br/>";
+					}
+					var epchanges = "";
+					for (var i in this._EP)
+					{
+						epchanges += i + " : " + (this._EP[i] ? "<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_ACTIVATE_LABEL'/>" : "<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_DEACTIVATE_LABEL'/>") + "<br/>";
+					}
+					
+					
+					var changes = "";
+					if (sepchanges != "")
+					{
+						changes += "<b><i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_SEP'/></b><br/>"
+								   + sepchanges;
+					}
+					if (epchanges != "")
+					{
+						changes += "<b><i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_EP'/></b><br/>"
+								   + epchanges;
+					}
+					
+					Ext.MessageBox.confirm("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_CONFIRM_TITLE'/>", 
+							"<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_CONFIRM_TEXT_START'/><ul>"
+							+ changes
+							+ "</ul><i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_CONFIRM_TEXT_END'/>", 
+							function(val) { if (val == "yes") { this._changesNow(controller._pluginName); } }, this);
+				}, this));
+	},
+	
+	/**
+	 * Operates the pending changes
+	 * @private
+	 */
+	_changesNow: function(pluginName)
+	{
+		var params = {};
+		params.EP = this._EP;
+		params.SEP = this._SEP;
+		
+		Ametys.data.ServerComm.send({
+			plugin: pluginName, 
+			url: "administrator/plugins/change", 
+			parameters: params, 
+			priority: Ametys.data.ServerComm.PRIORITY_MAJOR, 
+			callback: {
+				handler: this._changesNowCB,
+				scope: this,
+				arguments: {pluginName: pluginName},
+			},
+			errorMessage: {
+				msg: "<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_ERROR'/>",
+				category: this.self.getName()
+			},
+			responseType: null
+		});
+		
+		Ext.getBody().mask("<i18n:text i18n:key='KERNEL_LOADMASK_DEFAULT_MESSAGE' i18n:catalogue='kernel'/>");
+	},
+
+	/**
+	 * @private
+	 * Call back for the server message of the {@link #_changesNow} method
+	 * @param {Object} response The xmlhttpresponse
+	 * @param {Object} args the callback arguments
+	 * @param {String} args.pluginName the name of the plugin
+	 */
+	_changesNowCB: function(response, args)
+	{
+		Ext.getBody().unmask();
+
+	    Ametys.Msg.alert("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES'/>", "<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_DONE'/>");
+
+	    Ext.getBody().mask("<i18n:text i18n:key='KERNEL_LOADMASK_DEFAULT_MESSAGE' i18n:catalogue='kernel'/>");
+	    
+	    // Restart
+	    Ext.Ajax.request({url: Ametys.getPluginDirectPrefix(args.pluginName) + "/administrator/restart", params: "", async: false});
+	    
+	    Ametys.reload();
+	}
+});
+
+
+Ext.define("Ametys.message.PluginsMessageTarget",
+	{
+		override: "Ametys.message.MessageTarget",
+		statics: 
+		{
+			/**
+			 * @member Ametys.message.MessageTarget
+			 * @readonly
+			 * @property {String} AMETYS_PLUGIN The target of the message is a server-side plugin (for instance "core"). The only parameter is: 'name' the name of the plugin 
+			 */
+			AMETYS_PLUGIN: "ametys-plugin"
+		}
+	}
+);
Index: main/plugin-core/resources/js/Ametys/plugins/core/administration/controller/ChangesController.js
===================================================================
--- main/plugin-core/resources/js/Ametys/plugins/core/administration/controller/ChangesController.js	(revision 0)
+++ main/plugin-core/resources/js/Ametys/plugins/core/administration/controller/ChangesController.js	(revision 0)
@@ -0,0 +1,49 @@
+/*
+ *  Copyright 2015 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * This class controls a ribbon button allowing to apply the changes made on the selection of plugins and extension points
+ * @private
+ */
+Ext.define('Ametys.plugins.core.administration.controller.ChangesController', {
+	extend: 'Ametys.ribbon.element.ui.ButtonController',
+	
+	constructor: function(config)
+	{
+		this.callParent(arguments);
+		
+		Ametys.message.MessageBus.on(Ametys.message.Message.MODIFYING, this._onModifying, this);
+	},
+
+	/**
+	 * Listener when the tree is being modified
+	 * Will update the state of the button
+	 * @param {Ametys.message.Message} message The modified message.
+	 * @protected
+	 */
+	_onModifying: function (message)
+	{
+		var targets = message.getTargets();
+		for (var i=0; i < targets.length; i++)
+		{
+			if (targets[i].getType() == Ametys.message.MessageTarget.AMETYS_PLUGIN)
+			{
+				this.setDisabled(false);
+				return;
+			}
+		}
+	}
+});
Index: main/plugin-core/resources/js/Ametys/plugins/core/administration/tool/PluginsTool.js
===================================================================
--- main/plugin-core/resources/js/Ametys/plugins/core/administration/tool/PluginsTool.js	(revision 0)
+++ main/plugin-core/resources/js/Ametys/plugins/core/administration/tool/PluginsTool.js	(revision 0)
@@ -0,0 +1,238 @@
+/*
+ *  Copyright 2015 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      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.
+ */
+
+/**
+ * &lt;p&gt;This tool displays the tree of plugins by file, and allows the administrator to perform several operations such as :&lt;/p&gt;
+ * &lt;ul&gt;
+ * 	&lt;li&gt; see the documentation &lt;/li&gt;
+ * 	&lt;li&gt; activate/deactivate plugins &lt;/li&gt;
+ * 	&lt;li&gt; reboot the application with the changes made &lt;/li&gt;
+ * &lt;/ul&gt;
+ */
+Ext.define('Ametys.plugins.core.administration.tool.PluginsTool', {
+	extend: 'Ametys.tool.Tool',
+	
+	/**
+	 * @private
+	 * @property {Ext.tree.Panel} _tree The plugins by file tree panel
+	 */
+	
+	/**
+	 * @private
+	 * @property {Boolean} _hasChanges true if changes were made, false otherwise
+	 */
+	
+	/**
+	 * @private
+	 * @property {String} _proxyUrl the url of the proxy of the associated tree store
+	 */
+	
+	constructor: function(config)
+	{
+		this.callParent(arguments);
+		
+		this._proxyUrl = config.proxyUrl;
+		Ametys.message.MessageBus.on(Ametys.message.Message.MODIFYING, this._onModifying, this);
+	},
+	
+	onOpen: function()
+	{
+		this.callParent(arguments);
+		Ametys.plugins.core.administration.actions.PluginsActions.resetChangeList();
+	},
+		
+	getMBSelectionInteraction: function() 
+	{
+		return Ametys.tool.Tool.MB_TYPE_ACTIVE;
+	},
+	
+	createPanel: function ()
+	{
+		this._tree = this._drawPanel();
+		return this._tree;
+	},
+	
+	sendCurrentSelection: function()
+	{
+		this._onSelect();
+	},
+	
+	/**
+	 * Refreshes the tool
+	 */
+	refresh: function ()
+	{
+		this.showRefreshing();
+		this._tree.getStore().load({node: this._tree.getRootNode(), callback: this.showRefreshed, scope: this});
+	},
+
+	/**
+	 * @private
+	 * Draw the tree panel for the plugins by file tool
+	 */
+	_drawPanel: function()
+	{
+		var store = Ext.create('Ext.data.TreeStore', {
+			model: 'Ametys.plugins.core.administration.Plugins.Item',
+			
+			proxy: {
+	        	type: 'ametys',
+				plugin: 'core',
+				url: this._proxyUrl,
+	        	reader: {
+	        		type: 'json',
+	        		rootProperty: 'children'
+	        	}
+	        },
+			
+			root: {
+				expanded: false
+			},		
+			
+	        listeners: {
+	        	'load': Ext.bind(this._onLoad, this)
+	        }
+		});
+		
+		return new Ext.tree.Panel({
+			cls: 'plugins-tool',
+			store: store,
+			rootVisible: false,
+			
+			autoScroll: true,
+			border: false,
+			
+			dockedItems: [
+	              {
+	            	  xtype: 'component',
+	            	  cls: 'hint',
+	            	  hidden: true,
+	            	  dock: 'top',
+	            	  html: "<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_PENDING'/>"
+	              }
+			],
+					
+			listeners: {
+				'selectionchange': Ext.bind(this._onSelect, this)
+			}
+		});
+	},
+
+	/**
+     * @private
+     * Listener when store is loaded
+     */
+	_onLoad: function()
+    {
+		var rootNode = this._tree.getRootNode();
+		
+        // Expand first nodes
+        this._tree.getRootNode().expandChildren(false, false, this._tree._onRootNodesChangedAndExpanded, this);
+    },
+    
+    /**
+     * @private
+     * When the newly loaded root nodes are expanded
+     */
+    _onRootNodesChangedAndExpanded: function()
+    {
+        // Select first node
+        this._tree.getSelectionModel().select(this._tree.getRootNode().firstChild);
+    },
+	
+    /**
+     * @private
+     * Send selection message
+     */
+	_onSelect: function()
+	{
+		var targets = [];
+		
+		var selectedNodes = this._tree.getSelectionModel().getSelection();
+		Ext.Array.forEach(selectedNodes, function(selectedNode) {
+			
+			var nodeData = selectedNode.data;
+			
+			var activeFeature,
+				inactiveFeature;
+			
+			if (nodeData.type == 'feature')
+			{
+				if (nodeData.cause == "")
+				{
+					activeFeature = nodeData.active;
+				}
+				else
+				{
+					inactiveFeature = nodeData.cause == "EXCLUDED";
+				}
+			}
+			
+			target = Ext.create('Ametys.message.MessageTarget', {
+				type: 'plugin-by-file-node',
+				parameters: {
+								id: selectedNode.getId(), 
+								type: nodeData.type,
+								active: nodeData.active,
+								activeFeature: activeFeature, // if true the "deactivate" action is enabled
+								inactiveFeature: inactiveFeature, // if true the "activate" action is enabled
+								selectable: nodeData.type == 'extension' && selectedNode.parentNode.data.isMultiple == "false", 
+								pluginName: nodeData.pluginName, 
+								featureName: nodeData.featureName,
+								componentName: nodeData.componentName,
+								extensionPointName: nodeData.extensionPointName,
+								parentExtensionPointName: selectedNode.parentNode != null ? selectedNode.parentNode.data.extensionPointName : "", // for the "select" action
+								extensionId: nodeData.extensionId
+							}
+			});
+			
+			targets.push(target);
+		});
+		
+		Ext.create('Ametys.message.Message', {
+			type: Ametys.message.Message.SELECTION_CHANGED,
+			targets: targets
+		});
+	},
+	
+	/**
+	 * @private
+	 * Listener when the tree is being modified
+	 * @param {Ametys.message.Message} message The modified message.
+	 */
+	_onModifying: function (message)
+	{
+		this._tree.getDockedItems()[0].show();
+	}
+});
+
+Ext.define('Ametys.plugins.core.administration.Plugins.Item', { 
+    extend: 'Ext.data.TreeModel', 
+    fields: [ 
+       { name: 'icon', type: 'string' }, 
+       { name: 'text', type: 'string', sortType: Ext.data.SortTypes.asNonAccentedUCString}, 
+       { name: 'type', type: 'string' }, // can be 'plugin', 'extension', 'feature', 'component', 'extension-point'
+       { name: 'active', type: 'boolean' }, // true if its an active feature
+       { name: 'cause', type: 'string' }, // if inactive, the cause of inactivation
+       { name: 'isMultiple', type: 'string' }, // is it a multiple extension point 
+       { name: 'pluginName', type: 'string' }, // the name of the plugin bringing the element
+       { name: 'featureName', type: 'string' }, // the name of the feature bringing the lement
+       { name: 'componentName', type: 'string' }, // the name of the component
+       { name: 'extensionPointName', type: 'string'}, // the extension point if
+       { name: 'extensionId', type: 'string'}, // the extension if
+       { name: 'leaf', type: 'boolean'} 
+    ] 
+}); 
Index: main/plugin-core/sitemap.xmap
===================================================================
--- main/plugin-core/sitemap.xmap	(revision 31811)
+++ main/plugin-core/sitemap.xmap	(working copy)
@@ -19,10 +19,16 @@

             <!-- +
-                 | Plugins and workspaces managment tool
+                 | Plugins and workspaces management tools
                  + -->
-            <map:match pattern="administrator/plugins/list.xml">
-                <map:generate type="administrator-plugins-list"/>
+            <map:match pattern="administrator/plugins/administrator-plugins-by-file-or-extension-point.xml">
+                <map:generate type="administrator-plugins-by-file-or-extension-point"/>
                 <map:serialize type="xml"/>
             </map:match>
+            
             <map:match pattern="administrator/plugins/plugins.xml">
                 <map:generate type="administrator-plugins-doc"/>
                 <map:serialize type="xml"/>
             </map:match>
 
-            <map:match pattern="administrator/plugins/change">
-            	<map:act type="administrator-change-plugins">
-                    <map:generate type="action-result"/>
-                    <map:serialize type="xml"/>
-            	</map:act>
-            </map:match>
-
-            <map:match pattern="administrator/plugins/change-runtime">
-            	<map:generate type="administrator-plugins-change-runtime"/>
-            	<map:transform src="pages/administrator/plugins/runtime.xsl"/>
-            	<map:serialize type="xml"/>
+            <map:match pattern="administrator/plugins-by-file">
+                <map:aggregate element="root" label="content">
+                    <map:part src="cocoon:/administrator/plugins/administrator-plugins-by-file-or-extension-point.xml"/>
+                    <map:part src="cocoon:/administrator/plugins/plugins.xml"/>
+                </map:aggregate>
+                <map:transform src="pages/administrator/plugins/plugins-by-file.xsl">
+                    <map:parameter name="contextPath" value="{request:contextPath}"/>
+                    <map:parameter name="pluginName" value="{request-attr:pluginName}"/>
+                    <map:parameter name="workspaceName" value="{request-attr:workspaceName}"/>
+                    <map:parameter name="workspaceURI" value="{request-attr:workspaceURI}"/>
+                </map:transform>
+                <map:transform type="i18n">
+                    <map:parameter name="locale" value="{locale:locale}"/>
+                    <map:parameter name="plugin" value="{request-attr:pluginName}"/>
+                </map:transform>
+               <map:serialize type="text" mime-type="application/json"/>
             </map:match>
-
-            <map:match pattern="administrator/plugins/view.html">
+            
+            <map:match pattern="administrator/plugins-by-extension-point">
                 <map:aggregate element="root" label="content">
-                	<map:part src="cocoon:/administrator/plugins/list.xml"/>
-                	<map:part src="cocoon:/administrator/plugins/plugins.xml"/>
+                    <map:part src="cocoon:/administrator/plugins/administrator-plugins-by-file-or-extension-point.xml"/>
+                    <map:part src="cocoon:/administrator/plugins/plugins.xml"/>
                 </map:aggregate>
-                <map:transform src="pages/administrator/plugins/list.xsl">
+                <map:transform src="pages/administrator/plugins/plugins-by-extension-point.xsl">
+                    <map:parameter name="contextPath" value="{request:contextPath}"/>
+                    <map:parameter name="pluginName" value="{request-attr:pluginName}"/>
+                    <map:parameter name="workspaceName" value="{request-attr:workspaceName}"/>
+                    <map:parameter name="workspaceURI" value="{request-attr:workspaceURI}"/>
+                </map:transform>
+                <map:transform type="i18n">
+                    <map:parameter name="locale" value="{locale:locale}"/>
+                    <map:parameter name="plugin" value="{request-attr:pluginName}"/>
+                </map:transform>
+               <map:serialize type="text" mime-type="application/json"/>
+            </map:match>
+            
+            <map:match pattern="administrator/workspaces">
+                <map:generate type="administrator-workspaces"/>
+                <map:transform src="pages/administrator/plugins/workspaces.xsl">
                     <map:parameter name="contextPath" value="{request:contextPath}"/>
                     <map:parameter name="pluginName" value="{request-attr:pluginName}"/>
                     <map:parameter name="workspaceName" value="{request-attr:workspaceName}"/>
                     <map:parameter name="workspaceURI" value="{request-attr:workspaceURI}"/>
                 </map:transform>
-               <map:serialize/>
+                <map:transform type="i18n">
+                    <map:parameter name="locale" value="{locale:locale}"/>
+                    <map:parameter name="plugin" value="{request-attr:pluginName}"/>
+                </map:transform>
+               <map:serialize type="text" mime-type="application/json"/>
+            </map:match>
+            
+            <map:match pattern="administrator/plugins/change">
+                <map:act type="administrator-change-plugins">
+                    <map:generate type="action-result"/>
+                    <map:serialize type="xml"/>
+                </map:act>
             </map:match>
 
+            <map:match pattern="administrator/plugins/change-runtime">
+                <map:generate type="administrator-plugins-change-runtime"/>
+                <map:transform src="pages/administrator/plugins/runtime.xsl"/>
+                <map:serialize type="xml"/>
+            </map:match>
+         
 			<!-- Plugins individual frames -->
             <map:match pattern="administrator/plugins/doc/*_*.html">
             	<map:generate type="administrator-plugins-doc"/>
