diff --git a/src/AddSpouse.py b/src/AddSpouse.py
index f46b12f30..9b0459c13 100644
--- a/src/AddSpouse.py
+++ b/src/AddSpouse.py
@@ -43,7 +43,7 @@ import libglade
 #-------------------------------------------------------------------------
 import RelLib
 import const
-import sort
+import Sorter
 import Utils
 import GrampsCfg
 
@@ -82,8 +82,13 @@ class AddSpouse:
         self.ok = self.glade.get_widget('spouse_ok')
 
         self.ok.set_sensitive(0)
-        self.name_list = self.db.getPersonMap().values()
-        self.name_list.sort(sort.by_last_name)
+        arrow_map = [(2,self.glade.get_widget('NameArrow')),
+                     (3,self.glade.get_widget('DateArrow'))]
+                     
+        self.spouse_list.set_column_visibility(2,0)
+        self.spouse_list.set_column_visibility(3,0)
+        self.sorter = Sorter.Sorter(self.spouse_list,arrow_map,'spouse',self.top)
+        self.name_list = self.db.getPersonKeys()
         self.rel_combo.set_popdown_strings(const.familyRelations)
         title = _("Choose Spouse/Partner of %s") % GrampsCfg.nameof(person)
         self.glade.get_widget("spouseTitle").set_text(title)
@@ -127,11 +132,11 @@ class AddSpouse:
         QuickAdd.QuickAdd(self.db,gen,self.update_list)
 
     def update_list(self,person):
-        self.name_list.append(person)
-        self.name_list.sort(sort.by_last_name)
+        self.name_list.append(person.getId())
         self.addperson(person)
         self.relation_type_changed(self.relation_type)
         row = self.spouse_list.find_row_from_data(person)
+        self.sorter.sort_list()
         self.spouse_list.select_row(row,0)
         self.spouse_list.moveto(row,0)
 
@@ -143,7 +148,7 @@ class AddSpouse:
         if len(self.spouse_list.selection) == 0:
             return
         row = self.spouse_list.selection[0]
-        spouse = self.spouse_list.get_row_data(row)
+        spouse = self.db.getPerson(self.spouse_list.get_row_data(row))
 
         # don't do anything if the marriage already exists
         for f in self.person.getFamilyList():
@@ -188,13 +193,15 @@ class AddSpouse:
         index = 0
         self.spouse_list.clear()
         self.spouse_list.freeze()
-        for person in self.name_list:
+        for key in self.name_list:
+            person = self.db.getPerson(key)
             if person.getGender() == gender:
                 continue
-            name = person.getPrimaryName().getName()
-            self.spouse_list.append([name,Utils.birthday(person)])
-            self.spouse_list.set_row_data(index,person)
+            data = person.getDisplayInfo()
+            self.spouse_list.append([data[0],data[3],data[5],data[6]])
+            self.spouse_list.set_row_data(index,key)
             index = index + 1
+        self.sorter.sort_list()
         self.spouse_list.thaw()
 
 #-------------------------------------------------------------------------
@@ -280,7 +287,7 @@ class SetSpouse:
         if len(self.spouse_list.selection) == 0:
             return
         row = self.spouse_list.selection[0]
-        spouse = self.spouse_list.get_row_data(row)
+        spouse = self.db.getPerson(self.spouse_list.get_row_data(row))
 
         # don't do anything if the marriage already exists
         for f in self.person.getFamilyList():
diff --git a/src/Find.py b/src/Find.py
index 77d044673..dca88de4d 100644
--- a/src/Find.py
+++ b/src/Find.py
@@ -56,13 +56,14 @@ _ = gettext
 class FindBase:
     """Opens find person dialog for gramps"""
     
-    def __init__(self,clist,task,name):
+    def __init__(self,clist,task,name,db):
         """Opens a dialog box instance that allows users to
         search for a person.
 
         clist - GtkCList containing the people information
         task - function to call to change the active person"""
-        
+
+        self.db = db
         self.clist = clist
         self.nlist = []
         self.task = task
