diff --git a/models/db_tools.py b/models/db_tools.py
index 45068b70840a160cd5a4639daf44f606e4cda31b..4eefa99a7695fd1128e14add2eceba8c20f0bbbf 100644
--- a/models/db_tools.py
+++ b/models/db_tools.py
@@ -23,26 +23,27 @@ tp_ratio = \
 "Parameter for fuzzy string search."
 
 db.define_table("harvesters",
-    Field("id_teams", db.teams, default=undef_id, label='Team'),
-    Field("id_projects", db.projects, default=undef_id, label='Project'),
+    Field("id_teams", "reference teams", default=undef_id, label='Team'),
+    Field("id_projects", "reference projects", default=undef_id, label='Project'),
     Field("controller", "string", notnull=True, comment=tp_controller),
     Field("host", "string", notnull=True, default='cdsweb.cern.ch', label='Store', comment=tp_host),
     Field("collections", "string", comment=tp_collections),
     Field("ratio", "double", notnull=True, default=1.0, comment=tp_ratio),
-    Field("id_categories", db.categories, default=1, label='Category', comment=tp_category),
+    Field("id_categories", "reference categories", default=1, label='Category', comment=tp_category),
     migrate="harvesters.table")
 
 db.harvesters.controller.requires = \
 IS_IN_SET(['articles', 'notes', 'preprints', 'proceedings', 'reports', 'talks', 'theses'])
 
+# TEST THE DIFFERENT SYNTAX DEFINING FOREIGN KEY
 db.harvesters.id_categories.requires = \
 IS_IN_DB(db, 'categories.id', 'categories.code')
 
 db.harvesters.id_projects.requires = \
-IS_IN_DB(db, 'projects.id', 'projects.project')
+IS_IN_DB(db, 'projects.project')
 
-db.harvesters.id_teams.requires = \
-IS_IN_DB(db, 'teams.id', 'teams.team')
+#db.harvesters.id_teams.requires = \
+#IS_IN_DB(db, 'teams.id', 'teams.team')
 
 db.harvesters.ratio.requires = \
 IS_FLOAT_IN_RANGE(0., 1.0)
\ No newline at end of file
diff --git a/modules/plugin_dbui/helper.py b/modules/plugin_dbui/helper.py
index 27ba60f5f85fc6115d7943e47728d4e898c980cc..2a78e5329a70ceca261d00ad339be1c52915cda0 100644
--- a/modules/plugin_dbui/helper.py
+++ b/modules/plugin_dbui/helper.py
@@ -202,20 +202,54 @@ def get_file_paths(path, ext=None, alpha=True):
 
 
 def get_foreign_field(field):
-    """Helper function returning a tuple containing the parent tablename,
-    the parent fieldname and the primary key name of the parent table. 
-    
-        table.field --> k_table.k_field
-        table.field == k_table.k_key
+    """Helper function returning a tuple (k_tablename, k_fieldname, k_keyname)
+    where:
+        
+        k_tablename is the name of the parent table
+        
+        k_fieldname is the name of the parent field
+            table.field --> k_table.k_field
         
+        k_keyname is the name of the primary key of the parent table
+        requires by the left join. In most of the case it is id
+            table.field == k_table.k_key
+     
     Otherwise return None.
     
     """
+    if not is_foreign_field(field):
+        return None
+    
+    # foreign field validators IS_IN_BD contains all information 
+    # on the parent key for the left join and on the parent field
     validators = as_list(field.requires)
 
+    # Several syntax are allowed
+
+    # IS_IN_DB is use.
     for vdt in validators:
+        
         if isinstance(vdt, IS_IN_DB):
-            return (vdt.ktable, vdt.ks[0], vdt.ks[1])   
+            # IS_IN_DB contains only the parent field. 
+            # The key for the left join is the id key of the parent table
+            if len(vdt.ks) == 1:
+                return (vdt.ktable, vdt.ks[0], 'id')
+            
+            # IS_IN_DB contains the key for the join and the parent field 
+            else:
+                return (vdt.ktable, vdt.ks[0], vdt.ks[1])   
+    
+    # IS_IN_DB is not use. 
+    # The parent key for the left join is the id key of the parent table
+    # the parent field is the first field of the parent table which differs id
+    if not validators:
+        i = field.type.index(' ')
+        ktablename = field.type[i:].strip()
+        
+        for kfield in field._db[ktablename]:
+            if kfield.name != 'id':
+                return (ktablename, kfield.name, 'id')
+            
 
     return None
 
diff --git a/static/plugin_dbui/CHANGELOG b/static/plugin_dbui/CHANGELOG
index 0beb3aadce677f34f9f3391637e5055f0c5273bc..fc4c46f221075776d95b73a1531c2ed5d026fde2 100644
--- a/static/plugin_dbui/CHANGELOG
+++ b/static/plugin_dbui/CHANGELOG
@@ -2,6 +2,7 @@
 
 HEAD
   - Upgrade to run with alias table.
+  - More syntax to define foreign key.
 
 0.4.10.3 (Mar 2013)
   - Fix a bug in App.BasePanelWithSelector for IE.