*** empty log message ***
diff --git a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/search/SearchCategoryDescriptor.java b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/search/SearchCategoryDescriptor.java
index 834aa4d..95916e9 100644
--- a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/search/SearchCategoryDescriptor.java
+++ b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/search/SearchCategoryDescriptor.java
@@ -1,6 +1,7 @@
 package org.eclipse.update.internal.ui.search;
 
 import org.eclipse.core.runtime.*;
+import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.update.internal.ui.*;
 import org.eclipse.swt.graphics.Image;
 
@@ -16,6 +17,15 @@
 	public String getName() {
 		return config.getAttribute("name");
 	}
+	
+	public ImageDescriptor getImageDescriptor() {
+		String imageName = config.getAttribute("icon");
+		if (imageName == null)
+			return null;
+		return UpdateUIPluginImages.getImageDescriptorFromPlugin(
+			config.getDeclaringExtension().getDeclaringPluginDescriptor(),
+			imageName);
+	}
 	public Image getImage() {
 		String imageName = config.getAttribute("icon");
 		if (imageName == null)
diff --git a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/views/SearchMonitorManager.java b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/views/SearchMonitorManager.java
new file mode 100644
index 0000000..df098c5
--- /dev/null
+++ b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/views/SearchMonitorManager.java
@@ -0,0 +1,171 @@
+package org.eclipse.update.internal.ui.views;
+
+import java.util.*;
+import java.util.Hashtable;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.update.internal.ui.UpdateUIPlugin;
+import org.eclipse.update.internal.ui.model.*;
+import org.eclipse.update.internal.ui.model.UpdateModel;
+import org.eclipse.update.internal.ui.search.SearchObject;
+
+/**
+ * @author dejan
+ *
+ * To change this generated comment edit the template variable "typecomment":
+ * Window>Preferences>Java>Templates.
+ * To enable and disable the creation of type comments go to
+ * Window>Preferences>Java>Code Generation.
+ */
+public class SearchMonitorManager {
+	Hashtable monitors;
+
+	class SearchMonitor implements IProgressMonitor {
+		private SearchObject sobj;
+		private int totalWork;
+		private int worked;
+		private boolean active;
+
+		public SearchMonitor(SearchObject sobj) {
+			this.sobj = sobj;
+			sobj.attachProgressMonitor(this);
+		}
+
+		public void dispose() {
+			sobj.detachProgressMonitor(this);
+		}
+		/**
+		 * @see org.eclipse.core.runtime.IProgressMonitor#beginTask(java.lang.String, int)
+		 */
+		public void beginTask(String name, int totalWork) {
+			this.totalWork = totalWork;
+			worked = 0;
+			active = true;
+			update();
+		}
+
+		/**
+		 * @see org.eclipse.core.runtime.IProgressMonitor#done()
+		 */
+		public void done() {
+			active = false;
+			update();
+		}
+
+		private void update() {
+			UpdateUIPlugin.getDefault().getUpdateModel().fireObjectChanged(
+				sobj,
+				NamedModelObject.P_NAME);
+		}
+
+		public String getLabel() {
+			if (active) {
+				int perc = (worked * 100) / totalWork;
+				return sobj.getName() + " - " + perc + "%";
+			} else {
+				return sobj.getName();
+			}
+		}
+
+		/**
+		 * @see org.eclipse.core.runtime.IProgressMonitor#internalWorked(double)
+		 */
+		public void internalWorked(double work) {
+		}
+
+		/**
+		 * @see org.eclipse.core.runtime.IProgressMonitor#isCanceled()
+		 */
+		public boolean isCanceled() {
+			return false;
+		}
+
+		/**
+		 * @see org.eclipse.core.runtime.IProgressMonitor#setCanceled(boolean)
+		 */
+		public void setCanceled(boolean value) {
+		}
+
+		/**
+		 * @see org.eclipse.core.runtime.IProgressMonitor#setTaskName(java.lang.String)
+		 */
+		public void setTaskName(String name) {
+		}
+
+		/**
+		 * @see org.eclipse.core.runtime.IProgressMonitor#subTask(java.lang.String)
+		 */
+		public void subTask(String name) {
+		}
+
+		/**
+		 * @see org.eclipse.core.runtime.IProgressMonitor#worked(int)
+		 */
+		public void worked(int work) {
+			worked += work;
+			update();
+		}
+
+	}
+	/**
+	 * Constructor for SearchMonitorManager.
+	 */
+	public SearchMonitorManager() {
+		monitors = new Hashtable();
+		initialize();
+	}
+	
+	public void shutdown() {
+		for (Enumeration enum=monitors.elements(); enum.hasMoreElements();) {
+			SearchMonitor monitor = (SearchMonitor)enum.nextElement();
+			monitor.dispose();
+		}
+		monitors.clear();
+	}
+	
+	private void initialize() {
+		UpdateModel model = UpdateUIPlugin.getDefault().getUpdateModel();
+		NamedModelObject [] bookmarks = model.getBookmarks();
+		for (int i=0; i<bookmarks.length; i++) {
+			processBookmark(bookmarks[i]);
+		}
+	}
+	
+	private void processFolder(BookmarkFolder folder) {
+		Object [] children = folder.getChildren(null);
+		for (int i=0; i<children.length; i++) {
+			processBookmark((NamedModelObject)children[i]);
+		}
+	}
+	
+	private void processBookmark(NamedModelObject obj) {
+		if (obj instanceof SearchObject) {
+			register((SearchObject)obj);
+		}
+		else if (obj instanceof BookmarkFolder) {
+			processFolder((BookmarkFolder)obj);
+		}
+	}
+		
+
+	public void register(SearchObject obj) {
+		if (monitors.get(obj) == null)
+			monitors.put(obj, new SearchMonitor(obj));
+	}
+
+	public void unregister(SearchObject obj) {
+		SearchMonitor monitor = (SearchMonitor) monitors.get(obj);
+		if (monitor != null) {
+			monitor.dispose();
+			monitors.remove(obj);
+		}
+	}
+
+	public String getLabel(SearchObject obj) {
+		SearchMonitor monitor = (SearchMonitor) monitors.get(obj);
+		if (monitor == null)
+			return obj.getName();
+		else
+			return monitor.getLabel();
+	}
+}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/views/UpdatesView.java b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/views/UpdatesView.java
index 5c454f3..600484e 100644
--- a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/views/UpdatesView.java
+++ b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/views/UpdatesView.java
@@ -102,6 +102,7 @@
 	private EnvironmentFilter environmentFilter = new EnvironmentFilter();
 	private Cursor handCursor;
 	private Clipboard clipboard;
+	private SearchMonitorManager searchMonitorManager;
 
 	class DeleteAction extends Action implements IUpdate {
 		public DeleteAction() {
@@ -286,6 +287,9 @@
 				else
 					return dir.getLabel(dir);
 			}
+			if (obj instanceof SearchObject) {
+				return searchMonitorManager.getLabel((SearchObject)obj);
+			}
 			return super.getText(obj);
 		}
 		public Image getImage(Object obj) {
@@ -347,7 +351,8 @@
 				SearchCategoryRegistryReader.getDefault().getDescriptor(
 					categoryId);
 			if (desc != null) {
-				return desc.getImage();
+				int flags = obj.isSearchInProgress()?UpdateLabelProvider.F_CURRENT:0;
+				return UpdateUIPlugin.getDefault().getLabelProvider().get(desc.getImageDescriptor(), flags);
 			}
 			return null;
 		}
@@ -413,10 +418,13 @@
 			clipboard.dispose();
 			clipboard = null;
 		}
