### Eclipse Workspace Patch 1.0
#P gn_svn
Index: web/geonetwork/WEB-INF/config.xml
===================================================================
--- web/geonetwork/WEB-INF/config.xml	(revision 1565)
+++ web/geonetwork/WEB-INF/config.xml	(working copy)
@@ -69,8 +69,8 @@
 			<name>main-db</name>
 			<provider>jeeves.resources.dbms.DbmsPool</provider>
 			<config>
-				<user>zZlngCjy</user>
-				<password>i719dYGY</password>
+				<user>o6lSk3f3</user>
+				<password>XJgOpmkt</password>
 				<driver>com.mckoi.JDBCDriver</driver>
 				<url>jdbc:mckoi://localhost:9157/</url>
 				<poolSize>10</poolSize>
@@ -292,6 +292,14 @@
 		<service name="xml.region.get">
 			<class name=".services.region.Get" />
 		</service>
+		
+		<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+		<!-- Selection search services for filtering -->
+
+		<service name="selection.search">
+			<class name=".services.main.SelectionSearch" />
+			<output forward="main.present.embedded" />
+		</service>
 
 		<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
 		<!-- Feedback services                                             -->
Index: web/geonetwork/WEB-INF/config-metadata.xml
===================================================================
--- web/geonetwork/WEB-INF/config-metadata.xml	(revision 1565)
+++ web/geonetwork/WEB-INF/config-metadata.xml	(working copy)
@@ -286,6 +286,14 @@
 
 			<output forward="main.present"/>
 		</service>
+		
+		<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+		
+		<service name="metadata.select">
+			<class name=".services.main.Select">
+				<param name="type" value="metadata" />
+			</class>
+		</service>
 
 		<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
 		<!-- Thumbnail services                                            -->
Index: web/geonetwork/xsl/search-results-xhtml.xsl
===================================================================
--- web/geonetwork/xsl/search-results-xhtml.xsl	(revision 1565)
+++ web/geonetwork/xsl/search-results-xhtml.xsl	(working copy)
@@ -38,6 +38,17 @@
 					&#160;
 					(page <xsl:value-of select="$currPage"/>/<xsl:value-of select="$pages"/>),
 <!--					<xsl:value-of select="/root/response/summary/@count"/>-->
+					&#160;
+                    <span id="nbselected">
+                        <xsl:choose>
+                            <xsl:when test="/root/response/@selected">
+                            <xsl:value-of select="/root/response/@selected"/> 
+                            </xsl:when>
+                            <xsl:otherwise>
+                            <xsl:value-of select="count(//geonet:info[selected='true'])"/> 
+                            </xsl:otherwise>                            
+                        </xsl:choose>
+                    </span> <xsl:value-of select="/root/gui/strings/selected"/> 
 				</xsl:with-param>
 				<xsl:with-param name="indent" select="50"/>
 			</xsl:call-template>
@@ -54,9 +65,6 @@
 				<xsl:with-param name="indent" select="50"/>
 			</xsl:call-template>
 
-			<!-- massive actions -->
-			<xsl:call-template name="massiveActions"/>
-
 			<tr><td class="blue-content" colspan="3"/></tr>
 		</table>
 	</xsl:template>
@@ -72,7 +80,7 @@
 			<td/>
 			<td class="padded-content">
 				<div class="results_title" style="float:left;">
-					<xsl:value-of select="$title"/>
+					<xsl:copy-of select="$title"/>
 					<xsl:if test="/root/response/summary/@count > 1">
 						&#xA0;<xsl:value-of select="/root/gui/strings/sortBy"/>&#xA0;
 						
@@ -94,6 +102,32 @@
 				<xsl:if test="/root/response/summary/@count > 0">
                    <!-- print pdf - - - - - - - - - - - - - - - - - - - - -->
                    <div style="float:right;">
+                    <xsl:value-of select="/root/gui/strings/select" />
+                    <a href="javascript:metadataselect(0, 'add-all')" title="{/root/gui/strings/selectAll}" alt="{/root/gui/strings/selectAll}">
+                    	<xsl:value-of select="/root/gui/strings/all"/>
+                    </a>
+					,
+					<a href="javascript:metadataselect(0, 'remove-all')" title="{/root/gui/strings/selectNone}" alt="{/root/gui/strings/selectNone}">
+                    	<xsl:value-of select="/root/gui/strings/none"/>
+                    </a>
+                    &#160;
+                    <!-- ==============================================  -->
+		            <!-- Add other actions list on selected metadata     -->
+		            <button id="oAcOs" name="oAcOs" class="content" onclick="actionOnSelect('{/root/gui/strings/noSelectedMd}')" style="width:220px;" title="{/root/gui/strings/otherActions}">
+		                <img id="oAcOsImg" name="oAcOsImg" src="{/root/gui/url}/images/plus.gif" style="padding-right:3px;"/>
+		                <xsl:value-of select="/root/gui/strings/actionOnSelect"/>
+		            </button>
+		
+		            <div id="oAcOsEle" name="oAcOsEle" class="oAcEle" style="display:none;" onClick="oActions('oAcOs');">
+                        <xsl:if test="/root/gui/services/service/@name='metadata.massiveDelete'">
+						  <button onclick="massiveDelete('{/root/gui/strings/confirmMassiveDelete}')">
+						  	<xsl:value-of select="/root/gui/strings/delete"/>
+						  </button>
+                        </xsl:if>
+						<button onclick="gn_filteredSearch()"><xsl:value-of select="/root/gui/strings/selectedOnly"/></button>
+		            </div>
+		            <!-- ==============================================  -->
+					&#160;
                     <a href="#" onclick="runPdfSearch();"><img align="absmiddle" src="{/root/gui/url}/images/pdf.gif" alt="{/root/gui/strings/savepdf}" title="{/root/gui/strings/savepdf}"/></a>
                    </div>
                 </xsl:if>			
@@ -194,6 +228,15 @@
 										<!-- Title -->
 										<td class="padded" colspan="2">
 											<h1 align="left">
+												<xsl:variable name="isSelected" select="$metadata/geonet:info/selected" />
+												<xsl:choose>
+													<xsl:when test="$isSelected='true'">	
+														<input class="content"  type="checkbox" id="chk{geonet:info/id}" name="chk{geonet:info/id}" onclick="javascript:metadataselect('{geonet:info/uuid}', this.checked)"  checked="true"/>
+													</xsl:when>
+													<xsl:otherwise>
+														<input class="content" type="checkbox" onclick="javascript:metadataselect('{geonet:info/uuid}', this.checked)"/>				
+													</xsl:otherwise>
+												</xsl:choose>
 												<a href="{/root/gui/locService}/remote.show?id={$metadata/geonet:info[server]/id}&amp;currTab=simple">
 													<xsl:value-of select="concat($metadata/geonet:info/id,' - ',$metadata/title)"/>
 												</a>
