Index: main/plugin-forms/cms-ribbon.xml
===================================================================
--- main/plugin-forms/cms-ribbon.xml	(revision 37724)
+++ main/plugin-forms/cms-ribbon.xml	(working copy)
@@ -803,5 +803,19 @@
 				</group>
 			</groups>
 		</tab>
+        
+        <tab label="plugin.forms:RIBBON_TABS_TAB_FORM_ENTRY_LABEL" id="org.ametys.plugins.forms.FormsEntriesTab" contextualColor="5" contextualGroup="FORM" contextualLabel="plugin.forms:RIBBON_TABS_TAB_FORM_GROUP_LABEL">
+            <groups>
+                <group label="plugin.forms:RIBBON_TABS_TAB_FORM_ENTRY_ACTIONS_LABEL" icon="">
+                    <large/>
+                    <medium>
+                        <control id="org.ametys.plugins.forms.entries.DeleteEntry"/>
+                        <control id="org.ametys.plugins.forms.entries.ClearEntries"/>
+                        <control id="org.ametys.plugins.forms.entries.ViewRequest"/>
+                    </medium>
+                    <small/>
+                </group>
+            </groups>
+        </tab>
 	</tabs>
 </ribbon>
\ No newline at end of file
Index: main/plugin-forms/i18n/messages_en.xml
===================================================================
--- main/plugin-forms/i18n/messages_en.xml	(revision 37724)
+++ main/plugin-forms/i18n/messages_en.xml	(working copy)
@@ -15,10 +15,15 @@
    limitations under the License.
    -->
 <catalogue xml:lang="en">
+    <message key="PLUGINS_FORMS_RIGHTS_FORMS_CATEGORY">Forms</message>
 	<message key="PLUGINS_FORMS_RIGHTS_EDITION_ONLINE_FORMS_LABEL">Form edition</message>
 	<message key="PLUGINS_FORMS_RIGHTS_EDITION_ONLINE_FORMS_DESCRIPTION">Edit a form in the inline editor (adding fields, modification...)</message>
 	<message key="PLUGINS_FORMS_RIGHTS_EXPORT_FORM_LABEL">Export forms data</message>
 	<message key="PLUGINS_FORMS_RIGHTS_EXPORT_FORM_DESCRIPTION">Authorize the export of the data submited by the visitors through forms using excel format</message>
+    <message key="PLUGINS_FORMS_RIGHTS_DELETE_FORM_ENTRY_LABEL">Delete an entry</message>
+    <message key="PLUGINS_FORMS_RIGHTS_DELETE_FORM_ENTRY_DESCRIPTION">Authorize the deletion of the data submitted by the visitors through forms</message>
+    <message key="PLUGINS_FORMS_RIGHTS_VIEW_SQL_LABEL">Generate Select Statement</message>
+    <message key="PLUGINS_FORMS_RIGHTS_VIEW_SQL_DESCRIPTION">Authorize the view of the SQL request used to retrieve the data submitted by the visitors through forms</message>
 	
 	<message key="CONTENT_EDITION_FORMS_INSERTMENU_LABEL">Form</message>
 	<message key="CONTENT_EDITION_FORMS_INSERTMENU_DESCRIPTION">Insert a web form for the visitors. The form can be sent to you by email or stored in Ametys for a later management.</message>
@@ -41,6 +46,10 @@
     
     <message key="UITOOL_FORM_RESULTS_LABEL">Form</message>
     <message key="UITOOL_FORM_RESULTS_DESCRIPTION">Tool to show form data</message>
+    <message key="PLUGINS_FORMS_UITOOL_BUTTON_DELETE_ENTRY_LABEL">Delete</message>
+    <message key="PLUGINS_FORMS_UITOOL_BUTTON_DELETE_ENTRY_DESCRIPTION">Delete the selected entries from the current form.</message>
+    <message key="PLUGINS_FORMS_UITOOL_BUTTON_CLEAR_ENTRIES_LABEL">Delete all</message>
+    <message key="PLUGINS_FORMS_UITOOL_BUTTON_CLEAR_ENTRIES_DESCRIPTION">Delete all entries from the current form.</message>
     
 	<message key="PLUGINS_FORMS_FORMS_EDITOR_OPENINNEWWINDOW_LABEL">Submit in a new window</message>	
 	<message key="PLUGINS_FORMS_FORMS_EDITOR_OPENINNEWWINDOW_DESCRIPTION">When the visitor sumbits the form, a new window opens with the thank message or the errors depending on the case. He can then close this window to continue.</message>
@@ -354,6 +363,8 @@
 	<message key="RIBBON_TABS_TAB_FORM_INPUT_RESET_LABEL">Reset button</message>
 	<message key="RIBBON_TABS_TAB_FORM_INPUT_RESET_PROPERTIES_LABEL">Properties</message>
 	<message key="RIBBON_TABS_TAB_FORM_INPUT_RESET_CONTROL_LABEL">Control</message>
+    <message key="RIBBON_TABS_TAB_FORM_ENTRY_LABEL">Entries</message>
+    <message key="RIBBON_TABS_TAB_FORM_ENTRY_ACTIONS_LABEL">Actions</message>
 	
 	<!-- Antivirus -->
 	<message key="PLUGINS_FORMS_ANTIVIRUS_ACTIVATED_PARAM">Antivirus activated</message>
@@ -366,4 +377,24 @@
     <!-- Alert -->
     <message key="PLUGINS_FORMS_FORMS_VALIDATE_DISABLED_BACK_TITLE">Feature not available</message>
     <message key="PLUGINS_FORMS_FORMS_VALIDATE_DISABLED_BACK_MESSAGE">This feature is not available in the CMS workspace. Please, use the 'preview' or 'live' mode.</message>
+    
+    <!-- Forms Tool -->
+    <message key="PLUGINS_FORMS_DELETE_ENTRY_CONFIRM_TITLE">Delete</message>
+    <message key="PLUGINS_FORMS_DELETE_ENTRY_CONFIRM">Do you really want to delete the selected entries from the form ?</message>
+    <message key="PLUGINS_FORMS_DELETE_ENTRY_ERROR">An error occurred, the selected entries could not be deleted.</message>
+    <message key="PLUGINS_FORMS_CLEAR_ENTRIES_CONFIRM_TITLE">Delete all</message>
+    <message key="PLUGINS_FORMS_CLEAR_ENTRIES_CONFIRM">Do you really want to delete all the entries from the form ?</message>
+    <message key="PLUGINS_FORMS_CLEAR_ENTRIES_ERROR">An error occurred, the entries of the form could not be deleted.</message>
+    <message key="PLUGINS_FORMS_UITOOL_ENTRY_CONTENT_RESULT_1">Entries </message>
+    <message key="PLUGINS_FORMS_UITOOL_ENTRY_CONTENT_RESULT_2"> - </message>
+    <message key="PLUGINS_FORMS_UITOOL_ENTRY_CONTENT_RESULT_3"> on </message>
+    <message key="PLUGINS_FORMS_UITOOL_ENTRY_RESULTS_MAX"> maximum</message>
+    <message key="PLUGINS_FORMS_UITOOL_ENTRY_NO_RESULT">No entry found for this form.</message>
+    <message key="PLUGINS_FORMS_UITOOL_BUTTON_VIEW_REQUEST_LABEL">Generate Select Statement</message>
+    <message key="PLUGINS_FORMS_UITOOL_BUTTON_VIEW_REQUEST_DESCRIPTION">Generate the select statement used to retrieve the entries informations for the form.</message>
+    <message key="PLUGINS_FORMS_VIEW_REQUEST_DIALOG_BUTTON_OK">Ok</message>
+    <message key="PLUGINS_FORMS_VIEW_REQUEST_DIALOG_TITLE">Select Statement</message>
+    <message key="PLUGINS_FORMS_VIEW_REQUEST_DIALOG_TABLENAME_FIELD">Table name</message>
+    <message key="PLUGINS_FORMS_VIEW_REQUEST_DIALOG_REQUEST_FIELD">Statement</message>
+        
 </catalogue>
