diff --git a/product/ERP5/Document/Person.py b/product/ERP5/Document/Person.py
index 6d2c18cf14b8d7d46f83eadaec6ac4153ea8a6e7..f6c3bc49b0725857627c0a175e1e88ec32ed6e83 100644
--- a/product/ERP5/Document/Person.py
+++ b/product/ERP5/Document/Person.py
@@ -96,11 +96,12 @@ class Person(Node, LoginAccountProviderMixin, EncryptedPasswordMixin):
         first name, middle name and last name
       """
       if not self.title:
-        return ' '.join([x for x in (self.getFirstName(),
-                                     self.getMiddleName(),
-                                     self.getLastName()) if x])
-      else:
-        return self.title
+        title = ' '.join([x for x in (self.getFirstName(),
+                                      self.getMiddleName(),
+                                      self.getLastName()) if x])
+        if title:
+          return title
+      return super(Person, self).getTitle(**kw)
 
     security.declareProtected(Permissions.AccessContentsInformation,
                               'getTranslatedTitle')
@@ -110,11 +111,12 @@ class Person(Node, LoginAccountProviderMixin, EncryptedPasswordMixin):
         first name, middle name and last name
       """
       if not self.title:
-        return ' '.join([x for x in (self.getTranslatedFirstName(**kw),
-                                     self.getTranslatedMiddleName(**kw),
-                                     self.getTranslatedLastName(**kw)) if x])
-      else:
-        return self.title
+        title = ' '.join([x for x in (self.getTranslatedFirstName(**kw),
+                                      self.getTranslatedMiddleName(**kw),
+                                      self.getTranslatedLastName(**kw)) if x])
+        if title:
+          return title
+      return super(Person, self).getTranslatedTitle(**kw)
 
     security.declareProtected(Permissions.AccessContentsInformation,
                               'title_or_id')
@@ -124,7 +126,10 @@ class Person(Node, LoginAccountProviderMixin, EncryptedPasswordMixin):
     security.declareProtected(Permissions.AccessContentsInformation,
                               'hasTitle')
     def hasTitle(self):
-      return not not self.getTitle()
+      return self.hasFirstName() or \
+          self.hasLastName() or \
+          self.hasMiddleName() or \
+          self._baseHasTitle()
 
     def _setReference(self, value):
       """
diff --git a/product/ERP5/tests/testPerson.py b/product/ERP5/tests/testPerson.py
index 17e1ca3503e3966379e038364b23400233e54746..bf7296b3c7f28bcfa46d1269bdd0c216e3247738 100644
--- a/product/ERP5/tests/testPerson.py
+++ b/product/ERP5/tests/testPerson.py
@@ -90,9 +90,37 @@ class TestPerson(ERP5TypeTestCase):
     self.assertEqual(person_copy_obj.getReference(), person.getReference())
 
   # title & first_name, last_name
-  def testEmptyTitle(self):
-    p = self._makeOne()
-    self.assertEqual('', p.getTitle())
+  def testEmptyTitleFallbackOnId(self):
+    p = self._makeOne(id=self.id())
+    self.assertEqual(self.id(), p.getTitle())
+
+  def testEmptyTranslatedTitleFallbackOnId(self):
+    p = self._makeOne(id=self.id())
+    self.assertEqual(self.id(), p.getTranslatedTitle())
+
+  def testEmptyCompactTitleFallbackOnId(self):
+    p = self._makeOne(id=self.id())
+    self.assertEqual(self.id(), p.getCompactTitle())
+
+  def testEmptyCompactTranslatedTitleFallbackOnId(self):
+    p = self._makeOne(id=self.id())
+    self.assertEqual(self.id(), p.getCompactTranslatedTitle())
+
+  def testEmptyTitleFallbackOnReference(self):
+    p = self._makeOne(reference='reference')
+    self.assertEqual('reference', p.getTitle())
+
+  def testEmptyTranslatedTitleFallbackOnReference(self):
+    p = self._makeOne(reference='reference')
+    self.assertEqual('reference', p.getTranslatedTitle())
+
+  def testEmptyCompactTitleFallbackOnReference(self):
+    p = self._makeOne(reference='reference')
+    self.assertEqual('reference', p.getCompactTitle())
+
+  def testEmptyCompactTranslatedTitleFallbackOnReference(self):
+    p = self._makeOne(reference='reference')
+    self.assertEqual('reference', p.getCompactTranslatedTitle())
 
   def testSetFirstName(self):
     p = self._makeOne()
@@ -112,6 +140,22 @@ class TestPerson(ERP5TypeTestCase):
     p.setMiddleName('middle')
     self.assertEqual('first middle last', p.getTitle())
 
+  def testTranslatedTitleFromFirstLastName(self):
+    p = self._makeOne(id='person')
+    p.setFirstName('first')
+    p.setLastName('last')
+    self.assertEqual('first last', p.getTranslatedTitle())
+    p.setMiddleName('middle')
+    self.assertEqual('first middle last', p.getTranslatedTitle())
+
+  def testCompactTranslatedTitleFromFirstLastName(self):
+    p = self._makeOne(id='person')
+    p.setFirstName('first')
+    p.setLastName('last')
+    self.assertEqual('first last', p.getCompactTranslatedTitle())
+    p.setMiddleName('middle')
+    self.assertEqual('first middle last', p.getCompactTranslatedTitle())
+
   def testEditFirstNameLastName(self):
     # using 'edit' method
     p = self._makeOne(id='person')