Index: lib/sup/contact.rb
===================================================================
--- lib/sup/contact.rb	(revision 714)
+++ lib/sup/contact.rb	(working copy)
@@ -5,44 +5,40 @@
 
   def initialize fn
     @fn = fn
-    @p2a = {} # person to alias map
-    @a2p = {} # alias to person map
+    @contacts = []
 
     if File.exists? fn
       IO.foreach(fn) do |l|
+        aalias = nil
         l =~ /^([^:]+): (.*)$/ or raise "can't parse #{fn} line #{l.inspect}"
         aalias, addr = $1, $2
         p = PersonManager.person_for addr, :definitive => true
-        @p2a[p] = aalias
-        @a2p[aalias] = p
+        p.aalias = aalias if aalias !=nil
+        @contacts << p
       end
     end
 
     self.class.i_am_the_instance self
   end
 
-  def contacts; @p2a.keys; end
-  def set_contact person, aalias
-    if(pold = @a2p[aalias]) && (pold != person)
-      drop_contact pold
-    end
-    @p2a[person] = aalias
-    @a2p[aalias] = person
+  attr_reader :contacts
+  def update_alias person, aalias
+    person.aalias = aalias
+    # update contact list if this contact was not already in the list.
+    @contacts << person if !@contacts.include?(person)
   end
   def drop_contact person
-    if(aalias = @p2a[person])
-      @p2a.delete person
-      @a2p.delete aalias
-    end
-  end    
-  def contact_for aalias; @a2p[aalias]; end
-  def alias_for person; @p2a[person]; end
-  def is_contact? person; @p2a.member? person; end
+    @contacts = @contacts.delete(person) if @contacts.include?(person)
+  end
+  def contact_for aalias; @contacts.grep{ |a| a.aalias==aalias}[0]; end
+  def alias_for person; person.aalias; end
+  def is_contact? person; @contacts.include?(person); end
 
   def save
+    Redwood::log "Saving #{@fn}"
     File.open(@fn, "w") do |f|
-      @p2a.each do |p, a|
-        f.puts "#{a}: #{p.full_address}"
+      @contacts.each do |p|
+        f.puts "#{p.aalias}: #{p.full_address}"
       end
     end
   end
Index: lib/sup/modes/contact-list-mode.rb
===================================================================
--- lib/sup/modes/contact-list-mode.rb	(revision 714)
+++ lib/sup/modes/contact-list-mode.rb	(working copy)
@@ -2,12 +2,16 @@
 
 module CanAliasContacts
   def alias_contact p
-    a = BufferManager.ask(:alias, "Nickname for #{p.longname}: ", ContactManager.alias_for(p)) or return
-    if a.empty?
+    a = BufferManager.ask(:alias, "Alias for #{p.longname}: ", ContactManager.alias_for(p))
+    if a && a.empty?
       ContactManager.drop_contact p
     else
-      ContactManager.set_contact p, a
+      ContactManager.update_alias p, a
     end
+    a = BufferManager.ask(:name, "Full name for #{p.longname}: ", p.name)
+    if a && !a.empty?
+      p.name = a 
+    end
   end
 end
 
@@ -17,7 +21,7 @@
   register_keymap do |k|
     k.add :load_more, "Load #{LOAD_MORE_CONTACTS_NUM} more contacts", 'M'
     k.add :reload, "Drop contact list and reload", 'D'
-    k.add :alias, "Edit nickname/alias for contact", 'a'
+    k.add :alias, "Edit alias/fullname for contact", 'a'
     k.add :toggle_tagged, "Tag/untag current line", 't'
     k.add :apply_to_tagged, "Apply next command to all tagged items", ';'
     k.add :search, "Search for messages from particular people", 'S'
Index: lib/sup/person.rb
===================================================================
--- lib/sup/person.rb	(revision 714)
+++ lib/sup/person.rb	(working copy)
@@ -37,7 +37,6 @@
     p.definitive = true if opts[:definitive]
     register p
   end
-  
   def self.register p
     oldp = @@people[p.email]
 
@@ -53,12 +52,12 @@
 ## don't create these by hand. rather, go through personmanager, to
 ## ensure uniqueness and overriding.
 class Person 
-  attr_accessor :name, :email, :timestamp
+  attr_accessor :name, :email, :timestamp, :aalias
   bool_accessor :definitive
 
-  def initialize name, email, timestamp=0, definitive=false
+  def initialize name, email, timestamp=0, definitive=false, aalias=nil
     raise ArgumentError, "email can't be nil" unless email
-    
+
     if name
       @name = name.gsub(/^\s+|\s+$/, "").gsub(/\s+/, " ")
       if @name =~ /^(['"]\s*)(.*?)(\s*["'])$/
@@ -66,6 +65,7 @@
       end
     end
 
+    @alias = aalias
     @email = email.gsub(/^\s+|\s+$/, "").gsub(/\s+/, " ").downcase
     @definitive = definitive
     @timestamp = timestamp