@@ -222,7 +265,16 @@
 										<!-- Title -->
 										<td class="padded" width="90%">
 											<h1 align="left">
-												<input id="selId" name="{$metadata/geonet:info/id}" type="checkbox" />
+												<xsl:variable name="isSelected" select="$metadata/geonet:info/selected" />
+												<xsl:choose>
+													<xsl:when test="$isSelected='true'">	
+														<input class="content"  type="checkbox" id="chk{geonet:info/id}" name="chk{geonet:info/id}" onclick="javascript:metadataselect('{geonet:info/uuid}', this.checked)"  checked="true"/>
+													</xsl:when>
+													<xsl:otherwise>
+														<input class="content" type="checkbox" onclick="javascript:metadataselect('{geonet:info/uuid}', this.checked)"/>				
+													</xsl:otherwise>
+												</xsl:choose>
+												<!-- <input id="selId" name="{$metadata/geonet:info/id}" type="checkbox" /> -->
 												<xsl:value-of select="$metadata/title"/>
 											</h1>
 										</td>
@@ -594,23 +646,6 @@
 			</xsl:call-template>
 		</xsl:if>
 	</xsl:template>
-		
-	<!-- ================================================================================== -->
-	<!-- massive actions -->
-	<!-- ================================================================================== -->
-
-	<xsl:template name="massiveActions">
-		<xsl:if test="/root/gui/services/service/@name='metadata.massiveDelete'">
-			<tr>
-				<td align="center" colspan="3" style="padding-bottom:4px;">
-					<xsl:value-of select="/root/gui/strings/massiveActions"/>
-					<button class="content" onclick="massiveDelete('{/root/gui/strings/confirmMassiveDelete}')">
-						<xsl:value-of select="/root/gui/strings/delete"/>
-					</button>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
 	
 	<!-- ================================================================================== -->
 
