Index: mail/em-folder-browser.c
===================================================================
--- mail/em-folder-browser.c	(revision 35576)
+++ mail/em-folder-browser.c	(working copy)
@@ -847,6 +847,7 @@ get_view_query (ESearchBar *esb, CamelFo
 
 	switch (id & VIEW_ITEMS_MASK) {
 	case VIEW_ALL_MESSAGES:
+		/* one space indicates no filtering */
 		view_sexp = " ";
 		break;
 
@@ -908,7 +909,8 @@ get_view_query (ESearchBar *esb, CamelFo
 		break;
 
 	case VIEW_CUSTOMIZE:
-		view_sexp = " ";
+		/* one space indicates no filtering, so here use two */
+		view_sexp = "  ";
 		break;
 	}
 
Index: mail/ChangeLog
===================================================================
--- mail/ChangeLog	(revision 35576)
+++ mail/ChangeLog	(working copy)
@@ -1,3 +1,13 @@
+2008-06-02  Milan Crha  <mcrha@redhat.com>
+
+	** Fix for bug #535749
+
+	* em-folder-browser.c: (get_view_query):
+	Distinguish between no filter and custom filter.
+	* message-list.c: (mail_regen_list): Report empty search as NULL.
+	* message-list.c: (regen_list_exec): Use better condition whether
+	keep cursor_uid in the message list or not on regeneration.
+
 2008-06-02  Srinivasa Ragavan  <sragavan@novell.com>
 
 	** Fix for bug #531836
Index: mail/message-list.c
===================================================================
--- mail/message-list.c	(revision 35576)
+++ mail/message-list.c	(working copy)
@@ -3889,19 +3889,31 @@ regen_list_exec (struct _regen_list_msg 
 	if (expr == NULL) {
 		uids = camel_folder_get_uids (m->folder);
 	} else {
-		char *tmp_expr = NULL;
+		searchuids = uids = camel_folder_search_by_expression (m->folder, expr, &m->base.ex);
 
 		/* If m->changes is not NULL, then it means we are called from folder_changed event,
 		   thus we will keep the selected message to be sure it doesn't disappear because
 		   it no longer belong to our search filter. */
-		if (m->changes && m->ml->search && m->ml->cursor_uid) {
-			tmp_expr = g_strdup_printf ("(or %s (match-all (uid \"%s\")))", expr, m->ml->cursor_uid);
-			expr = tmp_expr;
-		}
+		if (m->changes && m->ml->search && m->ml->cursor_uid && uids) {
+			for (i = 0; i < uids->len; i++) {
+				if (g_str_equal (m->ml->cursor_uid, uids->pdata [i]))
+					break;
+			}
 
-		searchuids = uids = camel_folder_search_by_expression (m->folder, expr, &m->base.ex);
+			/* cursor_uid has been filtered out */
+			if (i == uids->len) {
+				gboolean was_deleted = (camel_folder_get_message_flags (m->folder, m->ml->cursor_uid) & CAMEL_MESSAGE_DELETED) != 0;
+
+				/* I would really like to check for CAMEL_MESSAGE_FOLDER_FLAGGED on a message,
+				   so I would know whether it was changed locally, and then just check the changes
+				   struct whether change came from the server, but with periodical save it doesn't
+				   matter. So here just check whether the file was deleted and we show it based
+				   on the flag whether we can view deleted messages or not. */
 
-		g_free (tmp_expr);
+				if (!was_deleted || (was_deleted && !m->hidedel))
+					g_ptr_array_add (uids, g_strdup (m->ml->cursor_uid));
+			}
+		}
 	}
 
 	if (camel_exception_is_set (&m->base.ex))
@@ -4182,6 +4194,10 @@ mail_regen_list (MessageList *ml, const 
 	struct _regen_list_msg *m;
 	GConfClient *gconf;
 
+	/* report empty search as NULL, not as one/two-space string */
+	if (search && (strcmp (search, " ") == 0 || strcmp (search, "  ") == 0))
+		search = NULL;
+
 	if (ml->folder == NULL) {
 		if (ml->search != search) {
 			g_free(ml->search);
Index: widgets/misc/ChangeLog
===================================================================
--- widgets/misc/ChangeLog	(revision 35576)
+++ widgets/misc/ChangeLog	(working copy)
@@ -1,3 +1,10 @@
+2008-06-02  Milan Crha  <mcrha@redhat.com>
+
+	** Part of fix for bug #535749
+
+	* e-filter-bar.c: (get_property): Do not return any query
+	with empty text from search bar.
+
 2008-05-28  Milan Crha  <mcrha@redhat.com>
 
 	** Fix for bug #532597
Index: widgets/misc/e-filter-bar.c
===================================================================
--- widgets/misc/e-filter-bar.c	(revision 35576)
+++ widgets/misc/e-filter-bar.c	(working copy)
@@ -592,8 +592,11 @@ get_property (GObject *object, guint pro
 	ESearchBar *esb = E_SEARCH_BAR (object);
 
 	switch (property_id) {
-	case PROP_QUERY:
-		if (efb->current_query) {
+	case PROP_QUERY: {
+		char *text = e_search_bar_get_text (E_SEARCH_BAR (efb));
+
+		/* empty search text means searching turned off */
+		if (efb->current_query && text && *text) {
 			GString *out = g_string_new ("");
 
 			filter_rule_build_code (efb->current_query, out);
@@ -602,7 +605,9 @@ get_property (GObject *object, guint pro
 		} else {
 			g_value_set_string (value, NULL);
 		}
-		break;
+
+		g_free (text);
+		break; }
 	case PROP_STATE: {
 		/* FIXME: we should have ESearchBar save its own state to the xmlDocPtr */
 		xmlChar *xmlbuf;