+		searchMonitorManager.shutdown();
 		super.dispose();
 	}
 
 	public void initProviders() {
+		searchMonitorManager = new SearchMonitorManager();
+		searchMonitorManager.register(updateSearchObject);
 		viewer.setContentProvider(new SiteProvider());
 		viewer.setLabelProvider(new SiteLabelProvider());
 		viewer.setInput(UpdateUIPlugin.getDefault().getUpdateModel());
@@ -1097,14 +1105,11 @@
 		Object child = children[0];
 		if (child instanceof PendingChange)
 			return;
-		if (child instanceof NamedModelObject
-			/*
-		|| child instanceof SearchResultSite
-		|| child instanceof IFeature
-		|| child instanceof IFeatureAdapter 
-		*/
-			) {
+		if (child instanceof NamedModelObject) {
 			UpdateModel model = UpdateUIPlugin.getDefault().getUpdateModel();
+			if (child instanceof SearchObject) {
+				searchMonitorManager.register((SearchObject)child);
+			}
 			if (parent == null)
 				parent = model;
 			viewer.add(parent, children);
@@ -1118,16 +1123,19 @@
 		if (children[0] instanceof PendingChange)
 			return;
 		if (children[0] instanceof NamedModelObject
-			/*|| children[0] instanceof SearchResultSite */
 			) {
 			viewer.remove(children);
 			viewer.setSelection(new StructuredSelection());
+			for (int i=0; i<children.length; i++) {
+				if (children[i] instanceof SearchObject)	
+			   		searchMonitorManager.unregister((SearchObject)children[i]);
+			}
 		}
 	}
 
 	public void objectChanged(Object object, String property) {
 		if (object instanceof NamedModelObject) {
-			if (property.equals(SiteBookmark.P_NAME)) {
+			if (property.equals(NamedModelObject.P_NAME)) {
 				viewer.update(object, null);
 			}
 			if (object instanceof SiteBookmark) {