done = false
     @shelled = true
     until done
-      key = Ncurses.nonblocking_getch
+      key = Ncurses.nonblocking_getch or next
       if key == Ncurses::KEY_CANCEL
         done = true
       elsif (accept && accept.member?(key)) || !accept
 
   def drop_tag_for o; @tagged.delete o; end
 
   def apply_to_tagged
-    num_tagged = @tagged.map { |t| t ? 1 : 0 }.sum
+    targets = @tagged.select_by_value
+    num_tagged = targets.size
     if num_tagged == 0
-      BufferManager.flash "No tagged messages!"
+      BufferManager.flash "No tagged threads!"
       return
     end
 
-    noun = num_tagged == 1 ? "message" : "messages"
+    noun = num_tagged == 1 ? "thread" : "threads"
     c = BufferManager.ask_getch "apply to #{num_tagged} tagged #{noun}:"
     return if c.nil? # user cancelled
 
-    if(action = @mode.resolve_input c)
+    if(action = @mode.resolve_input(c))
       tagged_sym = "multi_#{action}".intern
       if @mode.respond_to? tagged_sym
-        targets = @tagged.select_by_value
         @mode.send tagged_sym, targets
       else
-        BufferManager.flash "That command cannot be applied to multiple messages."
+        BufferManager.flash "That command cannot be applied to multiple threads."
       end
     else
       BufferManager.flash "Unknown command #{c.to_character}."