Index: src/org/fao/geonet/kernel/SelectionManager.java
===================================================================
--- src/org/fao/geonet/kernel/SelectionManager.java	(revision 0)
+++ src/org/fao/geonet/kernel/SelectionManager.java	(revision 0)
@@ -0,0 +1,296 @@
+package org.fao.geonet.kernel;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import jeeves.server.UserSession;
+import jeeves.server.context.ServiceContext;
+import org.fao.geonet.constants.Edit;
+import org.fao.geonet.constants.Geonet;
+import org.fao.geonet.constants.Params;
+import org.fao.geonet.kernel.search.LuceneSearcher;
+import org.jdom.Element;
+
+/**
+ * Manage objects selection for a user session	
+ */
+public class SelectionManager {
+
+	private Hashtable<String, Set<String>> selections = null;
+	private UserSession session = null;
+	
+	public static final String SELECTION_METADATA = "metadata";
+	
+	private static final String ADD_ALL_SELECTED     = "add-all";
+	private static final String REMOVE_ALL_SELECTED  = "remove-all";
+	private static final String ADD_SELECTED         = "add";
+	private static final String REMOVE_SELECTED      = "remove";
+	private static final String CLEAR_ADD_SELECTED   = "clear-add";
+
+	private SelectionManager(UserSession session) {
+		selections = new Hashtable<String, Set<String>>(0);
+
+		Set<String> MDSelection = Collections.synchronizedSet(new HashSet<String>(0));
+		selections.put(SELECTION_METADATA, MDSelection);
+		
+		this.session = session;
+	}
+	
+	/**
+	 * <p>
+	 * Update result elements to present </br>
+	 * <ul>
+	 * 	<li> set selected true if result element in session </li>
+	 * 	<li> set selected false if result element not in session </li>
+	 * </ul>
+	 * </p>
+	 * 
+	 * @param result the result modified<br/>
+	 * 
+	 * @see org.fao.geonet.services.main.Result<br/>
+	 */
+	public static void updateMDResult(UserSession session, Element result) {
+		  SelectionManager manager = getManager(session);
+		  List<Element> elList = result.getChildren();
+		  
+		  if (manager != null){
+			  
+			  	Set<String> selection = manager.getSelection(SELECTION_METADATA);
+				
+			  	for (Iterator<Element> iter = elList.iterator(); iter.hasNext();) {
+					Element element = (Element) iter.next();
+					if (element.getName().equals(Geonet.Elem.SUMMARY)) {
+						continue;
+					}
+					Element info = element.getChild(Edit.RootChild.INFO, Edit.NAMESPACE);
+					String uuid = info.getChildText(Edit.Info.Elem.UUID);
+					if (selection.contains(uuid)) {
+						info.addContent(new Element(Edit.Info.Elem.SELECTED).setText("true"));
+					} else { 
+						info.addContent(new Element(Edit.Info.Elem.SELECTED).setText("false"));
+					}
+				}
+				result.setAttribute(Edit.Info.Elem.SELECTED,Integer.toString(selection.size()));				
+			} else {
+				for (Iterator<Element> iter = elList.iterator(); iter.hasNext();) {
+					Element element = (Element) iter.next();
+					Element info = element.getChild(Edit.RootChild.INFO, Edit.NAMESPACE);
+					info.addContent(new Element(Edit.Info.Elem.SELECTED).setText("false"));
+				}
+				result.setAttribute(Edit.Info.Elem.SELECTED,Integer.toString(0));
+			}
+	}
+	
+	
+	/**
+	 * <p>
+	 * Update selected element in session
+	 * <ul>
+	 *  <li>[selected=true] : add selected element</li> 
+	 *  <li>[selected=false] : remove non selected element</li>
+	 *  <li>[selected=all] : select all elements</li> 
+	 *  <li>[selected=none] : clear the selection</li>
+	 *  <li>[selected=single] : clear the selection and add selected element</li>
+	 * </ul>
+	 * </p> 
+	 * 
+	 * @param type The type of selected element handled in session 
+	 * @param session Current session
+	 * @param params Parameters
+	 * @param context 
+	 * 
+	 * @return number of selected elements
+	 */
+	public static int updateSelection(String type, UserSession session, Element params, ServiceContext context) {
+		
+		// Get ID of the selected/deselected metadata
+		String paramid = params.getChildText(Params.ID);
+		String selected = params.getChildText(Params.SELECTED);
+		
+		// Get the selection manager or create it
+		SelectionManager manager = getManager(session);
+		if (manager == null) { 
+			manager = new SelectionManager(session);
+			session.setProperty(Geonet.Session.SELECTED_RESULT, manager);
+		}
+
+		return manager.updateSelection( type, context, selected, paramid);
+	}
+
+	/**
+	 * <p>
+	 * Update selected element in session
+	 * </p>
+	 * 
+	 * @param type The type of selected element handled in session 
+	 * @param selected true, false, single, all, none
+	 * @param paramid id of the selected element
+	 * 
+	 * @return number of selected element
+	 */
+	public int updateSelection(String type, ServiceContext context, String selected, String paramid ) {
+		
+		// Get the selection manager or create it
+		Set<String> selection = this.getSelection(type);
+		if (selection == null){
+			this.selections.put(type, Collections.synchronizedSet(new HashSet<String>()));
+		}
+		if (selected != null){
+			if (selected.equals(ADD_ALL_SELECTED))
+				this.selectAll(type, context);
+			else
+			if (selected.equals(REMOVE_ALL_SELECTED))
+				this.close(type);
+			else
+			if (selected.equals(ADD_SELECTED) && (paramid != null))
+				selection.add(paramid);
+			else
+			if (selected.equals(REMOVE_SELECTED) && (paramid != null))
+				selection.remove(paramid);
+			else
+			if (selected.equals(CLEAR_ADD_SELECTED) && (paramid != null)){
+				this.close(type);
+				selection.add(paramid);
+			}
+		}
+		
+		// Remove empty/null element from the selection
+		for (Iterator iter = selection.iterator(); iter.hasNext();) {
+			Object element = (Object) iter.next();
+			if (element == null)
+				iter.remove();
+		}
+		
+		return selection.size();
+	}
+	
+	
+	/**
+	 * <p>
+	 * Gets selection manager in session, if null creates it
+	 * </p>
+	 * 
+	 * @param session Current user session
+	 * @return selection manager
+	 */
+	public static SelectionManager getManager(UserSession session){
+		SelectionManager manager = (SelectionManager) session.getProperty(Geonet.Session.SELECTED_RESULT);
+		if ( manager == null ){
+			manager = new SelectionManager(session);
+			session.setProperty(Geonet.Session.SELECTED_RESULT, manager);
+		}
+		return manager; 		
+	}
+
+	
+	/**
+	 * <p>
+	 * Select all element
+	 * </p>
+	 * 
+	 * @param type
+	 * @param context
+	 * 
+	 */
+	public void selectAll(String type, ServiceContext context){
+		Set<String> selection = selections.get(type);
+		
+		if (selection != null) 
+			selection.clear();
+
+		if (type.equals(SELECTION_METADATA)){
+			LuceneSearcher searcher = (LuceneSearcher)session.getProperty(Geonet.Session.SEARCH_RESULT);
+			Element ht;
+			try {
+				ht = searcher.getAll();
+
+				List<Element> elList = ht.getChildren();
+
+				for (Iterator<Element> iter = elList.iterator(); iter.hasNext();) {
+					Element element = (Element) iter.next();
+					Element info = element.getChild(Edit.RootChild.INFO, Edit.NAMESPACE);
+					String UUID = info.getChildText(Edit.Info.Elem.UUID);
+					
+					if (UUID == null) 
+						continue;
+					
+					selection.add(UUID);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	/**
+	 * <p>
+	 * Close the current selection manager for the given element type
+	 * </p>
+	 * 
+	 * @param type
+	 */
+	public void close(String type) {
+			Set<String> selection = selections.get(type);
+			if (selection != null)	selection.clear();
+	}
+	
+	/**
+	 * <p>
+	 * Close the current selection manager
+	 * </p>
+	 * 
+	 * @param type
+	 */
+	public void close() {
+			for (Iterator iter = selections.values().iterator(); iter.hasNext();) {
+				Set<String> selection = (Set<String>) iter.next();
+				selection.clear();
+			}
+	}
+
+	/**
+	 * <p>
+	 * Gets selection for given element type
+	 * </p>
+	 * 
+	 * @param type The type of selected element handled in session
+	 * 
+	 * @return Set<String>
+	 */
+	public Set<String> getSelection(String type) {
+		return selections.get(type);
+	}
+	
+	/**
+	 * <p>
+	 * Add new element to the selection
+	 * </p>
+	 * 
+	 * @param type The type of selected element handled in session
+	 * @param uuid Element identifier to select
+	 * 
+	 * @return boolean
+	 */
+	public boolean addSelection(String type, String uuid) {
+		return selections.get(type).add(uuid);
+	}
+
+	/**
+	 * <p>
+	 * Add a collection to the selection
+	 * </p>
+	 * 
+	 * @param type The type of selected element handled in session
+	 * @param uuids Collection of uuids to select
+	 * 
+	 * @return boolean
+	 */
+	public boolean addAllSelection(String type, Set<String> uuids) {
+		return selections.get(type).addAll(uuids);
+	}
+	
+}
Index: src/org/fao/geonet/services/metadata/MassiveDelete.java
===================================================================
--- src/org/fao/geonet/services/metadata/MassiveDelete.java	(revision 1565)
+++ src/org/fao/geonet/services/metadata/MassiveDelete.java	(working copy)
@@ -26,6 +26,7 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.util.Iterator;
 
 import jeeves.constants.Jeeves;
 import jeeves.exceptions.OperationNotAllowedEx;
@@ -41,6 +42,7 @@
 import org.fao.geonet.kernel.AccessManager;
 import org.fao.geonet.kernel.DataManager;
 import org.fao.geonet.kernel.MdInfo;
+import org.fao.geonet.kernel.SelectionManager;
 import org.fao.geonet.kernel.mef.MEFLib;
 import org.fao.geonet.kernel.search.MetaSearcher;
 import org.fao.geonet.lib.Lib;
@@ -69,11 +71,13 @@
 		UserSession   session   = context.getUserSession();
 
 		Dbms dbms = (Dbms) context.getResourceManager().open(Geonet.Res.MAIN_DB);
-
-		for (Object o : params.getChildren("id"))
-		{
-			String id = ((Element) o).getText();
-
+		
+		context.info("Get selected metadata");
+		SelectionManager sm = SelectionManager.getManager(session) ;
+		
+		for (Iterator<String> iter = sm.getSelection("metadata").iterator(); iter.hasNext();) {
+			String uuid = (String) iter.next();
+			String id   = dataMan.getMetadataId(dbms, uuid);
 			context.info("Deleting metadata with id:"+ id);
 
 			//-----------------------------------------------------------------------
Index: src/org/fao/geonet/kernel/search/LuceneSearcher.java
===================================================================
--- src/org/fao/geonet/kernel/search/LuceneSearcher.java	(revision 1565)
+++ src/org/fao/geonet/kernel/search/LuceneSearcher.java	(working copy)
@@ -42,6 +42,7 @@
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
+import org.apache.lucene.index.CorruptIndexException;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.BooleanClause;
@@ -549,6 +550,40 @@
 		md.addContent(info);
 		return md;
 	}
+
+	/**
+	 * <p>
+	 * Gets results in current searcher
+	 * </p>
+	 * 
+	 * @return current searcher result in "fast" mode
+	 * 
+	 * @throws IOException 
+	 * @throws CorruptIndexException 
+	 */
+	public Element getAll() throws CorruptIndexException, IOException {
+		Element response = new Element("response");
+        if (_hits.length() == 0) {
+            response.setAttribute("from", 0 + "");
+            response.setAttribute("to", 0 + "");
+            return response;
+        }
+
+        response.setAttribute("from", 1 + "");
+        response.setAttribute("to", _hits.length() + "");
+
+        for (int i = 0; i < _hits.length(); i++) {
+            Document doc = _hits.doc(i);
+            String id = doc.get("_id");
+
+            // FAST mode
+            Element md = getMetadataFromIndex(doc, id);
+            response.addContent(md);
+        }
+        
+        return response;
+	}
+	
 }
 
 //==============================================================================
Index: web/geonetwork/geonetwork.css
===================================================================
--- web/geonetwork/geonetwork.css	(revision 1565)
+++ web/geonetwork/geonetwork.css	(working copy)
@@ -401,6 +401,33 @@
 }
 
 /*******************************************************************************
+Other action buttons
+*******************************************************************************/
+
+.oAcEle {
+    border: 1px solid #266397;
+    background-color: #e7e7e7;
+    position: absolute;
+    opacity: .9;
+    filter: alpha(opacity=90);
+    -moz-opacity: 0.9;
+}
+
+.oAcEle button {
+    text-align:left;
+    font-family: Verdana;
+    color: #064377;
+    font-size: 9pt;
+    cursor: pointer;
+    cursor: hand;
+    width:90%;
+    border-width: 0px;
+}
+.oAcEle button:hover {
+	text-decoration: underline;
+}
+
+/*******************************************************************************
 Ajax Keyword list
 *******************************************************************************/
 div.keywordSelectorFrame {
Index: web/geonetwork/xml/search/lucene.xsl
===================================================================
--- web/geonetwork/xml/search/lucene.xsl	(revision 1565)
+++ web/geonetwork/xml/search/lucene.xsl	(working copy)
@@ -277,6 +277,14 @@
 			</BooleanClause>
 		</xsl:if>
 
+		<!-- uuid -->
+		<xsl:if test="string(/request/uuid) !=''">
+			<xsl:call-template name="textField">
+				<xsl:with-param name="expr" select="/request/uuid"/>
+				<xsl:with-param name="field" select="'_uuid'"/>
+			</xsl:call-template>
+		</xsl:if>
+		
 		<!-- site id -->
 		<xsl:if test="string(/request/siteId)!=''">
 			<BooleanClause required="true" prohibited="false">
Index: web/geonetwork/xsl/main.xsl
===================================================================
--- web/geonetwork/xsl/main.xsl	(revision 1565)
+++ web/geonetwork/xsl/main.xsl	(working copy)
@@ -95,7 +95,7 @@
 			<td class="padded-content" width="{$indent}"/>
 			<td class="dots"/>
 			<td class="padded-content">
-				<h1><xsl:value-of select="$title"/></h1>
+				<h1><xsl:copy-of select="$title"/></h1>
 			</td>
 		</tr>
 	</xsl:template>
Index: web/geonetwork/loc/de/xml/strings.xml
===================================================================
--- web/geonetwork/loc/de/xml/strings.xml	(revision 1565)
+++ web/geonetwork/loc/de/xml/strings.xml	(working copy)
@@ -80,11 +80,13 @@
 	<about>Über</about>
 	<abstract>Kurzübersicht</abstract>
 	<accept>Abschicken</accept>
+	<actionOnSelect>Actions on selected metadata</actionOnSelect>
 	<add>hinzufügen</add>
 	<addNewMetadata>Neue Metadaten</addNewMetadata>
 	<admin>Administration</admin>
 	<Administrator>Administrator</Administrator>
 	<agrovocKeyword>Agrovoc Schlüsselwörter</agrovocKeyword>
+	<all>all</all>
 	<any>- Alle -</any>
 	<anytime>zu jeder Zeit</anytime>
 	<appSchInfoTab>App. Schema</appSchInfoTab>
@@ -329,6 +331,7 @@
 	<noInfo>Entschuldigung, keine Informationen verfügbar</noInfo>
 	<noLogin>Sie sind nicht angemeldet</noLogin>
 	<northbc>nördliche Grenzkoordinate</northbc>
+	<noSelectedMd>No metadata selected! Please at least select one before select an action.</noSelectedMd>
 	<online>Interaktive Karte</online>
 	<onlink>Online Linkage</onlink>
 	<opensearch>GeoNetwork opensearch service allow search to be made into the metadata catalog.</opensearch>
@@ -417,6 +420,11 @@
 	<searchAllText>Was?</searchAllText>
 	<searchUnused>Suche nach nicht benutzen oder leeren Metadaten</searchUnused>
 	<searchUnusedTitle>Suche nach unbenutzten</searchUnusedTitle>
+	<select>Select : </select>
+	<selectAll>Select all metadata</selectAll>
+	<selected> selected</selected>
+	<selectedOnly>Display selected only</selectedOnly>
+	<selectNone>Unselect metadata selected</selectNone>
 	<server>Server</server>
 	<setAll>Alle setzen</setAll>
 	<show>Metadaten</show>
Index: web/geonetwork/loc/ar/xml/strings.xml
===================================================================
--- web/geonetwork/loc/ar/xml/strings.xml	(revision 1565)
+++ web/geonetwork/loc/ar/xml/strings.xml	(working copy)
@@ -6,12 +6,14 @@
 	<about>عن البرنامج</about>
 	<abstract>مقدمة</abstract>
 	<accept>قبول</accept>
+	<actionOnSelect>Actions on selected metadata</actionOnSelect>
 	<add>إضافة</add>
 	<addNewMetadata>بيانات أساسية Metadata جديدة</addNewMetadata>
 	<address>Address</address>
 	<admin>إدارة موقع</admin>
 	<Administrator>مدير موقع</Administrator>
 	<agrovocKeyword>دوال أجروفوك</agrovocKeyword>
+	<all>all</all>
 	<any>- أي من -</any>
  <anytime>Anytime</anytime>
 	<ar>عربي</ar> <!-- Do not translate! -->
@@ -308,6 +310,7 @@
 	<noInfo>عفواً، لا توجد معلومات متوفرة</noInfo>
 	<noLogin>لم تتمكن من الدخول</noLogin>
 	<northbc>الاحداثيات الشمالية</northbc>
+	<noSelectedMd>No metadata selected! Please at least select one before select an action.</noSelectedMd>
 <!--  <nteaphome>موقع مشروع البيئة الاقليمي</nteaphome> -->
 	<online>خريطة تفاعلية</online>
 	<onlink>روابط حية</onlink>
@@ -403,6 +406,11 @@
 	<searchAllText>كتابة حرة</searchAllText>
 	<searchUnused>بحث عن بيانات اساسية Metadata خالية</searchUnused>
 	<searchUnusedTitle>Search for Unused</searchUnusedTitle>
+	<select>Select : </select>
+	<selectAll>Select all metadata</selectAll>
+	<selected> selected</selected>
+	<selectedOnly>Display selected only</selectedOnly>
+	<selectNone>Unselect metadata selected</selectNone>
 	<selection>Selection</selection>
 	<server>مخدم</server>
 	<setAll>Set All</setAll>
Index: src/org/fao/geonet/services/main/Select.java
===================================================================
--- src/org/fao/geonet/services/main/Select.java	(revision 0)
+++ src/org/fao/geonet/services/main/Select.java	(revision 0)
@@ -0,0 +1,51 @@
+package org.fao.geonet.services.main;
+
+import jeeves.constants.Jeeves;
+import jeeves.interfaces.Service;
+import jeeves.server.ServiceConfig;
+import jeeves.server.UserSession;
+import jeeves.server.context.ServiceContext;
+import jeeves.utils.Util;
+
+import org.fao.geonet.constants.Params;
+import org.fao.geonet.kernel.SelectionManager;
+import org.jdom.Element;
+
+/**
+ * Select a list of elements stored in session
+ * Returns status 
+ */
+
+public class Select implements Service {
+	
+	String init_type;
+	
+	public void init(String appPath, ServiceConfig params) throws Exception {
+		init_type = params.getValue(Params.TYPE);
+	}
+
+	// --------------------------------------------------------------------------
+	// ---
+	// --- Service
+	// ---
+	// --------------------------------------------------------------------------
+
+	public Element exec(Element params, ServiceContext context)
+			throws Exception {
+		
+		String type = Util.getParam(params, Params.TYPE, init_type );
+		
+		// Get the selection manager
+		UserSession session = context.getUserSession();
+		int nbSelected = SelectionManager.updateSelection(type, session, params, context);
+		
+		// send ok
+		Element response = new Element(Jeeves.Elem.RESPONSE);
+		response.addContent(new Element("Selected").setText(""+nbSelected));		
+
+		return response;
+	}
+}
+
+// =============================================================================
+
Index: web/geonetwork/scripts/gn_search.js
===================================================================
--- web/geonetwork/scripts/gn_search.js	(revision 1565)
+++ web/geonetwork/scripts/gn_search.js	(working copy)
@@ -527,6 +527,19 @@
 	);
 }
 
+function gn_filteredSearch() 
+{
+	var myAjax = new Ajax.Request(
+		getGNServiceURL('selection.search'), 
+		{
+			method: 'get',
+			parameters: '',
+			onSuccess: gn_search_complete,
+			onFailure: gn_search_error
+		}
+	);
+}
+
 function gn_searchpdf(pars) 
 {
     pars = pars.replace(/hitsPerPage=\d{2,3}/, 'hitsPerPage=9999'); 
@@ -825,4 +838,72 @@
 	xfrom.value = fromdate;
 }
 
+
+
+/**********************************************************
+***
+***		METADATA SELECT
+***
+**********************************************************/
+
+
+/*
+ *Check and uncheck selected metadata
+ */
+function check() {
+	var checks = $('search-results-content').getElementsByTagName('INPUT');
+	var checksLength = checks.length;				
+	for (var i = 0; i < checksLength; i++) {
+		checks[i].checked = true;
+	}
+}
+
+function uncheck() {
+	var checks = $('search-results-content').getElementsByTagName('INPUT');
+	var checksLength = checks.length;				
+	for (var i = 0; i < checksLength; i++) {
+		checks[i].checked = false;
+	}
+}
+
+function metadataselect(id, selected){
+	if (selected===true)
+		selected='add';
+	else if (selected===false)
+		selected='remove';
+	var param = 'id='+id+'&selected='+selected;
+	var http = new Ajax.Request(
+		Env.locService +'/'+ 'metadata.select',
+		{
+			method: 'get',
+			parameters: param,
+			onComplete: function(originalRequest){
+				// console.log('onComplete');
+			},
+			onLoaded: function(originalRequest){
+				// console.log('onLoaded');
+			},
+			onSuccess: function(originalRequest){
+				var xmlString = originalRequest.responseText;
+				
+				// convert the string to an XML object
+				var xmlobject = (new DOMParser()).parseFromString(xmlString, "text/xml");
+				// get the XML root item
+				var root = xmlobject.getElementsByTagName('response')[0];
+				var nbSelected = root.getElementsByTagName('Selected')[0].firstChild.nodeValue;
+				var item = document.getElementById('nbselected');
+				item.innerHTML = nbSelected;
+		},
+		onFailure: function(originalRequest){
+			alert('ERROR JAVASCRIPT metadata.select ');
+		}
+	});
+	if (selected=='remove-all') {
+		uncheck();
+	};
+	if (selected=='add-all') {
+		check();
+	};
+}
+
 /*** EOF ***********************************************************/
\ No newline at end of file
Index: web/geonetwork/xsl/header.xsl
===================================================================
--- web/geonetwork/xsl/header.xsl	(revision 1565)
+++ web/geonetwork/xsl/header.xsl	(working copy)
@@ -41,6 +41,8 @@
 			Env.locUrl    = "<xsl:value-of select="/root/gui/locUrl"/>";
 			Env.url       = "<xsl:value-of select="/root/gui/url"/>";
 			Env.lang      = "<xsl:value-of select="/root/gui/language"/>";
+			var on        = "<xsl:value-of select="/root/gui/url"/>/images/plus.gif";
+            var off       = "<xsl:value-of select="/root/gui/url"/>/images/minus.png";
 			
 			<xsl:if test="//service/@name = 'main.home'">
             document.onkeyup = alertkey;
Index: src/org/fao/geonet/constants/Geonet.java
===================================================================
--- src/org/fao/geonet/constants/Geonet.java	(revision 1565)
+++ src/org/fao/geonet/constants/Geonet.java	(working copy)
@@ -114,6 +114,7 @@
 		public static final String METADATA_SHOW			= "metadata.show";
 		public static final String METADATA_POSITION  = "metadata.position";
 		public static final String SEARCH_KEYWORDS_RESULT	= "search.keywords.result";
+		public static final String SELECTED_RESULT          = "selected.result";
 	}
 
 	//--------------------------------------------------------------------------
@@ -296,6 +297,10 @@
          * or {@value org.fao.geonet.constants.Geonet.Text#OFF} */
         public static final String INTERMAP      = "intermap";
 
+        /** Parameter name: {@value #UUID} - Text field that search 
+         * for specific uuid given */
+        public static final String UUID = "uuid";
+
 		//-----------------------------------------------------------------------
 
 		public class Relation
Index: web/geonetwork/loc/fr/xml/strings.xml
===================================================================
--- web/geonetwork/loc/fr/xml/strings.xml	(revision 1565)
+++ web/geonetwork/loc/fr/xml/strings.xml	(working copy)
@@ -110,11 +110,13 @@
 	<about>A propos</about>
 	<abstract>Résumé</abstract>
 	<accept>Accepter</accept>
+	<actionOnSelect>Actions sur les métadonnées selectionnées</actionOnSelect>
 	<add>Ajouter</add>
 	<addNewMetadata>Créer une nouvelle fiche de métadonnées</addNewMetadata>
 	<admin>Administration</admin>
 	<Administrator>Administrateur</Administrator>
 	<agrovocKeyword>Mots clés Agrovoc</agrovocKeyword>
+	<all>Tout</all>
 	<any>- Tous -</any>
 	<anytime>N'importe quand</anytime>
 	<appSchInfoTab>Schéma d'application</appSchInfoTab>
@@ -377,6 +379,7 @@
 	<noInfo>Désolé, pas d'information disponible</noInfo>
 	<noLogin>Vous n'étes pas connecté.</noLogin>
 	<northbc>Coordonnée nord de l'emprise</northbc>
+	<noSelectedMd>No metadata selected! Please at least select one before select an action.</noSelectedMd>
 	<online>Carte interactive</online>
 	<onlink>Liens</onlink>
 	<operation>Opération</operation>
@@ -464,6 +467,11 @@
 	<searchAllText>Partout</searchAllText>
 	<searchUnused>Rechercher des métadonnées vides ou non utilisées</searchUnused>
 	<searchUnusedTitle>Métadonnées inutilisées</searchUnusedTitle>
+	<select>Select : </select>
+	<selectAll>Select all metadata</selectAll>
+	<selected> selected</selected>
+	<selectedOnly>Display selected only</selectedOnly>
+	<selectNone>Unselect metadata selected</selectNone>
 	<server>Serveur</server>
 	<setAll>Set All</setAll>
 	<show>Métadonnées</show>
Index: web/geonetwork/loc/es/xml/strings.xml
===================================================================
--- web/geonetwork/loc/es/xml/strings.xml	(revision 1565)
+++ web/geonetwork/loc/es/xml/strings.xml	(working copy)
@@ -120,7 +120,9 @@
 	<admin>Administrador</admin>
 	<Administrator>Administrador</Administrator>
 	<accept>Aceptar </accept>
+	<actionOnSelect>Actions on selected metadata</actionOnSelect>
 	<agrovocKeyword>Palabras del Diccionario de Agrovoc</agrovocKeyword>
+	<all>all</all>
 	<any>- Cualquiera -</any>
 	<anytime>Cualquier momento</anytime>
 	<appSchInfoTab>Perfil de aplicación</appSchInfoTab>
@@ -367,6 +369,7 @@
 	<noLogin>No está identificado como usuario</noLogin>
 	<none>nada</none>
 	<northbc>Coordenada Norte</northbc>
+	<noSelectedMd>No metadata selected! Please at least select one before select an action.</noSelectedMd>
 	<online>Mapa Interactivo</online>
 	<onlink>Recurso en línea</onlink>
 	<operation>Opciones</operation>
@@ -452,6 +455,11 @@
 	<searchText>¿Qué? (Texto)</searchText>
 	<searchAllText>¿Qué? (Texto)</searchAllText>
 	<searchUnused>Búsqueda de metadatos vacíos o que no han sido usados nunca</searchUnused>
+	<select>Select : </select>
+	<selectAll>Select all metadata</selectAll>
+	<selected> selected</selected>
+	<selectedOnly>Display selected only</selectedOnly>
+	<selectNone>Unselect metadata selected</selectNone>
 	<server>Servidor</server>
 	<setAll>Establecer todos</setAll>
 	<show>Página de Metadatos</show>
Index: web/geonetwork/loc/en/xml/strings.xml
===================================================================
--- web/geonetwork/loc/en/xml/strings.xml	(revision 1565)
+++ web/geonetwork/loc/en/xml/strings.xml	(working copy)
@@ -86,11 +86,13 @@
 	<about>About</about>
 	<abstract>Abstract</abstract>
 	<accept>Accept</accept>
+	<actionOnSelect>Actions on selected metadata</actionOnSelect>
 	<add>add</add>
 	<addNewMetadata>Add new metadata</addNewMetadata>
 	<admin>Administration</admin>
 	<Administrator>Administrator</Administrator>
 	<agrovocKeyword>Agrovoc Keywords</agrovocKeyword>
+	<all>all</all>
 	<any>- Any -</any>
 	<anytime>Anytime</anytime>
 	<appSchInfoTab>App. schema</appSchInfoTab>
@@ -347,6 +349,7 @@
 	<noInfo>Sorry, no info available</noInfo>
 	<noLogin>You are not logged in</noLogin>
 	<northbc>North Bounding Coordinate</northbc>
+	<noSelectedMd>No metadata selected! Please at least select one before select an action.</noSelectedMd>
 	<online>Interactive map</online>
 	<onlink>Online Linkage</onlink>
 	<opensearch>GeoNetwork opensearch service allow search to be made into the metadata catalog.</opensearch>
@@ -435,6 +438,11 @@
 	<searchAllText>What?</searchAllText>
 	<searchUnused>Search for unused or empty metadata</searchUnused>
 	<searchUnusedTitle>Search for Unused</searchUnusedTitle>
+	<select>Select : </select>
+	<selectAll>Select all metadata</selectAll>
+	<selected> selected</selected>
+	<selectedOnly>Display selected only</selectedOnly>
+	<selectNone>Unselect metadata selected</selectNone>
 	<server>Server</server>
 	<setAll>Set All</setAll>
 	<show>Metadata</show>
Index: src/org/fao/geonet/services/main/Result.java
===================================================================
--- src/org/fao/geonet/services/main/Result.java	(revision 1565)
+++ src/org/fao/geonet/services/main/Result.java	(working copy)
@@ -30,6 +30,7 @@
 import jeeves.server.context.*;
 
 import org.fao.geonet.constants.*;
+import org.fao.geonet.kernel.SelectionManager;
 import org.fao.geonet.kernel.search.*;
 
 //=============================================================================
@@ -72,7 +73,12 @@
 				params.addContent(new Element("to").setText(searcher.getSize() +""));
 			}
 
-		return searcher.present(context, params, _config);
+		Element result = searcher.present(context, params, _config);
+		
+		// Update result elements to present
+		SelectionManager.updateMDResult(context.getUserSession(), result);
+		
+		return result; 
 	}
 }
 