@@ -84,12 +85,36 @@ class FindBase:
         self.top.editable_enters(self.entry)
         self.entry.grab_focus()
 
+    def get_value(self,id):
+        return None
+    
     def enable_autocomp(self):
         if GrampsCfg.autocomp:
             self.comp = AutoComp.AutoEntry(self.entry,self.nlist)
         
     def advance(self,func):
-        pass
+        try:
+            self.row = self.clist.selection[0]
+        except IndexError:
+            gtk.gdk_beep()
+            return
+
+        text = self.entry.get_text()
+        if self.row == None or text == "":
+            gtk.gdk_beep()
+            return
+        orow = self.row
+        func()
+        while self.row != orow:
+            id = self.clist.get_row_data(self.row)
+            if id == None:
+                func()
+                continue
+            if string.find(string.upper(self.get_value(id)),string.upper(text)) >= 0:
+                self.task(self.row)
+                return
+            func()
+        gtk.gdk_beep()
 
     def forward(self):
         self.row = self.row + 1
@@ -121,45 +146,22 @@ class FindBase:
 class FindPerson(FindBase):
     """Opens a Find Person dialog for GRAMPS"""
     
-    def __init__(self,clist,task,plist):
+    def __init__(self,clist,task,db):
         """Opens a dialog box instance that allows users to
         search for a person.
 
         clist - GtkCList containing the people information
         task - function to call to change the active person"""
         
-        FindBase.__init__(self,clist,task,_("Find Person"))
-        for n in plist:
-            self.nlist.append(n.getPrimaryName().getName())
+        FindBase.__init__(self,clist,task,_("Find Person"),db)
+        for n in self.db.getPersonKeys():
+            val = self.db.getPersonDisplay(n)
+            self.nlist.append(val[0])
         self.enable_autocomp()
-        
-    def advance(self,func):
-        try:
-            self.row = self.clist.selection[0]
-        except IndexError:
-            gtk.gdk_beep()
-            return
 
-        text = self.entry.get_text()
-        if self.row == None or text == "":
-            gtk.gdk_beep()
-            return
-        orow = self.row
-        func()
-        person = None
-        while self.row != orow:
-            value = self.clist.get_row_data(self.row)
-            if value == None:
-                func()
-                continue
-            person,alt = value
-            if alt == 0:
-                name = person.getPrimaryName().getName()
-                if string.find(string.upper(name),string.upper(text)) >= 0:
-                    self.task(person)
-                    return
-            func()
-        gtk.gdk_beep()
+    def get_value(self,id):
+        return self.db.getPersonDisplay(id)[0]
+    
 
 #-------------------------------------------------------------------------
 #
@@ -169,42 +171,20 @@ class FindPerson(FindBase):
 class FindPlace(FindBase):
     """Opens a Find Place dialog for GRAMPS"""
     
-    def __init__(self,clist,task,plist):
+    def __init__(self,clist,task,db):
         """Opens a dialog box instance that allows users to
         search for a place.
 
         clist - GtkCList containing the people information
         task - function to call to change the active person"""
         
-        FindBase.__init__(self,clist,task,_("Find Place"))
-        for n in plist:
-            self.nlist.append(n.get_title())
+        FindBase.__init__(self,clist,task,_("Find Place"),db)
+        for n in self.db.getPlaceKeys():
+            self.nlist.append(self.db.getPlaceDisplay(n)[0])
         self.enable_autocomp()
         
-    def advance(self,func):
-        try:
-            self.row = self.clist.selection[0]
-        except IndexError:
-            gtk.gdk_beep()
-            return
-
-        text = self.entry.get_text()
-        if self.row == None or text == "":
-            gtk.gdk_beep()
-            return
-        orow = self.row
-        func()
-        while self.row != orow:
-            value = self.clist.get_row_data(self.row)
-            if value == None:
-                func()
-                continue
-            name = value.get_title()
-            if string.find(string.upper(name),string.upper(text)) >= 0:
-                self.task(self.row)
-                return
-            func()
-        gtk.gdk_beep()
+    def get_value(self,id):
+        return  self.db.getPlaceDisplay(id)[0]
 
 #-------------------------------------------------------------------------
 #
