## labels that have special semantics. user will be unable to
   ## add/remove these via normal label mechanisms.
-  RESERVED_LABELS = [ :starred, :spam, :draft, :unread, :killed, :sent, :deleted ]
+  RESERVED_LABELS = [ :starred, :spam, :draft, :unread, :killed, :sent, :deleted, :inbox ]
 
   ## labels which it nonetheless makes sense to search for by
-  LISTABLE_RESERVED_LABELS = [ :starred, :spam, :draft, :sent, :killed, :deleted ]
+  LISTABLE_RESERVED_LABELS = [ :starred, :spam, :draft, :sent, :killed, :deleted, :inbox ]
 
-  ## labels that will never be displayed to the user
+  ## labels that will typically be hidden from the user
   HIDDEN_RESERVED_LABELS = [ :starred, :unread ]
 
   def initialize fn
 
 
   def edit_labels
     m = @message_lines[curpos] or return
+
+    reserved_labels = m.labels.select { |l| LabelManager::RESERVED_LABELS.include? l }
     new_labels = BufferManager.ask_for_labels :label, "Labels for message: ", m.labels
 
     return unless new_labels
-    m.labels = new_labels
+    m.labels = (reserved_labels + new_labels).uniq
     new_labels.each { |l| LabelManager << l }
     ## TODO: don't recalculate EVERYTHING
     update
         rest += format_person_list "   Bcc: ", m.bcc
       end
 
+      show_labels = m.labels - LabelManager::HIDDEN_RESERVED_LABELS
       rest += [
         "   Date: #{m.date.strftime DATE_FORMAT} (#{m.date.to_nice_distance_s})",
         "   Subject: #{m.subj}",
         (parent ? "   In reply to: #{parent.from.mediumname}'s message of #{parent.date.strftime DATE_FORMAT}" : nil),
-        m.labels.empty? ? nil : "   Labels: #{m.labels.join(', ')}",
+        show_labels.empty? ? nil : "   Labels: #{show_labels.join(', ')}",
       ].compact
       
       from + rest.map { |l| [[color, prefix + "  " + l]] }