Index: web/geonetwork/xml/user-profiles.xml
===================================================================
--- web/geonetwork/xml/user-profiles.xml	(revision 1565)
+++ web/geonetwork/xml/user-profiles.xml	(working copy)
@@ -219,6 +219,10 @@
 		<allow service="external.getmetadata"/>
 		<allow service="resources.getgraphover"/>
 		<allow service="graphover.show"/>
+		
+		<!-- Select metadata -->
+		<allow service="metadata.select"/>
+		<allow service="selection.search"/>
 
 		<!-- WMC -->
 		<allow service="intermap.wmc.setWmcContext"/>
Index: src/org/fao/geonet/constants/Edit.java
===================================================================
--- src/org/fao/geonet/constants/Edit.java	(revision 1565)
+++ src/org/fao/geonet/constants/Edit.java	(working copy)
@@ -82,6 +82,7 @@
 			public static final String HARVEST_INFO= "harvestInfo";
 			public static final String POPULARITY  = "popularity";
 			public static final String RATING      = "rating";
+			public static final String SELECTED    = "selected";
 
 			//--- privileges
 
Index: src/org/fao/geonet/services/main/Search.java
===================================================================
--- src/org/fao/geonet/services/main/Search.java	(revision 1565)
+++ src/org/fao/geonet/services/main/Search.java	(working copy)
@@ -31,6 +31,7 @@
 import jeeves.server.context.*;
 
 import org.fao.geonet.constants.*;