@@ -214,42 +194,20 @@ class FindPlace(FindBase):
 class FindSource(FindBase):
     """Opens a Find Place dialog for GRAMPS"""
     
-    def __init__(self,clist,task,plist):
+    def __init__(self,clist,task,db):
         """Opens a dialog box instance that allows users to
         search for a place.
 
         clist - GtkCList containing the people information
         task - function to call to change the active person"""
         
-        FindBase.__init__(self,clist,task,_("Find Source"))
-        for n in plist:
-            self.nlist.append(n.getTitle())
+        FindBase.__init__(self,clist,task,_("Find Source"),db)
+        for n in self.db.getSourceKeys():
+            self.nlist.append(n[0])
         self.enable_autocomp()
         
-    def advance(self,func):
-        try:
-            self.row = self.clist.selection[0]
-        except IndexError:
-            gtk.gdk_beep()
-            return
-
-        text = self.entry.get_text()
-        if self.row == None or text == "":
-            gtk.gdk_beep()
-            return
-        orow = self.row
-        func()
-        while self.row != orow:
-            value = self.clist.get_row_data(self.row)
-            if value == None:
-                func()
-                continue
-            name = value.getTitle()
-            if string.find(string.upper(name),string.upper(text)) >= 0:
-                self.task(self.row)
-                return
-            func()
-        gtk.gdk_beep()
+    def get_value(self,id):
+        return  self.db.getSourceDisplay(id)[0]
 
 #-------------------------------------------------------------------------
 #
diff --git a/src/GenericFilter.py b/src/GenericFilter.py
index ee377d29d..449019cc1 100644
--- a/src/GenericFilter.py
+++ b/src/GenericFilter.py
@@ -413,12 +413,12 @@ class HasBirth(Rule):
 
     def apply(self,p):
         event = p.getBirth()
-        if self.list[2] and find(event.getDescription(),self.list[2])==-1:
+        if len(self.list) > 2 and find(event.getDescription(),self.list[2])==-1:
             return 0
         if self.date:
             if date_cmp(self.date,event.getDateObj()) == 0:
                 return 0
-        if self.list[1] and find(p.getPlaceName(),self.list[1]) == -1:
+        if len(self.list) > 1 and find(event.getPlaceName(),self.list[1]) == -1:
             return 0
         return 1
 
diff --git a/src/RelLib.py b/src/RelLib.py
index 387c342db..f4dec5f32 100644
--- a/src/RelLib.py
+++ b/src/RelLib.py
@@ -1986,6 +1986,10 @@ class GrampsDB(Persistent):
         """returns a map of gramps's IDs to Family instances"""
         return extmap(self.familyMap)
 
+    def getFamily(self,id):
+        """returns a map of gramps's IDs to Family instances"""
+        return self.familyMap[id]
+
     def setFamilyMap(self,map):
         """sets the map of gramps's IDs to Family instances"""
         self.familyMap = map
diff --git a/src/gramps.glade b/src/gramps.glade
index d45152fdf..4aec80cba 100644
--- a/src/gramps.glade
+++ b/src/gramps.glade
@@ -4661,12 +4661,9 @@
 
       <widget>
 	<class>GtkScrolledWindow</class>
-	<name>scrolledwindow9</name>
-	<border_width>10</border_width>
-	<width>400</width>
-	<height>200</height>
-	<hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
-	<vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
+	<name>scrolledwindow36</name>
+	<hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
+	<vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
 	<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
 	<vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
 	<child>
@@ -4678,28 +4675,143 @@
 	<widget>
 	  <class>GtkCList</class>
 	  <name>spouseList</name>
+	  <width>450</width>
+	  <height>300</height>
 	  <can_focus>True</can_focus>
 	  <signal>
 	    <name>select_row</name>
 	    <handler>on_select_row</handler>