Index: main/plugin-forms/i18n/messages_fr.xml
===================================================================
--- main/plugin-forms/i18n/messages_fr.xml	(revision 37724)
+++ main/plugin-forms/i18n/messages_fr.xml	(working copy)
@@ -15,10 +15,15 @@
    limitations under the License.
    -->
 <catalogue xml:lang="fr">
+	<message key="PLUGINS_FORMS_RIGHTS_FORMS_CATEGORY">Formulaires</message>
 	<message key="PLUGINS_FORMS_RIGHTS_EDITION_ONLINE_FORMS_LABEL">Edition formulaires</message>
 	<message key="PLUGINS_FORMS_RIGHTS_EDITION_ONLINE_FORMS_DESCRIPTION">Autorise l'édition des formulaires dans l'éditeur en ligne (ajout de champs, modification...)</message>
 	<message key="PLUGINS_FORMS_RIGHTS_EXPORT_FORM_LABEL">Exporter les formulaires</message>
 	<message key="PLUGINS_FORMS_RIGHTS_EXPORT_FORM_DESCRIPTION">Autorise l'export au format excel des données envoyées par les visiteurs sur les formulaires</message>
+	<message key="PLUGINS_FORMS_RIGHTS_DELETE_FORM_ENTRY_LABEL">Supprimer une entrée</message>
+	<message key="PLUGINS_FORMS_RIGHTS_DELETE_FORM_ENTRY_DESCRIPTION">Autorise la suppression des données envoyées par les visiteurs sur les formulaires</message>
+	<message key="PLUGINS_FORMS_RIGHTS_VIEW_SQL_LABEL">Voir la requête SQL</message>
+	<message key="PLUGINS_FORMS_RIGHTS_VIEW_SQL_DESCRIPTION">Authorise à visualiser la requête SQL utilisée pour obtenir les données envoyées par les visiteurs sur les formulaires</message>
 
 	<message key="CONTENT_EDITION_FORMS_INSERTMENU_LABEL">Formulaire</message>
 	<message key="CONTENT_EDITION_FORMS_INSERTMENU_DESCRIPTION">Insérer un formulaire web pour vos visiteurs. Le formulaire peut vous être envoyé par email ou stocké dans Ametys pour un traitement ultérieur.</message>
@@ -41,6 +46,10 @@
  
 	<message key="UITOOL_FORM_RESULTS_LABEL">Formulaire</message>
 	<message key="UITOOL_FORM_RESULTS_DESCRIPTION">Outil de visualisation des donnés des formulaires</message>
+    <message key="PLUGINS_FORMS_UITOOL_BUTTON_DELETE_ENTRY_LABEL">Supprimer</message>
+    <message key="PLUGINS_FORMS_UITOOL_BUTTON_DELETE_ENTRY_DESCRIPTION">Supprimer les entrées sélectionnées du formulaire courant.</message>
+    <message key="PLUGINS_FORMS_UITOOL_BUTTON_CLEAR_ENTRIES_LABEL">Supprimer tout</message>
+    <message key="PLUGINS_FORMS_UITOOL_BUTTON_CLEAR_ENTRIES_DESCRIPTION">Supprimer toutes les entrées du formulaire courant.</message>
 
 	<message key="PLUGINS_FORMS_FORMS_EDITOR_OPENINNEWWINDOW_LABEL">Soumettre dans une nouvelle fenêtre</message>	
 	<message key="PLUGINS_FORMS_FORMS_EDITOR_OPENINNEWWINDOW_DESCRIPTION">Lorsque le visiteur soumet le formulaire une nouvelle fenêtre s'ouvre avec le message de remerciement ou les erreurs le cas échéant. Il peut ensuite fermer cette fenêtre et continuer sa navigation.</message>	
@@ -355,6 +364,8 @@
 	<message key="RIBBON_TABS_TAB_FORM_INPUT_RESET_LABEL">Bouton annuler</message>
 	<message key="RIBBON_TABS_TAB_FORM_INPUT_RESET_PROPERTIES_LABEL">Propriétés</message>
 	<message key="RIBBON_TABS_TAB_FORM_INPUT_RESET_CONTROL_LABEL">Contrôle</message>
+    <message key="RIBBON_TABS_TAB_FORM_ENTRY_LABEL">Entrées</message>
+    <message key="RIBBON_TABS_TAB_FORM_ENTRY_ACTIONS_LABEL">Actions</message>
 	
 	<!-- Antivirus -->
 	<message key="PLUGINS_FORMS_ANTIVIRUS_ACTIVATED_PARAM">Antivirus activé</message>
@@ -367,4 +378,24 @@
     <!-- Alert -->
     <message key="PLUGINS_FORMS_FORMS_VALIDATE_DISABLED_BACK_TITLE">Fonctionnalité indisponible</message>
     <message key="PLUGINS_FORMS_FORMS_VALIDATE_DISABLED_BACK_MESSAGE">Il n'est pas possible d'utiliser cette fonctionnalités depuis l'environnement du CMS. Veuillez passer par le mode 'prévisualisation' ou 'version en ligne'.</message>
+    
+    <!-- Forms Tool -->
+    <message key="PLUGINS_FORMS_DELETE_ENTRY_CONFIRM_TITLE">Supprimer</message>
+    <message key="PLUGINS_FORMS_DELETE_ENTRY_CONFIRM">Etes-vous sûrs de vouloir supprimer cette ou ces entrées ?</message>
+    <message key="PLUGINS_FORMS_DELETE_ENTRY_ERROR">Une erreur est survenue, impossible de supprimer les entrées sélectionnées.</message>
+    <message key="PLUGINS_FORMS_CLEAR_ENTRIES_CONFIRM_TITLE">Supprimer tout</message>
+    <message key="PLUGINS_FORMS_CLEAR_ENTRIES_CONFIRM">Etes-vous sûrs de vouloir supprimer toutes les entrées du formulaire ?</message>
+    <message key="PLUGINS_FORMS_CLEAR_ENTRIES_ERROR">Une erreur est survenue, impossible de supprimer les entrées du formulaire.</message>
+    <message key="PLUGINS_FORMS_UITOOL_ENTRY_CONTENT_RESULT_1">Entrées </message>
+    <message key="PLUGINS_FORMS_UITOOL_ENTRY_CONTENT_RESULT_2"> - </message>
+    <message key="PLUGINS_FORMS_UITOOL_ENTRY_CONTENT_RESULT_3"> sur </message>
+    <message key="PLUGINS_FORMS_UITOOL_ENTRY_RESULTS_MAX"> maximum</message>
+    <message key="PLUGINS_FORMS_UITOOL_ENTRY_NO_RESULT">Aucune entrée pour ce formulaire.</message>
+    <message key="PLUGINS_FORMS_UITOOL_BUTTON_VIEW_REQUEST_LABEL">Voir la requête SQL</message>
+    <message key="PLUGINS_FORMS_UITOOL_BUTTON_VIEW_REQUEST_DESCRIPTION">Visualiser la requête SQL permettant de récupérer les entrées du formulaire.</message>
+    <message key="PLUGINS_FORMS_VIEW_REQUEST_DIALOG_BUTTON_OK">Ok</message>
+    <message key="PLUGINS_FORMS_VIEW_REQUEST_DIALOG_TITLE">Voir la requête SQL</message>
+    <message key="PLUGINS_FORMS_VIEW_REQUEST_DIALOG_TABLENAME_FIELD">Nom de la table</message>
+    <message key="PLUGINS_FORMS_VIEW_REQUEST_DIALOG_REQUEST_FIELD">Requête</message>
+        
 </catalogue>
