k.add :jump_to_next_open, "Jump to next open message", 'n'
     k.add :jump_to_prev_open, "Jump to previous open message", 'p'
     k.add :toggle_starred, "Star or unstar message", '*'
-    k.add :collapse_non_new_messages, "Collapse all but new messages", 'N'
+    k.add :toggle_new, "Toggle new/read status of message", 'N'
+#    k.add :collapse_non_new_messages, "Collapse all but new messages", 'N'
     k.add :reply, "Reply to a message", 'r'
     k.add :forward, "Forward a message", 'f'
     k.add :alias, "Edit alias/nickname for a person", 'i'
       @layout[m].state = initial_state_for m
       @layout[m].color = altcolor ? :alternate_patina_color : :message_patina_color
       @layout[m].star_color = altcolor ? :alternate_starred_patina_color : :starred_patina_color
-      @layout[m].orig_new = m.has_label? :unread
+      @layout[m].orig_new = m.has_label? :read
       altcolor = !altcolor
       if latest_date.nil? || m.date > latest_date
         latest_date = m.date
     @layout[latest].state = :open if @layout[latest].state == :closed
     @layout[earliest].state = :detailed if earliest.has_label?(:unread) || @thread.size == 1
 
+    @thread.remove_label :unread
     regen_text
   end
 
 
   def toggle_starred
     m = @message_lines[curpos] or return
-    if m.has_label? :starred
-      m.remove_label :starred
+    toggle_label m, :starred
+  end
+
+  def toggle_new
+    m = @message_lines[curpos] or return
+    toggle_label m, :unread
+  end
+
+  def toggle_label m, label
+    if m.has_label? label
+      m.remove_label label
     else
-      m.add_label :starred
+      m.add_label label
     end
     ## TODO: don't recalculate EVERYTHING just to add a stupid little
     ## star to the display
 
   def message_patina_lines m, state, start, parent, prefix, color, star_color
     prefix_widget = [color, prefix]
-    widget = 
-      case state
-      when :closed
-        [color, "+ "]
-      when :open, :detailed
-        [color, "- "]
-      end
-    imp_widget = 
+
+    open_widget = [color, (state == :closed ? "+ " : "- ")]
+    new_widget = [color, (m.has_label?(:unread) ? "N" : " ")]
+    starred_widget = 
       if m.has_label?(:starred)
         [star_color, "* "]
       else
     case state
     when :open
       @person_lines[start] = m.from
-      [[prefix_widget, widget, imp_widget,
+      [[prefix_widget, open_widget, new_widget, starred_widget,
         [color, 
             "#{m.from ? m.from.mediumname : '?'} to #{m.recipients.map { |l| l.shortname }.join(', ')} #{m.date.to_nice_s} (#{m.date.to_nice_distance_s})"]]]
 
     when :closed
       @person_lines[start] = m.from
-      [[prefix_widget, widget, imp_widget,
+      [[prefix_widget, open_widget, new_widget, starred_widget,
         [color, 
         "#{m.from ? m.from.mediumname : '?'}, #{m.date.to_nice_s} (#{m.date.to_nice_distance_s})  #{m.snippet}"]]]
 
     when :detailed
       @person_lines[start] = m.from
-      from = [[prefix_widget, widget, imp_widget, [color, "From: #{m.from ? format_person(m.from) : '?'}"]]]
+      from = [[prefix_widget, open_widget, new_widget, starred_widget,
+          [color, "From: #{m.from ? format_person(m.from) : '?'}"]]]
 
       rest = []
       unless m.to.empty?