-	    <last_modification_time>Fri, 29 Mar 2002 13:44:27 GMT</last_modification_time>
+	    <last_modification_time>Sat, 01 Jun 2002 20:59:14 GMT</last_modification_time>
 	  </signal>
 	  <signal>
 	    <name>unselect_row</name>
 	    <handler>on_unselect_row</handler>
-	    <last_modification_time>Fri, 29 Mar 2002 13:44:33 GMT</last_modification_time>
+	    <last_modification_time>Sat, 01 Jun 2002 20:59:58 GMT</last_modification_time>
 	  </signal>
-	  <columns>2</columns>
-	  <column_widths>256,80</column_widths>
+	  <columns>4</columns>
+	  <column_widths>229,85,5,80</column_widths>
 	  <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
 	  <show_titles>True</show_titles>
 	  <shadow_type>GTK_SHADOW_IN</shadow_type>
 
+	  <widget>
+	    <class>GtkHBox</class>
+	    <child_name>CList:title</child_name>
+	    <name>hbox82</name>
+	    <homogeneous>True</homogeneous>
+	    <spacing>0</spacing>
+
+	    <widget>
+	      <class>GtkHBox</class>
+	      <name>hbox83</name>
+	      <homogeneous>False</homogeneous>
+	      <spacing>0</spacing>
+	      <child>
+		<padding>0</padding>
+		<expand>False</expand>
+		<fill>False</fill>
+	      </child>
+
+	      <widget>
+		<class>GtkLabel</class>
+		<child_name>CList:title</child_name>
+		<name>label315</name>
+		<label>Name</label>
+		<justify>GTK_JUSTIFY_CENTER</justify>
+		<wrap>False</wrap>
+		<xalign>0.5</xalign>
+		<yalign>0.5</yalign>
+		<xpad>0</xpad>
+		<ypad>0</ypad>
+		<child>
+		  <padding>0</padding>
+		  <expand>False</expand>
+		  <fill>False</fill>
+		</child>
+	      </widget>
+
+	      <widget>
+		<class>GtkArrow</class>
+		<name>NameArrow</name>
+		<width>10</width>
+		<height>10</height>
+		<arrow_type>GTK_ARROW_DOWN</arrow_type>
+		<shadow_type>GTK_SHADOW_OUT</shadow_type>
+		<xalign>0.5</xalign>
+		<yalign>0.5</yalign>
+		<xpad>0</xpad>
+		<ypad>0</ypad>
+		<child>
+		  <padding>5</padding>
+		  <expand>False</expand>
+		  <fill>True</fill>
+		</child>
+	      </widget>
+	    </widget>
+	  </widget>
+
+	  <widget>
+	    <class>GtkHBox</class>
+	    <child_name>CList:title</child_name>
+	    <name>hbox80</name>
+	    <homogeneous>True</homogeneous>
+	    <spacing>0</spacing>
+
+	    <widget>
+	      <class>GtkHBox</class>
+	      <name>hbox81</name>
+	      <homogeneous>False</homogeneous>
+	      <spacing>0</spacing>
+	      <child>
+		<padding>0</padding>
+		<expand>False</expand>
+		<fill>False</fill>
+	      </child>
+
+	      <widget>
+		<class>GtkLabel</class>
+		<child_name>CList:title</child_name>
+		<name>label311</name>
+		<label>Birth Date</label>
+		<justify>GTK_JUSTIFY_CENTER</justify>
+		<wrap>False</wrap>
+		<xalign>0.5</xalign>
+		<yalign>0.5</yalign>
+		<xpad>0</xpad>
+		<ypad>0</ypad>
+		<child>
+		  <padding>0</padding>
+		  <expand>False</expand>
+		  <fill>False</fill>
+		</child>
+	      </widget>
+
+	      <widget>
+		<class>GtkArrow</class>
+		<name>DateArrow</name>
+		<width>10</width>
+		<height>10</height>
+		<visible>False</visible>
+		<arrow_type>GTK_ARROW_DOWN</arrow_type>
+		<shadow_type>GTK_SHADOW_OUT</shadow_type>
+		<xalign>0.5</xalign>
+		<yalign>0.5</yalign>
+		<xpad>0</xpad>
+		<ypad>0</ypad>
+		<child>
+		  <padding>0</padding>
+		  <expand>False</expand>
+		  <fill>False</fill>
+		</child>
+	      </widget>
+	    </widget>
+	  </widget>
+
 	  <widget>
 	    <class>GtkLabel</class>
 	    <child_name>CList:title</child_name>