+import org.fao.geonet.kernel.SelectionManager;
 import org.fao.geonet.kernel.search.*;
 import org.fao.geonet.GeonetContext;
 import org.fao.geonet.services.util.MainUtil;
@@ -90,6 +91,14 @@
 
 		if (oldSearcher != null)
 			oldSearcher.close();
+		
+		// possibly close old selection
+		SelectionManager oldSelection = (SelectionManager)session.getProperty(Geonet.Session.SELECTED_RESULT);
+		
+		if (oldSelection != null){
+			oldSelection.close();
+			oldSelection = null;
+		}
 
 		// perform the search and save search result into session
 		MetaSearcher searcher;
Index: web/geonetwork/scripts/geonetwork.js
===================================================================
--- web/geonetwork/scripts/geonetwork.js	(revision 1565)
+++ web/geonetwork/scripts/geonetwork.js	(working copy)
@@ -88,24 +88,42 @@
 
 	function massiveDelete(message)
 	{
-		var list = $('search-results-content').getElementsByTagName('INPUT');
-		var ids  = '';
+		if(!confirm(message))
+			return;
 
-		for (var i=0; i<list.length; i++)
-		{
-			if (list[i].getAttribute('id') == 'selId')
-				if (list[i].checked)
-				{
-					var name = list[i].getAttribute('name');
-					ids = ids +'&id='+name;
-				}
-		}
+		document.location.href = Env.locService +'/metadata.massiveDelete';
+	}
+	
+	// Other actions javascript functions
+	function oActionsInit(name,id) {
+		if (id === undefined) {
+			id = "";
+        }
+		$(name+'Ele'+id).style.width = $(name+id).getWidth(); 
+	    $(name+'Ele'+id).style.top = $(name+id).positionedOffset().top + $(name+id).getHeight();
+	    $(name+'Ele'+id).style.left = $(name+id).positionedOffset().left;
+	}
+
+	function oActions(name,id) {
+		if (id === undefined) {
+			id = "";
+        }
+		if (!$(name+'Ele'+id).style.top)
+	        oActionsInit (name, id);
+	        
+	    if ($(name+'Ele'+id).style.display == 'none') {
+	        $(name+'Ele'+id).style.display = 'block';
+	        $(name+'Img'+id).src = off;
+	    } else { 
+	        $(name+'Ele'+id).style.display = 'none';
+	        $(name+'Img'+id).src = on;
+	    }
 
-		if (ids == '')
-			return;
-			
-		if(!confirm(message))
-			return;
+	}
 