Index: main/plugin-forms/plugin.xml
===================================================================
--- main/plugin-forms/plugin.xml	(revision 37724)
+++ main/plugin-forms/plugin.xml	(working copy)
@@ -523,7 +523,7 @@
                 <right id="Runtime_Rights_Forms_Export">
                     <label>PLUGINS_FORMS_RIGHTS_EXPORT_FORM_LABEL</label>
                     <description>PLUGINS_FORMS_RIGHTS_EXPORT_FORM_DESCRIPTION</description>
-                    <category>plugin.cms:PLUGINS_CMS_RIGHTS_CONTENT_CATEGORY</category>
+                    <category>PLUGINS_FORMS_RIGHTS_FORMS_CATEGORY</category>
                 </right>
             </extension>
     		
@@ -1495,6 +1495,93 @@
             <param-ref id="plugins.forms.antivirus.command"/>
         </config>
 	</feature>
+    
+    <feature name="org.ametys.plugins.forms.entries">
+        <extensions>
+            <extension point="org.ametys.runtime.plugins.core.right.RightsExtensionPoint"
+                       id="web.entries.rights.forms">
+                <!-- 
+                    Define the right for entries in forms
+                 -->
+                <right id="Runtime_Rights_Forms_Delete_Entry">
+                    <label>PLUGINS_FORMS_RIGHTS_DELETE_FORM_ENTRY_LABEL</label>
+                    <description>PLUGINS_FORMS_RIGHTS_DELETE_FORM_ENTRY_DESCRIPTION</description>
+                    <category>PLUGINS_FORMS_RIGHTS_FORMS_CATEGORY</category>
+                </right>
+                <right id="Runtime_Rights_Forms_View_SQL">
+                    <label>PLUGINS_FORMS_RIGHTS_VIEW_SQL_LABEL</label>
+                    <description>PLUGINS_FORMS_RIGHTS_VIEW_SQL_DESCRIPTION</description>
+                    <category>PLUGINS_FORMS_RIGHTS_FORMS_CATEGORY</category>
+                </right>
+            </extension>
+                
+            <extension id="org.ametys.plugins.forms.FormsEntriesTab"
+                       point="org.ametys.cms.workspace.ribbon.RibbonTabsManager"
+                       class="org.ametys.runtime.ui.impl.StaticContextualClientSideElement">
+                <action class="org.ametys.cms.ribbon.tab.ToolTab">
+    				<param name="factory-id">^uitool-form-entries.+$</param>
+    			</action> 
+    			<scripts>
+    				<file plugin="cms">js/org/ametys/cms/ribbon/tab/ToolTab.js</file>
+    			</scripts>   
+            </extension>
+            
+            <extension id="org.ametys.plugins.forms.entries.DeleteEntry"
+                       point="org.ametys.cms.workspace.ribbon.RibbonControlsManager"
+                       class="org.ametys.runtime.ui.impl.StaticContextualClientSideElement">
+                <action class="org.ametys.ribbon.control.button.ActionSelectionButton">
+                    <param name="action">org.ametys.forms.entry.DeleteEntry</param>
+                    <param name="target-type">^form-entry$</param>
+    
+                    <param name="label" i18n="true">PLUGINS_FORMS_UITOOL_BUTTON_DELETE_ENTRY_LABEL</param>
+                    <param name="default-description" i18n="true">PLUGINS_FORMS_UITOOL_BUTTON_DELETE_ENTRY_DESCRIPTION</param>
+					<param name="icon-small" file="true">img/delete_entry_16.png</param>
+					<param name="icon-medium" file="true">img/delete_entry_32.png</param>
+					<param name="icon-large" file="true">img/delete_entry_48.png</param>
+                </action>
+                <right>Runtime_Rights_Forms_Delete_Entry</right>
+                <scripts>
+                    <file>js/org/ametys/forms/FormsEntriesActions.i18n.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.plugins.forms.entries.ClearEntries"
+                       point="org.ametys.cms.workspace.ribbon.RibbonControlsManager"
+                       class="org.ametys.runtime.ui.impl.StaticContextualClientSideElement">
+                <action class="org.ametys.ribbon.control.button.ActionButton">
+                    <param name="action">org.ametys.forms.entry.ClearEntries</param>
+    
+                    <param name="label" i18n="true">PLUGINS_FORMS_UITOOL_BUTTON_CLEAR_ENTRIES_LABEL</param>
+                    <param name="default-description" i18n="true">PLUGINS_FORMS_UITOOL_BUTTON_CLEAR_ENTRIES_DESCRIPTION</param>
+                    <param name="icon-small" file="true">img/clear_entries_16.png</param>
+                    <param name="icon-medium" file="true">img/clear_entries_32.png</param>
+                    <param name="icon-large" file="true">img/clear_entries_48.png</param>
+                </action>
+                <right>Runtime_Rights_Forms_Delete_Entry</right>
+                <scripts>
+                    <file>js/org/ametys/forms/FormsEntriesActions.i18n.js</file>
+                </scripts>
+            </extension>
+            
+            <extension id="org.ametys.plugins.forms.entries.ViewRequest"
+                       point="org.ametys.cms.workspace.ribbon.RibbonControlsManager"
+                       class="org.ametys.runtime.ui.impl.StaticContextualClientSideElement">
+                <action class="org.ametys.ribbon.control.button.ActionButton">
+                    <param name="action">org.ametys.forms.entry.ViewRequest</param>
+    
+                    <param name="label" i18n="true">PLUGINS_FORMS_UITOOL_BUTTON_VIEW_REQUEST_LABEL</param>
+                    <param name="default-description" i18n="true">PLUGINS_FORMS_UITOOL_BUTTON_VIEW_REQUEST_DESCRIPTION</param>
+                    <param name="icon-small" file="true">img/view_request_16.png</param>
+                    <param name="icon-medium" file="true">img/view_request_32.png</param>
+                    <param name="icon-large" file="true">img/view_request_48.png</param>
+                </action>
+                <right>Runtime_Rights_Forms_View_SQL</right>
+                <scripts>
+                    <file>js/org/ametys/forms/FormsEntriesActions.i18n.js</file>
+                </scripts>
+            </extension>
+        </extensions>
+    </feature>
 	
     
 </plugin>
Index: main/plugin-forms/resources/js/org/ametys/forms/FormsActions.i18n.js
===================================================================
--- main/plugin-forms/resources/js/org/ametys/forms/FormsActions.i18n.js	(revision 37724)
+++ main/plugin-forms/resources/js/org/ametys/forms/FormsActions.i18n.js	(working copy)
@@ -30,7 +30,7 @@
     org.ametys.forms.ChooseForm.act(control, org.ametys.forms.buttons.Action.showSelectedForm);
 }
 
-org.ametys.forms.buttons.Action.exportSelectedForm = function (id, encodedLabel)
+org.ametys.forms.buttons.Action.exportSelectedForm = function (id, encodedLabel, label)
 {
 	if (id != null)
     {
@@ -41,7 +41,7 @@
     }
 }
 