-	    <name>label65</name>
-	    <label>Name</label>
+	    <name>label318</name>
+	    <label></label>
 	    <justify>GTK_JUSTIFY_CENTER</justify>
 	    <wrap>False</wrap>
 	    <xalign>0.5</xalign>
@@ -4711,8 +4823,8 @@
 	  <widget>
 	    <class>GtkLabel</class>
 	    <child_name>CList:title</child_name>
-	    <name>label66</name>
-	    <label>Birthdate</label>
+	    <name>label319</name>
+	    <label></label>
 	    <justify>GTK_JUSTIFY_CENTER</justify>
 	    <wrap>False</wrap>
 	    <xalign>0.5</xalign>
diff --git a/src/gramps_main.py b/src/gramps_main.py
index bd813c13e..34e7abcc5 100755
--- a/src/gramps_main.py
+++ b/src/gramps_main.py
@@ -330,25 +330,23 @@ class Gramps:
     def on_find_activate(self,obj):
         """Display the find box"""
         if self.notebook.get_current_page() == 4:
-            Find.FindPlace(self.place_view.place_list,self.find_goto_place,
-                           self.db.getPlaceMap().values())
+            Find.FindPlace(self.place_view.place_list,self.find_goto_place,self.db)
         elif self.notebook.get_current_page() == 3:
-            Find.FindSource(self.source_view.source_list,self.find_goto_source,
-                           self.db.getSourceMap().values())
+            Find.FindSource(self.source_view.source_list,self.find_goto_source,self.db)
         elif self.notebook.get_current_page() == 5:
             Find.FindMedia(self.media_view.media_list,self.find_goto_media,
                            self.db.getObjectMap().values())
         else:
-            Find.FindPerson(self.person_list,self.find_goto_to,
-                            self.db.getPersonMap().values())
+            Find.FindPerson(self.person_list,self.find_goto_to,self.db)
 
     def on_findname_activate(self,obj):
         """Display the find box"""
         pass
 
-    def find_goto_to(self,person):
+    def find_goto_to(self,row):
         """Find callback to jump to the selected person"""
-        self.change_active_person(person)
+        id = self.person_list.get_row_data(row)
+        self.change_active_person(self.db.getPerson(id))
         self.goto_active_person()
         self.update_display(0)
 
@@ -1290,9 +1288,9 @@ class Gramps:
             EditPerson.EditPerson(person, self.db, self.update_after_edit)
 
     def build_spouse_dropdown(self):
+        list = []
         mymap = {}
         mynmap = {}
-        list = []
         sel = None
         for f in self.active_person.getFamilyList():
             if self.active_person == f.getFather():
@@ -1303,8 +1301,8 @@ class Gramps:
             list.append(c)
             if f == self.active_family or sel == None:
                 sel = c
-            mymap[f] = c
-            mynmap[f] = sname
+            mynmap[f.getId()] = sname
+            mymap[f.getId()] = c
         self.spouse_combo.disable_activate()
         self.spouse_combo.list.clear_items(0,-1)
         self.spouse_combo.list.append_items(list)
@@ -1706,10 +1704,13 @@ class Gramps:
             gnome.ui.GnomeErrorDialog(_("No default/home person has been set"))
 
     def on_add_bookmark_activate(self,obj):
-        self.bookmarks.add(self.active_person)
-        name = GrampsCfg.nameof(self.active_person)
-        self.statusbar.set_status(_("%s has been bookmarked") % name)
-        gtk.timeout_add(5000,self.modify_statusbar)
+        if self.active_person:
+            self.bookmarks.add(self.active_person)
+            name = GrampsCfg.nameof(self.active_person)
+            self.statusbar.set_status(_("%s has been bookmarked") % name)
+            gtk.timeout_add(5000,self.modify_statusbar)
+        else:
+            GnomeWarningDialog(_("Bookmark could not be set because no one was selected"))
 
     def on_edit_bookmarks_activate(self,obj):
         self.bookmarks.edit()