-		document.location.href = Env.locService +'/metadata.massiveDelete?'+ids.substring(1);
+	function actionOnSelect(msg) {
+		if ($('nbselected').innerHTML == 0 && $('oAcOsEle').style.display == 'none') {
+			a(msg);
+		} else
+			oActions('oAcOs');
 	}
Index: web/geonetwork/loc/cn/xml/strings.xml
===================================================================
--- web/geonetwork/loc/cn/xml/strings.xml	(revision 1565)
+++ web/geonetwork/loc/cn/xml/strings.xml	(working copy)
@@ -118,11 +118,13 @@
 	<about>关于本站</about>
 	<abstract>摘要</abstract>
 	<accept>提交</accept>
+	<actionOnSelect>Actions on selected metadata</actionOnSelect>
 	<add>添加</add>
 	<addNewMetadata>增加新的元数据</addNewMetadata>
 	<admin>系统管理</admin>
 	<Administrator>管理员</Administrator>
 	<agrovocKeyword>关键词</agrovocKeyword>
+	<all>all</all>
 	<any>- 任意 -</any>
 	<anytime>Anytime</anytime>
 	<appSchInfoTab>应用模式信息</appSchInfoTab>
@@ -364,6 +366,7 @@
 	<noInfo>对不起，没有信息</noInfo>
 	<noLogin>您还未登录</noLogin>
 	<northbc>覆盖范围北边坐标</northbc>
