bm.spawn_unless_exists("Buffer List") { BufferListMode.new }
       when :list_contacts
         b = bm.spawn_unless_exists("Contact List") { ContactListMode.new }
-        b.mode.load_in_background
+        b.mode.load_in_background if b
       when :search
         query = BufferManager.ask :search, "search all messages: "
         next unless query && query !~ /^\s*$/
           BufferManager.spawn "Edit message", r
           r.edit_message
         else
-          b = BufferManager.spawn_unless_exists("All drafts") do
-            mode = LabelSearchResultsMode.new [:draft]
-          end
-          b.mode.load_threads :num => b.content_height
+          b = BufferManager.spawn_unless_exists("All drafts") { LabelSearchResultsMode.new [:draft] }
+          b.mode.load_threads :num => b.content_height if b
         end
       when :nothing
       when :redraw
 
   def spawn_unless_exists title, opts={}
     if @name_map.member? title
       raise_to_front @name_map[title] unless opts[:hidden]
+      nil
     else
       mode = yield
       spawn title, mode, opts
+      @name_map[title]
     end
-    @name_map[title]
   end
 
   def spawn title, mode, opts={}
 
 
 class LabelListMode < LineCursorMode
   register_keymap do |k|
-    k.add :select_label, "Select label", :enter
+    k.add :select_label, "Search by label", :enter
     k.add :reload, "Discard label list and reload", '@'
     k.add :toggle_show_unread_only, "Toggle between all labels and those with unread mail", :tab
   end
 
-  bool_reader :done
   attr_reader :value
 
   def initialize
     @labels = []
     @text = []
-    @done = false
     @value = nil
     @unread_only = false
     super
 
   def select_label
     @value, string = @labels[curpos]
-    @done = true if @value
+    return unless @value
+    LabelSearchResultsMode.spawn_nicely @value
   end
 end
 
 
     when :inbox
       BufferManager.raise_to_front InboxMode.instance.buffer
     else
-      BufferManager.spawn_unless_exists("All threads with label '#{label}'") do
-        mode = LabelSearchResultsMode.new([label])
-        mode.load_threads :num => b.content_height
-      end
+      b = BufferManager.spawn_unless_exists("All threads with label '#{label}'") { LabelSearchResultsMode.new [label] }
+      b.mode.load_threads :num => b.content_height if b
     end
   end
 end