@@ -1760,7 +1761,7 @@ class Gramps:
         if len(select) == 0:
             self.active_family = None
         else:
-            self.active_family = select[0].get_data('d')
+            self.active_family = self.db.getFamily(select[0].get_data('d'))
 
         if self.active_family == self.active_person.getFamilyList()[0]:
             self.pref_spouse.set_sensitive(0)
diff --git a/src/plugins/PatchNames.py b/src/plugins/PatchNames.py
index 3cfbc6066..30b24bc2b 100644
--- a/src/plugins/PatchNames.py
+++ b/src/plugins/PatchNames.py
@@ -53,30 +53,30 @@ class PatchNames:
         self.title_list = []
         self.nick_list = []
         
-        personMap = self.db.getPersonMap()
-        for key in personMap.keys():
+        for key in self.db.getPersonKeys():
         
-            person = personMap[key]
+            person = self.db.getPerson(key)
             first = person.getPrimaryName().getFirstName()
             match = _title_re.match(first)
             if match:
                 groups = match.groups()
-                self.title_list.append((person,groups[0],groups[1]))
-
+                self.title_list.append((key,groups[0],groups[1]))
             match = _nick_re.match(first)
             if match:
                 groups = match.groups()
-                self.nick_list.append((person,groups[0],groups[1]))
+                self.nick_list.append((key,groups[0],groups[1]))
 
         msg = ""
         if len(self.nick_list) > 0 or len(self.title_list) > 0:
-            for name in self.nick_list:
+            for (id,name,nick) in self.nick_list:
+                p = self.db.getPerson(id)
                 msg = msg + _("%s will be extracted as a nickname from %s\n") % \
-                      (name[2],name[0].getPrimaryName().getName())
+                      (nick,p.getPrimaryName().getName())
 
-            for name in self.title_list:
+            for (id,title,nick) in self.title_list:
+                p = self.db.getPerson(id)
                 msg = msg + _("%s will be extracted as a title from %s\n") % \
-                      (name[0].getPrimaryName().getName(),name[1])
+                      (title,p.getPrimaryName().getName())
 
             base = os.path.dirname(__file__)
             glade_file = base + os.sep + "patchnames.glade"
@@ -93,15 +93,19 @@ class PatchNames:
 
     def on_ok_clicked(self,obj):
         for grp in self.nick_list:
-            name = grp[0].getPrimaryName()
+            p = self.db.getPerson(grp[0])
+            name = p.getPrimaryName()
             name.setFirstName(grp[1])
-            grp[0].setNickName(grp[2])
+            p.setNickName(grp[2])
+            self.db.buildPersonDisplay(grp[0])
             Utils.modified()
 
         for grp in self.title_list:
-            name = grp[0].getPrimaryName()
+            p = self.db.getPerson(grp[0])
+            name = p.getPrimaryName()
             name.setFirstName(grp[2])
             name.setTitle(grp[1])
+            self.db.buildPersonDisplay(grp[0])
             Utils.modified()
 
         Utils.destroy_passed_object(obj)
diff --git a/src/plugins/ReadGedcom.py b/src/plugins/ReadGedcom.py
index 9c2020947..804ce8903 100644
--- a/src/plugins/ReadGedcom.py
+++ b/src/plugins/ReadGedcom.py
@@ -1675,11 +1675,9 @@ class GedcomParser:
                         self.db.removePerson(person.getId())
                         person.setId(new_key)
                         self.db.addPersonAs(person)
-                    # person currently using it was just added, change it
-                    elif self.added.has_key(tp.getId()):
-                        self.db.removePerson(person.getId())
-                        person.setId(new_key)
-                        self.db.addPersonAs(person)
+                    # give up trying to use the refn as a key
+                    else:
+                        pass
 
         self.db.pmapIndex = new_pmax