+	<noSelectedMd>No metadata selected! Please at least select one before select an action.</noSelectedMd>
 	<online>在线交互地图</online>
 	<onlink>在线链接</onlink>
 	<operation>操作</operation>
@@ -437,6 +440,11 @@
 	<searchText>全文</searchText>
 	<searchAllText>全文</searchAllText>
 	<searchUnused>搜索未用或空的元数据</searchUnused>
+	<select>Select : </select>
+	<selectAll>Select all metadata</selectAll>
+	<selected> selected</selected>
+	<selectedOnly>Display selected only</selectedOnly>
+	<selectNone>Unselect metadata selected</selectNone>
 	<server>服务器</server>
 	<show>元数据</show>
 	<simple>简单搜索</simple>
Index: web/geonetwork/xsl/search-results.xsl
===================================================================
--- web/geonetwork/xsl/search-results.xsl	(revision 1565)
+++ web/geonetwork/xsl/search-results.xsl	(working copy)
@@ -17,6 +17,12 @@
 		</xsl:choose>
 	</xsl:variable>
 
+	<!--
+	additional scripts
+	-->
+	<xsl:template mode="script" match="/">
+		<script type="text/javascript" src="{/root/gui/url}/scripts/gn_search.js?"/>
+	</xsl:template>
 	
 	<!--
 	page content
@@ -30,6 +36,17 @@
 					<xsl:value-of select="/root/gui/strings/resultsMatching"/>
 					&#160;
 					<xsl:value-of select="/root/response/summary/@count"/>
+					&#160;&#160;
+					<span id="nbselected">
+						<xsl:choose>
+							<xsl:when test="/root/response/@selected" >
+								<xsl:value-of select="/root/response/@selected"/> 
+							</xsl:when>
+							<xsl:otherwise>
+								<xsl:value-of select="count(//geonet:info[selected='true'])"/>
+							</xsl:otherwise>							
+						</xsl:choose>
+					</span><xsl:value-of select="/root/gui/strings/selected"/>
 				</xsl:with-param>
 				<xsl:with-param name="indent" select="50"/>
 			</xsl:call-template>