-org.ametys.forms.buttons.Action.showSelectedForm = function(id, label)
+org.ametys.forms.buttons.Action.showSelectedForm = function(id, encodedLabel, label)
 {
 	org.ametys.uitool.ToolsManager.getInstance().openTool('uitool-form-entries', { id: id, label: label});
 }
@@ -209,8 +209,9 @@
         
         var formId = selection[0].id;
         var formEncodedLabel = selection[0].get('encodedName');
+        var formLabel = selection[0].get('name');
         
-        org.ametys.forms.ChooseForm._callback(formId, formEncodedLabel);
+        org.ametys.forms.ChooseForm._callback(formId, formEncodedLabel, formLabel);
     }
     else
     {
Index: main/plugin-forms/resources/js/org/ametys/forms/FormsEntriesActions.i18n.js
===================================================================
--- main/plugin-forms/resources/js/org/ametys/forms/FormsEntriesActions.i18n.js	(revision 0)
+++ main/plugin-forms/resources/js/org/ametys/forms/FormsEntriesActions.i18n.js	(revision 0)
@@ -0,0 +1,210 @@
+/*
+ *  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.
+ */
+
+Ext.namespace('org.ametys.forms.entry');
+
+/**
+ * Delete a form entry.
+ */
+org.ametys.forms.entry.DeleteEntry = function(controlId, controlConfiguration, controlPluginName)
+{
+    var targets = org.ametys.ribbon.RibbonManager.getInstance().getCurrentSelectionTargets();
+    var target = org.ametys.messagebus.message.MessageTargetHelper.findFirst(targets, function (target) { return target.getType() == 'form-entry'});
+    var ids = target.getParameters().ids || [];
+    var formId = target.getParameters().formId || "";
+    
+    if (ids.length &gt; 0)
+    {
+        Ext.Msg.confirm("<i18n:text i18n:key="PLUGINS_FORMS_DELETE_ENTRY_CONFIRM_TITLE"/>", 
+            "<i18n:text i18n:key="PLUGINS_FORMS_DELETE_ENTRY_CONFIRM"/>", 
+            function (answer) {
+                if (answer == 'yes')
+                {
+                    var serverMessage = new org.ametys.servercomm.ServerMessage(
+                        'forms',
+                        '/form/delete-entries',
+                        {siteName: context.parameters.siteName, formId: formId, ids: ids}, 
+                        org.ametys.servercomm.ServerComm.PRIORITY_MAJOR,
+                        org.ametys.forms.entry.DeleteEntry._deleteEntriesCb, 
+                        this, 
+                        [ids, formId]
+                    );
+                    org.ametys.servercomm.ServerComm.getInstance().send(serverMessage);
+                }
+            },
+            this
+        );
+    }
+}
+
+org.ametys.forms.entry.DeleteEntry._deleteEntriesCb = function(response, args)
+{
+    if (org.ametys.servercomm.ServerComm.handleBadResponse("<i18n:text i18n:key='PLUGINS_FORMS_DELETE_ENTRY_ERROR'/>", response, "org.ametys.forms.entry.DeleteEntry"))
+    {
+        return;
+    }
+    
+    var target = org.ametys.messagebus.bus.MessageBuilder.getInstance().createTarget("form-entry", {'ids':  args[0], 'formId': args[1]});
+    var message = org.ametys.messagebus.bus.MessageBuilder.getInstance().createMessage(org.ametys.ribbon.RibbonManager.EVENTTYPE_DELETED, null, [target]);
+    org.ametys.messagebus.MessageBus.getInstance().fireMessages([message]);
+}
+
+
+/**
+ * Clear all entries from a form.
+ */
+org.ametys.forms.entry.ClearEntries = function(controlId, controlConfiguration, controlPluginName)
+{
+    var targets = org.ametys.ribbon.RibbonManager.getInstance().getCurrentSelectionTargets();
+    var target = org.ametys.messagebus.message.MessageTargetHelper.findFirst(targets, function (target) { return target.getType() == 'form-entry'});
+    var formId = target.getParameters().formId || "";
+
+    Ext.Msg.confirm("<i18n:text i18n:key="PLUGINS_FORMS_CLEAR_ENTRIES_CONFIRM_TITLE"/>", 
+        "<i18n:text i18n:key="PLUGINS_FORMS_CLEAR_ENTRIES_CONFIRM"/>", 
+        function (answer) {
+            if (answer == 'yes')
+            {
+                var serverMessage = new org.ametys.servercomm.ServerMessage(
+                    'forms',
+                    '/form/clear-entries',
+                    {siteName: context.parameters.siteName, formId: formId}, 
+                    org.ametys.servercomm.ServerComm.PRIORITY_MAJOR,
+                    org.ametys.forms.entry.ClearEntries._clearEntriesCb, 
+                    this, 
+                    [formId]
+                );
+                org.ametys.servercomm.ServerComm.getInstance().send(serverMessage);
+            }
+        },
+        this
+    );
+}
+
+org.ametys.forms.entry.ClearEntries._clearEntriesCb = function(response, args)
+{
+    if (org.ametys.servercomm.ServerComm.handleBadResponse("<i18n:text i18n:key='PLUGINS_FORMS_CLEAR_ENTRIES_ERROR'/>", response, "org.ametys.forms.entry.ClearEntries"))
+    {
+        return;
+    }
+    
+    var target = org.ametys.messagebus.bus.MessageBuilder.getInstance().createTarget("form-entry", {'formId': args[0]});
+    var message = org.ametys.messagebus.bus.MessageBuilder.getInstance().createMessage(org.ametys.ribbon.RibbonManager.EVENTTYPE_DELETED, null, [target]);
+    org.ametys.messagebus.MessageBus.getInstance().fireMessages([message]);
+}
+
+/**
+ * View the SQL Request in a dialog box
+ */
+org.ametys.forms.entry.ViewRequest = function (controlId, controlConfiguration, controlPluginName)
+{
+    var targets = org.ametys.ribbon.RibbonManager.getInstance().getCurrentSelectionTargets();
+    var target = org.ametys.messagebus.message.MessageTargetHelper.findFirst(targets, function (target) { return target.getType() == 'form-entry'});
+    var formId = target.getParameters().formId || "";
+
+    if (formId != "")
+    {
+        var serverMessage = new org.ametys.servercomm.ServerMessage(
+            'forms',
+            '/form/entries-statement.xml',
+            {siteName: context.parameters.siteName, id: formId}, 
+            org.ametys.servercomm.ServerComm.PRIORITY_MAJOR,
+            org.ametys.forms.entry.ViewRequest._viewRequestCb,
+            this
+        );
+        org.ametys.servercomm.ServerComm.getInstance().send(serverMessage);
+    }
+}
+
+org.ametys.forms.entry.ViewRequest._viewRequestCb = function(response)
+{
+    if (org.ametys.servercomm.ServerComm.handleBadResponse("<i18n:text i18n:key='PLUGINS_FORMS_DELETE_ENTRY_ERROR'/>", response, "org.ametys.forms.entry.DeleteEntry"))
+    {
+        return;
+    }
+    
+    if (!org.ametys.forms.entry.ViewRequest.delayedInitialize())
+    {
+        return;
+    }
+    
+    org.ametys.forms.entry.ViewRequest.initDialog(response);
+    
+    org.ametys.forms.entry.ViewRequest._box.show();
+}
+
+org.ametys.forms.entry.ViewRequest.delayedInitialize = function ()
+{
+    if (org.ametys.forms.entry.ViewRequest._initialized)
+    {
+        return true;
+    }
+    
+    org.ametys.forms.entry.ViewRequest._form = new Ext.FormPanel({
+        width: 390,
+        labelWidth: 80,
+        bodyStyle: 'padding:5px',
+        
+        items: [
+            new org.ametys.form.TextField({
+                readOnly: true,
+                name: "tableName",
+                fieldLabel: "<i18n:text i18n:key="PLUGINS_FORMS_VIEW_REQUEST_DIALOG_TABLENAME_FIELD"/>",
+                width: 280
+            }),
+            new org.ametys.form.TextAreaField({
+                readOnly: true,
+                name: "request",
+                fieldLabel: "<i18n:text i18n:key="PLUGINS_FORMS_VIEW_REQUEST_DIALOG_REQUEST_FIELD"/>",
+                width: 280,
+                height: 120
+            })
+        ]
+    })
+    
+    org.ametys.forms.entry.ViewRequest._box = new org.ametys.DialogBox( {
+        title: "<i18n:text i18n:key="PLUGINS_FORMS_VIEW_REQUEST_DIALOG_TITLE"/>",
+        icon : getPluginResourcesUrl("forms") + "/img/view_request_16.png",
+
+        layout: 'fit',
+        width: 400,
+        height: 250,
+        autoScroll: false,
+        
+        items : [ org.ametys.forms.entry.ViewRequest._form ],
+        
+        closeAction: 'hide',
+        buttons : [{
+            text: "<i18n:text i18n:key="PLUGINS_FORMS_VIEW_REQUEST_DIALOG_BUTTON_OK"/>",
+            handler: function () {
+                org.ametys.forms.entry.ViewRequest._box.hide();
+            }
+        } ]
+    });
+    
+    org.ametys.forms.entry.ViewRequest._initialized = true;
+    
+    return true;
+    
+}
+
+org.ametys.forms.entry.ViewRequest.initDialog = function(response)
+{
+    var request = response.selectSingleNode("request");
+    var form = org.ametys.forms.entry.ViewRequest._form.getForm();
+    
+    form.findField("tableName").setValue(request.getAttribute('tableName'));
+    form.findField("request").setValue(request[org.ametys.servercomm.ServerComm.xmlTextContent]);
+}
Index: main/plugin-forms/resources/js/org/ametys/forms/FormsTool.i18n.js
===================================================================
--- main/plugin-forms/resources/js/org/ametys/forms/FormsTool.i18n.js	(revision 37724)
+++ main/plugin-forms/resources/js/org/ametys/forms/FormsTool.i18n.js	(working copy)
@@ -23,6 +23,9 @@
 
 Ext.extend(org.ametys.forms.tool.FormsTool, org.ametys.uitool.tool.Tool, {});
 
+//default pagination size
+org.ametys.forms.tool.FormsTool.PAGE_SIZE = 50;
+
 org.ametys.forms.tool.FormsTool.prototype.createPanel = function ()
 {	
 	var store = new Ext.data.ArrayStore({
@@ -30,12 +33,21 @@
 	    data: []
 	});
 	
+    this._pagingBar = new Ext.PagingToolbar({
+        pageSize: org.ametys.forms.tool.FormsTool.PAGE_SIZE,
+        store: store,
+        displayInfo: true,
+        displayMsg: "<i18n:text i18n:key="PLUGINS_FORMS_UITOOL_ENTRY_CONTENT_RESULT_1" i18n:catalogue="plugin.forms"/>{0}<i18n:text i18n:key="PLUGINS_FORMS_UITOOL_ENTRY_CONTENT_RESULT_2" i18n:catalogue="plugin.forms"/>{1}<i18n:text i18n:key="PLUGINS_FORMS_UITOOL_ENTRY_CONTENT_RESULT_3" i18n:catalogue="plugin.forms"/>{2}",
+        emptyMsg: "<i18n:text i18n:key="PLUGINS_FORMS_UITOOL_ENTRY_NO_RESULT" i18n:catalogue="plugin.forms"/>"
+    });
+    
 	this._resultGrid = new Ext.grid.GridPanel({
 		columns: [],
 		store: store,
 		cls: 'form-entries-grid',
         autoScroll: true,
-        region: 'center'
+        region: 'center',
+        bbar: this._pagingBar
 	});
 		
 	this._mainPanel = new Ext.Panel ({
@@ -46,15 +58,30 @@
 	});
 	
 	// Listeners
-	this._mainPanel.addListener('focus', this._onFocus, this);
+	this._mainPanel.addListener('focus', this._sendCurrentSelection, this);
+	this._resultGrid.getSelectionModel().addListener('selectionchange', this._sendCurrentSelection, this);
 	
 	return this._mainPanel;
 }
 
-org.ametys.forms.tool.FormsTool.prototype._onFocus = function ()
+org.ametys.forms.tool.FormsTool.prototype._sendCurrentSelection = function ()
+{
+    window.clearTimeout(this._sendTimeout);
+    this._sendTimeout = this._fireMessages.defer(10, this);
+}
+    
+org.ametys.forms.tool.FormsTool.prototype._fireMessages = function ()
 {
-	// Empty selection
-	var event = org.ametys.messagebus.bus.MessageBuilder.getInstance().createMessage(org.ametys.ribbon.RibbonManager.EVENTTYPE_SELECTIONCHANGED, null, []);
+    var sm = this._resultGrid.getSelectionModel();
+    var records = sm.getSelections();
+    var ids = [];
+    for (var i=0; i &lt; records.length; i++)
+    {
+        ids.push(records[i].data.entryId);
+    }
+    
+    var targets = org.ametys.messagebus.bus.MessageBuilder.getInstance().createTargets("form-entry", {'ids': ids, "formId": org.ametys.forms.tool.FormsTool._formId});
+    var event = org.ametys.messagebus.bus.MessageBuilder.getInstance().createMessage(org.ametys.ribbon.RibbonManager.EVENTTYPE_SELECTIONCHANGED, null, targets);
     org.ametys.messagebus.MessageBus.getInstance().fireMessages([event]);
 }
 
@@ -72,7 +99,7 @@
 	var serverMessage = new org.ametys.servercomm.ServerMessage(
 		'forms',
 		'/form/entries.xml',
-		{siteName: context.parameters.siteName, id: org.ametys.forms.tool.FormsTool._formId}, 
+		{siteName: context.parameters.siteName, id: org.ametys.forms.tool.FormsTool._formId, start: 0, limit: 0}, 
 		org.ametys.servercomm.ServerComm.PRIORITY_MAJOR,
 		this._displayFormEntries, 
 		this, 
@@ -81,6 +108,31 @@
 	org.ametys.servercomm.ServerComm.getInstance().send(serverMessage);
 }
 
+org.ametys.forms.tool.FormsTool.prototype.onMessage = function (messages)
+{
+    for (var i=messages.length - 1; i &gt;= 0; i--)
+    {
+        if (messages[i].getType().getName() == org.ametys.ribbon.RibbonManager.EVENTTYPE_DELETED)
+        {
+            var targets = messages[i].getTargets();
+            var allTargets = org.ametys.messagebus.message.MessageTargetHelper.findAll(targets, function(target) { return target.getType() == "form-entry";});
+
+            if (allTargets != null)
+            {
+                // Find all deleted contents
+                for (var j=0; j &lt; allTargets.length; j++)
+                {
+                    if (org.ametys.forms.tool.FormsTool._formId == allTargets[j].getParameters().formId)
+                    {
+                        this.refresh();
+                        return;
+                    }
+                }
+            }
+        }   
+    }
+}
+
 org.ametys.forms.tool.FormsTool.prototype._displayFormEntries = function(response, args)
 {
 	if (org.ametys.servercomm.ServerComm.handleBadResponse("<i18n:text i18n:key='PLUGINS_FORMS_CHOOSE_SHOW_FORM_ERROR'/>", response, "org.ametys.forms.tool.FormsTool"))
@@ -89,12 +141,14 @@
 	}
 	
 	var columns = this._getColumns(response);
-	var data = this._getEntries (response);
 	var fields = this._getFields (response);
 	        
-	var store = new Ext.data.ArrayStore({
+	var store = new Ext.data.XmlStore({
 	    fields: fields,
-	    data: data
+	    url: getPluginDirectUrl('forms') + '/form/entries.xml',
+	    record: 'entry',
+	    totalProperty: '@total',
+        baseParams: {siteName: context.parameters.siteName, id: org.ametys.forms.tool.FormsTool._formId}
 	});
 	
 	var colModel = new Ext.grid.ColumnModel({
@@ -107,62 +161,46 @@
 	
 	this._resultGrid.reconfigure(store, colModel);
 	this._resultGrid.autoExpandColumn = "submission-date";
-	
-	this.upToDate();
-}
-
-org.ametys.forms.tool.FormsTool.prototype._getEntries = function (response)
-{
-	var data = [];
+	this._pagingBar.bindStore(store);
 	
-	var entryNodes = response.selectNodes("form/entry");
-	for (var i=0; i &lt; entryNodes.length; i++)
-	{
-		var entryNode = entryNodes[i];
-		
-		var record = [];
-		record.push(entryNode.getAttribute("id")); // Entry id
-		record.push(entryNode.getAttribute("submission-date"))
-		
-		var values = entryNode.selectNodes("field")
-		for (var j=0; j &lt; values.length; j++)
-		{
-			record.push(values[j][org.ametys.servercomm.ServerComm.xmlTextContent]);
-		}
-		
-		data.push(record);
-	}
+	store.load({
+	    params: {
+	        start: 0, 
+	        limit: org.ametys.forms.tool.FormsTool.PAGE_SIZE
+	    }
+	});
 	
-	return data;
+	this.upToDate();
 }
 
 org.ametys.forms.tool.FormsTool.prototype._getFields = function (response)
 {
 	var fields = [];
 	
-	fields.push({'name': 'entryId', type: 'int'});
-	fields.push({'name': 'submission-date', type: 'date'});
+	fields.push({'name': 'entryId', type: 'int', mapping: '@id'});
+	fields.push({'name': 'submission-date', type: 'date', mapping: '@submission-date'});
 	
 	var columnNodes = response.selectNodes("form/columns/column");
 	for (var i=0; i &lt; columnNodes.length; i++)
 	{
 		var columnNode = columnNodes[i];
 		var regexptype = columnNode.getAttribute("regexptype");
+		var mapping = "field[id=" + columnNode.getAttribute("id") + "]";
 		if (regexptype == "int")
 		{
-			fields.push({'name': columnNode.getAttribute("id"), type: 'int'});
+			fields.push({'name': columnNode.getAttribute("id"), type: 'int', mapping: mapping});
 		}
 		else if (regexptype == "float")
 		{
-			fields.push({'name': columnNode.getAttribute("id"), type: 'float'});
+			fields.push({'name': columnNode.getAttribute("id"), type: 'float', mapping: mapping});
 		}
 		else if (regexptype == "date")
 		{
-			fields.push({'name': columnNode.getAttribute("id"), type: 'date'});
+			fields.push({'name': columnNode.getAttribute("id"), type: 'date', mapping: mapping});
 		}
 		else
 		{
-			fields.push({'name': columnNode.getAttribute("id")});
+			fields.push({'name': columnNode.getAttribute("id"), mapping: mapping});
 		}
 	}
 	
Index: main/plugin-forms/resources/js/org/ametys/forms/FormsToolFactory.js
===================================================================
--- main/plugin-forms/resources/js/org/ametys/forms/FormsToolFactory.js	(revision 37724)
+++ main/plugin-forms/resources/js/org/ametys/forms/FormsToolFactory.js	(working copy)
@@ -44,7 +44,19 @@
 	if (org.ametys.uitool.ToolsManager.getInstance().getTool(idTool) == null)
 	{
 		var tool = new org.ametys.forms.tool.FormsTool(idTool, this.getPluginName());
-		tool.setConfiguration(this._config);
+		
+		if (params.label)
+	    {
+		    var defaultTitle = this._config["title"];
+		    this._config["title"] = this._config["title"] + ": " + params.label;
+		    tool.setConfiguration(this._config);
+		    this._config["title"] = defaultTitle;
+	    }
+		else
+	    {
+		    tool.setConfiguration(this._config);
+	    }
+		
 		tool.setFactory(this);
 		
 		org.ametys.uitool.ToolsManager.getInstance().addUITool (tool, this._config['default-location']);
Index: main/plugin-forms/sitemap.xmap
===================================================================
--- main/plugin-forms/sitemap.xmap	(revision 37724)
+++ main/plugin-forms/sitemap.xmap	(working copy)
@@ -21,9 +21,11 @@
             <map:generator name="form-errors" src="org.ametys.plugins.forms.processing.FormErrorsGenerator" logger="org.ametys.plugins.forms.processing.FormErrorsGenerator"/>
             <map:generator name="form-entries" src="org.ametys.plugins.forms.data.FormEntriesGenerator" logger="org.ametys.plugins.forms.data.FormEntriesGenerator"/>
             <map:generator name="content-forms" src="org.ametys.plugins.forms.data.ContentFormsGenerator" logger="org.ametys.plugins.forms.data.ContentFormsGenerator"/>
+            <map:generator name="form-entries-statement" src="org.ametys.plugins.forms.data.FormEntriesStatementGenerator" logger="org.ametys.plugins.forms.data.FormEntriesStatementGenerator"/>
             
             <map:generator name="results" src="org.ametys.plugins.forms.processing.FormResultsGenerator" logger="org.ametys.plugins.forms.processing.FormResultsGenerator"/>
             <map:generator name="receipt" src="org.ametys.plugins.forms.processing.FormResultsGenerator" logger="org.ametys.plugins.forms.processing.FormResultsGenerator"/>
+
         </map:generators>
         
         <map:actions>
@@ -31,6 +33,7 @@
 
             <map:action name="process-form" src="org.ametys.plugins.forms.processing.ProcessFormAction" logger="org.ametys.plugins.forms.processing.ProcessFormAction"/>
             <map:action name="get-content" src="org.ametys.plugins.forms.processing.GetContentAction" logger="org.ametys.plugins.forms.processing.ProcessFormAction"/>
+            <map:action name="delete-form-entries" src="org.ametys.plugins.forms.DeleteFormEntriesAction" logger="org.ametys.plugins.forms.DeleteFormEntriesAction"/>
             
             <map:action name="set-header" src="org.apache.cocoon.acting.HttpHeaderAction"/>
         </map:actions>
@@ -159,6 +162,8 @@
                 <map:generate type="form-entries">
                     <map:parameter name="site" value="{request-param:siteName}"/>
                     <map:parameter name="id" value="{request-param:id}"/>
+                    <map:parameter name="start" value="{request-param:start}"/>
+                    <map:parameter name="limit" value="{request-param:limit}"/>
                 </map:generate>
                 <map:serialize type="xml"/>
             </map:match>
@@ -195,6 +200,34 @@
                     </map:read>
                 </map:act>
             </map:match>
+            
+            <map:match pattern="form/delete-entries">
+                <map:act type="delete-form-entries">
+                    <map:parameter name="mode" value="delete"/>
+
+                    <map:generate type="action-result" />
+                    <map:serialize type="xml"/>
+                </map:act>
+            </map:match>
+            
+            <map:match pattern="form/clear-entries">
+                <map:act type="delete-form-entries">
+                    <map:parameter name="mode" value="clear"/>
+
+                    <map:generate type="action-result" />
+                    <map:serialize type="xml"/>
+                </map:act>
+            </map:match>
+            
+            
+            <map:match pattern="form/entries-statement.xml">
+                <map:generate type="form-entries-statement">
+                    <map:parameter name="site" value="{request-param:siteName}"/>
+                    <map:parameter name="id" value="{request-param:id}"/>
+                </map:generate>
+                <map:serialize type="xml"/>
+            </map:match>
+            
         </map:pipeline>
 	</map:pipelines>
 </map:sitemap>
Index: main/plugin-forms/src/org/ametys/plugins/forms/DeleteFormEntriesAction.java
===================================================================
--- main/plugin-forms/src/org/ametys/plugins/forms/DeleteFormEntriesAction.java	(revision 0)
+++ main/plugin-forms/src/org/ametys/plugins/forms/DeleteFormEntriesAction.java	(revision 0)
@@ -0,0 +1,88 @@
+/*
+ *  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.
+ */
+package org.ametys.plugins.forms;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.acting.ServiceableAction;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Redirector;
+import org.apache.cocoon.environment.SourceResolver;
+import org.apache.commons.lang.StringUtils;
+
+import org.ametys.plugins.forms.jcr.FormPropertiesManager;
+import org.ametys.plugins.forms.table.FormTableManager;
+
+/**
+ * Action for deleting one, multiple or all entries for a form.
+ */
+public class DeleteFormEntriesAction extends ServiceableAction
+{
+    private FormPropertiesManager _formPropertiesManager;
+    private FormTableManager _formTableManager;
+    
+    @Override
+    public void service(ServiceManager serviceManager) throws ServiceException
+    {
+        super.service(serviceManager);
+        _formPropertiesManager = (FormPropertiesManager) serviceManager.lookup(FormPropertiesManager.ROLE);
+        _formTableManager = new FormTableManager();
+    }
+    
+    @Override
+    public Map<String, String> act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
+    {
+        Map<String, String> result = new HashMap<String, String>();
+        Map<String, Object> jsParameters = (Map<String, Object>) objectModel.get(ObjectModelHelper.PARENT_CONTEXT);
+
+        String mode = parameters.getParameter("mode");
+        String siteName = (String) jsParameters.get("siteName");
+        String formId = (String) jsParameters.get("formId");
+        
+        if (StringUtils.isEmpty(siteName) || StringUtils.isEmpty(formId))
+        {
+            throw new ProcessingException("The site name and form ID must be provided.");
+        }
+    
+        Form form = _formPropertiesManager.getForm(siteName, formId);
+        
+        if (form == null)
+        {
+            throw new ProcessingException("The form of ID '" + formId + " can't be found in the site '" + siteName + "'.");
+        }
+        
+        if (mode.equals("delete"))
+        {
+            List<Integer> entriesIds = (List<Integer>) jsParameters.get("ids");
+            for (Integer entryId : entriesIds)
+            {
+                _formTableManager.deleteSubmission(form, entryId);
+            }
+        }
+        else if (mode.equals("clear"))
+        {
+            _formTableManager.deleteSubmission(form, null);
+        }
+        
+        return result;
+    }
+}
Index: main/plugin-forms/src/org/ametys/plugins/forms/data/FormEntriesGenerator.java
===================================================================
--- main/plugin-forms/src/org/ametys/plugins/forms/data/FormEntriesGenerator.java	(revision 37724)
+++ main/plugin-forms/src/org/ametys/plugins/forms/data/FormEntriesGenerator.java	(working copy)
@@ -74,6 +74,8 @@
     {
         String siteName = parameters.getParameter("site", "");
         String formId = parameters.getParameter("id", "");
+        int start = parameters.getParameterAsInteger("start", 0);
+        int limit = parameters.getParameterAsInteger("limit", Integer.MAX_VALUE);
         
         if (StringUtils.isEmpty(siteName) || StringUtils.isEmpty(formId))
         {
@@ -90,13 +92,15 @@
             }
             
             Map<String, FieldValue> columns = _formTableManager.getColumns(form);
-            List<UserEntry> entries = _formTableManager.getSubmissions(form, columns);
+            List<UserEntry> entries = _formTableManager.getSubmissions(form, columns, start, limit);
+            int totalSubmissions = _formTableManager.getTotalSubmissions(form);
             
             contentHandler.startDocument();
             
             AttributesImpl atts = new AttributesImpl();
             atts.addCDATAAttribute("id", form.getId());
             atts.addCDATAAttribute("label", form.getLabel());
+            atts.addCDATAAttribute("total", String.valueOf(totalSubmissions));
             
             XMLUtils.startElement(contentHandler, "form", atts);
             
Index: main/plugin-forms/src/org/ametys/plugins/forms/data/FormEntriesStatementGenerator.java
===================================================================
--- main/plugin-forms/src/org/ametys/plugins/forms/data/FormEntriesStatementGenerator.java	(revision 0)
+++ main/plugin-forms/src/org/ametys/plugins/forms/data/FormEntriesStatementGenerator.java	(revision 0)
@@ -0,0 +1,93 @@
+package org.ametys.plugins.forms.data;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.generation.ServiceableGenerator;
+import org.apache.cocoon.xml.AttributesImpl;
+import org.apache.cocoon.xml.XMLUtils;
+import org.apache.commons.lang.StringUtils;
+import org.xml.sax.SAXException;
+
+import org.ametys.plugins.forms.Form;
+import org.ametys.plugins.forms.FormsException;
+import org.ametys.plugins.forms.jcr.FormPropertiesManager;
+import org.ametys.plugins.forms.table.FormTableManager;
+import org.ametys.runtime.util.I18nUtils;
+import org.ametys.runtime.util.I18nizableText;
+
+/**
+ * Generate the SQL statement for retrieving the form entries
+ */
+public class FormEntriesStatementGenerator extends ServiceableGenerator
+{
+    /** The form properties manager. */
+    protected FormPropertiesManager _formPropertiesManager;
+    
+    /** The form data manager. */
+    protected FormTableManager _formTableManager;
+
+    private I18nUtils _i18nUtils;
+    
+    @Override
+    public void service(ServiceManager serviceManager) throws ServiceException
+    {
+        super.service(serviceManager);
+        _formPropertiesManager = (FormPropertiesManager) serviceManager.lookup(FormPropertiesManager.ROLE);
+        _formTableManager = new FormTableManager();
+        _i18nUtils = (I18nUtils) serviceManager.lookup(I18nUtils.ROLE);
+    }
+    
+    @Override
+    public void generate() throws IOException, SAXException, ProcessingException
+    {
+        String siteName = parameters.getParameter("site", "");
+        String formId = parameters.getParameter("id", "");
+        
+        Form form;
+        try
+        {
+            form = _formPropertiesManager.getForm(siteName, formId);
+            
+            if (form == null)
+            {
+                throw new ProcessingException("The form of ID '" + formId + " can't be found in the site '" + siteName + "'.");
+            }
+            
+            contentHandler.startDocument();
+            
+            String tableName = FormTableManager.TABLE_PREFIX + form.getId();
+
+            AttributesImpl atts = new AttributesImpl();
+            atts.addCDATAAttribute("id", form.getId());
+            atts.addCDATAAttribute("tableName", tableName);
+            
+            List<String> selectClause = new ArrayList<String>();
+            
+            selectClause.add("id as Id");
+            selectClause.add("creationDate as '" + _i18nUtils.translate(new I18nizableText("plugin.forms", "PLUGINS_FORMS_CHOOSE_SHOW_FORM_SUBMISSION_DATE")) + "'");
+            
+            Map<String, FieldValue> columns = _formTableManager.getColumns(form);
+            for (FieldValue column : columns.values())
+            {
+                selectClause.add(column.getColumnName() + " as '" + column.getField().getLabel() + "'");
+            }
+
+            StringBuilder request = new StringBuilder();
+            request.append("SELECT ").append(StringUtils.join(selectClause, ", ")).append("\nFROM ").append(tableName).append(";");
+            
+            XMLUtils.createElement(contentHandler, "request", atts, request.toString());
+            contentHandler.endDocument();
+        }
+        catch (FormsException e)
+        {
+            getLogger().error("An error occurred while getting the results of a form.", e);
+            throw new ProcessingException("An error occurred while getting the results of a form.", e);
+        }
+    }
+}
Index: main/plugin-forms/src/org/ametys/plugins/forms/table/FormTableManager.java
===================================================================
--- main/plugin-forms/src/org/ametys/plugins/forms/table/FormTableManager.java	(revision 37724)
+++ main/plugin-forms/src/org/ametys/plugins/forms/table/FormTableManager.java	(working copy)
@@ -138,10 +138,12 @@
      * Get all the submissions for a form.
      * @param form the form object.
      * @param columns 
+     * @param offset The number of results to ignore.
+     * @param length The maximum number of results to return.
      * @return the list of submissions.
      * @throws FormsException if an error occurs.
      */
-    public List<UserEntry> getSubmissions(Form form, Map<String, FieldValue> columns) throws FormsException
+    public List<UserEntry> getSubmissions(Form form, Map<String, FieldValue> columns, int offset, int length) throws FormsException
     {
         List<UserEntry> entries = new ArrayList<UserEntry>();
         
@@ -159,6 +161,27 @@
             
             String request = "SELECT * FROM " + DbTypeHelper.escape(dbType, tableName);
             
+            // Limit the results
+            DatabaseType datatype = ConnectionHelper.getDatabaseType(con);
+            
+            if (datatype == DatabaseType.DATABASE_MYSQL || datatype == DatabaseType.DATABASE_POSTGRES || datatype == DatabaseType.DATABASE_HSQLDB)
+            {
+                request = request + " LIMIT " + length + " OFFSET " + offset;
+            }
+            else if (datatype == DatabaseType.DATABASE_ORACLE)
+            {
+                request = "select * from (select rownum r, " + DbTypeHelper.escape(dbType, tableName) + ".* from " + DbTypeHelper.escape(dbType, tableName) + ") where r BETWEEN " + (offset + 1) + " AND " + (offset + length);
+            }
+            else if (datatype == DatabaseType.DATABASE_DERBY)
+            {
+                request = "select * from (select ROW_NUMBER() OVER () AS ROWNUM, TR.* from " + DbTypeHelper.escape(dbType, tableName) 
+                    + " AS TR ) AS TRR where ROWNUM BETWEEN " + (offset + 1) + " AND " + (offset + length);
+            }
+            else if (__logger.isWarnEnabled())
+            {
+                __logger.warn("The request will not have the limit and offet set, since its type is unknown");
+            }
+            
             stmt = con.prepareStatement(request);
             
             // Execute the query.
@@ -247,6 +270,56 @@
     }
     
     /**
+     * Get the total count of submissions for a form.
+     * @param form the form object.
+     * @return the total count of submissions, or -1 if an error occurs.
+     * @throws FormsException if an error occurs.
+     */
+    public int getTotalSubmissions(Form form) throws FormsException
+    {
+        final String tableName = TABLE_PREFIX + form.getId();
+        
+        Connection con = null;
+        PreparedStatement stmt = null;
+        ResultSet rs = null;
+        
+        try
+        {
+            // Connect to the database.
+            con = ConnectionHelper.getConnection(ConnectionHelper.CORE_POOL_NAME);
+            DatabaseType dbType = ConnectionHelper.getDatabaseType(con);
+            
+            String request = "SELECT COUNT(*) FROM " + DbTypeHelper.escape(dbType, tableName);
+            
+            stmt = con.prepareStatement(request);
+            
+            // Execute the query.
+            rs = stmt.executeQuery();
+            
+            // Extract the result.
+            if (rs.next())
+            {
+                int count = rs.getInt(1);
+                return count;
+            }
+        }
+        catch (SQLException e)
+        {
+            __logger.error("Error while getting entries for table " + tableName, e);
+            throw new FormsException("Error while getting entries for table " + tableName, e);
+        }
+        finally
+        {
+            // Fermer les ressources de connexion
+            ConnectionHelper.cleanup(rs);
+            ConnectionHelper.cleanup(stmt);
+            ConnectionHelper.cleanup(con);
+        }
+        
+        return -1;
+    }
+    
+    /**
      * Form to tableinfo.
      * @param form the form.
      * @return the tableinfo.
@@ -846,6 +919,57 @@
         return sqlType;
     }
     
+
+    /**
+     * Delete the submission from a form.
+     * @param form the form object.
+     * @param entryId the entry to delete. If null, all the entries are deleted.
+     * @throws FormsException if an error occurs.
+     */
+    public void deleteSubmission(Form form, Integer entryId) throws FormsException
+    {
+        final String tableName = TABLE_PREFIX + form.getId();
+        
+        Connection con = null;
+        PreparedStatement stmt = null;
+        
+        try
+        {
+            // Connect to the database.
+            con = ConnectionHelper.getConnection(ConnectionHelper.CORE_POOL_NAME);
+            DatabaseType dbType = ConnectionHelper.getDatabaseType(con);
+            
+            String request = "DELETE FROM " + DbTypeHelper.escape(dbType, tableName);
+            
+            if (entryId != null)
+            {
+                request += " WHERE " + ID_FIELD + " = ?";
+            }
+            
+            stmt = con.prepareStatement(request);
+            
+            if (entryId != null)
+            {
+                stmt.setInt(1, entryId);
+            }
+            
+            // Execute the query.
+            stmt.executeUpdate();
+        }
+        catch (SQLException e)
+        {
+            __logger.error("Error while deleting entry for table " + tableName, e);
+            throw new FormsException("Error while deleting entry for table " + tableName, e);
+        }
+        finally
+        {
+            // Fermer les ressources de connexion
+            ConnectionHelper.cleanup(stmt);
+            ConnectionHelper.cleanup(con);
+        }
+    }
+    
+    
     /**
      * Class storing modifications to do on columns.
      */
Index: main/plugin-forms/stylesheets/docbook2html.xsl
===================================================================
--- main/plugin-forms/stylesheets/docbook2html.xsl	(revision 37724)
+++ main/plugin-forms/stylesheets/docbook2html.xsl	(working copy)
@@ -753,11 +753,6 @@
 	</xsl:template>
 	
 	<xsl:template match="html:captcha" mode="form-check">
-		reset("<xsl:value-of select="@id"/>", "captcha");
-		if (!/^[a-z]{6}$/.test($j("#<xsl:value-of select="@id"/>").attr('value')))
-		{
-			error("<xsl:value-of select="@id"/>", "captcha", "<i18n:text i18n:key="PLUGINS_FORMS_FORMS_RENDER_ERROR_CAPTCHA" i18n:catalogue="plugin.forms"/>");
-		}
 	</xsl:template>
 	
 	<xsl:template match="node()" mode="form-check">