@@ -99,7 +116,18 @@
 									<xsl:variable name="port" select="substring-before($rest,'/')"/>
 									<xsl:variable name="db" select="substring-after($rest,'/')"/>
 									<td class="padded" colspan="2">
-										<h1 align="left"><a href="{/root/gui/locService}/remote.show?id={$metadata/geonet:info[server]/id}&amp;currTab=simple"><xsl:value-of select="concat($metadata/geonet:info/id,' - ',$metadata/title)"/></a></h1>
+										<h1 align="left">
+											<xsl:variable name="isSelected" select="geonet:info/selected" />
+											<xsl:if test="$isSelected='true'">	
+								  				<input class="content"  type="checkbox" id="chk{geonet:info/id}" name="chk{geonet:info/id}" onclick="javascript:metadataselect('{geonet:info/uuid}', this.checked)"  checked="true"/>
+											</xsl:if>
+											<xsl:if test="$isSelected='false'">
+												<input class="content" type="checkbox" onclick="javascript:metadataselect('{geonet:info/uuid}', this.checked)"/>				
+											</xsl:if>
+											<a href="{/root/gui/locService}/remote.show?id={$metadata/geonet:info[server]/id}&amp;currTab=simple">
+												<xsl:value-of select="concat($metadata/geonet:info/id,' - ',$metadata/title)"/>
+											</a> 
+										</h1>
 										<xsl:variable name="server" select="$metadata/geonet:info/server"/>
 										<xsl:variable name="name" select="/root/gui/repositories/Collection[@collection_dn=$server]/@collection_name"/>
 										<font class="green-neg"><xsl:value-of select="$name"/></font>
@@ -122,9 +150,16 @@
 									</td>
 									<td class="padded" width="90%">
 										<h1 align="left">
+											<xsl:variable name="isSelected" select="geonet:info/selected" />
+											<xsl:if test="$isSelected='true'">	
+								  				<input class="content"  type="checkbox" id="chk{geonet:info/id}" name="chk{geonet:info/id}" onclick="javascript:metadataselect('{geonet:info/uuid}', this.checked)"  checked="true"/>
+											</xsl:if>
+											<xsl:if test="$isSelected='false'">
+												<input class="content" type="checkbox" onclick="javascript:metadataselect('{geonet:info/uuid}', this.checked)"/>				
+											</xsl:if>
 											<a href="{/root/gui/locService}/metadata.show?id={$metadata/geonet:info/id}&amp;currTab=simple">
 												<xsl:value-of select="$metadata/title"/>
-											</a>
+											</a> 
 										</h1>
 									</td>
 								<!-- Download XML for ISO and FGDC for use in applications like GeoNetwork or ESRI ArcCatalog -->
Index: src/org/fao/geonet/services/main/SelectionSearch.java
===================================================================
--- src/org/fao/geonet/services/main/SelectionSearch.java	(revision 0)
+++ src/org/fao/geonet/services/main/SelectionSearch.java	(revision 0)
@@ -0,0 +1,119 @@
+//=============================================================================
+//===	Copyright (C) 2001-2007 Food and Agriculture Organization of the
+//===	United Nations (FAO-UN), United Nations World Food Programme (WFP)
+//===	and United Nations Environment Programme (UNEP)
+//===
+//===	This program is free software; you can redistribute it and/or modify
+//===	it under the terms of the GNU General Public License as published by
+//===	the Free Software Foundation; either version 2 of the License, or (at
+//===	your option) any later version.
+//===
+//===	This program is distributed in the hope that it will be useful, but
+//===	WITHOUT ANY WARRANTY; without even the implied warranty of
+//===	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+//===	General Public License for more details.
+//===
+//===	You should have received a copy of the GNU General Public License
+//===	along with this program; if not, write to the Free Software
+//===	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+//===
+//===	Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2,
+//===	Rome - Italy. email: geonetwork@osgeo.org
+//==============================================================================
+
+package org.fao.geonet.services.main;
+
+import java.util.Iterator;
+
+import jeeves.constants.Jeeves;
+import jeeves.interfaces.Service;
+import jeeves.server.ServiceConfig;
+import jeeves.server.UserSession;
+import jeeves.server.context.ServiceContext;
+import org.fao.geonet.GeonetContext;
+import org.fao.geonet.constants.Edit;
+import org.fao.geonet.constants.Geonet;
+import org.fao.geonet.kernel.SelectionManager;
+import org.fao.geonet.kernel.search.MetaSearcher;
+import org.fao.geonet.kernel.search.SearchManager;
+import org.fao.geonet.services.util.MainUtil;
+import org.jdom.Element;
+
+//=============================================================================
+
+public class SelectionSearch implements Service
+{
+	private ServiceConfig _config;
+
+	//--------------------------------------------------------------------------
+	//---
+	//--- Init
+	//---
+	//--------------------------------------------------------------------------
+
+	public void init(String appPath, ServiceConfig config) throws Exception
+	{
+		_config = config;
+	}
+
+	/*
+	 * Get the current search and add an uuid params
+	 * with the list of records contain in the 
+	 * selection manager. 
+	 * 
+	 */
+	public Element exec(Element params, ServiceContext context) throws Exception
+	{
+		GeonetContext gc = (GeonetContext) context.getHandlerContext(Geonet.CONTEXT_NAME);
+		
+		SearchManager searchMan = gc.getSearchmanager();
+		
+		// possibly close old searcher
+		UserSession  session     = context.getUserSession();
+		MetaSearcher oldSearcher = (MetaSearcher)session.getProperty(Geonet.Session.SEARCH_RESULT);
+
+		if (oldSearcher != null)
+			oldSearcher.close();
+
+		context.info("Get selected metadata");
+		SelectionManager sm = SelectionManager.getManager(session) ;
+
+		// TODO : Get the sortBy params in order to apply on new result list.
+		
+		if (sm != null) {
+			String uuids= "";
+			boolean first = true;
+			for (Iterator<String> iter = sm.getSelection("metadata").iterator(); iter.hasNext();) {
+				String uuid = (String) iter.next();
+				if (first) {
+					uuids = (String) uuid;
+					first = false;
+				}
+				else 
+					uuids = uuids +" or "+ uuid;
+			}
+			context.debug("List of selected uuids: " + uuids);
+			params.addContent(new Element(Geonet.SearchResult.UUID).setText(uuids));
+			sm.close();
+			sm = null;
+		} 
+		
+		// perform the search and save search result into session
+		MetaSearcher searcher;
+
+		context.info("Creating searchers");
+
+		searcher = searchMan.newSearcher(SearchManager.LUCENE, Geonet.File.SEARCH_LUCENE);
+
+		searcher.search(context, params, _config);
+		session.setProperty(Geonet.Session.SEARCH_RESULT, searcher);
+
+		context.info("Getting summary");
+		
+		return searcher.getSummary();
+		
+	}
+}
+
+//=============================================================================
+
