[tryton-debian-vcs] tryton-client branch upstream updated. upstream/3.2.4-1-gda60d82

Mathias Behrle tryton-debian-vcs at alioth.debian.org
Thu Oct 23 12:11:38 UTC 2014


The following commit has been merged in the upstream branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-client.git;a=commitdiff;h=upstream/3.2.4-1-gda60d82

commit da60d82586cc542263bc305e34cacaf0642e0510
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Oct 21 11:29:01 2014 +0200

    Adding upstream version 3.4.0.
    
    Signed-off-by: Mathias Behrle <mathiasb at m9s.biz>

diff --git a/CHANGELOG b/CHANGELOG
index be6184e..26291ea 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,14 +1,15 @@
-Version 3.2.4 - 2014-09-29
-* Bug fixes (see mercurial logs for details)
-
-Version 3.2.3 - 2014-08-03
-* Bug fixes (see mercurial logs for details)
-
-Version 3.2.2 - 2014-07-02
-* Bug fixes (see mercurial logs for details)
-
-Version 3.2.1 - 2014-05-07
+Version 3.4.0 - 2014-10-20
 * Bug fixes (see mercurial logs for details)
+* Add DnD on export window
+* Allow to overide predefined export
+* Prefill export window with current view fields
+* Manage field context on Group value
+* Add export of selection string
+* Load plugins from local user directory
+* Manage tree_state attribute
+* Add simple tree_state support on form view
+* Change range operator of search widget to be included
+* Explicitly set value of parent field
 
 Version 3.2.0 - 2014-04-21
 * Bug fixes (see mercurial logs for details)
diff --git a/PKG-INFO b/PKG-INFO
index 8bd6c16..d23ca40 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: tryton
-Version: 3.2.4
+Version: 3.4.0
 Summary: Tryton client
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: issue_tracker at tryton.org
 License: GPL-3
-Download-URL: http://downloads.tryton.org/3.2/
+Download-URL: http://downloads.tryton.org/3.4/
 Description: tryton
         ======
         
diff --git a/doc/conf.py b/doc/conf.py
index 22adaab..27e91e8 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -46,9 +46,9 @@ copyright = u'2008-2011,  Anne Krings, Bertrand Chenal, Cédric Krier, \
 # built documents.
 #
 # The short X.Y version.
-version = '3.2'
+version = '3.4'
 # The full version, including alpha/beta/rc tags.
-release = '3.2'
+release = '3.4'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/doc/usage.rst b/doc/usage.rst
index 16f0120..863c8f3 100644
--- a/doc/usage.rst
+++ b/doc/usage.rst
@@ -474,7 +474,7 @@ Save Width/Height:
 .. _Menu-Options-Form-Save_Tree_State:
 
 Save Tree Expanded State:
-  Check box to enable saving of manually expanded nodes in trees.
+  Check box to enable saving of expanded and selected nodes in trees/lists.
 
 .. _Menu-Options-Form-Spell_Checking:
 
@@ -616,10 +616,10 @@ Search:
 View Logs...:
   Shows generic information of the current record.
 
-.. _Toolbar-Go_to_Record_ID:
+.. _Toolbar-Show revisions:
 
-Go to Record ID...:
-  Opens specific record id in the current view.
+Show revisions...:
+  Reload the current view/record at a specific revision.
 
 .. _Toolbar-Close:
 
@@ -794,8 +794,7 @@ A range of number values can be set using `..`.
 
     For example: ``Amount: 100..500``
 
-    It will find all records with `Amount` between `100` and `500` (left
-    included and right excluded)
+    It will find all records with `Amount` between `100` and `500` included.
 
 There are two wildcards:
 
@@ -878,4 +877,4 @@ Configuration File
    ~/.config/tryton/x.y/known_hosts      # Fingerprints
    ~/.config/tryton/x.y/ca_certs         # Certification Authority (http://docs.python.org/library/ssl.html#ssl-certificates)
    ~/.config/tryton/x.y/profiles.cfg     # Profile configuration
-
+   ~/.config/tryton/x.y/plugins          # Local user plugins directory
diff --git a/setup.py b/setup.py
index de7b229..05957e0 100644
--- a/setup.py
+++ b/setup.py
@@ -40,6 +40,7 @@ languages = (
     'de_DE',
     'es_AR',
     'es_CO',
+    'es_EC',
     'es_ES',
     'fr_FR',
     'ja_JP',
@@ -374,8 +375,14 @@ elif sys.platform == 'darwin':
         with open(immodules_path, 'w') as immodules:
             immodules.write(query_immodules)
 
-        shutil.copy(os.path.join(gtk_dir, 'share', 'themes', 'Clearlooks',
-            'gtk-2.0', 'gtkrc'), os.path.join(resources_dir, 'gtkrc'))
+        with open(os.path.join(resources_dir, 'gtkrc'), 'w') as gtkrc:
+            for name, dirname in (
+                    ('Clearlooks', 'gtk-2.0'),
+                    ('Mac', 'gtk-2.0-key'),
+                    ):
+                rcfile = os.path.join(gtk_dir, 'share', 'themes', name,
+                    dirname, 'gtkrc')
+                gtkrc.write(open(rcfile).read())
 
         for lang in all_languages():
             if os.path.isdir(os.path.join(resources_dir, 'share', 'locale',
diff --git a/share/locale/bg_BG/LC_MESSAGES/tryton.mo b/share/locale/bg_BG/LC_MESSAGES/tryton.mo
index 9d9f899..2b7ade2 100644
Binary files a/share/locale/bg_BG/LC_MESSAGES/tryton.mo and b/share/locale/bg_BG/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/bg_BG/LC_MESSAGES/tryton.po b/share/locale/bg_BG/LC_MESSAGES/tryton.po
index 21147c3..c7898c6 100644
--- a/share/locale/bg_BG/LC_MESSAGES/tryton.po
+++ b/share/locale/bg_BG/LC_MESSAGES/tryton.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tryton 1.5.0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
 "PO-Revision-Date: 2012-04-23 11:06+0200\n"
 "Last-Translator: Nickolay Kolev <nickyk at gmx.net>\n"
 "Language-Team: bg_BG <LL at li.org>\n"
@@ -15,46 +15,46 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "укажете друг конфигурационен файл"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr ""
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr "записване на всичко на ниво INFO "
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr ""
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "укажете потребителското име"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr "укажете порт на сървъра"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "укажете адреса на сървъра"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr "Твърде много аргументи"
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr "Файла \"%s\" не е намерен"
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr "Не може да запише конфигурационен файл %s!"
@@ -84,42 +84,42 @@ msgstr "Сървър:"
 msgid "Port:"
 msgstr "Порт:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Избор:"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "Вашия избор"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Запис като ..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "Винаги игнорирай това предупреждение."
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr ""
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Потвърждение"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Грешка при достъп"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
 "\n"
@@ -137,50 +137,50 @@ msgstr ""
 "   - \"Сравняване\" за да видите променената версия;\n"
 "   - \"Запис \" за да запишете вашата текуща версия."
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Сравняване"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Запис"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Грешка"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "Съобщаване за грешка"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr "Грешка в приложението!"
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "Грешка: "
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr "За да съобщите за грешка трябва да имате сметка на <u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr ""
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "Потребител: "
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "Парола:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -188,11 +188,11 @@ msgstr ""
 "Тази грешка е вече съобщена от друг потребител..\n"
 "За да бъдете информирани потребителя ви е добавен списъка за този проблем"
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "Създадена е нова грешка с ID"
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
@@ -200,11 +200,11 @@ msgstr ""
 "Грешка при свързване!\n"
 "Грешно потребителско име или парола!"
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "Грешка:"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
@@ -214,12 +214,12 @@ msgstr ""
 "Приложението ще спре да се връзва към сървъра докато не бъде оправен "
 "идентификатора му."
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
 msgstr "Риск за сигурността"
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
@@ -227,31 +227,31 @@ msgstr ""
 "Грешка при свързване!\n"
 "Невъзможност да се свърже със сървъра!"
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "Мрежова грешка!"
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr "Г"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "М"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "с"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr "д"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "ч"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "м"
 
@@ -272,59 +272,59 @@ msgstr "Отваряне на календара"
 msgid "Date Selection"
 msgstr "Избор на дата"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr "г"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "yes"
 msgstr "да"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "true"
 msgstr "Истина"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr ""
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Истина"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Лъжа"
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 #, fuzzy
 msgid "Edit..."
 msgstr "Изход..."
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 msgid "Attachments..."
 msgstr "Прикачен файл:"
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 msgid "Actions..."
 msgstr "Действия..."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 #, fuzzy
 msgid "Relate..."
 msgstr "Свързани..."
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 msgid "Report..."
 msgstr "Справки..."
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 msgid "E-Mail..."
 msgstr "Email..."
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 msgid "Print..."
 msgstr "Печат..."
 
@@ -349,10 +349,10 @@ msgid "_Help"
 msgstr "Помощ"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Търсене"
 
@@ -523,7 +523,7 @@ msgstr "Относно..."
 msgid "Manage Favorites"
 msgstr "Управление на профили"
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
@@ -531,11 +531,11 @@ msgstr ""
 "Следващите действия изискват затваряне на всички прозорци.\n"
 "Искате ли да продължите?"
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Затваряне на таб"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
@@ -543,7 +543,7 @@ msgstr ""
 "Ще изтриете Tryton база данни.\n"
 "Сигурни ли сте че искате да продължите?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -551,28 +551,28 @@ msgstr ""
 "Грешна парола за Tryton сървъра\n"
 "Моля опитайте отново."
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "Достъпа отказан!"
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr "Изтриването на базата данни неуспя с грешка:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "Изтриването на базата данни неуспешно!"
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "Базата данни изтрита успешно!"
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "Отваряне на архивиран файл за възтановяване..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -580,11 +580,11 @@ msgstr ""
 "Не може да се възтановяви база данни защитена с парола.\n"
 "Архивирането и възтановяването трябва да стане ръчно."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "Базата данни е защитена с парола!"
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -592,19 +592,19 @@ msgstr ""
 "Грешна парола за Tryton сървъра.\n"
 "Моля опитайте отново."
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr "Възтановяването на базата данни неуспя с грешка:\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "Възтановяването на базата неуспешно"
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "Възтановяването на базата данни неуспешно"
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -612,15 +612,15 @@ msgstr ""
 "Не е възможно да се извлече база данни защитена с парола.\n"
 "Архивирането и възтановяването трябва да стане ръчно."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "Извличането на базата данни неуспя с грешка:\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr "Извличането на базата данни неуспешно!"
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "Базата данни архивирана успешно!"
 
@@ -633,7 +633,7 @@ msgid "Create a new record"
 msgstr "Създаване на нов запис"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "Съхраняване"
 
@@ -643,7 +643,7 @@ msgstr "Съхраняване на този запис"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "Превключване"
 
@@ -824,39 +824,17 @@ msgstr "Потвърждаване на паролата:"
 msgid "Type the Admin password again"
 msgstr "Напишете отново паролата на администратора"
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Името на базата данни е ограничено до латински букви, цифри и \"_\" (под "
-"черта). Избягвайте акценти, празен символ или специални символи."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Грешни символи в името на базата данни!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr ""
 "Новата парола на администратора не съвпада с тази в полето за "
 "потвърждение.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "Паролата не съвпада!"
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"За зъздаване на нова база данни са необходими парола за администратор и "
-"парола за потвърждение."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Липсва парола за администратор!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -864,15 +842,15 @@ msgstr ""
 "Вече съществува база данни с това име.\n"
 "Опитайте с друго име на базата данни."
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "Вече съществува база данни с такова име!"
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr "Грешна парола за Tryton сървъра. Моля опитайте отново."
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -884,7 +862,7 @@ msgstr ""
 "тази база данни! За повече информация вижте съобщинието за грешка.\n"
 "Съобщение за грешка:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "Грешка при създаване на база данни!"
 
@@ -949,12 +927,12 @@ msgstr "Редактор на профили"
 msgid "Profile"
 msgstr "Профил"
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "Добавяне"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "Изтриване"
@@ -979,7 +957,7 @@ msgstr "Потребителско име:"
 msgid "Could not connect to the server"
 msgstr "Не може да се свърже със сървъра!"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 msgid "Incompatible version of the server"
 msgstr "Несъвместима версия на сървъра!"
 
@@ -1105,8 +1083,8 @@ msgstr "Прикачен файл:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Предишен"
 
@@ -1116,8 +1094,8 @@ msgstr "Предишен запис"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Следващ"
 
@@ -1224,23 +1202,23 @@ msgstr "Дата на последна промяна:"
 msgid "Model:"
 msgstr "Модел:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr "Наистина ли искате да изтриете този запис?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr "Наистина ли искате да изтриете тези записи?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr "Записа не е изтрит!"
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr "Записите изтрити!"
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr "Работите върху дублиран(и) запис(и)!"
 
@@ -1252,11 +1230,11 @@ msgstr "Записа съхранен!"
 msgid "Invalid form!"
 msgstr "Невалидна форма!"
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " от"
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1264,49 +1242,48 @@ msgstr ""
 "Този запис е променен\n"
 "искате ли да го запишете ?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Действие"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr "Започване на действие"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Relate"
 msgstr "Свързани"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Open related records"
 msgstr "Отваряне на свързани записи"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Report"
 msgstr "Справки"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Open report"
 msgstr "Отваряне на справка"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail"
 msgstr "Email"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr "Изращане на справка по Email"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Печат"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr "Отпечатване на справка"
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Неизвестен"
 
@@ -1484,67 +1461,77 @@ msgstr "Подсказки"
 msgid "_Display a new tip next time"
 msgstr "Показвай нова подсказка следващия път"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Извличане в CSV"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Предварително зададени извличания</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Всички полета</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Изчистване"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Запис на извличане"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Изтриване на извличане"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Полета за извличане</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Настройки</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Отваряне"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Добавяне на имена на полета"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "Име"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr "Какво е името на това извличане?"
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "%d заспис съхранен!"
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "%d записа съхранени!"
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1568,18 +1555,17 @@ msgid "Remove <Del>"
 msgstr "Изтриване <Del>"
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 msgid "Create a new record <F3>"
 msgstr "Създаване на нов запис <F3>"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 msgid "Delete selected record <Del>"
 msgstr "Изтриване на избрания запис <Del>"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 msgid "Undelete selected record <Ins>"
 msgstr "Възтановяване на избрания запис <Ins>"
 
@@ -1601,10 +1587,10 @@ msgstr "Файл за вмъкване:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Отваряне..."
 
@@ -1655,74 +1641,104 @@ msgstr "%d запис вмъкнат!"
 msgid "%d records imported!"
 msgstr "%d записи вмъкнати!"
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Помощник"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Няма атрибут низ"
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 #, fuzzy
 msgid "ID"
 msgstr "д"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 #, fuzzy
 msgid "Creation User"
 msgstr "Потребител създал:"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 #, fuzzy
 msgid "Creation Date"
 msgstr "Дата на създаване:"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 #, fuzzy
 msgid "Modification User"
 msgstr "Дата на последна промяна:"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 #, fuzzy
 msgid "Modification Date"
 msgstr "Дата на последна промяна:"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr ""
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 #, fuzzy
 msgid "Unable to set view tree state"
 msgstr "Не може да зададе локални настройки %s"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Запис като"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Размер на изображение"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Ширина:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Височина:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG изображение (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Размера на изображението е много голям!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 msgid "F_ilters"
 msgstr "Филтри"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Търсене"
 
@@ -1753,83 +1769,52 @@ msgstr "Избор на файл"
 msgid "Show plain text"
 msgstr "Показване само на текст"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 msgid "Select an Image..."
 msgstr "Избор на картинка"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Всички файлове"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Изображения"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-#, fuzzy
-msgid "Translation"
-msgstr "Добавяне на превод"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Редактиране"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Неясно"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Трябва да съхраните записа преди да добавите преводи!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Няма наличен друг език!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 #, fuzzy
 msgid "Add existing record"
 msgstr "Съхраняване на този запис"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 #, fuzzy
 msgid "Remove selected record <Del>"
 msgstr "Изтриване на избрания запис <Del>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 msgid "Open a record <F2>"
 msgstr "Отваряне на запис"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 msgid "Search a record <F2>"
 msgstr "Тъсене на запис"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 #, fuzzy
 msgid "Remove selected record"
 msgstr "Изтриване на избрания запис <Del>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 msgid "Edit selected record <F2>"
 msgstr "Редактиране на избрания запис"
 
@@ -1889,35 +1874,27 @@ msgstr ""
 msgid "Select a background color"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Запис като"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Размер на изображение"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Ширина:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+#, fuzzy
+msgid "Translation"
+msgstr "Добавяне на превод"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Височина:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Редактиране"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG изображение (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Неясно"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Размера на изображението е много голям!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Трябва да съхраните записа преди да добавите преводи!"
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Няма наличен друг език!"
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
 msgstr "Превод на изглед"
-
diff --git a/share/locale/ca_ES/LC_MESSAGES/tryton.mo b/share/locale/ca_ES/LC_MESSAGES/tryton.mo
index a84d937..2e044eb 100644
Binary files a/share/locale/ca_ES/LC_MESSAGES/tryton.mo and b/share/locale/ca_ES/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/ca_ES/LC_MESSAGES/tryton.po b/share/locale/ca_ES/LC_MESSAGES/tryton.po
index bbc5dd8..983a981 100644
--- a/share/locale/ca_ES/LC_MESSAGES/tryton.po
+++ b/share/locale/ca_ES/LC_MESSAGES/tryton.po
@@ -9,54 +9,54 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tryton 2.4.0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-04-17 18:49+0200\n"
-"Last-Translator: \n"
-"Language-Team: Catalan <kde-i18n-ca at kde.org>\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-10-17 09:35+0100\n"
+"Last-Translator: Sergi Almacellas Abellana <sergi at koolpi.com>\n"
+"Language-Team: Catalan <tryton-ca at googlegroups.com>\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "Indica un fitxer de configuració alternatiu"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr "mode desenvolupament"
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr "Registra tota la informació amb nivell INFO"
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr "indica el nivell de log: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "Indica l'usuari"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr "Indica el port del servidor"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "Indica el nom del servidor"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr "Massa arguments"
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr "No s'ha trobat el fitxer \"%s\""
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr "No s'ha pogut escriure el fitxer configuració %s"
@@ -86,42 +86,42 @@ msgstr "Servidor:"
 msgid "Port:"
 msgstr "Port:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Selecció"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "La vostra selecció:"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Desa com..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "Ignora sempre aquest advertiment."
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr "Voleu continuar?"
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Confirmació"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Excepció de concurrència"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
 "\n"
@@ -139,50 +139,50 @@ msgstr ""
 "   - \"Compara\" per veure la versió modificada:\n"
 "   - \"Desa de totes formes\" per desar els vostres canvis."
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Compara"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Desa de totes formes"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Error"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "Informa de l'error"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr "Error d'aplicació."
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "Error: "
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr "Per informar d'errors heu de tenir un compte a <u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr "Seguiment d'errors"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "Usuari:"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "Contrasenya:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -191,11 +191,11 @@ msgstr ""
 "Per mantenir-vos informat afegirem el vostre usuari a la llista "
 "d'interessats en aquest assumpte."
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "S'ha creat una nou informe d'error amb l'identificador "
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
@@ -203,11 +203,11 @@ msgstr ""
 "Error de connexió.\n"
 "Nom d'usuari o contrasenya incorrectes."
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "Excepció:"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
@@ -217,12 +217,12 @@ msgstr ""
 "L'aplicació no es podrà connectar a aquest servidor fins que es "
 "corregeixi l'empremta digital del servidor."
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
 msgstr "Risc de seguretat."
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
@@ -230,31 +230,31 @@ msgstr ""
 "Error de connexió.\n"
 "No ha estat possible connectar-se al servidor."
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "Error de xarxa."
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr "A"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "M"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "s"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr "d"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "h"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "m"
 
@@ -274,57 +274,57 @@ msgstr "Obre el calendari <F2>"
 msgid "Date Selection"
 msgstr "Selecció de data"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr "a"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "yes"
 msgstr "sí"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "true"
 msgstr "verdader"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr "v"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Verdader"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Fals"
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 msgid "Edit..."
 msgstr "Edita..."
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 msgid "Attachments..."
 msgstr "Adjunts..."
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 msgid "Actions..."
 msgstr "Accions..."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 msgid "Relate..."
 msgstr "Relacionat..."
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 msgid "Report..."
 msgstr "Informe..."
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 msgid "E-Mail..."
 msgstr "Correu electrònic..."
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 msgid "Print..."
 msgstr "Imprimeix..."
 
@@ -349,10 +349,10 @@ msgid "_Help"
 msgstr "Aj_uda"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Cerca"
 
@@ -520,7 +520,7 @@ msgstr "_Quant a..."
 msgid "Manage Favorites"
 msgstr "_Gestiona els preferits"
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
@@ -528,11 +528,11 @@ msgstr ""
 "L'acció seleccionada requereix tancar totes les pestanyes.\n"
 "Voleu continuar?"
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Tanca pestanya"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
@@ -540,7 +540,7 @@ msgstr ""
 "Esteu a punt d'eliminar una base de dades de Tryton.\n"
 "Esteu segur que voleu continuar?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -548,28 +548,28 @@ msgstr ""
 "La contrasenya del servidor Tryton és incorrecta.\n"
 "Intenteu-ho de nou."
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "Accés denegat."
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr "L'eliminació de la base de dades ha fallat amb el missatge d'error:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "Ha fallat l'eliminació de la base de dades."
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "La base de dades s'ha eliminat correctament."
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "Obre una còpia de seguretat per restaurar..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -577,11 +577,11 @@ msgstr ""
 "No és possible restaurar una base de dades protegida amb contrasenya.\n"
 "La còpia de seguretat i la seva restauració ha de ser manual."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "La base de dades està protegida amb contrasenya."
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -589,19 +589,19 @@ msgstr ""
 "La contrasenya del servidor Tryton és incorrecta.\n"
 "Intenteu-ho de nou."
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr "La restauració de la base de dades ha fallat amb l'error:\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "La restauració de la base de dades ha fallat."
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "La base de dades s'ha restaurat correctament."
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -609,15 +609,15 @@ msgstr ""
 "No és possible fer còpia d'una base de dades protegida amb contrasenya.\n"
 "La còpia de seguretat i la seva restauració ha de ser manual."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "L'extracció de la base de dades ha fallat amb el missatge d'error:\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr "L'extracció de la base de dades ha fallat."
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "La còpia de seguretat de la base de dades ha finalitzat correctament."
 
@@ -630,7 +630,7 @@ msgid "Create a new record"
 msgstr "Crea un nou registre"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "Desa"
 
@@ -640,7 +640,7 @@ msgstr "Desa aquest registre"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "Canvia la vista"
 
@@ -823,40 +823,17 @@ msgstr "Confirmeu la contrasenya de l'administrador:"
 msgid "Type the Admin password again"
 msgstr "Teclegeu la contrasenya de l'administrador de nou"
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"El nom de la base de dades està restringit a caràcters alfanumèrics i "
-"\"_\" (guió baix). Eviteu tots els accents, espais i qualsevol altre "
-"caràcter especial."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Heu introduït caràcters incorrectes al nom de la base de dades."
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr ""
 "La nova contrasenya de l'administrador no coincideix amb el camp de "
 "confirmació.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "Les contrasenyes no coincideixen."
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"La contrasenya de l'administrador i la seva confirmació són necessàries "
-"per crear una nova base de dades."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Falta la contrasenya de l'administrador."
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -864,15 +841,15 @@ msgstr ""
 "Ja existeix una base de dades amb el mateix nom.\n"
 "Intenteu-ho amb un altre nom de base de dades."
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "Ja existeix una base de dades amb aquest nom."
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr "La contrasenya del servidor Tryton no és correcta. Intenteu-ho de nou."
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -885,7 +862,7 @@ msgstr ""
 " informació addicional.\n"
 "Missatge d'error:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "S'ha produït un error al crear la base de dades."
 
@@ -950,12 +927,12 @@ msgstr "Editor de perfils"
 msgid "Profile"
 msgstr "Perfil"
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "_Afegeix"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "_Elimina"
@@ -980,7 +957,7 @@ msgstr "Nom d'usuari:"
 msgid "Could not connect to the server"
 msgstr "No s'ha pogut connectar al servidor"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 msgid "Incompatible version of the server"
 msgstr "El client no és compatible amb la versió del servidor"
 
@@ -1107,8 +1084,8 @@ msgstr "Adjunt:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Anterior"
 
@@ -1118,8 +1095,8 @@ msgstr "Registre anterior"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Següent"
 
@@ -1224,23 +1201,23 @@ msgstr "Última data de modificació:"
 msgid "Model:"
 msgstr "Model:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr "Esteu segur que voleu eliminar aquest registre?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr "Esteu segur que voleu eliminar aquests registres?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr "Els registres no s'han eliminat."
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr "Registres eliminats."
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr "Ara esteu treballant en el registre duplicat."
 
@@ -1252,11 +1229,11 @@ msgstr "Registre desat."
 msgid "Invalid form!"
 msgstr "Formulari incorrecte."
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " de "
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1264,49 +1241,48 @@ msgstr ""
 "Aquest registre ha estat modificat.\n"
 "Voleu desar-lo?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Acció"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr "Executa acció"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Relate"
 msgstr "_Relacionat"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Open related records"
 msgstr "Obre registres relacionats"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Report"
 msgstr "Informes"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Open report"
 msgstr "Obre informe"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail"
 msgstr "Correu electrònic"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr "Informe per email"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Imprimeix"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr "Imprimeix informe"
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Desconegut"
 
@@ -1482,67 +1458,77 @@ msgstr "Consells"
 msgid "_Display a new tip next time"
 msgstr "_Mostra un nou consell la propera vegada"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Exporta a CSV"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Exportacions predeterminades</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Tots els camps</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Neteja"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Desa exportació"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Elimina exportació"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Camps a exportar</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Opcions</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Obre"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Afegeix noms de _camp"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "Nom"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (text)"
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr "Quin és el nom d'aquesta exportació?"
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "Voleu sobrescriure la definició de '%s'?"
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "S'ha desat %d registre."
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "S'han desat %d registres."
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1566,18 +1552,17 @@ msgid "Remove <Del>"
 msgstr "Elimina <Supr>"
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 msgid "Create a new record <F3>"
 msgstr "Crea un nou registre <F3>"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 msgid "Delete selected record <Del>"
 msgstr "Elimina el registre seleccionat <Supr>"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 msgid "Undelete selected record <Ins>"
 msgstr "Recupera el registre seleccionat <Ins>"
 
@@ -1599,10 +1584,10 @@ msgstr "Fitxer a importar:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Obre..."
 
@@ -1653,68 +1638,98 @@ msgstr "S'ha importat %d registre."
 msgid "%d records imported!"
 msgstr "S'han importat %d registres."
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Assistent"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "No té una cadena com atribut."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 msgid "ID"
 msgstr "ID"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 msgid "Creation User"
 msgstr "Creat per"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 msgid "Creation Date"
 msgstr "Data de creació"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 msgid "Modification User"
 msgstr "Modificat per"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 msgid "Modification Date"
 msgstr "Data de modificació"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr "No s'ha pogut obtenir l'estat de la vista d'arbre"
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 msgid "Unable to set view tree state"
 msgstr "No s'ha pogut desar l'estat de la vista d'arbre"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Anomena i desa"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Mida de la imatge"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Amplada:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Altura:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "Imatge PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "La mida de la imatge és massa gran."
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ".."
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 msgid "F_ilters"
 msgstr "F_iltres"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr "Mostra les cerques preferides"
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr "Elimina de les cerques preferides"
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr "Desa com a cerca preferida"
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr "Nom de la cerca preferida:"
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Cerca"
 
@@ -1742,79 +1757,49 @@ msgstr "Selecciona un fitxer..."
 msgid "Show plain text"
 msgstr "Mostra com a text pla"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr "Afegeix un valor"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr "Eliminar \"%s\""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 msgid "Select an Image..."
 msgstr "Selecciona una imatge..."
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Tots els fitxers"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Imatges"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Traducció"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Edita"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Dubtós"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Heu de desar el registre abans d'afegir traduccions."
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "No hi ha cap altre idioma disponible."
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 msgid "Add existing record"
 msgstr "Afegeix un registre existent"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 msgid "Remove selected record <Del>"
 msgstr "Elimina el registre seleccionat <Supr>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 msgid "Open a record <F2>"
 msgstr "Obre el registre <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 msgid "Search a record <F2>"
 msgstr "Cerca un registre <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 msgid "Remove selected record"
 msgstr "Elimina el registre seleccionat"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 msgid "Edit selected record <F2>"
 msgstr "Edita registre seleccionat <F2>"
 
@@ -1874,33 +1859,25 @@ msgstr "Selecciona color principal"
 msgid "Select a background color"
 msgstr "Selecciona color de fons"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Anomena i desa"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Grandària de la imatge"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Amplada:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Traducció"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Altura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Edita"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "Imatge PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Dubtós"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "La mida de la imatge és massa gran."
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Heu de desar el registre abans d'afegir traduccions."
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "No hi ha cap altre idioma disponible."
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/cs_CZ/LC_MESSAGES/tryton.mo b/share/locale/cs_CZ/LC_MESSAGES/tryton.mo
index abe3177..3a4ad81 100644
Binary files a/share/locale/cs_CZ/LC_MESSAGES/tryton.mo and b/share/locale/cs_CZ/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/cs_CZ/LC_MESSAGES/tryton.po b/share/locale/cs_CZ/LC_MESSAGES/tryton.po
index 9338785..ef2dd58 100644
--- a/share/locale/cs_CZ/LC_MESSAGES/tryton.po
+++ b/share/locale/cs_CZ/LC_MESSAGES/tryton.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  1.0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
 "PO-Revision-Date: 2012-04-23 11:06+0200\n"
 "Last-Translator: Dan Horák <dan at danny.cz>\n"
 "Language-Team: Czech\n"
@@ -12,46 +12,46 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "zadejte alternativní konfigurační soubor"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr ""
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr ""
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr ""
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "zadejte uživatelské jméno"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr "zadejte číslo portu síťového serveru"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "zadejte název hostitele pro server"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr ""
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr ""
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr "Nelze zapsat konfigurační soubor %s!"
@@ -81,42 +81,42 @@ msgstr "Server:"
 msgid "Port:"
 msgstr "Port:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Výběr"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "Váš výběr:"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Uložit jako..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "zadejte alternativní konfigurační soubor"
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr ""
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Potvrzení"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Výjimka při souběhu"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 #, fuzzy
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
@@ -135,50 +135,50 @@ msgstr ""
 "  - \"Porovnat\" pro zobrazení změněné verze,\n"
 "  - \"Přesto zapsat\" pro zapsání vaší verze."
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Porovnat"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Přesto zapsat"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Chyba"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "Nahlásit chybu"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr "Chyba aplikace!"
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "Chyba:"
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, fuzzy, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr "Pro hlášení chyb musíte mít účet na <u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr "Sledování chyb"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "Uživatel:"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "Heslo:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -186,11 +186,11 @@ msgstr ""
 "Ta samá chyba již byla nahlášena jiným uživatelem.\n"
 "Vaše uživatelské jméno bylo přidáno na její seznam."
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "Založena nová chyba s ID"
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
@@ -198,23 +198,23 @@ msgstr ""
 "Chyba při spojení!\n"
 "Špatné uživatelské jméno nebo heslo!"
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "Výjimka:"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
 " is fixed."
 msgstr ""
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
 msgstr ""
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
@@ -222,31 +222,31 @@ msgstr ""
 "Chyba spojení!\n"
 "Nelze se připojit k serveru!"
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "Chyba sítě!"
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr ""
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr ""
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr ""
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr ""
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr ""
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr ""
 
@@ -267,65 +267,65 @@ msgstr "Otevřít kalendář"
 msgid "Date Selection"
 msgstr "Výběr datumu"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr ""
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 #, fuzzy
 msgid "yes"
 msgstr "bajtů"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 #, fuzzy
 msgid "true"
 msgstr "Pravda"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr ""
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Pravda"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Nepravda"
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 #, fuzzy
 msgid "Edit..."
 msgstr "Konec..."
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 #, fuzzy
 msgid "Attachments..."
 msgstr "Příloha:"
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 #, fuzzy
 msgid "Actions..."
 msgstr "Akce..."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 #, fuzzy
 msgid "Relate..."
 msgstr "_Odstranit..."
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 #, fuzzy
 msgid "Report..."
 msgstr "Importovat data..."
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 #, fuzzy
 msgid "E-Mail..."
 msgstr "_Email..."
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 #, fuzzy
 msgid "Print..."
 msgstr "_Tisk..."
@@ -351,10 +351,10 @@ msgid "_Help"
 msgstr "Nápo_věda"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Hledat"
 
@@ -525,17 +525,17 @@ msgstr "_O programu..."
 msgid "Manage Favorites"
 msgstr ""
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
 msgstr ""
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Zavřít záložku"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
@@ -543,7 +543,7 @@ msgstr ""
 "Bude smazána Tryton databáze.\n"
 "Opravdu chcete pokračovat?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -551,28 +551,28 @@ msgstr ""
 "Špatné heslo Tryton serveru\n"
 "Zkuste to znovu."
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "Přístup odepřen!"
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr "Odstranění databáze selhalo s chybovou zprávou:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "Odstranění databáze selhalo!"
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "Databáze úspěšné odstraněna!"
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "Otevřít soubor se zálohou pro obnovu..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -580,11 +580,11 @@ msgstr ""
 "Není možné obnovit databázi chráněnou heslem.\n"
 "Záloha a obnova musí být provedeny ručně."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "Databáze je chráněna heslem!"
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -592,19 +592,19 @@ msgstr ""
 "Špatné heslo Tryton serveru\n"
 "Zkuste to znovu."
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr "Obnovení databáze selhalo s chybovou zprávou:\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "Obnova databáze selhala!"
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "Databáze úspěšně obnovena!"
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -612,15 +612,15 @@ msgstr ""
 "Není možné zálohovat databázi chráněnou heslem.\n"
 "Záloha a obnova musí být provedeny ručně."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "Záloha databáze selhala s chybovou zprávou:\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr "Záloha databáze selhala!"
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "Databáze úspěšně zazálohována!"
 
@@ -633,7 +633,7 @@ msgid "Create a new record"
 msgstr "Vytvořit nový záznam"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 #, fuzzy
 msgid "Save"
 msgstr "_Uložit"
@@ -644,7 +644,7 @@ msgstr "Uložit tento záznam"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "Přepnout"
 
@@ -830,37 +830,15 @@ msgstr "Potvrzení hesla správce:"
 msgid "Type the Admin password again"
 msgstr "Zadejte znovu heslo správce"
 
-#: tryton/gui/window/dbcreate.py:332
-#, fuzzy
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Název databáze je omezen na alfanumercké znaky a _ (podtržítko). Musí "
-"začínat písmenem a být maximálně 63 znaků dlouhý.\n"
-"Nepoužívejte znaky s akcenty, mezeru nebo jiné speciální znaky."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Neplatný znak v názvu databáze!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr "Heslo správce a jeho zopakování nejsou shodné.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "Hesla nesouhlasí!"
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr "Heslo správce a jeho zopakování jsou nutné pro vytvoření nové databáze."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Chybí heslo administrátora!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -868,15 +846,15 @@ msgstr ""
 "Databáze se stejným názvem již existuje.\n"
 "Použijte jiný název."
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "Databáze s tímto názvem již existuje!"
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr "Zadali jste špatné heslo pro Tryton server. Zkuste to znovu."
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -888,7 +866,7 @@ msgstr ""
 " Zkontrolujte chybové hlášení pro případné další informace.\n"
 "Chybová zpráva:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "Chyba při vytváření databáze!"
 
@@ -953,12 +931,12 @@ msgstr ""
 msgid "Profile"
 msgstr ""
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "_Přidat"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "_Odstranit"
@@ -988,7 +966,7 @@ msgstr "Uživatelské jméno:"
 msgid "Could not connect to the server"
 msgstr "Nelze se spojit se serverem!"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 #, fuzzy
 msgid "Incompatible version of the server"
 msgstr "Verze serveru není kompatibilní!"
@@ -1115,8 +1093,8 @@ msgstr "Příloha:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Předchozí"
 
@@ -1126,8 +1104,8 @@ msgstr "Předchozí záznam"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Další"
 
@@ -1237,23 +1215,23 @@ msgstr "Datum poslední úpravy:"
 msgid "Model:"
 msgstr "Model:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr "Opravdu chcete odstranit tento záznam?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr "Opravdu chcete odstranit tyto záznamy?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr "Záznamy neodstraněny!"
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr "Záznamy odstraněny!"
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr "Nyní pracujete s duplicitním záznamem!"
 
@@ -1265,11 +1243,11 @@ msgstr "Záznam uložen!"
 msgid "Invalid form!"
 msgstr "Neplatný formulář!"
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " z "
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1277,54 +1255,53 @@ msgstr ""
 "Tento záznam byl upraven\n"
 "chcete ho uložit?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Akce"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr ""
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 #, fuzzy
 msgid "Relate"
 msgstr "_Vytvořit"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 #, fuzzy
 msgid "Open related records"
 msgstr "Otevřít záznam"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 #, fuzzy
 msgid "Report"
 msgstr "Sestavy"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 #, fuzzy
 msgid "Open report"
 msgstr "Otevřít záznam"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 #, fuzzy
 msgid "E-Mail"
 msgstr "Email"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr ""
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Tisk"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr ""
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Neznámý"
 
@@ -1502,67 +1479,77 @@ msgstr "Tipy"
 msgid "_Display a new tip next time"
 msgstr "Zobrazit příště další tip"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Exportovat do CSV souboru"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Předdefinované exporty</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Všechna pole</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Vymazat"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Uložit exportu"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Smazat exportu"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Pole pro export</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Možnosti</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Otevřít"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Přidat jména polí"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "%d záznam uložen!"
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "%d záznamů uloženo!"
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1586,20 +1573,19 @@ msgid "Remove <Del>"
 msgstr ""
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 #, fuzzy
 msgid "Create a new record <F3>"
 msgstr "Vytvořit nový záznam"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 #, fuzzy
 msgid "Delete selected record <Del>"
 msgstr "Smazat vybraný záznam"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 #, fuzzy
 msgid "Undelete selected record <Ins>"
 msgstr "Smazat vybraný záznam"
@@ -1622,10 +1608,10 @@ msgstr "Soubor k importu:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Otevřít..."
 
@@ -1677,75 +1663,105 @@ msgstr "%d záznam načten!"
 msgid "%d records imported!"
 msgstr "%d záznamů načteno!"
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Průvodce"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Žádný řetězcový atribut"
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 #, fuzzy
 msgid "ID"
 msgstr "Najít"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 #, fuzzy
 msgid "Creation User"
 msgstr "Vytvořeno uživatelem:"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 #, fuzzy
 msgid "Creation Date"
 msgstr "Datum vytvoření:"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 #, fuzzy
 msgid "Modification User"
 msgstr "Datum poslední úpravy:"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 #, fuzzy
 msgid "Modification Date"
 msgstr "Datum poslední úpravy:"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr ""
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 #, fuzzy
 msgid "Unable to set view tree state"
 msgstr "Nemohu nastavit lokalizaci %s"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Uložit jako"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Velikost obrázku"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Šířka:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Výška:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "Obrázek PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Rozměry obrázku jsou příliš velké!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 #, fuzzy
 msgid "F_ilters"
 msgstr "_Soubor"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Najít"
 
@@ -1777,86 +1793,55 @@ msgstr "Vyberte soubor"
 msgid "Show plain text"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 #, fuzzy
 msgid "Select an Image..."
 msgstr "Vyberte soubor"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Všechny soubory"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Obrázky"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-#, fuzzy
-msgid "Translation"
-msgstr "Přidat překlad"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Musíte uložit záznam před přidáváním překladů!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Jiný jazyk není k dispozici!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 #, fuzzy
 msgid "Add existing record"
 msgstr "Uložit tento záznam"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 #, fuzzy
 msgid "Remove selected record <Del>"
 msgstr "Smazat vybraný záznam"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 #, fuzzy
 msgid "Open a record <F2>"
 msgstr "Otevřít záznam"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 #, fuzzy
 msgid "Search a record <F2>"
 msgstr "Hledat záznam"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 #, fuzzy
 msgid "Remove selected record"
 msgstr "Smazat vybraný záznam"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 #, fuzzy
 msgid "Edit selected record <F2>"
 msgstr "Upravit vybraný záznam"
@@ -1917,34 +1902,26 @@ msgstr ""
 msgid "Select a background color"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Uložit jako"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Velikost obrázku"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Šířka:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+#, fuzzy
+msgid "Translation"
+msgstr "Přidat překlad"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Výška:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "Obrázek PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Rozměry obrázku jsou příliš velké!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Musíte uložit záznam před přidáváním překladů!"
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-#, fuzzy
-msgid ": "
-msgstr ":"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Jiný jazyk není k dispozici!"
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/de_DE/LC_MESSAGES/tryton.mo b/share/locale/de_DE/LC_MESSAGES/tryton.mo
index 53bb90b..57f5460 100644
Binary files a/share/locale/de_DE/LC_MESSAGES/tryton.mo and b/share/locale/de_DE/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/de_DE/LC_MESSAGES/tryton.po b/share/locale/de_DE/LC_MESSAGES/tryton.po
index 5cdcaa4..137ff6d 100644
--- a/share/locale/de_DE/LC_MESSAGES/tryton.po
+++ b/share/locale/de_DE/LC_MESSAGES/tryton.po
@@ -8,54 +8,54 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tryton 3.2.0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-04-14 12:23+0100\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-10-02 23:42+0100\n"
 "Last-Translator: Mathias Behrle <mbehrle at m9s.biz>\n"
 "Language-Team: de_DE <tryton-de at googlegroups.com>\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "Alternative Konfigurationsdatei angeben"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr "Entwicklungsmodus"
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr "Allgemeiner Log-Level: INFO"
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr "Log Level angeben: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "Anmeldename angeben"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr "Port des Servers angeben"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "Name des Servers angeben"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr "Zu viele Argumente"
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr "Datei \"%s\" nicht gefunden"
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr "Kann Konfigurationsdatei '%s' nicht schreiben!"
@@ -85,42 +85,42 @@ msgstr "Server:"
 msgid "Port:"
 msgstr "Port:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Auswahl"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "Ihre Auswahl:"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Speichern unter..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "Diese Warnung künftig nicht mehr anzeigen"
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr "Fortfahren?"
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Bestätigung"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Aktualisierungskonflikt"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
 "\n"
@@ -141,52 +141,52 @@ msgstr ""
 "   - \"Überschreiben\" um die gespeicherte Version mit Ihrer Version zu "
 "überschreiben"
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Vergleichen"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Überschreiben"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Fehler"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "Fehler berichten"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr "Anwendungsfehler!"
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "Fehler:"
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr ""
 "Um Fehler online berichten zu können, benötigen Sie ein Konto auf "
 "<u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr "Fehler melden"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "Anmeldename:"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "Passwort:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -196,11 +196,11 @@ msgstr ""
 "Zu Ihrer Information wurde Ihr Benutzername auf der Interessentenliste "
 "eingetragen."
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "Neuer Fehlerbericht angelegt mit ID "
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
@@ -208,11 +208,11 @@ msgstr ""
 "Verbindungsfehler!\n"
 "Anmeldename oder Passwort fehlerhaft."
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "Ausnahme: "
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
@@ -223,12 +223,12 @@ msgstr ""
 "Der Client wird sich nicht mehr zu diesem Server verbinden bis der "
 "Fingerabdruck wieder dem des Servers entspricht."
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
 msgstr "Sicherheitsrisiko!"
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
@@ -236,31 +236,31 @@ msgstr ""
 "Verbindungsfehler!\n"
 "Kann nicht zum Server verbinden."
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "Netzwerkfehler!"
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr "J"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "M"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "W"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr "t"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "h"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "m"
 
@@ -280,57 +280,57 @@ msgstr "Kalender öffnen <F2>"
 msgid "Date Selection"
 msgstr "Auswahl Datum"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr "J"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "yes"
 msgstr "Ja"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "true"
 msgstr "Wahr"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr "w"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Wahr"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Falsch"
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 msgid "Edit..."
 msgstr "Bearbeiten..."
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 msgid "Attachments..."
 msgstr "Anhänge..."
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 msgid "Actions..."
 msgstr "Aktionen..."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 msgid "Relate..."
 msgstr "Beziehungen..."
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 msgid "Report..."
 msgstr "Berichte..."
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 msgid "E-Mail..."
 msgstr "E-Mail..."
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 msgid "Print..."
 msgstr "Drucken..."
 
@@ -355,10 +355,10 @@ msgid "_Help"
 msgstr "_Hilfe"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Suchen"
 
@@ -526,7 +526,7 @@ msgstr "_Über..."
 msgid "Manage Favorites"
 msgstr "Favoriten verwalten"
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
@@ -534,11 +534,11 @@ msgstr ""
 "Die folgende Aktion erfordert die Schließung aller Tabs.\n"
 "Fortfahren?"
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Tab schließen"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
@@ -546,7 +546,7 @@ msgstr ""
 "Sie werden eine Tryton Datenbank löschen.\n"
 "Wirklich fortfahren?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -554,30 +554,30 @@ msgstr ""
 "Falsches Passwort für den Tryton Server\n"
 "Bitte geben Sie es noch einmal ein."
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "Zugang verweigert!"
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr ""
 "Das Löschen der Datenbank ist fehlgeschlagen mit der folgenden "
 "Fehlermeldung:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "Datenbank konnte nicht gelöscht werden!"
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "Datenbank erfolgreich gelöscht."
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "Backup Datei für Wiederherstellung öffnen..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -587,11 +587,11 @@ msgstr ""
 "Backup und Wiederherstellung müssen in diesem Fall manuell durchgeführt "
 "werden."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "Datenbank ist passwortgeschützt!"
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -599,21 +599,21 @@ msgstr ""
 "Falsches Passwort für den Tryton Server\n"
 "Bitte geben Sie es noch einmal ein."
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr ""
 "Wiederherstellung der Datenbank ist fehlgeschlagen mit der Fehlermeldung:"
 "\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "Wiederherstellung der Datenbank ist fehlgeschlagen!"
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "Datenbank wurde erfolgreich wiederhergestellt."
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -622,15 +622,15 @@ msgstr ""
 "Backup und Wiederherstellung müssen in diesem Fall manuell durchgeführt "
 "werden."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "Die Datenbanksicherung ist fehlgeschlagen mit der Fehlermeldung:\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr "Datenbank konnte nicht gesichert werden!"
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "Datenbank erfolgreich gesichert."
 
@@ -643,7 +643,7 @@ msgid "Create a new record"
 msgstr "Neuen Datensatz erstellen"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "Speichern"
 
@@ -653,7 +653,7 @@ msgstr "Diesen Datensatz speichern"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "Ansicht wechseln"
 
@@ -846,41 +846,17 @@ msgstr ""
 "Wiederholen Sie die Eingabe des Administrator Passworts um sicher zu "
 "gehen, dass Sie sich beim ersten Mal nicht vertippt haben."
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Die erlaubten Zeichen des Datenbanknamens sind auf Buchstaben, Zahlen und"
-" \"_\" (Unterstrich) beschränkt. Akzente, Leerzeichen und andere "
-"Spezialzeichen sollten nicht benutzt werden. Umlaute, Akzente und 'ß'  "
-"sind ebenfalls verboten."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Unerlaubte Zeichen im Namen für die Datenbank!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr ""
 "Die beiden Eingaben für das neue Administrator Passwort stimmen nicht "
 "überein.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "Passwörter sind nicht identisch!"
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"Das Administrator Passwort und dessen Wiederholung werden benötigt um "
-"eine neue Datenbank für Tryton anlegen zu können."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Administrator Passwort fehlt!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -888,17 +864,17 @@ msgstr ""
 "Eine Datenbank mit diesem Namen existiert bereits.\n"
 "Versuchen Sie einen anderen Datenbanknamen."
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "Eine Datenbank mit diesem Namen existiert bereits!"
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr ""
 "Das für den Tryton Server eingegebene Passwort scheint falsch zu sein. "
 "Bitte nochmals eingeben."
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -913,7 +889,7 @@ msgstr ""
 "zu diesem Fehler.\n"
 "Fehlermeldung:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "Fehler bei der Datenbankerstellung!"
 
@@ -978,12 +954,12 @@ msgstr "Profilbearbeitung"
 msgid "Profile"
 msgstr "Profil"
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "_Hinzufügen"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "_Entfernen"
@@ -1008,7 +984,7 @@ msgstr "Anmeldename:"
 msgid "Could not connect to the server"
 msgstr "Kann nicht zum Server verbinden!"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 msgid "Incompatible version of the server"
 msgstr "Inkompatible Serverversion"
 
@@ -1135,8 +1111,8 @@ msgstr "Anhang:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Vorheriger"
 
@@ -1146,8 +1122,8 @@ msgstr "Vorheriger Datensatz"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Nächster"
 
@@ -1252,23 +1228,23 @@ msgstr "Zuletzt verändert am"
 msgid "Model:"
 msgstr "Modell:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr "Möchten Sie diesen Datensatz wirklich löschen?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr "Möchten Sie diese Datensätze wirklich löschen?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr "Datensätze nicht gelöscht!"
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr "Datensätze gelöscht"
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr "Sie arbeiten nun an dem duplizierten Datensatz"
 
@@ -1280,11 +1256,11 @@ msgstr "Datensatz gespeichert"
 msgid "Invalid form!"
 msgstr "Ungültiges Formular!"
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " von "
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1292,49 +1268,48 @@ msgstr ""
 "Datensatz geändert\n"
 "Soll der Datensatz gespeichert werden?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Aktion"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr "Aktion ausführen"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Relate"
 msgstr "Beziehung"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Open related records"
 msgstr "Datensätze einer Beziehung öffnen"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Report"
 msgstr "Bericht"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Open report"
 msgstr "Bericht öffnen"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail"
 msgstr "E-Mail"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr "Bericht per E-Mail senden"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Drucken"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr "Bericht drucken"
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Unbekannt"
 
@@ -1511,67 +1486,77 @@ msgstr "Tipps"
 msgid "_Display a new tip next time"
 msgstr "_Tipps beim Start von Tryton anzeigen"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Als CSV exportieren"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Vordefinierte Exporte</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Alle Felder</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Leeren"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Export speichern"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Export löschen"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Zu exportierende Felder</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Optionen</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Öffnen"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Feldnamen _hinzufügen"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "Name"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (string)"
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr "Wie soll der Name des Exports lauten?"
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "Definition von '%s' nicht berücksichtigen?"
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "%d Datensatz gespeichert"
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "%d Datensätze gespeichert"
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1595,18 +1580,17 @@ msgid "Remove <Del>"
 msgstr "Entfernen <Entf>"
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 msgid "Create a new record <F3>"
 msgstr "Neuen Datensatz erstellen <F3>"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 msgid "Delete selected record <Del>"
 msgstr "Ausgewählte Datensätze löschen <Entf>"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 msgid "Undelete selected record <Ins>"
 msgstr "Löschung der ausgewählten Datensätze rückgängig machen <Einfg>"
 
@@ -1628,10 +1612,10 @@ msgstr "Importdatei:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Öffnen..."
 
@@ -1682,68 +1666,98 @@ msgstr "%d Datensatz importiert"
 msgid "%d records imported!"
 msgstr "%d Datensätze importiert"
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Wizard"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Kein Zeichen Attr."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 msgid "ID"
 msgstr "ID"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 msgid "Creation User"
 msgstr "Erstellt von"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 msgid "Creation Date"
 msgstr "Erstellt am"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 msgid "Modification User"
 msgstr "Zuletzt verändert von"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 msgid "Modification Date"
 msgstr "Zuletzt verändert am"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr "Kann Sicht für den Menübaum nicht finden"
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 msgid "Unable to set view tree state"
 msgstr "Kann Sicht für den Menübaum nicht anwenden"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Speichern unter..."
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Bildgröße"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Breite:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Höhe:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG Bild (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Bild ist zu groß!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ".."
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 msgid "F_ilters"
 msgstr "F_ilter"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr "Filterlesezeichen anzeigen"
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr "Dieses Lesezeichen entfernen"
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr "Diesen Filter als Lesezeichen hinzufügen"
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr "Lesezeichenname:"
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Suchen"
 
@@ -1771,81 +1785,49 @@ msgstr "Datei auswählen..."
 msgid "Show plain text"
 msgstr "Klartext anzeigen"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr "Wert hinzufügen"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr "\"%s\" entfernen"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 msgid "Select an Image..."
 msgstr "Bild auswählen..."
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Alle Dateien"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Bilder"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Übersetzung"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Bearbeiten"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Unscharf"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr ""
-"Der Datensatz muss gespeichert werden, bevor eine Übersetzung hinzugefügt"
-" werden kann!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Keine anderen Sprachen verfügbar!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 msgid "Add existing record"
 msgstr "Bestehenden Datensatz hinzufügen"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 msgid "Remove selected record <Del>"
 msgstr "Ausgewählten Datensatz löschen <Entf>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 msgid "Open a record <F2>"
 msgstr "Datensatz öffnen <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 msgid "Search a record <F2>"
 msgstr "Datensatz suchen <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 msgid "Remove selected record"
 msgstr "Ausgewählten Datensatz löschen <Entf>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 msgid "Edit selected record <F2>"
 msgstr "Ausgewählten Datensatz bearbeiten <F2>"
 
@@ -1905,33 +1887,27 @@ msgstr "Zeichenfarbe"
 msgid "Select a background color"
 msgstr "Hintergrundfarbe"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Speichern unter..."
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Bildgröße"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Breite:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Übersetzung"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Höhe:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Bearbeiten"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG Bild (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Unscharf"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Bild ist zu groß!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr ""
+"Der Datensatz muss gespeichert werden, bevor eine Übersetzung hinzugefügt"
+" werden kann!"
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Keine anderen Sprachen verfügbar!"
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/es_AR/LC_MESSAGES/tryton.mo b/share/locale/es_AR/LC_MESSAGES/tryton.mo
index 2b5f699..f297ec2 100644
Binary files a/share/locale/es_AR/LC_MESSAGES/tryton.mo and b/share/locale/es_AR/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/es_AR/LC_MESSAGES/tryton.po b/share/locale/es_AR/LC_MESSAGES/tryton.po
index 6e9c5b7..4328ce6 100644
--- a/share/locale/es_AR/LC_MESSAGES/tryton.po
+++ b/share/locale/es_AR/LC_MESSAGES/tryton.po
@@ -5,56 +5,56 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: tryton 3.2.0\n"
+"Project-Id-Version: tryton 3.4.0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-04-17 16:35-0300\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-10-16 23:39-0300\n"
 "Last-Translator: Bruno M. Villasanti <bvillasanti at thymbra.com>\n"
 "Language-Team: Argentina\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "Indica un archivo de configuración alternativo"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr "Modo desarrollo"
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr "Registra toda la información con nivel INFO"
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr "Indica el nivel de registro: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "Indica el usuario"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr "Indica el puerto del servidor"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "Indica el nombre del servidor"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr "Demasiados argumentos"
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr "El archivo «%s» no se ha encontrado"
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr "¡No se ha podido escribir el archivo de configuración %s!"
@@ -84,42 +84,42 @@ msgstr "Servidor:"
 msgid "Port:"
 msgstr "Puerto:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Selección"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "Su selección:"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Guardar como..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "Ignorar siempre esta advertencia."
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr "¿Desea continuar?"
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Confirmación"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Excepción de concurrencia"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
 "\n"
@@ -137,50 +137,50 @@ msgstr ""
 "   - \"Comparar\" para ver la versión modificada:\n"
 "   - \"Guardar de todas formas\" para guardar sus cambios."
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Comparar"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Guardar de todas formas"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Error"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "Informar de un error"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr "¡Error de aplicación!"
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "Error: "
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr "Para informar de errores debe tener una cuenta en <u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr "Seguimiento de errores"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "Usuario:"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "Contraseña:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -189,11 +189,11 @@ msgstr ""
 "Para mantenerle informado añadiremos su usuario a la lista de interesados"
 " en este asunto."
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "Se creó un nuevo error con ID "
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
@@ -201,11 +201,11 @@ msgstr ""
 "¡Error de conexión!\n"
 "¡Nombre de usuario o contraseña incorrectos!"
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "Excepción:"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
@@ -216,12 +216,12 @@ msgstr ""
 "La aplicación no se podrá conectar a este servidor hasta que se corrija "
 "la huella de seguridad del servidor."
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
 msgstr "¡Riesgo de seguridad!"
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
@@ -229,31 +229,31 @@ msgstr ""
 "¡Error de conexión!\n"
 "¡No ha sido posible conectarse al servidor!"
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "¡Error de red!"
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr "A"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "M"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "s"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr "d"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "h"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "m"
 
@@ -273,57 +273,57 @@ msgstr "Abrir el calendario <F2>"
 msgid "Date Selection"
 msgstr "Selección de fecha"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr "a"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "yes"
 msgstr "sí"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "true"
 msgstr "verdadero"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr "v"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Verdadero"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Falso"
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 msgid "Edit..."
 msgstr "Editar..."
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 msgid "Attachments..."
 msgstr "Adjuntos..."
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 msgid "Actions..."
 msgstr "Acciones..."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 msgid "Relate..."
 msgstr "Relacionado..."
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 msgid "Report..."
-msgstr "Informes..."
+msgstr "Informe..."
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 msgid "E-Mail..."
 msgstr "Correo electrónico..."
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 msgid "Print..."
 msgstr "Imprimir..."
 
@@ -348,10 +348,10 @@ msgid "_Help"
 msgstr "Ay_uda"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Buscar"
 
@@ -519,7 +519,7 @@ msgstr "_Acerca de..."
 msgid "Manage Favorites"
 msgstr "_Administrar favoritos"
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
@@ -527,11 +527,11 @@ msgstr ""
 "La acción seleccionada requiere cerrar todas las pestañas. \n"
 "¿Desea continuar?"
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Cerrar pestaña"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
@@ -539,7 +539,7 @@ msgstr ""
 "Va a eliminar una base de datos de Tryton.\n"
 "¿Está seguro que quiere continuar?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -547,28 +547,28 @@ msgstr ""
 "La contraseña del servidor Tryton es incorrecta.\n"
 "Inténtelo de nuevo."
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "¡Acceso denegado!"
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr "La eliminación de la base de datos ha fallado con el mensaje de error:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "¡Falló la eliminación de la base de datos!"
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "¡La base de datos se ha eliminado satisfactoriamente!"
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "Abrir una copia de seguridad para restaurar..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -576,11 +576,11 @@ msgstr ""
 "No es posible restaurar una base de datos protegida con contraseña.\n"
 "La copia de seguridad y su restauración tiene que ser manual."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "¡La base de datos está protegida por contraseña!"
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -588,19 +588,19 @@ msgstr ""
 "La contraseña del servidor Tryton es incorrecta.\n"
 "Inténtelo de nuevo."
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr "La restauración de la base de datos ha fallado con el error:\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "¡La restauración de la base de datos ha fallado!"
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "¡La base de datos se ha restaurado correctamente!"
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -608,15 +608,15 @@ msgstr ""
 "No es posible hacer copia de una base de datos protegida por contraseña.\n"
 "La copia de seguridad y su restauración tiene que ser manual."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "La extracción de la base de datos ha fallado con el mensaje de error:\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr "¡La extracción de la base de datos ha fallado!"
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "¡La copia de seguridad de la base de datos ha finalizado correctamente!"
 
@@ -629,7 +629,7 @@ msgid "Create a new record"
 msgstr "Crear un nuevo registro"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "Guardar"
 
@@ -639,7 +639,7 @@ msgstr "Guardar este registro"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "Cambiar vista"
 
@@ -822,40 +822,17 @@ msgstr "Confirme la contraseña del Administrador:"
 msgid "Type the Admin password again"
 msgstr "Teclee la contraseña del Administrador de nuevo"
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"El nombre de la base de datos está restringido a caracteres alfanuméricos"
-" y \"_\" (subrayado). Evite todos los acentos, espacios y cualquier otro "
-"carácter especial."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "¡Ha introducido caracteres incorrectos en el nombre de la base de datos!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr ""
 "La nueva contraseña del Administrador no coincide con el campo de "
 "confirmación.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "¡Las contraseñas no coinciden!"
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"La contraseña del Administrador y su confirmación son necesarias para "
-"crear una nueva base de datos."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "¡Falta la contraseña del Administrador!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -863,15 +840,15 @@ msgstr ""
 "Ya existe una base de datos con el mismo nombre.\n"
 "Inténtelo con otro nombre de base de datos."
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "¡Ya existe una base de datos con este nombre!"
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr "La contraseña del servidor Tryton no es correcta. Inténtelo de nuevo."
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -884,7 +861,7 @@ msgstr ""
 "adicional.\n"
 "Mensaje de error:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "¡Se ha producido un error al crear la base de datos!"
 
@@ -949,12 +926,12 @@ msgstr "Editor de perfiles"
 msgid "Profile"
 msgstr "Perfil"
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "_Añadir"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "_Eliminar"
@@ -979,7 +956,7 @@ msgstr "Nombre de usuario:"
 msgid "Could not connect to the server"
 msgstr "No se ha podido conectar al servidor"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 msgid "Incompatible version of the server"
 msgstr "El cliente no es compatible con la versión del servidor"
 
@@ -1105,8 +1082,8 @@ msgstr "Adjunto:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Anterior"
 
@@ -1116,8 +1093,8 @@ msgstr "Registro anterior"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Siguiente"
 
@@ -1171,7 +1148,7 @@ msgstr "_Relacionado..."
 
 #: tryton/gui/window/form.py:78
 msgid "_Report..."
-msgstr "_Informes..."
+msgstr "_Informe..."
 
 #: tryton/gui/window/form.py:80
 msgid "_E-Mail..."
@@ -1222,23 +1199,23 @@ msgstr "Última fecha de modificación:"
 msgid "Model:"
 msgstr "Modelo:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr "¿Está seguro que quiere eliminar este registro?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr "¿Está seguro que quiere eliminar estos registros?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr "¡Los registros no se han eliminado!"
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr "¡Registros eliminados!"
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr "¡Ahora está trabajando en el registro duplicado!"
 
@@ -1250,11 +1227,11 @@ msgstr "¡Registro guardado!"
 msgid "Invalid form!"
 msgstr "¡Formulario no válido!"
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " de "
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1262,49 +1239,48 @@ msgstr ""
 "Este registro ha sido modificado.\n"
 "¿Desea guardarlo?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Acción"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr "Ejecutar acción"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Relate"
-msgstr "Relacionado"
+msgstr "_Relacionado"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Open related records"
 msgstr "Abrir registros relacionados"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Report"
 msgstr "Informes"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Open report"
 msgstr "Abrir informe"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail"
 msgstr "Email"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr "Informe por email"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Imprimir"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr "Imprimir informe"
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Desconocido"
 
@@ -1470,7 +1446,7 @@ msgid ""
 msgstr ""
 "<b>Exportar gráficos</b>\n"
 "\n"
-"Puedes guardar los gráficos como imagen PNG haciendo clic con el botón "
+"Puede guardar los gráficos como imagen PNG haciendo clic con el botón "
 "derecho sobre el mismo.\n"
 
 #: tryton/gui/window/tips.py:46
@@ -1481,67 +1457,77 @@ msgstr "Consejos"
 msgid "_Display a new tip next time"
 msgstr "_Mostrar un nuevo consejo la próxima vez"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Exportar a CSV"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Exportaciones predeterminadas</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Todos los campos</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Limpiar"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Guardar exportación"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Eliminar exportación"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Campos a exportar</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Opciones</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Abrir"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Añadir nombres de _campo"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "Nombre"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (cadena)"
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr "¿Cuál es el nombre de esta exportación?"
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "¿Sobrescribir definición de '%s'?"
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "¡Se ha guardado %d registro!"
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "¡Se han guardado %d registros!"
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1565,18 +1551,17 @@ msgid "Remove <Del>"
 msgstr "Eliminar <Supr>"
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 msgid "Create a new record <F3>"
 msgstr "Crear un nuevo registro <F3>"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 msgid "Delete selected record <Del>"
 msgstr "Eliminar registro seleccionado <Supr>"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 msgid "Undelete selected record <Ins>"
 msgstr "Recuperar registro seleccionado <Ins>"
 
@@ -1598,10 +1583,10 @@ msgstr "Archivo a importar:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Abrir..."
 
@@ -1652,68 +1637,98 @@ msgstr "¡Se ha importado %d registro!"
 msgid "%d records imported!"
 msgstr "¡Se han importado %d registros!"
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Asistente"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "No tiene una cadena como atributo."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 msgid "ID"
 msgstr "ID"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 msgid "Creation User"
 msgstr "Creado por:"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 msgid "Creation Date"
 msgstr "Fecha de creación:"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 msgid "Modification User"
 msgstr "Última modificación por:"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 msgid "Modification Date"
 msgstr "Última fecha de modificación:"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr "No se ha podido obtener el estado del árbol"
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 msgid "Unable to set view tree state"
 msgstr "No se ha podido establecer el estado del árbol"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Guardar como"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Tamaño de la imagen"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Anchura:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Altura:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "Imagen PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "¡El tamaño de la imagen es muy grande!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ".."
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 msgid "F_ilters"
 msgstr "F_iltros"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr "Muestra las búsquedas favoritas"
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr "Eliminar de las búsquedas favoritas"
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr "Guardar como búsqueda favorita"
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr "Nombre de la búsqueda favorita:"
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Buscar"
 
@@ -1741,79 +1756,49 @@ msgstr "Seleccione un archivo..."
 msgid "Show plain text"
 msgstr "Mostrar como texto plano"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr "Añadir un valor"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr "Eliminar \"%s\""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 msgid "Select an Image..."
 msgstr "Seleccione una imagen..."
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Todos los archivos"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Imágenes"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Traducción"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Editar"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Confuso"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "¡Debe guardar el registro antes de añadir traducciones!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "¡No hay otro idioma disponible!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 msgid "Add existing record"
 msgstr "Añadir un registro existente"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 msgid "Remove selected record <Del>"
 msgstr "Eliminar registro seleccionado <Supr>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 msgid "Open a record <F2>"
 msgstr "Abrir registro <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 msgid "Search a record <F2>"
 msgstr "Buscar registro <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 msgid "Remove selected record"
 msgstr "Eliminar registro seleccionado <Supr>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 msgid "Edit selected record <F2>"
 msgstr "Editar registro seleccionado <F2>"
 
@@ -1873,33 +1858,25 @@ msgstr "Seleccionar color principal"
 msgid "Select a background color"
 msgstr "Seleccionar color de fondo"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Guardar como"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Tamaño de la imagen"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Anchura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Traducción"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Altura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Editar"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "Imagen PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Confuso"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "¡El tamaño de la imagen es muy grande!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "¡Debe guardar el registro antes de añadir traducciones!"
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "¡No hay otro idioma disponible!"
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/es_CO/LC_MESSAGES/tryton.mo b/share/locale/es_CO/LC_MESSAGES/tryton.mo
index 00ba0f5..ed0df30 100644
Binary files a/share/locale/es_CO/LC_MESSAGES/tryton.mo and b/share/locale/es_CO/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/es_CO/LC_MESSAGES/tryton.po b/share/locale/es_CO/LC_MESSAGES/tryton.po
index 0a847b3..828f3d8 100644
--- a/share/locale/es_CO/LC_MESSAGES/tryton.po
+++ b/share/locale/es_CO/LC_MESSAGES/tryton.po
@@ -1,61 +1,61 @@
 # Spanish (Colombia) translations for tryton.
-# Copyright (C) 2012 Prexik
+# Copyright (C) 2014 Presik Technologies
 # This file is distributed under the same license as the tryton project.
 # FIRST AUTHOR <EMAIL at ADDRESS>, 2012.
 # Oscar Alvarez <oscar.alvarez.montero at gmail.com>, 2012.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: tryton 2.4.0\n"
+"Project-Id-Version: tryton 3.4.0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-04-02 22:45-0500\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-10-14 22:25-0500\n"
 "Last-Translator: Oscar Alvarez <oscar.alvarez.montero at gmail.com>\n"
-"Language-Team: Colombia\n"
+"Language-Team: Colombia <oscar.alvarez.montero at gmail.com>\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "Especifique un archivo de configuración alternativo"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr "modo desarrollo"
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr "Registra toda la información con nivel INFO"
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr "especifique el nivel log: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "especifique el usuario"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr "especifique el puerto del servidor"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "especifique el nombre del servidor"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr "Demasiados argumentos"
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr "No se ha encontró el archivo \"%s\""
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr "No es posible modificar el archivo de configuración %s!"
@@ -85,42 +85,42 @@ msgstr "Servidor:"
 msgid "Port:"
 msgstr "Puerto:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Selección"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "Su selección:"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Guardar como..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "Ignorar siempre esta advertencia."
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr "Desea continuar?"
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Confirmación"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Excepción de Concurrencia"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
 "\n"
@@ -138,50 +138,50 @@ msgstr ""
 "   - \"Comparar\" para ver la versión modificada:\n"
 "   - \"Guardar de todas formas\" para guardar sus cambios."
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Comparar"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Guardar de todas formas"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Error"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "Reportar Fallo"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr "Error de Aplicación!"
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "Error: "
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr "Para reportar fallos debe tener una cuenta en <u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr "Seguimiento de Fallos"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "Usuario:"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "Contraseña:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -190,11 +190,11 @@ msgstr ""
 "Para mantenerle informado añadiremos su usuario a la lista de interesados"
 " en este asunto."
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "Se creó un nuevo fallo con ID "
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
@@ -202,11 +202,11 @@ msgstr ""
 "Error de conexión!\n"
 "Nombre de usuario o contraseña incorrectos!"
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "Excepción:"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
@@ -217,12 +217,12 @@ msgstr ""
 "La aplicación detendrá la conexión al servidor hasta que se corrija la "
 "huella de seguridad."
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
-msgstr "Riesgo de Seguridad!"
+msgstr "Riesgo de seguridad!"
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
@@ -230,31 +230,31 @@ msgstr ""
 "Error de conexión!\n"
 "No ha sido posible conectarse al servidor!"
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
-msgstr "¡Error de Red!"
+msgstr "Error de Red!"
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr "A"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "M"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "s"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr "d"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "h"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "m"
 
@@ -274,58 +274,57 @@ msgstr "Abrir el calendario <F2>"
 msgid "Date Selection"
 msgstr "Selección de Fecha"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr "s"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "yes"
 msgstr "sí"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "true"
 msgstr "verdadero"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr "v"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Verdadero"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Falso"
 
-#: tryton/common/popup_menu.py:72
-#, fuzzy
+#: tryton/common/popup_menu.py:77
 msgid "Edit..."
-msgstr "_Salir..."
+msgstr "_Editar..."
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 msgid "Attachments..."
 msgstr "Adjuntos..."
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 msgid "Actions..."
 msgstr "Acciones..."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 msgid "Relate..."
 msgstr "Relacionado..."
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 msgid "Report..."
-msgstr "Informes..."
+msgstr "Reporte..."
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 msgid "E-Mail..."
 msgstr "Correo Electrónico..."
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 msgid "Print..."
 msgstr "Imprimir..."
 
@@ -350,10 +349,10 @@ msgid "_Help"
 msgstr "Ay_uda"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Buscar"
 
@@ -521,7 +520,7 @@ msgstr "_Acerca de..."
 msgid "Manage Favorites"
 msgstr "_Administrar Favoritos"
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
@@ -529,11 +528,11 @@ msgstr ""
 "La acción seleccionada requiere cerrar todas las pestañas. \n"
 "¿Desea continuar?"
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Cerrar pestaña"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
@@ -541,7 +540,7 @@ msgstr ""
 "Va a eliminar una base de datos de Tryton.\n"
 "Está seguro que quiere continuar?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -549,28 +548,28 @@ msgstr ""
 "La contraseña del Servidor Tryton es incorrecta.\n"
 "Inténtelo de nuevo."
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "¡Acceso denegado!"
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr "La eliminación de la base de datos ha fallado con el mensaje de error:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "Falló la eliminación de la base de datos!"
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "La base de datos se ha eliminado satisfactoriamente!"
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "Abrir una Copia de Seguridad a Restaurar..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -578,11 +577,11 @@ msgstr ""
 "No es posible restaurar una base de datos protegida con contraseña.\n"
 "La copia de seguridad y su restauración tiene que ser manual."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "La base de datos está protegida por contraseña!"
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -590,19 +589,19 @@ msgstr ""
 "La contraseña del servidor Tryton es incorrecta.\n"
 "Inténtelo de nuevo."
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr "La restauración de la base de datos ha fallado con el error:\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "¡La restauración de la base de datos ha fallado!"
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "¡La base de datos se ha restaurado correctamente!"
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -610,15 +609,15 @@ msgstr ""
 "No es posible hacer copia de una base de datos protegida por contraseña.\n"
 "La copia de seguridad y su restauración tiene que ser manual."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "La extracción de la base de datos ha fallado con el mensaje de error:\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr "La extracción de la base de datos ha fallado!"
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "¡La copia de seguridad de la base de datos ha finalizado correctamente!"
 
@@ -631,7 +630,7 @@ msgid "Create a new record"
 msgstr "Crear un nuevo registro"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "Guardar"
 
@@ -641,9 +640,9 @@ msgstr "Guardar este registro"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
-msgstr "Cambiar vista"
+msgstr "Cambiar"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 msgid "Switch view"
@@ -824,40 +823,17 @@ msgstr "Confirme la contraseña del Administrador:"
 msgid "Type the Admin password again"
 msgstr "Teclee la contraseña del Administrador de nuevo"
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"El nombre de la base de datos está restringido a caracteres alfanuméricos"
-" y \"_\" (subrayado). Evite todos los acentos, espacios y cualquier otro "
-"carácter especial."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "¡Ha introducido caracteres incorrectos en el nombre de la base de datos!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr ""
 "La nueva contraseña del Administrador no coincide con el campo de "
 "confirmación.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "¡Las contraseñas no coinciden!"
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"La contraseña del Administrador y su confirmación son necesarias para "
-"crear una nueva base de datos."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "¡Falta la contraseña del Administrador!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -865,15 +841,15 @@ msgstr ""
 "Ya existe una base de datos con el mismo nombre.\n"
 "Inténtelo con otro nombre de base de datos."
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "Ya existe una base de datos con este nombre!"
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr "La contraseña del servidor Tryton no es correcta. Inténtelo de nuevo."
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -886,7 +862,7 @@ msgstr ""
 "adicional.\n"
 "Mensaje de error:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "Se ha producido un error al crear la base de datos!"
 
@@ -951,12 +927,12 @@ msgstr "Perfiles"
 msgid "Profile"
 msgstr "Perfil"
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "_Agregar"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "_Eliminar"
@@ -981,7 +957,7 @@ msgstr "Nombre de usuario:"
 msgid "Could not connect to the server"
 msgstr "No se ha podido conectar al servidor"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 msgid "Incompatible version of the server"
 msgstr "Incompatible versión del servidor"
 
@@ -1107,8 +1083,8 @@ msgstr "Adjunto:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Anterior"
 
@@ -1118,8 +1094,8 @@ msgstr "Registro Anterior"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Siguiente"
 
@@ -1157,7 +1133,7 @@ msgstr "Ver _Registro..."
 
 #: tryton/gui/window/form.py:66
 msgid "Show revisions..."
-msgstr ""
+msgstr "Mostrar revisiones..."
 
 #: tryton/gui/window/form.py:71
 msgid "A_ttachments..."
@@ -1224,23 +1200,23 @@ msgstr "Fecha de Última Modificación:"
 msgid "Model:"
 msgstr "Modelo:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr "Está seguro que quiere eliminar este registro?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr "Está seguro que quiere eliminar estos registros?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr "Los registros no se han eliminado!"
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr "Registros eliminados!"
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr "Está trabajando ahora registro(s) duplicado(s)!"
 
@@ -1252,11 +1228,11 @@ msgstr "¡Registro guardado!"
 msgid "Invalid form!"
 msgstr "¡Formulario no válido!"
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " de "
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1264,49 +1240,48 @@ msgstr ""
 "Este registro ha sido modificado.\n"
 "¿Desea guardarlo?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Acción"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr "Lanzar acción"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Relate"
 msgstr "Relacionado"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Open related records"
 msgstr "Abrir registros relacionados"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Report"
 msgstr "Informes"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Open report"
-msgstr "Abrir informe"
+msgstr "Abrir reporte"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail"
 msgstr "Email"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
-msgstr "Informe por email"
+msgstr "Reporte por email"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Imprimir"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
-msgstr "Imprimir informe"
+msgstr "Imprimir reporte"
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Desconocido"
 
@@ -1339,18 +1314,16 @@ msgid "Current Password:"
 msgstr "Contraseña Actual:"
 
 #: tryton/gui/window/revision.py:20
-#, fuzzy
 msgid "Revision"
-msgstr "Anterior"
+msgstr "Revisión"
 
 #: tryton/gui/window/revision.py:29
-#, fuzzy
 msgid "Select a revision"
-msgstr "Selección"
+msgstr "Seleccione una revisión"
 
 #: tryton/gui/window/revision.py:32
 msgid "Revision:"
-msgstr ""
+msgstr "Revisión:"
 
 #: tryton/gui/window/shortcuts.py:17
 msgid "Keyboard Shortcuts"
@@ -1414,7 +1387,7 @@ msgstr "Desmarcar línea para eliminación"
 
 #: tryton/gui/window/shortcuts.py:44
 msgid "Edition Widgets"
-msgstr "Controles de Edición"
+msgstr "Widgets de Edición"
 
 #: tryton/gui/window/tips.py:17
 msgid ""
@@ -1485,67 +1458,77 @@ msgstr "Consejos"
 msgid "_Display a new tip next time"
 msgstr "_Mostrar un nuevo consejo la próxima vez"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Exportar a CSV"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Exportaciones predeterminadas</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Todos los campos</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Limpiar"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Guardar Exportación"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Eliminar Exportación"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Campos a exportar</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Opciones</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Abrir"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Añadir nombres de _campo"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "Nombre"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (cadena)"
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr "¿Cuál es el nombre de esta exportación?"
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "Sobreescribir '%s' definición?"
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "%d registro guardado!"
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "%d registros guardados!"
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1569,18 +1552,17 @@ msgid "Remove <Del>"
 msgstr "Eliminar <Supr>"
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 msgid "Create a new record <F3>"
 msgstr "Crear un nuevo registro <F3>"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 msgid "Delete selected record <Del>"
 msgstr "Eliminar registro seleccionado <Supr>"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 msgid "Undelete selected record <Ins>"
 msgstr "Recuperar registro seleccionado <Ins>"
 
@@ -1602,10 +1584,10 @@ msgstr "Archivo a importar:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Abrir..."
 
@@ -1656,68 +1638,98 @@ msgstr "%d registro importado!"
 msgid "%d records imported!"
 msgstr "%d registros importados!"
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Asistente"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "No tiene una cadena como atributo."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 msgid "ID"
 msgstr "ID"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 msgid "Creation User"
 msgstr "Creado por Usuario"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 msgid "Creation Date"
 msgstr "Fecha de Creación"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 msgid "Modification User"
 msgstr "Modificado por Usuario"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 msgid "Modification Date"
 msgstr "Fecha de Modificación"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr "No es posible encontrar el estado de la vista de árbol"
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 msgid "Unable to set view tree state"
 msgstr "No se puede fijar la vista de estado del árbol"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Guardar Como"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Tamaño de la Imagen"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Anchura:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Altura:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "Imagen PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "La imagen es muy grande!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ".."
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 msgid "F_ilters"
 msgstr "F_iltros"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr "Mostrar marcadores de filtros"
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr "Eliminar este marcador"
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr "Marcar este filtro"
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr "Nombre del Marcador:"
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Buscar"
 
@@ -1745,79 +1757,49 @@ msgstr "Seleccione un archivo..."
 msgid "Show plain text"
 msgstr "Mostrar como texto plano"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr "Agregar valor"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr "Remover \"%s\""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 msgid "Select an Image..."
 msgstr "Seleccione una Imagen..."
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Todos los archivos"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Imágenes"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Traducción"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Editar"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Confuso"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Debe guardar el registro antes de añadir traducciones!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "No hay otro idioma disponible!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 msgid "Add existing record"
 msgstr "Agregar registro existente"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 msgid "Remove selected record <Del>"
 msgstr "Eliminar registro seleccionado <Supr>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 msgid "Open a record <F2>"
 msgstr "Abrir registro <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 msgid "Search a record <F2>"
 msgstr "Buscar registro <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 msgid "Remove selected record"
 msgstr "Eliminar registro seleccionado"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 msgid "Edit selected record <F2>"
 msgstr "Editar registro seleccionado <F2>"
 
@@ -1877,33 +1859,25 @@ msgstr "Seleccionar color principal"
 msgid "Select a background color"
 msgstr "Seleccionar color de fondo"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Guardar Como"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Tamaño de la Imagen"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Anchura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Traducción"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Altura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Editar"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "Imagen PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Confuso"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "La imagen es muy grande!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Debe guardar el registro antes de añadir traducciones!"
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ":"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "No hay otro idioma disponible!"
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/es_EC/LC_MESSAGES/tryton.mo b/share/locale/es_EC/LC_MESSAGES/tryton.mo
new file mode 100644
index 0000000..d8b0f3c
Binary files /dev/null and b/share/locale/es_EC/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/es_CO/LC_MESSAGES/tryton.po b/share/locale/es_EC/LC_MESSAGES/tryton.po
similarity index 78%
copy from share/locale/es_CO/LC_MESSAGES/tryton.po
copy to share/locale/es_EC/LC_MESSAGES/tryton.po
index 0a847b3..a43c698 100644
--- a/share/locale/es_CO/LC_MESSAGES/tryton.po
+++ b/share/locale/es_EC/LC_MESSAGES/tryton.po
@@ -1,64 +1,64 @@
-# Spanish (Colombia) translations for tryton.
-# Copyright (C) 2012 Prexik
+# Spanish (Ecuador) translations for tryton.
+# Copyright (C) 2014 Fabyc
 # This file is distributed under the same license as the tryton project.
-# FIRST AUTHOR <EMAIL at ADDRESS>, 2012.
-# Oscar Alvarez <oscar.alvarez.montero at gmail.com>, 2012.
+# FIRST AUTHOR <fabianc7 at gmail.com>, 2014.
+# Fabian Calle <fabianc7 at gmail.com>, 2014.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: tryton 2.4.0\n"
+"Project-Id-Version: tryton 3.3.dev0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-04-02 22:45-0500\n"
-"Last-Translator: Oscar Alvarez <oscar.alvarez.montero at gmail.com>\n"
-"Language-Team: Colombia\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-09-01 15:13-0500\n"
+"Last-Translator: Fabian Calle <fabianc7 at gmail.com>\n"
+"Language-Team: Ecuador <fabianc7 at gmail.com>\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "Especifique un archivo de configuración alternativo"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr "modo desarrollo"
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr "Registra toda la información con nivel INFO"
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr "especifique el nivel log: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "especifique el usuario"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr "especifique el puerto del servidor"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "especifique el nombre del servidor"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr "Demasiados argumentos"
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr "No se ha encontró el archivo \"%s\""
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
-msgstr "No es posible modificar el archivo de configuración %s!"
+msgstr "¡No es posible escribir el archivo de configuración %s!"
 
 #: tryton/translate.py:184
 #, python-format
@@ -71,7 +71,7 @@ msgstr "Seleccione su acción"
 
 #: tryton/action/main.py:177
 msgid "No action defined!"
-msgstr "No hay acción definida!"
+msgstr "¡No se ha definido ninguna acción!"
 
 #: tryton/common/common.py:284
 msgid "Tryton Connection"
@@ -85,42 +85,42 @@ msgstr "Servidor:"
 msgid "Port:"
 msgstr "Puerto:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Selección"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "Su selección:"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Guardar como..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "Ignorar siempre esta advertencia."
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
-msgstr "Desea continuar?"
+msgstr "¿Desea continuar?"
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Confirmación"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Excepción de Concurrencia"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
 "\n"
@@ -138,75 +138,75 @@ msgstr ""
 "   - \"Comparar\" para ver la versión modificada:\n"
 "   - \"Guardar de todas formas\" para guardar sus cambios."
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Comparar"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Guardar de todas formas"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Error"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
-msgstr "Reportar Fallo"
+msgstr "Informar Error"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
-msgstr "Error de Aplicación!"
+msgstr "¡Error de Aplicación!"
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "Error: "
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
-msgstr "Para reportar fallos debe tener una cuenta en <u>%s</u>"
+msgstr "Para informar errores debe tener una cuenta en <u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
-msgstr "Seguimiento de Fallos"
+msgstr "Seguimiento de Errores"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "Usuario:"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "Contraseña:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
 msgstr ""
-"El mismo fallo ya fue notificado por otro usuario.\n"
+"El mismo error ya fue notificado por otro usuario.\n"
 "Para mantenerle informado añadiremos su usuario a la lista de interesados"
 " en este asunto."
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
-msgstr "Se creó un nuevo fallo con ID "
+msgstr "Se creó un nuevo error con ID "
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
 msgstr ""
 "Error de conexión!\n"
-"Nombre de usuario o contraseña incorrectos!"
+"¡Nombre de usuario o contraseña incorrectos!"
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "Excepción:"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
@@ -217,44 +217,44 @@ msgstr ""
 "La aplicación detendrá la conexión al servidor hasta que se corrija la "
 "huella de seguridad."
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
-msgstr "Riesgo de Seguridad!"
+msgstr "¡Riesgo de Seguridad!"
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
 msgstr ""
-"Error de conexión!\n"
-"No ha sido posible conectarse al servidor!"
+"¡Error de conexión!\n"
+"¡No ha sido posible conectarse al servidor!"
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "¡Error de Red!"
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr "A"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "M"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "s"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr "d"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "h"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "m"
 
@@ -274,58 +274,57 @@ msgstr "Abrir el calendario <F2>"
 msgid "Date Selection"
 msgstr "Selección de Fecha"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr "s"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "yes"
 msgstr "sí"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "true"
 msgstr "verdadero"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr "v"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Verdadero"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Falso"
 
-#: tryton/common/popup_menu.py:72
-#, fuzzy
+#: tryton/common/popup_menu.py:77
 msgid "Edit..."
-msgstr "_Salir..."
+msgstr "Editar..."
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 msgid "Attachments..."
 msgstr "Adjuntos..."
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 msgid "Actions..."
 msgstr "Acciones..."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 msgid "Relate..."
 msgstr "Relacionado..."
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 msgid "Report..."
-msgstr "Informes..."
+msgstr "Informe..."
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 msgid "E-Mail..."
 msgstr "Correo Electrónico..."
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 msgid "Print..."
 msgstr "Imprimir..."
 
@@ -350,16 +349,16 @@ msgid "_Help"
 msgstr "Ay_uda"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Buscar"
 
 #: tryton/gui/main.py:374
 msgid "No result found."
-msgstr "No hay resultados."
+msgstr "No se han encontrado resultados."
 
 #: tryton/gui/main.py:396
 msgid "_Connect..."
@@ -383,7 +382,7 @@ msgstr "_Restaurar Base de Datos..."
 
 #: tryton/gui/main.py:444
 msgid "_Backup Database..."
-msgstr "_Copia de Seguridad de la Base de Datos..."
+msgstr "Realizar _Copia de Seguridad de la Base de Datos..."
 
 #: tryton/gui/main.py:453
 msgid "Dro_p Database..."
@@ -407,7 +406,7 @@ msgstr "Conmutar _Menú"
 
 #: tryton/gui/main.py:504
 msgid "_Global Search"
-msgstr "_Busqueda Global"
+msgstr "Búsqueda _Global"
 
 #: tryton/gui/main.py:519
 msgid "_Toolbar"
@@ -467,7 +466,7 @@ msgstr "Corrección Ortográfica"
 
 #: tryton/gui/main.py:646
 msgid "Tabs Position"
-msgstr "Posición de Pestañas"
+msgstr "Posición de las Pestañas"
 
 #: tryton/gui/main.py:654
 msgid "Top"
@@ -519,9 +518,9 @@ msgstr "_Acerca de..."
 
 #: tryton/gui/main.py:799
 msgid "Manage Favorites"
-msgstr "_Administrar Favoritos"
+msgstr "_Administrar Menús Favoritos"
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
@@ -529,19 +528,19 @@ msgstr ""
 "La acción seleccionada requiere cerrar todas las pestañas. \n"
 "¿Desea continuar?"
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Cerrar pestaña"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
 msgstr ""
 "Va a eliminar una base de datos de Tryton.\n"
-"Está seguro que quiere continuar?"
+"¿Está seguro que quiere continuar?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -549,28 +548,28 @@ msgstr ""
 "La contraseña del Servidor Tryton es incorrecta.\n"
 "Inténtelo de nuevo."
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "¡Acceso denegado!"
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr "La eliminación de la base de datos ha fallado con el mensaje de error:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "Falló la eliminación de la base de datos!"
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "La base de datos se ha eliminado satisfactoriamente!"
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
-msgstr "Abrir una Copia de Seguridad a Restaurar..."
+msgstr "Abrir una Copia de Seguridad para Restaurar..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -578,11 +577,11 @@ msgstr ""
 "No es posible restaurar una base de datos protegida con contraseña.\n"
 "La copia de seguridad y su restauración tiene que ser manual."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "La base de datos está protegida por contraseña!"
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -590,19 +589,19 @@ msgstr ""
 "La contraseña del servidor Tryton es incorrecta.\n"
 "Inténtelo de nuevo."
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr "La restauración de la base de datos ha fallado con el error:\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "¡La restauración de la base de datos ha fallado!"
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "¡La base de datos se ha restaurado correctamente!"
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -610,15 +609,15 @@ msgstr ""
 "No es posible hacer copia de una base de datos protegida por contraseña.\n"
 "La copia de seguridad y su restauración tiene que ser manual."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "La extracción de la base de datos ha fallado con el mensaje de error:\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
-msgstr "La extracción de la base de datos ha fallado!"
+msgstr "¡La extracción de la base de datos ha fallado!"
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "¡La copia de seguridad de la base de datos ha finalizado correctamente!"
 
@@ -631,7 +630,7 @@ msgid "Create a new record"
 msgstr "Crear un nuevo registro"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "Guardar"
 
@@ -641,7 +640,7 @@ msgstr "Guardar este registro"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "Cambiar vista"
 
@@ -694,7 +693,7 @@ msgstr ""
 
 #: tryton/gui/window/dbcreate.py:45
 msgid "No connection!"
-msgstr "No hay conexión!"
+msgstr "¡No hay conexión!"
 
 #: tryton/gui/window/dbcreate.py:48
 msgid ""
@@ -705,7 +704,7 @@ msgid ""
 "that the server address and port (usually 8000) are not blocked.\n"
 "Click on 'Change' to change the address."
 msgstr ""
-"No se ha podido conectar al servidor!\n"
+"¡No se ha podido conectar al servidor!\n"
 "1. Revise si el servidor se está ejecutando.\n"
 "2. Averigüe en qué dirección y puerto está escuchando.\n"
 "3. Si hay un cortafuegos entre el servidor y este cliente, asegúrese que "
@@ -824,40 +823,17 @@ msgstr "Confirme la contraseña del Administrador:"
 msgid "Type the Admin password again"
 msgstr "Teclee la contraseña del Administrador de nuevo"
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"El nombre de la base de datos está restringido a caracteres alfanuméricos"
-" y \"_\" (subrayado). Evite todos los acentos, espacios y cualquier otro "
-"carácter especial."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "¡Ha introducido caracteres incorrectos en el nombre de la base de datos!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr ""
 "La nueva contraseña del Administrador no coincide con el campo de "
 "confirmación.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "¡Las contraseñas no coinciden!"
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"La contraseña del Administrador y su confirmación son necesarias para "
-"crear una nueva base de datos."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "¡Falta la contraseña del Administrador!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -865,15 +841,15 @@ msgstr ""
 "Ya existe una base de datos con el mismo nombre.\n"
 "Inténtelo con otro nombre de base de datos."
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "Ya existe una base de datos con este nombre!"
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr "La contraseña del servidor Tryton no es correcta. Inténtelo de nuevo."
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -886,7 +862,7 @@ msgstr ""
 "adicional.\n"
 "Mensaje de error:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "Se ha producido un error al crear la base de datos!"
 
@@ -945,18 +921,18 @@ msgstr "Base de Datos:"
 
 #: tryton/gui/window/dblogin.py:31
 msgid "Profile Editor"
-msgstr "Perfiles"
+msgstr "Editor de Perfiles"
 
 #: tryton/gui/window/dblogin.py:46
 msgid "Profile"
 msgstr "Perfil"
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "_Agregar"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "_Eliminar"
@@ -981,9 +957,9 @@ msgstr "Nombre de usuario:"
 msgid "Could not connect to the server"
 msgstr "No se ha podido conectar al servidor"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 msgid "Incompatible version of the server"
-msgstr "Incompatible versión del servidor"
+msgstr "El cliente no es compatible con la versión del servidor"
 
 #: tryton/gui/window/dblogin.py:370
 msgid "Login"
@@ -1058,7 +1034,7 @@ msgid ""
 "Check for an automatic database update after restoring a database from a "
 "previous Tryton version."
 msgstr ""
-"Confirme si desea realizar una actualización automática de la base de "
+"Márquelo para que se realice una actualización automática de la base de "
 "datos desde una versión anterior de Tryton, después de restaurarla."
 
 #: tryton/gui/window/dbrestore.py:156
@@ -1107,8 +1083,8 @@ msgstr "Adjunto:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Anterior"
 
@@ -1118,8 +1094,8 @@ msgstr "Registro Anterior"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Siguiente"
 
@@ -1157,7 +1133,7 @@ msgstr "Ver _Registro..."
 
 #: tryton/gui/window/form.py:66
 msgid "Show revisions..."
-msgstr ""
+msgstr "Mostrar versiones..."
 
 #: tryton/gui/window/form.py:71
 msgid "A_ttachments..."
@@ -1198,7 +1174,7 @@ msgstr "Adjunto(%d)"
 
 #: tryton/gui/window/form.py:234
 msgid "You have to select one record!"
-msgstr "Debe seleccionar un registro!"
+msgstr "¡Debe seleccionar un registro!"
 
 #: tryton/gui/window/form.py:238
 msgid "ID:"
@@ -1224,25 +1200,25 @@ msgstr "Fecha de Última Modificación:"
 msgid "Model:"
 msgstr "Modelo:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
-msgstr "Está seguro que quiere eliminar este registro?"
+msgstr "¿Está seguro que quiere eliminar este registro?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
-msgstr "Está seguro que quiere eliminar estos registros?"
+msgstr "¿Está seguro que quiere eliminar estos registros?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
-msgstr "Los registros no se han eliminado!"
+msgstr "¡Los registros no se han eliminado!"
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
-msgstr "Registros eliminados!"
+msgstr "¡Registros eliminados!"
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
-msgstr "Está trabajando ahora registro(s) duplicado(s)!"
+msgstr "¡Ahora está trabajando en registro(s) duplicado(s)!"
 
 #: tryton/gui/window/form.py:352
 msgid "Record saved!"
@@ -1252,11 +1228,11 @@ msgstr "¡Registro guardado!"
 msgid "Invalid form!"
 msgstr "¡Formulario no válido!"
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " de "
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1264,49 +1240,48 @@ msgstr ""
 "Este registro ha sido modificado.\n"
 "¿Desea guardarlo?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Acción"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr "Lanzar acción"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Relate"
 msgstr "Relacionado"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Open related records"
 msgstr "Abrir registros relacionados"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Report"
 msgstr "Informes"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Open report"
 msgstr "Abrir informe"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail"
 msgstr "Email"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr "Informe por email"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Imprimir"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr "Imprimir informe"
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Desconocido"
 
@@ -1339,18 +1314,16 @@ msgid "Current Password:"
 msgstr "Contraseña Actual:"
 
 #: tryton/gui/window/revision.py:20
-#, fuzzy
 msgid "Revision"
-msgstr "Anterior"
+msgstr "Versión"
 
 #: tryton/gui/window/revision.py:29
-#, fuzzy
 msgid "Select a revision"
-msgstr "Selección"
+msgstr "Seleccione una versión"
 
 #: tryton/gui/window/revision.py:32
 msgid "Revision:"
-msgstr ""
+msgstr "Versión:"
 
 #: tryton/gui/window/shortcuts.py:17
 msgid "Keyboard Shortcuts"
@@ -1485,67 +1458,77 @@ msgstr "Consejos"
 msgid "_Display a new tip next time"
 msgstr "_Mostrar un nuevo consejo la próxima vez"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Exportar a CSV"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Exportaciones predeterminadas</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Todos los campos</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Limpiar"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Guardar Exportación"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Eliminar Exportación"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Campos a exportar</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Opciones</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Abrir"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Añadir nombres de _campo"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "Nombre"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (cadena)"
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr "¿Cuál es el nombre de esta exportación?"
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "¿Desea sobreescribir la definición '%s'?"
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
-msgstr "%d registro guardado!"
+msgstr "¡%d registro guardado!"
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
-msgstr "%d registros guardados!"
+msgstr "¡%d registros guardados!"
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1562,25 +1545,24 @@ msgstr "Enlace"
 
 #: tryton/gui/window/win_form.py:136
 msgid "Add"
-msgstr "Añadir"
+msgstr "Agregar"
 
 #: tryton/gui/window/win_form.py:149
 msgid "Remove <Del>"
 msgstr "Eliminar <Supr>"
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 msgid "Create a new record <F3>"
 msgstr "Crear un nuevo registro <F3>"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 msgid "Delete selected record <Del>"
 msgstr "Eliminar registro seleccionado <Supr>"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 msgid "Undelete selected record <Ins>"
 msgstr "Recuperar registro seleccionado <Ins>"
 
@@ -1602,10 +1584,10 @@ msgstr "Archivo a importar:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Abrir..."
 
@@ -1649,75 +1631,105 @@ msgstr "Se ha producido un error al procesar el archivo en el campo %s."
 #: tryton/gui/window/win_import.py:364
 #, python-format
 msgid "%d record imported!"
-msgstr "%d registro importado!"
+msgstr "¡%d registro importado!"
 
 #: tryton/gui/window/win_import.py:366
 #, python-format
 msgid "%d records imported!"
-msgstr "%d registros importados!"
+msgstr "¡%d registros importados!"
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Asistente"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "No tiene una cadena como atributo."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 msgid "ID"
 msgstr "ID"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 msgid "Creation User"
 msgstr "Creado por Usuario"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 msgid "Creation Date"
 msgstr "Fecha de Creación"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 msgid "Modification User"
 msgstr "Modificado por Usuario"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 msgid "Modification Date"
 msgstr "Fecha de Modificación"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
-msgstr "No es posible encontrar el estado de la vista de árbol"
+msgstr "No es posible obtener el estado de la vista de árbol"
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 msgid "Unable to set view tree state"
-msgstr "No se puede fijar la vista de estado del árbol"
+msgstr "No se puede establecer la vista de estado del árbol"
+
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Guardar Como"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Tamaño de la Imagen"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Anchura:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Altura:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "Imagen PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "¡El tamaño de la imagen es muy grande.!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ".."
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 msgid "F_ilters"
 msgstr "F_iltros"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr "Mostrar marcadores de filtros"
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr "Eliminar este marcador"
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr "Marcar este filtro"
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr "Nombre del Marcador:"
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Buscar"
 
@@ -1739,85 +1751,55 @@ msgstr "Semana"
 
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:47
 msgid "Select a File..."
-msgstr "Seleccione un archivo..."
+msgstr "Seleccionar un archivo..."
 
 #: tryton/gui/window/view_form/view/form_gtk/char.py:161
 msgid "Show plain text"
 msgstr "Mostrar como texto plano"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr "Agregar valor"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr "Remover \"%s\""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 msgid "Select an Image..."
-msgstr "Seleccione una Imagen..."
+msgstr "Seleccionar una Imagen..."
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Todos los archivos"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Imágenes"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Traducción"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Editar"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Confuso"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Debe guardar el registro antes de añadir traducciones!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "No hay otro idioma disponible!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 msgid "Add existing record"
 msgstr "Agregar registro existente"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 msgid "Remove selected record <Del>"
 msgstr "Eliminar registro seleccionado <Supr>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 msgid "Open a record <F2>"
 msgstr "Abrir registro <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 msgid "Search a record <F2>"
 msgstr "Buscar registro <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 msgid "Remove selected record"
 msgstr "Eliminar registro seleccionado"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 msgid "Edit selected record <F2>"
 msgstr "Editar registro seleccionado <F2>"
 
@@ -1877,33 +1859,25 @@ msgstr "Seleccionar color principal"
 msgid "Select a background color"
 msgstr "Seleccionar color de fondo"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Guardar Como"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Tamaño de la Imagen"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Anchura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Traducción"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Altura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Editar"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "Imagen PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Confuso"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "La imagen es muy grande!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Debe guardar el registro antes de añadir traducciones!"
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ":"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "No hay otro idioma disponible!"
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/es_ES/LC_MESSAGES/tryton.mo b/share/locale/es_ES/LC_MESSAGES/tryton.mo
index 6342c42..09fb6c3 100644
Binary files a/share/locale/es_ES/LC_MESSAGES/tryton.mo and b/share/locale/es_ES/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/es_ES/LC_MESSAGES/tryton.po b/share/locale/es_ES/LC_MESSAGES/tryton.po
index ab03387..3d8cbcd 100644
--- a/share/locale/es_ES/LC_MESSAGES/tryton.po
+++ b/share/locale/es_ES/LC_MESSAGES/tryton.po
@@ -12,54 +12,54 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tryton 2.4.0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-04-18 00:04+0100\n"
-"Last-Translator: Jordi Esteve <jesteve at zikzakmedia.com>\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-10-17 17:31+0100\n"
+"Last-Translator: Jordi Esteve (Zikzakmedia) <jesteve at zikzakmedia.com>\n"
 "Language-Team: <tryton-es at googlegroups.com>\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "Indica un archivo de configuración alternativo"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr "Modo desarrollo"
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr "Registra toda la información con nivel INFO"
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr "Indica el nivel de log: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "Indica el usuario"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr "Indica el puerto del servidor"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "Indica el nombre del servidor"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr "Demasiados argumentos"
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr "El archivo «%s» no se ha encontrado"
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr "No se ha podido escribir el archivo de configuración %s."
@@ -89,42 +89,42 @@ msgstr "Servidor:"
 msgid "Port:"
 msgstr "Puerto:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Selección"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "Su selección:"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Guardar como..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "Ignorar siempre esta advertencia."
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr "¿Desea continuar?"
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Confirmación"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Excepción de concurrencia"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
 "\n"
@@ -142,50 +142,50 @@ msgstr ""
 "   - \"Comparar\" para ver la versión modificada:\n"
 "   - \"Guardar de todas formas\" para guardar sus cambios."
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Comparar"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Guardar de todas formas"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Error"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "Informar de un error"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr "Error de aplicación."
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "Error: "
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr "Para informar de errores debe tener una cuenta en <u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr "Seguimiento de errores"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "Usuario:"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "Contraseña:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -194,11 +194,11 @@ msgstr ""
 "Para mantenerle informado añadiremos su usuario a la lista de interesados"
 " en esta incidencia."
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "Se creó un nuevo error con identificador"
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
@@ -206,11 +206,11 @@ msgstr ""
 "Error de conexión.\n"
 "Nombre de usuario o contraseña incorrectos."
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "Excepción:"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
@@ -221,12 +221,12 @@ msgstr ""
 "La aplicación no se podrá conectar a este servidor hasta que se corrija "
 "la huella de seguridad del servidor."
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
 msgstr "Riesgo de seguridad."
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
@@ -234,31 +234,31 @@ msgstr ""
 "Error de conexión.\n"
 "No ha sido posible conectarse al servidor."
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "Error de red."
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr "A"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "M"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "s"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr "d"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "h"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "m"
 
@@ -278,57 +278,57 @@ msgstr "Abrir el calendario <F2>"
 msgid "Date Selection"
 msgstr "Selección de fecha"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr "a"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "yes"
 msgstr "sí"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "true"
 msgstr "verdadero"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr "v"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Verdadero"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Falso"
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 msgid "Edit..."
 msgstr "Editar..."
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 msgid "Attachments..."
 msgstr "Adjuntos..."
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 msgid "Actions..."
 msgstr "Acciones..."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 msgid "Relate..."
 msgstr "Relacionado..."
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 msgid "Report..."
 msgstr "Informe..."
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 msgid "E-Mail..."
 msgstr "Correo electrónico..."
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 msgid "Print..."
 msgstr "Imprimir..."
 
@@ -353,10 +353,10 @@ msgid "_Help"
 msgstr "Ay_uda"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Buscar"
 
@@ -524,7 +524,7 @@ msgstr "_Acerca de..."
 msgid "Manage Favorites"
 msgstr "_Administrar menús favoritos"
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
@@ -532,11 +532,11 @@ msgstr ""
 "La acción seleccionada requiere cerrar todas las pestañas. \n"
 "¿Desea continuar?"
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Cerrar pestaña"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
@@ -544,7 +544,7 @@ msgstr ""
 "Va a eliminar una base de datos de Tryton.\n"
 "¿Está seguro que quiere continuar?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -552,28 +552,28 @@ msgstr ""
 "La contraseña del servidor Tryton es incorrecta.\n"
 "Inténtelo de nuevo."
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "Acceso denegado."
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr "La eliminación de la base de datos ha fallado con el mensaje de error:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "Falló la eliminación de la base de datos."
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "La base de datos se ha eliminado correctamente."
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "Abrir una copia de seguridad para restaurar..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -581,11 +581,11 @@ msgstr ""
 "No es posible restaurar una base de datos protegida con contraseña.\n"
 "La copia de seguridad y su restauración tiene que ser manual."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "La base de datos está protegida con contraseña."
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -593,19 +593,19 @@ msgstr ""
 "La contraseña del servidor Tryton es incorrecta.\n"
 "Inténtelo de nuevo."
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr "La restauración de la base de datos ha fallado con el error:\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "La restauración de la base de datos ha fallado."
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "La base de datos se ha restaurado correctamente."
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -613,15 +613,15 @@ msgstr ""
 "No es posible hacer copia de una base de datos protegida con contraseña.\n"
 "La copia de seguridad y su restauración tiene que ser manual."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "La extracción de la base de datos ha fallado con el mensaje de error:\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr "La extracción de la base de datos ha fallado."
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "La copia de seguridad de la base de datos ha finalizado correctamente."
 
@@ -634,7 +634,7 @@ msgid "Create a new record"
 msgstr "Crear un nuevo registro"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "Guardar"
 
@@ -644,7 +644,7 @@ msgstr "Guardar este registro"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "Cambiar vista"
 
@@ -827,40 +827,17 @@ msgstr "Confirme la contraseña del administrador:"
 msgid "Type the Admin password again"
 msgstr "Teclee la contraseña del administrador de nuevo"
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"El nombre de la base de datos está restringido a caracteres alfanuméricos"
-" y \"_\" (subrayado). Evite todos los acentos, espacios y cualquier otro "
-"carácter especial."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Ha introducido caracteres incorrectos en el nombre de la base de datos."
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr ""
 "La nueva contraseña del administrador no coincide con el campo de "
 "confirmación.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "Las contraseñas no coinciden."
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"La contraseña del administrador y su confirmación son necesarias para "
-"crear una nueva base de datos."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Falta la contraseña del administrador."
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -868,15 +845,15 @@ msgstr ""
 "Ya existe una base de datos con el mismo nombre.\n"
 "Inténtelo con otro nombre de base de datos."
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "Ya existe una base de datos con este nombre."
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr "La contraseña del servidor Tryton no es correcta. Inténtelo de nuevo."
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -889,7 +866,7 @@ msgstr ""
 "adicional.\n"
 "Mensaje de error:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "Se ha producido un error al crear la base de datos."
 
@@ -954,12 +931,12 @@ msgstr "Editor de perfiles"
 msgid "Profile"
 msgstr "Perfil"
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "_Añadir"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "_Eliminar"
@@ -984,7 +961,7 @@ msgstr "Nombre de usuario:"
 msgid "Could not connect to the server"
 msgstr "No se ha podido conectar al servidor"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 msgid "Incompatible version of the server"
 msgstr "El cliente no es compatible con la versión del servidor"
 
@@ -1110,8 +1087,8 @@ msgstr "Adjunto:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Anterior"
 
@@ -1121,8 +1098,8 @@ msgstr "Registro anterior"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Siguiente"
 
@@ -1227,23 +1204,23 @@ msgstr "Última fecha de modificación:"
 msgid "Model:"
 msgstr "Modelo:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr "¿Está seguro que quiere eliminar este registro?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr "¿Está seguro que quiere eliminar estos registros?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr "Los registros no se han eliminado."
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr "Registros eliminados."
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr "Ahora está trabajando en el registro duplicado."
 
@@ -1255,11 +1232,11 @@ msgstr "Registro guardado."
 msgid "Invalid form!"
 msgstr "Formulario incorrecto."
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " de "
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1267,49 +1244,48 @@ msgstr ""
 "Este registro ha sido modificado.\n"
 "¿Desea guardarlo?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Acción"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr "Ejecutar acción"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Relate"
 msgstr "_Relacionado"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Open related records"
 msgstr "Abrir registros relacionados"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Report"
 msgstr "Informes"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Open report"
 msgstr "Abrir informe"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail"
 msgstr "Email"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr "Informe por email"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Imprimir"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr "Imprimir informe"
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Desconocido"
 
@@ -1475,7 +1451,7 @@ msgid ""
 msgstr ""
 "<b>Exportar gráficos</b>\n"
 "\n"
-"Puedes guardar los gráficos como imagen PNG haciendo clic con el botón "
+"Puede guardar los gráficos como imagen PNG haciendo clic con el botón "
 "derecho sobre el mismo.\n"
 
 #: tryton/gui/window/tips.py:46
@@ -1486,67 +1462,77 @@ msgstr "Consejos"
 msgid "_Display a new tip next time"
 msgstr "_Mostrar un nuevo consejo la próxima vez"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Exportar a CSV"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Exportaciones predeterminadas</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Todos los campos</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Limpiar"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Guardar exportación"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Eliminar exportación"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Campos a exportar</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Opciones</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Abrir"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Añadir nombres de _campo"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "Nombre"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (cadena)"
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr "¿Cuál es el nombre de esta exportación?"
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "Sobrescribir la definición de '%s'?"
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "Se ha guardado %d registro."
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "Se han guardado %d registros."
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1570,18 +1556,17 @@ msgid "Remove <Del>"
 msgstr "Eliminar <Supr>"
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 msgid "Create a new record <F3>"
 msgstr "Crear un nuevo registro <F3>"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 msgid "Delete selected record <Del>"
 msgstr "Eliminar registro seleccionado <Supr>"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 msgid "Undelete selected record <Ins>"
 msgstr "Recuperar registro seleccionado <Ins>"
 
@@ -1603,10 +1588,10 @@ msgstr "Archivo a importar:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Abrir..."
 
@@ -1657,68 +1642,98 @@ msgstr "Se ha importado %d registro."
 msgid "%d records imported!"
 msgstr "Se han importado %d registros."
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Asistente"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "No tiene una cadena como atributo."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 msgid "ID"
 msgstr "ID"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 msgid "Creation User"
 msgstr "Creado por:"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 msgid "Creation Date"
 msgstr "Fecha de creación:"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 msgid "Modification User"
 msgstr "Última modificación por:"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 msgid "Modification Date"
 msgstr "Última fecha de modificación:"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr "No se ha podido obtener el estado de expansión del árbol"
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 msgid "Unable to set view tree state"
 msgstr "No se ha podido establecer el estado de expansión del árbol"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Guardar como"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Tamaño de la imagen"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Anchura:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Altura:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "Imagen PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "El tamaño de la imagen es muy grande."
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ".."
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 msgid "F_ilters"
 msgstr "F_iltros"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr "Muestra las búsquedas favoritas"
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr "Eliminar de las búsquedas favoritas"
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr "Guardar como búsqueda favorita"
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr "Nombre de la búsqueda favorita:"
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Buscar"
 
@@ -1746,79 +1761,49 @@ msgstr "Seleccionar un archivo..."
 msgid "Show plain text"
 msgstr "Mostrar como texto plano"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr "Añadir un valor"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr "Eliminar \"%s\""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 msgid "Select an Image..."
 msgstr "Seleccionar una imagen..."
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Todos los archivos"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Imágenes"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Traducción"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Editar"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Confuso"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Debe guardar el registro antes de añadir traducciones."
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "No hay otro idioma disponible."
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 msgid "Add existing record"
 msgstr "Añadir un registro existente"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 msgid "Remove selected record <Del>"
 msgstr "Eliminar registro seleccionado <Supr>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 msgid "Open a record <F2>"
 msgstr "Abrir registro <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 msgid "Search a record <F2>"
 msgstr "Buscar registro <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 msgid "Remove selected record"
 msgstr "Eliminar registro seleccionado"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 msgid "Edit selected record <F2>"
 msgstr "Editar registro seleccionado <F2>"
 
@@ -1878,33 +1863,25 @@ msgstr "Seleccionar color principal"
 msgid "Select a background color"
 msgstr "Seleccionar color de fondo"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Guardar como"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Tamaño de la imagen"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Anchura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Traducción"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Altura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Editar"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "Imagen PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Confuso"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "El tamaño de la imagen es muy grande."
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Debe guardar el registro antes de añadir traducciones."
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ":"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "No hay otro idioma disponible."
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/fr_FR/LC_MESSAGES/tryton.mo b/share/locale/fr_FR/LC_MESSAGES/tryton.mo
index 2550dde..1f5ca02 100644
Binary files a/share/locale/fr_FR/LC_MESSAGES/tryton.mo and b/share/locale/fr_FR/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/fr_FR/LC_MESSAGES/tryton.po b/share/locale/fr_FR/LC_MESSAGES/tryton.po
index 7bcaffa..0a4cf6e 100644
--- a/share/locale/fr_FR/LC_MESSAGES/tryton.po
+++ b/share/locale/fr_FR/LC_MESSAGES/tryton.po
@@ -7,57 +7,57 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tryton 0.0.1\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
 "PO-Revision-Date: 2013-04-19 23:58+0200\n"
-"Last-Translator: Nicolas Évrard <nicolas.evrard at b2ck.com>\n"
+"Last-Translator: Cédric Krier <cedric.krier at b2ck.com>\n"
 "Language-Team: fr_FR\n"
 "Plural-Forms: nplurals=2; plural=(n > 1)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "spécifier un fichier de configuration alternatif"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr "mode développement"
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr "logger tout au niveau INFO"
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
-msgstr "Spécifie le niveau de log : DEBUG, INFO, WARNING, ERROR, CRITICAL"
+msgstr "Spécifie le niveau de log : DEBUG, INFO, WARNING, ERROR, CRITICAL"
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "spécifier l'utilisateur de login"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr "spécifier le port du serveur"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "spécifier le nom du serveur"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr "Trop d'arguments"
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr "Fichier \"%s\" non trouvé"
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
-msgstr "Impossible d'écrire le fichier de configuration %s !"
+msgstr "Impossible d'écrire le fichier de configuration %s !"
 
 #: tryton/translate.py:184
 #, python-format
@@ -70,7 +70,7 @@ msgstr "Sélectionnez votre action"
 
 #: tryton/action/main.py:177
 msgid "No action defined!"
-msgstr "Pas d'action définie !"
+msgstr "Pas d'action définie !"
 
 #: tryton/common/common.py:284
 msgid "Tryton Connection"
@@ -78,48 +78,48 @@ msgstr "Connexion Tryton"
 
 #: tryton/common/common.py:295
 msgid "Server:"
-msgstr "Serveur :"
+msgstr "Serveur :"
 
 #: tryton/common/common.py:313 tryton/gui/window/dblogin.py:79
 msgid "Port:"
-msgstr "Port :"
+msgstr "Port :"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Sélection"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
-msgstr "Votre sélection :"
+msgstr "Votre sélection :"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Enregistrer sous..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "Toujours ignorer cet avertissement."
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
-msgstr "Souhaitez-vous continuer ?"
+msgstr "Souhaitez-vous continuer ?"
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Confirmation"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Erreur d'accès concurrent"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
 "\n"
@@ -138,50 +138,50 @@ msgstr ""
 "   - \"Comparer\" pour voir la nouvelle version;\n"
 "   - \"Écraser\" pour sauver vos modifications."
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Comparer"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Écraser"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Erreur"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "Rapporter un bogue"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
-msgstr "Erreur Applicative !"
+msgstr "Erreur Applicative !"
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
-msgstr "Erreur : "
+msgstr "Erreur : "
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr "Pour rapporter un bogue vous devez avoir un compte sur <u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr "Bug Tracker"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
-msgstr "Utilisateur :"
+msgstr "Utilisateur :"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
-msgstr "Mot de passe :"
+msgstr "Mot de passe :"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -190,70 +190,70 @@ msgstr ""
 "Pour vous garder informé, votre nom d'utilisateur a été ajouté à la liste"
 " de suivi de ce bogue"
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "Un nouveau bogue a été créé avec l'ID "
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
 msgstr ""
-"Erreur de connexion !\n"
-"Mauvais nom d'utilisateur ou mot de passe !"
+"Erreur de connexion !\n"
+"Mauvais nom d'utilisateur ou mot de passe !"
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
-msgstr "Exception :"
+msgstr "Exception :"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
 " is fixed."
 msgstr ""
-"L'empreinte digitale du serveur a changé depuis la dernière connection !\n"
+"L'empreinte digitale du serveur a changé depuis la dernière connection !\n"
 "Les connections à ce serveur sont annulées tant que son empreinte n'est "
 "pas corrigée."
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
-msgstr "Alerte sécurité !"
+msgstr "Alerte sécurité !"
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
 msgstr ""
-"Erreur de connexion !\n"
-"Impossible de se connecter au serveur !"
+"Erreur de connexion !\n"
+"Impossible de se connecter au serveur !"
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "Erreur réseau"
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr "A"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "M"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "s"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr "j"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "h"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "m"
 
@@ -273,57 +273,57 @@ msgstr "Ouvrir le calendrier <F2>"
 msgid "Date Selection"
 msgstr "Sélection de la date"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr "y"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "yes"
 msgstr "oui"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "true"
 msgstr "vrai"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr "v"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Vrai"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Faux"
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 msgid "Edit..."
 msgstr "Éditer..."
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 msgid "Attachments..."
 msgstr "Pièces jointes..."
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 msgid "Actions..."
 msgstr "Actions..."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 msgid "Relate..."
 msgstr "Relation..."
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 msgid "Report..."
 msgstr "Rapport..."
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 msgid "E-Mail..."
 msgstr "Email..."
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 msgid "Print..."
 msgstr "Imprimer..."
 
@@ -348,10 +348,10 @@ msgid "_Help"
 msgstr "_Aide"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Recherche"
 
@@ -519,7 +519,7 @@ msgstr "_À Propos..."
 msgid "Manage Favorites"
 msgstr "_Gérer les favoris"
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
@@ -527,19 +527,19 @@ msgstr ""
 "L'action suivante nécessite de fermer tous les onglets.\n"
 "Voulez-vous continuer?"
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Fermer l'onglet"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
 msgstr ""
 "Vous allez supprimer une base de données Tryton.\n"
-"Êtes-vous sûr de vouloir continuer ?"
+"Êtes-vous sûr de vouloir continuer ?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -547,30 +547,30 @@ msgstr ""
 "Mauvais mot de passe du serveur Tryton.\n"
 "Essayez à nouveau."
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
-msgstr "Accès refusé !"
+msgstr "Accès refusé !"
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr ""
-"La suppression de la base de données a échouée avec le message d'erreur :"
+"La suppression de la base de données a échouée avec le message d'erreur :"
 "\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
-msgstr "La suppression de la base de données a échouée !"
+msgstr "La suppression de la base de données a échouée !"
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
-msgstr "La base de données a été supprimée avec succès !"
+msgstr "La base de données a été supprimée avec succès !"
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "Ouvrir le Fichier de Sauvergarde..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -579,11 +579,11 @@ msgstr ""
 "mot de passe.\n"
 "La sauvegarde et la restauration doivent être faites manuellement."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
-msgstr "La base de données est protégée par un mot de passe !"
+msgstr "La base de données est protégée par un mot de passe !"
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -591,21 +591,21 @@ msgstr ""
 "Mauvais mot de passe du serveur Tryton.\n"
 "Essayez à nouveau."
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr ""
 "La restauration de la base de données a échouée avec le message d'erreur "
 ":\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
-msgstr "La restauration de la base de données a échoué !"
+msgstr "La restauration de la base de données a échoué !"
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
-msgstr "La base de données a été restaurée avec succès !"
+msgstr "La base de données a été restaurée avec succès !"
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -614,17 +614,17 @@ msgstr ""
 " mot de passe.\n"
 "La sauvegarde et la restauration doivent être faites manuellement."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
-msgstr "La sauvegarde de la base de donnée a échouée avec le message d'erreur :\n"
+msgstr "La sauvegarde de la base de donnée a échouée avec le message d'erreur :\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
-msgstr "La sauvegarde de la base de données a échouée !"
+msgstr "La sauvegarde de la base de données a échouée !"
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
-msgstr "La base de données a été sauvegardée avec succès !"
+msgstr "La base de données a été sauvegardée avec succès !"
 
 #: tryton/gui/window/board.py:19 tryton/gui/window/form.py:32
 msgid "New"
@@ -635,7 +635,7 @@ msgid "Create a new record"
 msgstr "Créer un nouvel enregistrement"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "Sauver"
 
@@ -645,7 +645,7 @@ msgstr "Sauver cet enregistrement"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "Basculer"
 
@@ -692,13 +692,13 @@ msgid ""
 "'8000' if the server is installed on this computer. Click on 'Change' to "
 "change the address."
 msgstr ""
-"Ceci est l'URL du serveur Tryton. Utilisez le serveur 'localhost' et le "
-"port '8000' si le serveur est installé sur cette machine. Cliquez sur "
-"'Changer' pour changer l'adresse."
+"Ceci est l'URL du serveur Tryton. Utilisez le serveur « localhost » et le"
+" port « 8000 » si le serveur est installé sur cette machine. Cliquez sur "
+"« Changer » pour changer l'adresse."
 
 #: tryton/gui/window/dbcreate.py:45
 msgid "No connection!"
-msgstr "Pas de connexion !"
+msgstr "Pas de connexion !"
 
 #: tryton/gui/window/dbcreate.py:48
 msgid ""
@@ -709,13 +709,13 @@ msgid ""
 "that the server address and port (usually 8000) are not blocked.\n"
 "Click on 'Change' to change the address."
 msgstr ""
-"Impossible de se connecter au serveur !\n"
+"Impossible de se connecter au serveur !\n"
 "1. Vérifiez si le serveur est en train de tourner.\n"
 "2. Trouvez sur quelle adresse et port il écoute.\n"
 "3. Si il y a un firewall entre le serveur et ce client, vérifiez que "
 "l'adresse du serveur et le port (habituellement 8000) ne sont pas "
 "bloqués.\n"
-"Cliquez sur 'Changer' pour changer l'adresse."
+"Cliquez sur « Changer » pour changer l'adresse."
 
 #: tryton/gui/window/dbcreate.py:139
 msgid "Create new database"
@@ -731,11 +731,11 @@ msgstr "Créer une nouvelle base de données"
 
 #: tryton/gui/window/dbcreate.py:168
 msgid "Server Setup:"
-msgstr "Configuration du serveur :"
+msgstr "Configuration du serveur :"
 
 #: tryton/gui/window/dbcreate.py:173
 msgid "Server connection:"
-msgstr "Connexion au serveur :"
+msgstr "Connexion au serveur :"
 
 #: tryton/gui/window/dbcreate.py:182 tryton/gui/window/dbdumpdrop.py:140
 #: tryton/gui/window/dbrestore.py:88
@@ -744,9 +744,9 @@ msgid ""
 "the server is installed on this computer. Click on 'Change' to change the"
 " address."
 msgstr ""
-"Ceci est l'URL du serveur. Utilisez le serveur 'localhost' et port '8000'"
-" si le serveur est installé sur cette machine. Cliquez sur 'Changer' pour"
-" changer l'adresse."
+"Ceci est l'« URL » du serveur. Utilisez le serveur « localhost » et port "
+"« 8000 » si le serveur est installé sur cette machine. Cliquez sur "
+"« Changer » pour changer l'adresse."
 
 #: tryton/gui/window/dbcreate.py:185 tryton/gui/window/dbdumpdrop.py:147
 #: tryton/gui/window/dbrestore.py:93
@@ -760,7 +760,7 @@ msgstr "Configurer la connexion au serveur"
 #: tryton/gui/window/dbcreate.py:197 tryton/gui/window/dbdumpdrop.py:186
 #: tryton/gui/window/dbrestore.py:102
 msgid "Tryton Server Password:"
-msgstr "Mot de passe du serveur Tryton :"
+msgstr "Mot de passe du serveur Tryton :"
 
 #: tryton/gui/window/dbcreate.py:207 tryton/gui/window/dbdumpdrop.py:196
 #: tryton/gui/window/dbrestore.py:111
@@ -774,11 +774,11 @@ msgstr ""
 
 #: tryton/gui/window/dbcreate.py:218
 msgid "New database setup:"
-msgstr "Configuration de la nouvelle base de données :"
+msgstr "Configuration de la nouvelle base de données :"
 
 #: tryton/gui/window/dbcreate.py:224
 msgid "Database name:"
-msgstr "Nom de la base de données :"
+msgstr "Nom de la base de données :"
 
 #: tryton/gui/window/dbcreate.py:236
 msgid ""
@@ -790,12 +790,12 @@ msgstr ""
 "Choisissez le nom de la nouvelle base de données.\n"
 "Seuls sont permis les caractères alphanumériques ou _ (caractère "
 "souligné)\n"
-"Vous devez proscrire les accents, espaces ou caractères spéciaux ! "
-"Example : tryton"
+"Vous devez proscrire les accents, espaces ou caractères spéciaux ! "
+"Example : tryton"
 
 #: tryton/gui/window/dbcreate.py:243
 msgid "Default language:"
-msgstr "Langue par défaut :"
+msgstr "Langue par défaut :"
 
 #: tryton/gui/window/dbcreate.py:253
 msgid ""
@@ -809,7 +809,7 @@ msgstr ""
 
 #: tryton/gui/window/dbcreate.py:257
 msgid "Admin password:"
-msgstr "Mot de passe admin :"
+msgstr "Mot de passe admin :"
 
 #: tryton/gui/window/dbcreate.py:267
 msgid ""
@@ -820,51 +820,27 @@ msgid ""
 msgstr ""
 "Choisissez un mot de passe pour l'utilisateur admin de la nouvelle base "
 "de données. Avec ce mot de passe, vous pourrez ensuite vous connecter à "
-"la base de données :\n"
-"Nom d'utilisateur : admin\n"
-"Mot de passe : <Le mot de passe que vous avez choisi>"
+"la base de données :\n"
+"Nom d'utilisateur : admin\n"
+"Mot de passe : <Le mot de passe que vous avez choisi>"
 
 #: tryton/gui/window/dbcreate.py:275
 msgid "Confirm admin password:"
-msgstr "Confirmer le mot de passe admin :"
+msgstr "Confirmer le mot de passe admin :"
 
 #: tryton/gui/window/dbcreate.py:284
 msgid "Type the Admin password again"
 msgstr "Entrer le mot de passe admin à nouveau"
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Le nom de la base de données est restreint aux caractères alphanumériques"
-" et \"_\" (souligné). Il doit commencer par une lettre et ne pas dépasser"
-" 63 caractères.\n"
-"Les accents, espaces et autres caractères spéciaux sont proscrit."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Mauvais caractères dans le nom de base de données !"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr "Le mot de passe admin ne correspond pas au mot de passe de confirmation.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
-msgstr "Les mots de passe ne correspondent pas !"
+msgstr "Les mots de passe ne correspondent pas !"
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"Le mot de passe admin et de confirmation sont requis pour créer une "
-"nouvelle base de données."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Mot de passe admin manquant !"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -872,17 +848,17 @@ msgstr ""
 "Une base de données avec le même nom existe déjà.\n"
 "Essayer un autre nom de base de données."
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
-msgstr "La base de données existe déjà !"
+msgstr "La base de données existe déjà !"
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr ""
 "Désolé, le mot de passe du serveur Tryton est incorrect. Veuillez "
 "réessayer."
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -891,24 +867,24 @@ msgid ""
 msgstr ""
 "Impossible de créer une base de données pour une raison inconnue.\n"
 "Si une base de données a été créée, elle pourrait être inutilisable. "
-"Supprimer la ! Vérifiez le message d'erreur pour plus d'information.\n"
-"Message d'erreur :\n"
+"Supprimer la ! Vérifiez le message d'erreur pour plus d'information.\n"
+"Message d'erreur :\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
-msgstr "Erreur de création de base de données !"
+msgstr "Erreur de création de base de données !"
 
 #: tryton/gui/window/dbdumpdrop.py:26
 msgid "Could not connect to server!"
-msgstr "Impossible de se connecter au serveur !"
+msgstr "Impossible de se connecter au serveur !"
 
 #: tryton/gui/window/dbdumpdrop.py:30
 msgid "This client version is not compatible with the server!"
-msgstr "Cette version du client n'est pas compatible avec le serveur !"
+msgstr "Cette version du client n'est pas compatible avec le serveur !"
 
 #: tryton/gui/window/dbdumpdrop.py:39
 msgid "No database found, you must create one!"
-msgstr "Pas de base de donnée trouvée, vous devez en créer une !"
+msgstr "Pas de base de donnée trouvée, vous devez en créer une !"
 
 #: tryton/gui/window/dbdumpdrop.py:77
 msgid "Backup a database"
@@ -944,12 +920,12 @@ msgstr "Choisissez la base de données à supprimer"
 
 #: tryton/gui/window/dbdumpdrop.py:130 tryton/gui/window/dbrestore.py:77
 msgid "Server Connection:"
-msgstr "Connexion au serveur :"
+msgstr "Connexion au serveur :"
 
 #: tryton/gui/window/dbdumpdrop.py:156 tryton/gui/window/dblogin.py:89
 #: tryton/gui/window/dblogin.py:444
 msgid "Database:"
-msgstr "Base de données :"
+msgstr "Base de données :"
 
 #: tryton/gui/window/dblogin.py:31
 msgid "Profile Editor"
@@ -959,19 +935,19 @@ msgstr "Éditeur de profil"
 msgid "Profile"
 msgstr "Profil"
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "_Ajouter"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "_Enlever"
 
 #: tryton/gui/window/dblogin.py:70
 msgid "Hostname:"
-msgstr "Hôte :"
+msgstr "Hôte :"
 
 #: tryton/gui/window/dblogin.py:107
 msgid "Create"
@@ -983,15 +959,15 @@ msgstr "Récupération de la liste des bases de données"
 
 #: tryton/gui/window/dblogin.py:128
 msgid "Username:"
-msgstr "Nom d'utilisateur :"
+msgstr "Nom d'utilisateur :"
 
 #: tryton/gui/window/dblogin.py:308
 msgid "Could not connect to the server"
-msgstr "Impossible de se connecter au serveur !"
+msgstr "Impossible de se connecter au serveur !"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 msgid "Incompatible version of the server"
-msgstr "Version du serveur incompatible !"
+msgstr "Version du serveur incompatible !"
 
 #: tryton/gui/window/dblogin.py:370
 msgid "Login"
@@ -1015,7 +991,7 @@ msgstr "Se connecter au serveur Tryton"
 
 #: tryton/gui/window/dblogin.py:417
 msgid "Profile:"
-msgstr "Profil :"
+msgstr "Profil :"
 
 #: tryton/gui/window/dblogin.py:421
 msgid "_Manage profiles"
@@ -1027,11 +1003,11 @@ msgstr "Hôte / Port"
 
 #: tryton/gui/window/dblogin.py:434
 msgid "Host:"
-msgstr "Hôte :"
+msgstr "Hôte :"
 
 #: tryton/gui/window/dblogin.py:467
 msgid "User name:"
-msgstr "Nom d'utilisateur :"
+msgstr "Nom d'utilisateur :"
 
 #: tryton/gui/window/dbrestore.py:66
 msgid "Restore Database"
@@ -1039,7 +1015,7 @@ msgstr "Restaurer une base de données"
 
 #: tryton/gui/window/dbrestore.py:119
 msgid "File to Restore:"
-msgstr "Fichier à restaurer :"
+msgstr "Fichier à restaurer :"
 
 #: tryton/gui/window/dbrestore.py:133
 msgid ""
@@ -1051,16 +1027,16 @@ msgstr ""
 "Choisissez le nom de la base de données à restaurer.\n"
 "Seul sont permis les caractères alphanumériques ou _ (caractère souligné)"
 "\n"
-"Vous devez proscrire les accents, espaces ou caractères spéciaux !\n"
-"Example : tryton"
+"Vous devez proscrire les accents, espaces ou caractères spéciaux !\n"
+"Example : tryton"
 
 #: tryton/gui/window/dbrestore.py:139
 msgid "New Database Name:"
-msgstr "Nom de la nouvelle base de données :"
+msgstr "Nom de la nouvelle base de données :"
 
 #: tryton/gui/window/dbrestore.py:142
 msgid "Update Database:"
-msgstr "Mettre à jour la base de données :"
+msgstr "Mettre à jour la base de données :"
 
 #: tryton/gui/window/dbrestore.py:146
 msgid ""
@@ -1088,36 +1064,36 @@ msgstr "Paramètres d'email"
 
 #: tryton/gui/window/email.py:28
 msgid "Command Line:"
-msgstr "Commande :"
+msgstr "Commande :"
 
 #: tryton/gui/window/email.py:37
 msgid "Legend of Available Placeholders:"
-msgstr "Légende des symboles :"
+msgstr "Légende des symboles :"
 
 #: tryton/gui/window/email.py:44
 msgid "To:"
-msgstr "À :"
+msgstr "À :"
 
 #: tryton/gui/window/email.py:48
 msgid "CC:"
-msgstr "CC :"
+msgstr "CC :"
 
 #: tryton/gui/window/email.py:52
 msgid "Subject:"
-msgstr "Sujet :"
+msgstr "Sujet :"
 
 #: tryton/gui/window/email.py:56
 msgid "Body:"
-msgstr "Corps :"
+msgstr "Corps :"
 
 #: tryton/gui/window/email.py:60
 msgid "Attachment:"
-msgstr "Attachement :"
+msgstr "Attachement :"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Précédent"
 
@@ -1127,8 +1103,8 @@ msgstr "Enregistrement précédent"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Suivant"
 
@@ -1207,115 +1183,115 @@ msgstr "Attachement(%d)"
 
 #: tryton/gui/window/form.py:234
 msgid "You have to select one record!"
-msgstr "Vous devez sélectionner un enregistrement !"
+msgstr "Vous devez sélectionner un enregistrement !"
 
 #: tryton/gui/window/form.py:238
 msgid "ID:"
-msgstr "ID :"
+msgstr "ID :"
 
 #: tryton/gui/window/form.py:239
 msgid "Creation User:"
-msgstr "Créé par l'utilisateur :"
+msgstr "Créé par l'utilisateur :"
 
 #: tryton/gui/window/form.py:240
 msgid "Creation Date:"
-msgstr "Date de création :"
+msgstr "Date de création :"
 
 #: tryton/gui/window/form.py:241
 msgid "Latest Modification by:"
-msgstr "Dernière modification par :"
+msgstr "Dernière modification par :"
 
 #: tryton/gui/window/form.py:242
 msgid "Latest Modification Date:"
-msgstr "Date de dernière modification :"
+msgstr "Date de dernière modification :"
 
 #: tryton/gui/window/form.py:260
 msgid "Model:"
-msgstr "Modèle :"
+msgstr "Modèle :"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
-msgstr "Êtes-vous sûr de vouloir supprimer cet enregistrement ?"
+msgstr "Êtes-vous sûr de vouloir supprimer cet enregistrement ?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
-msgstr "Êtes-vous sûr de vouloir supprimer ces enregistrements ?"
+msgstr "Êtes-vous sûr de vouloir supprimer ces enregistrements ?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
-msgstr "Enregistrements non supprimés !"
+msgstr "Enregistrements non supprimés !"
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
-msgstr "Enregistrements supprimés !"
+msgstr "Enregistrements supprimés !"
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
-msgstr "Sur les enregistrement(s) dupliqué(s) maintenant !"
+msgstr "Sur les enregistrement(s) dupliqué(s) maintenant !"
 
 #: tryton/gui/window/form.py:352
 msgid "Record saved!"
-msgstr "Enregistrement sauvé !"
+msgstr "Enregistrement sauvé !"
 
 #: tryton/gui/window/form.py:355
 msgid "Invalid form!"
-msgstr "Formulaire non-valide !"
+msgstr "Formulaire non-valide !"
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " de "
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
+#, fuzzy
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
 msgstr ""
 "Cet enregistrement a été modifié\n"
-"Voulez-vous le sauvegarder ?"
+"Voulez-vous le sauvegarder ?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Actions"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr "Lancer une action"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Relate"
 msgstr "Relation"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Open related records"
 msgstr "Ouvrir les enregistrements liés"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Report"
 msgstr "Rapport"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Open report"
 msgstr "Ouvrir un rapport"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail"
 msgstr "Email"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr "Rapport par email"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Imprimer"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr "Imprimer un rapport"
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Inconnu"
 
@@ -1329,7 +1305,7 @@ msgstr "Limite de recherche"
 
 #: tryton/gui/window/limit.py:29
 msgid "Limit:"
-msgstr "Limite :"
+msgstr "Limite :"
 
 #: tryton/gui/window/preference.py:23
 msgid "Preferences"
@@ -1345,7 +1321,7 @@ msgstr "Préférence"
 
 #: tryton/gui/window/preference.py:88
 msgid "Current Password:"
-msgstr "Mot de passe actuel :"
+msgstr "Mot de passe actuel :"
 
 #: tryton/gui/window/revision.py:20
 msgid "Revision"
@@ -1357,7 +1333,7 @@ msgstr "Sélectionner une révision"
 
 #: tryton/gui/window/revision.py:32
 msgid "Revision:"
-msgstr "Révision :"
+msgstr "Révision :"
 
 #: tryton/gui/window/shortcuts.py:17
 msgid "Keyboard Shortcuts"
@@ -1491,75 +1467,85 @@ msgstr "Astuces"
 msgid "_Display a new tip next time"
 msgstr "_Afficher une nouvelle astuce la prochaine fois"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Exporter en CSV"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Exportations prédéfinies</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Tout les champs</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Effacer"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Sauver l'exportation"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Supprimer l'exportation"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Champs à exporter</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Options</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Ouvrir"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Ajouter les noms des champs"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "Nom"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (string)"
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
-msgstr "Quel est le nom de cet export ?"
+msgstr "Quel est le nom de cet export ?"
+
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "Surcharger la définition « %s » ?"
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "%d enregistrement sauvé!"
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "%d enregistrements sauvés!"
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
 "Error message:\n"
 "%s"
 msgstr ""
-"Échec de l'opération !\n"
-"Message d'erreur :\n"
+"Échec de l'opération !\n"
+"Message d'erreur :\n"
 "%s"
 
 #: tryton/gui/window/win_form.py:36
@@ -1575,18 +1561,17 @@ msgid "Remove <Del>"
 msgstr "Supprimer <Del>"
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 msgid "Create a new record <F3>"
 msgstr "Créer un nouvel enregistrement<F3>"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 msgid "Delete selected record <Del>"
 msgstr "Supprimer l'enregistrement sélectionné<Del>"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 msgid "Undelete selected record <Ins>"
 msgstr "Restaurer l'enregistrement sélectionné<Ins>"
 
@@ -1608,10 +1593,10 @@ msgstr "Fichier à importer"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Ouvrir..."
 
@@ -1621,19 +1606,19 @@ msgstr "Paramètres CSV"
 
 #: tryton/gui/window/win_import.py:124
 msgid "Field Separator:"
-msgstr "Séparateur de champs :"
+msgstr "Séparateur de champs :"
 
 #: tryton/gui/window/win_import.py:133
 msgid "Text Delimiter:"
-msgstr "Délimiteur de texte :"
+msgstr "Délimiteur de texte :"
 
 #: tryton/gui/window/win_import.py:141
 msgid "Encoding:"
-msgstr "Codage :"
+msgstr "Codage :"
 
 #: tryton/gui/window/win_import.py:150
 msgid "Lines to Skip:"
-msgstr "Lignes à ignorer :"
+msgstr "Lignes à ignorer :"
 
 #: tryton/gui/window/win_import.py:185 tryton/gui/window/win_import.py:190
 msgid "Field name"
@@ -1641,7 +1626,7 @@ msgstr "Nom du champ"
 
 #: tryton/gui/window/win_import.py:251
 msgid "You must select an import file first!"
-msgstr "Vous devez d'abord sélectionner un fichier d'import !"
+msgstr "Vous devez d'abord sélectionner un fichier d'import !"
 
 #: tryton/gui/window/win_import.py:262
 msgid "Error opening CSV file"
@@ -1662,68 +1647,98 @@ msgstr "%d enregistrement importé!"
 msgid "%d records imported!"
 msgstr "%d enregistrements importés!"
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Wizard"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Pas d'attribut string."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 msgid "ID"
 msgstr "ID"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 msgid "Creation User"
 msgstr "Créé par l'utilisateur"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 msgid "Creation Date"
 msgstr "Date de création"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 msgid "Modification User"
 msgstr "Modifié par l'utilisateur"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 msgid "Modification Date"
 msgstr "Date de modification"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr "Impossible d'obtenir l'état de la vue arbre"
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 msgid "Unable to set view tree state"
 msgstr "Impossible de définir l'état de la vue arbre"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr " :"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Enregistrer sous"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Taille de l'image"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Largeur :"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Hauteur :"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "image PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Taille de l'image trop grande !"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ".."
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 msgid "F_ilters"
 msgstr "F_iltrer"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr "Montrer les marques-pages des filtres"
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr "Supprimer ce marque-page"
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr "Sauver ce filtre"
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr "Nom du marque-page"
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Chercher"
 
@@ -1751,79 +1766,49 @@ msgstr "Sélectionner un fichier ..."
 msgid "Show plain text"
 msgstr "Montrer en text clair"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr "Ajouter une valeur"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr " :"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr "Supprimer \"%s\""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 msgid "Select an Image..."
 msgstr "Sélectionner une image ..."
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Tous les fichiers"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Images"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Traduction"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Éditer"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Floue"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Vous devez sauvegarder l'enregistrement avant d'ajouter des traductions !"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Pas d'autre langue disponible !"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 msgid "Add existing record"
 msgstr "Ajouter un enregistrement existant"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 msgid "Remove selected record <Del>"
 msgstr "Supprimer l'enregistrement sélectionné<Del>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 msgid "Open a record <F2>"
 msgstr "Ouvrir un enregistrement<F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 msgid "Search a record <F2>"
 msgstr "Chercher un enregistrement<F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 msgid "Remove selected record"
 msgstr "Supprimer l'enregistrement sélectionné"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 msgid "Edit selected record <F2>"
 msgstr "Éditer l'enregistrement sélectionné<F2>"
 
@@ -1883,33 +1868,25 @@ msgstr "Couleur du texte"
 msgid "Select a background color"
 msgstr "Couleur de l'arrière plan"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Enregistrer sous"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Taille de l'image"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Largeur :"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Traduction"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Hauteur :"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Éditer"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "image PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Floue"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Taille de l'image trop grande !"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Vous devez sauvegarder l'enregistrement avant d'ajouter des traductions !"
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Pas d'autre langue disponible !"
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/ja_JP/LC_MESSAGES/tryton.mo b/share/locale/ja_JP/LC_MESSAGES/tryton.mo
index 4bab3a1..719b660 100644
Binary files a/share/locale/ja_JP/LC_MESSAGES/tryton.mo and b/share/locale/ja_JP/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/ja_JP/LC_MESSAGES/tryton.po b/share/locale/ja_JP/LC_MESSAGES/tryton.po
index 25179f6..81f0923 100644
--- a/share/locale/ja_JP/LC_MESSAGES/tryton.po
+++ b/share/locale/ja_JP/LC_MESSAGES/tryton.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tryton 1.5.0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
 "PO-Revision-Date: 2012-04-23 11:07+0200\n"
 "Last-Translator: TANIGUCHI Takaki <takaki at asis.media-as.org>\n"
 "Language-Team: ja_JP <LL at li.org>\n"
@@ -15,46 +15,46 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "代替設定ファイルを指定"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr ""
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr "全てをINFOレベルでログを取る"
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr ""
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "ログインユーザーを指定"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr "サーバーポートを指定"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "サーバーホスト名を指定"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr ""
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr "ファイル \"%s\" が見つかりません"
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr "設定ファイル %s が書きこめません!"
@@ -84,42 +84,42 @@ msgstr "サーバー名:"
 msgid "Port:"
 msgstr "ポート番号:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "選択"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "あなたの選択:"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "名前を付けて保存"
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "常にこの警告を無視する。"
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr ""
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "確認"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "並列性例外"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 #, fuzzy
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
@@ -138,50 +138,50 @@ msgstr ""
 "  - \"比較\"で変更されたものを見る\n"
 "  - \"とにかく書き込む\"で現在の物を書き込む。\n"
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "比較"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "とにかく書き込む"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "エラー"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "バグ報告"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr "アプリケーションエラー!"
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "エラー:"
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, fuzzy, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr "記録しておきたいバグを報告<u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr "バグトラッカー"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "ユーザー:"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "パスワード:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -189,11 +189,11 @@ msgstr ""
 "別のユーザーに同じバグが報告されています。\n"
 "お知らせするためにこの問題の通知リストにあなたのユーザー名を追加しました。"
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "新しいバグがID番号と一緒に作成されました"
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
@@ -201,11 +201,11 @@ msgstr ""
 "接続エラー!\n"
 "ユーザー名またはパスワードが違います!"
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "例外:"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
@@ -214,12 +214,12 @@ msgstr ""
 "このサーバーのフィンガープリントが最後の接続から変化しています!\n"
 "フィンガープリントが訂正されるまで接続を停止します。"
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
 msgstr "セキュリティリスク!"
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
@@ -227,31 +227,31 @@ msgstr ""
 "接続エラー!\n"
 "サーバーに接続できません!"
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "ネットワーク エラー!"
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr "年"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "月"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "週"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr "日"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "時"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "分"
 
@@ -272,65 +272,65 @@ msgstr "カレンダーを開く"
 msgid "Date Selection"
 msgstr "日付を選択"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr ""
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 #, fuzzy
 msgid "yes"
 msgstr "バイト"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 #, fuzzy
 msgid "true"
 msgstr "真"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr ""
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "真"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "偽"
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 #, fuzzy
 msgid "Edit..."
 msgstr "終了(_Q)"
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 #, fuzzy
 msgid "Attachments..."
 msgstr "添付:"
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 #, fuzzy
 msgid "Actions..."
 msgstr "実行(_A)"
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 #, fuzzy
 msgid "Relate..."
 msgstr "削除(_D)"
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 #, fuzzy
 msgid "Report..."
 msgstr "データのインポート(_I)"
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 #, fuzzy
 msgid "E-Mail..."
 msgstr "Eメール(_E)"
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 #, fuzzy
 msgid "Print..."
 msgstr "印刷(_P)"
@@ -356,10 +356,10 @@ msgid "_Help"
 msgstr "ヘルプ(_H)"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "検索"
 
@@ -529,17 +529,17 @@ msgstr "Trytonについて"
 msgid "Manage Favorites"
 msgstr ""
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
 msgstr ""
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "タブを閉じる"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
@@ -547,7 +547,7 @@ msgstr ""
 "Trytonデータベースを削除します。\n"
 "本当に実行しますか?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -555,28 +555,28 @@ msgstr ""
 "Trytonサーバのパスワードが違います\n"
 "もう一度試して下さい。"
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "アクセスが拒否されました!"
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr "データベースの削除に失敗しました。エラーメッセージ:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "データベースの削除に失敗しました!"
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "データベースの削除に成功しました!"
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "復元のためバックアップファイルを開く"
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -584,11 +584,11 @@ msgstr ""
 "パスワードで保護されたデータベースを復元できません。\n"
 "バックアップと復元は手動でする必要があります。"
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "データベースはパスワードで保護されています!"
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -596,19 +596,19 @@ msgstr ""
 "Trytonサーバーのパスワードが違います。\n"
 "もう一度試して下さい。"
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr "データベースの復元に失敗しました。エラーメッセージ:\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "データベースの復元に失敗しました!"
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "データベースの復元に成功しました!"
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -616,15 +616,15 @@ msgstr ""
 "パスワードで保護されたデータベースのダンプはできません。\n"
 "バックアップと復元は手動でする必要があります。"
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "データベースのダンプに失敗しました。エラーメッセージ:"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr "データベースのダンプに失敗しました!"
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "データベースのバックアップに成功しました!"
 
@@ -637,7 +637,7 @@ msgid "Create a new record"
 msgstr "レコードの新規作成"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "保存"
 
@@ -647,7 +647,7 @@ msgstr "レコードの保存"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "切替"
 
@@ -820,47 +820,29 @@ msgstr "管理者パスワードを確認:"
 msgid "Type the Admin password again"
 msgstr "管理者パスワードを再入力して下さい"
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr "データベース名は英数字と\"_\"(アンダースコア)に制限されています。アセントや空白や特殊文字は避けて下さい。"
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "データベース名に正しくない文字があります!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr "管理者パスワードが再確認入力と一致しません\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "パスワードが一致しません!"
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr "新しいデータベースを作成するのに管理者パスワードと確認用パスワードが必要です。"
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "管理者パスワードがありません!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
 msgstr "同じ名前のデータベースが存在します。別の名前を試して下さい。"
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "このデータベース名は存在します!"
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr "Trytonサーバーのパスワードが違います。再び試して下さい。"
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -871,7 +853,7 @@ msgstr ""
 "作成されていたとしても壊れているでしょう。データベースが削除されているかもしれません。可能な情報をエラーメッセージでチェックして下さい。\n"
 "エラーメッセージ:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "データベースの作成エラー!"
 
@@ -936,12 +918,12 @@ msgstr ""
 msgid "Profile"
 msgstr ""
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "追加(_A)"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "削除(_R)"
@@ -971,7 +953,7 @@ msgstr "ユーザー名:"
 msgid "Could not connect to the server"
 msgstr "サーバーに接続できませんでした!"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 #, fuzzy
 msgid "Incompatible version of the server"
 msgstr "サーバのバージョンが非互換です!"
@@ -1097,8 +1079,8 @@ msgstr "添付:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "前"
 
@@ -1108,8 +1090,8 @@ msgstr "前のレコード"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "次"
 
@@ -1219,23 +1201,23 @@ msgstr "最終更新日:"
 msgid "Model:"
 msgstr "モデル:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr "このレコードを削除しますか?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr "このレコードを削除しますか?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr "レコードが削除されませんでした!"
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr "レコードが削除されました!"
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr "重複したレコードで作業中です!"
 
@@ -1247,11 +1229,11 @@ msgstr "レコードが保存されました!"
 msgid "Invalid form!"
 msgstr "不正なフォームです!"
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " 中 "
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1259,54 +1241,53 @@ msgstr ""
 "レコードが変更されています\n"
 "保存しますか?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "実行"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr ""
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 #, fuzzy
 msgid "Relate"
 msgstr "作成(_C)"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 #, fuzzy
 msgid "Open related records"
 msgstr "レコードを開く"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 #, fuzzy
 msgid "Report"
 msgstr "レポート"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 #, fuzzy
 msgid "Open report"
 msgstr "レコードを開く"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 #, fuzzy
 msgid "E-Mail"
 msgstr "Eメール"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr ""
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "印刷"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr ""
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "未知"
 
@@ -1482,67 +1463,77 @@ msgstr "技"
 msgid "_Display a new tip next time"
 msgstr "新しい技を次回も表示する(_D)"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "CSVにエクスポート"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>定義済みエキスポート</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>全てのフィールド</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "クリア"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "エクスポートを保存"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "エクスポートを削除"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>エクスポートするフィールド</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>オプション</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "開く"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "フィールド名を追加(_F)"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "名前"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr "このエクスポートの名前は何ですか?"
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "%d レコード保存されました!"
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "%d レコード保存されました!"
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1566,20 +1557,19 @@ msgid "Remove <Del>"
 msgstr ""
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 #, fuzzy
 msgid "Create a new record <F3>"
 msgstr "レコードの新規作成"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 #, fuzzy
 msgid "Delete selected record <Del>"
 msgstr "選択したレコードを削除"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 #, fuzzy
 msgid "Undelete selected record <Ins>"
 msgstr "選択したレコードを削除"
@@ -1602,10 +1592,10 @@ msgstr "インポートするファイル:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "開く"
 
@@ -1657,75 +1647,105 @@ msgstr "%d レコードをインポートしました!"
 msgid "%d records imported!"
 msgstr "%d レコードをインポートしました。"
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "ウィザード"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "文字属性なし。"
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 #, fuzzy
 msgid "ID"
 msgstr "日"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 #, fuzzy
 msgid "Creation User"
 msgstr "作成ユーザー:"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 #, fuzzy
 msgid "Creation Date"
 msgstr "作成日:"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 #, fuzzy
 msgid "Modification User"
 msgstr "最終更新日:"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 #, fuzzy
 msgid "Modification Date"
 msgstr "最終更新日:"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr ""
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 #, fuzzy
 msgid "Unable to set view tree state"
 msgstr "%s ロケールに設定できません"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "名前をつけて保存"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "画像サイズ"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "幅:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "高さ:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG画像 (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "画像サイズが大きすぎます!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 #, fuzzy
 msgid "F_ilters"
 msgstr "ファイル(_F)"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "検索"
 
@@ -1757,86 +1777,55 @@ msgstr "ファイルを選択"
 msgid "Show plain text"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 #, fuzzy
 msgid "Select an Image..."
 msgstr "ファイルを選択"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "全てのファイル"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "画像"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-#, fuzzy
-msgid "Translation"
-msgstr "翻訳を追加"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "翻訳を追加する前にレコードを保存して下さい!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "他の利用できる言語はありません"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 #, fuzzy
 msgid "Add existing record"
 msgstr "レコードの保存"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 #, fuzzy
 msgid "Remove selected record <Del>"
 msgstr "選択したレコードを削除"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 #, fuzzy
 msgid "Open a record <F2>"
 msgstr "レコードを開く"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 #, fuzzy
 msgid "Search a record <F2>"
 msgstr "レコードを検索する"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 #, fuzzy
 msgid "Remove selected record"
 msgstr "選択したレコードを削除"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 #, fuzzy
 msgid "Edit selected record <F2>"
 msgstr "選択したレコードを編集"
@@ -1897,33 +1886,26 @@ msgstr ""
 msgid "Select a background color"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "名前をつけて保存"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "画像サイズ"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "幅:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+#, fuzzy
+msgid "Translation"
+msgstr "翻訳を追加"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "高さ:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG画像 (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "画像サイズが大きすぎます!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "翻訳を追加する前にレコードを保存して下さい!"
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ":"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "他の利用できる言語はありません"
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/lt_LT/LC_MESSAGES/tryton.mo b/share/locale/lt_LT/LC_MESSAGES/tryton.mo
index ae0f525..0c3e6cd 100644
Binary files a/share/locale/lt_LT/LC_MESSAGES/tryton.mo and b/share/locale/lt_LT/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/lt_LT/LC_MESSAGES/tryton.po b/share/locale/lt_LT/LC_MESSAGES/tryton.po
index c00e29f..bc6c7ac 100644
--- a/share/locale/lt_LT/LC_MESSAGES/tryton.po
+++ b/share/locale/lt_LT/LC_MESSAGES/tryton.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tryton 2.3.0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
 "PO-Revision-Date: 2013-04-18 11:37+0300\n"
 "Last-Translator: Giedrius Slavinskas <giedrius at inovera.lt>\n"
 "Language-Team: lt_LT <LL at li.org>\n"
@@ -16,46 +16,46 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr ""
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr ""
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr ""
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr ""
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr ""
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr ""
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr ""
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr ""
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr ""
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr ""
@@ -85,42 +85,42 @@ msgstr "Serveris:"
 msgid "Port:"
 msgstr "Prievadas:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Pasirinkimas"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "Jūsų pasirinkimas:"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Įrašyti kaip..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "Daugiau nepaisyti šio pranešimo."
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr "Ar tikrai norite vykdyti?"
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Patvirtinimas"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Lygiagretaus duomenų rašymo klaida"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
 "\n"
@@ -138,50 +138,50 @@ msgstr ""
 "    - \"Palyginti\", kad peržiūrėti pakeistą versiją;\n"
 "    - \"Rašyti visvien\", kad išsaugoti jūsų turimą versiją."
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Palyginti"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Rašyti visvien"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Klaida"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "Pranešti apie klaidą"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr "Programos klaida!"
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "Klaida: "
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr "Klaidų pranešimui reikalinga naudotojo paskyra <u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr "Klaidų pėdsekys"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "Naudotojas:"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "Slaptažodis:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -190,11 +190,11 @@ msgstr ""
 "Norėdami informuoti apie klaidos tvarkymo eigą, jūsų naudotojo vardas "
 "buvo pridėtas prie klaidos pranešimo sąrašo"
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "Užregistruoti naują klaidą su ID"
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
@@ -202,11 +202,11 @@ msgstr ""
 "Prisijungimo klaida!\n"
 "Neteisingas naudotojo vardas arba slaptažodis!"
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "Klaida:"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
@@ -217,12 +217,12 @@ msgstr ""
 "Programa nustos jungtis su šiuos serveriui, kol bus sutvarkytas "
 "identifikatorius."
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
 msgstr "Saugumo pavojus!"
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
@@ -230,31 +230,31 @@ msgstr ""
 "Prisijungimo klaida!\n"
 "Nepavyko prisijungti prie serverio!"
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "Tinklo klaida!"
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr "Y"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "M"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "w"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr "d"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "h"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "m"
 
@@ -274,58 +274,58 @@ msgstr "Atverti kalendorių <F2>"
 msgid "Date Selection"
 msgstr "Datos pasirinkimas"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr "t"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "yes"
 msgstr "taip"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "true"
 msgstr "teisa"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr "t"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Tiesa"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Netiesa"
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 #, fuzzy
 msgid "Edit..."
 msgstr "Išei_ti..."
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 msgid "Attachments..."
 msgstr "Priedai..."
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 msgid "Actions..."
 msgstr "Veiksmai..."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 msgid "Relate..."
 msgstr "Susiję įrašai..."
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 msgid "Report..."
 msgstr "Ataskaita..."
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 msgid "E-Mail..."
 msgstr "El. paštas..."
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 msgid "Print..."
 msgstr "Spausdinti..."
 
@@ -350,10 +350,10 @@ msgid "_Help"
 msgstr "_Žinynas"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Ieškoti"
 
@@ -522,7 +522,7 @@ msgstr "_Apie..."
 msgid "Manage Favorites"
 msgstr "_Tvarkyti mėgstamus"
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
@@ -530,11 +530,11 @@ msgstr ""
 "Atliekant šį veiksmą bus uždarytos visos kortelės.\n"
 "Ar norite tęsti?"
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Uždaryti kortelę"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
@@ -542,7 +542,7 @@ msgstr ""
 "Bus ištrinta Tryton duomenų bazė.\n"
 "Ar jūs tikrai norite tęsti?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -550,28 +550,28 @@ msgstr ""
 "Neteisingas Tryon serverio slaptažodis\n"
 "Bandykite iš naujo."
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "Neturite teisių!"
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr "Nepavyko sunaikinti duomenų bazės. Klaidos pranešimas:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "Nepavyko sunaikinti duomenų bazės!"
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "Sėkmingai sunaikinta duomenų bazė!"
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "Atverti atsarginę kopiją atkūrimui..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -579,11 +579,11 @@ msgstr ""
 "Negalima atkurti duomenų bazės apsaugotos slaptažodžiu.\n"
 "Atsarginės kopijos sukūrimą bei atkūrimą atlikite savarankiškai."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "Duomenų bazės slaptažodis yra apsaugotas!"
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -591,19 +591,19 @@ msgstr ""
 "Neteisingas Tryton serverio slaptažodis.\n"
 "Bandykite iš naujo."
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr "Nepavyko sunaikinti duomenų bazės. Klaidos pranešimas:\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "Nepavyko sunaikinti duomenų bazės!"
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "Sėkmingai sunaikinta duomenų bazė!"
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -612,15 +612,15 @@ msgstr ""
 "kopijos.\n"
 "Atsarginės kopijos sukūrimą bei atkūrimą atlikite savarankiškai."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "Nepavyko padaryti duomenų bazės atsarginės kopijos.Klaidos pranešimas:\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr "Nepavyko padaryti duomenų bazės atsarginės kopijos!"
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "Sėkmingai padaryta duomenų bazės atsarginė kopija!"
 
@@ -633,7 +633,7 @@ msgid "Create a new record"
 msgstr "Sukurti naują įrašą"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "Išsaugoti"
 
@@ -643,7 +643,7 @@ msgstr "Išsaugoti šį įrašą"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "Perjungti"
 
@@ -828,38 +828,15 @@ msgstr "Pakartokite slaptažodį:"
 msgid "Type the Admin password again"
 msgstr "Pakartotinai įrašykite administratoriaus slaptažodį"
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Duomenų bazės pavadinime leidžiami simboliai yra šie: lotyniškos raidės, "
-"skaičiai ir \"_\" (pabraukimas). Venkite nelotyniškų raidžių, tarpų bei "
-"skyrybos ženklų."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Negalima simbolis duomenų bazės pavadinime!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr "Naujas administratoriaus slaptažodis nesutampa su pakartotinu.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "Slaptažodžiai nesutampa!"
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"Administratoriaus slaptažodis kartu su pakartotinu slaptažodžiu yrabūtini"
-" norint sukurti naują duomenų bazę."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Neįvestas administratoriaus slaptažodis!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -867,15 +844,15 @@ msgstr ""
 "Duomenų bazė tokiu pavadinimu jau yra sukurta.\n"
 "Pasirinkite kitą pavadinimą."
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "Duomenų bazė tokiu pavadinimu jau yra sukurta!"
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr "Neteisingas Tryton serverio slaptažodis. Bandykite iš naujo."
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -888,7 +865,7 @@ msgstr ""
 "papildomos informacijos.\n"
 "Klaidos pranešimas:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "Klaida kuriant duomenų bazę!"
 
@@ -953,12 +930,12 @@ msgstr "Profilių tvarkymas"
 msgid "Profile"
 msgstr "Profilis"
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "_Pridėti"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "_Ištrinti"
@@ -983,7 +960,7 @@ msgstr "Naudotojas:"
 msgid "Could not connect to the server"
 msgstr "Nepavyko prisijungti prie serverio"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 msgid "Incompatible version of the server"
 msgstr "Nesuderinama serverio versija"
 
@@ -1110,8 +1087,8 @@ msgstr "Priedas:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Buvęs"
 
@@ -1121,8 +1098,8 @@ msgstr "Buvęs įrašas"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Kitas"
 
@@ -1227,23 +1204,23 @@ msgstr "Paskutinio redagavimo data:"
 msgid "Model:"
 msgstr "Modelis:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr "Ar tikrai norite ištrinti šį įrašą?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr "Ar tikrai norite ištrinti šiuos įrašus?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr "Įrašai nebuvo ištrinti!"
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr "Įrašai ištrinti!"
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr "Dabar dirbate su įrašo(-ų) kopija(-omis)!"
 
@@ -1255,11 +1232,11 @@ msgstr "Įrašas išsaugotas!"
 msgid "Invalid form!"
 msgstr "Netinkama forma!"
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " iš "
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1267,49 +1244,48 @@ msgstr ""
 "Šis įrašas buvo pakeistas\n"
 "Ar norite jį išsaugoti?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Veiksmai"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr "Vykdyti veiksmą"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Relate"
 msgstr "Susijęs"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Open related records"
 msgstr "Atverti susijusius įrašus"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Report"
 msgstr "Ataskaitos"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Open report"
 msgstr "Atverti ataskaitą"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail"
 msgstr "Siuntimas"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr "Siųsti ataskaitą el. paštu"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Spausdinimas"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr "Spausdinti ataskaitą"
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Nežinomas"
 
@@ -1492,67 +1468,77 @@ msgstr "Patarimai"
 msgid "_Display a new tip next time"
 msgstr "_Rodyti patarimus ir kitą kartą"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Eksportuoti CSV formatu"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Išsaugoti eksportavimo šablonai</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Galimi laukai</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Valyti"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Išsaugoti šabloną"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Ištrinti šabloną"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Eksportuojami laukai</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Nustatymai</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Atvėrimas"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Pridėti laukų pavadinimus"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "Pavadinimas"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr "Kokiu pavadinimu išsaugoti šį eksportavimo šabloną?"
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "%d įrašas išsaugotas!"
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "%d įrašai išsaugoti!"
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1576,18 +1562,17 @@ msgid "Remove <Del>"
 msgstr "Šalinti <Del>"
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 msgid "Create a new record <F3>"
 msgstr "Sukurti naują įrašą <F3>"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 msgid "Delete selected record <Del>"
 msgstr "Pašalinti pasirinktą įrašą <Del>"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 msgid "Undelete selected record <Ins>"
 msgstr "Atkurti pasirinktą įrašą <Ins>"
 
@@ -1609,10 +1594,10 @@ msgstr "Importuoti iš failo:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Atverti..."
 
@@ -1663,73 +1648,103 @@ msgstr "%d įrašas importuotas!"
 msgid "%d records imported!"
 msgstr "%d įrašai importuoti!"
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Vedlys"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Be pavadinimo"
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 msgid "ID"
 msgstr "ID"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 #, fuzzy
 msgid "Creation User"
 msgstr "Sukūrė naudotojas:"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 #, fuzzy
 msgid "Creation Date"
 msgstr "Sukūrimo data:"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 #, fuzzy
 msgid "Modification User"
 msgstr "Paskutinio redagavimo data:"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 #, fuzzy
 msgid "Modification Date"
 msgstr "Paskutinio redagavimo data:"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr ""
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 #, fuzzy
 msgid "Unable to set view tree state"
 msgstr "Nepavyko nustatyti lokalės %s"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Įrašyti kaip"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Paveiklėlio dydis"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Plotis:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Aukštis"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG paveikslėlis (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Paveikslėlis yra per didelis!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ".."
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 msgid "F_ilters"
 msgstr "F_iltras"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr "Rodyti filtrų žymeles"
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr "Šalinti šią žymelę"
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr "Sukurti šio filtro žymelę"
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr "Žymelės pavadinimas:"
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Rasti"
 
@@ -1760,79 +1775,49 @@ msgstr "Pasirinkite failą..."
 msgid "Show plain text"
 msgstr "Rodyti paprastą tekstą"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr "Pridėti reikšmę"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr "Šalinti \"%s\""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 msgid "Select an Image..."
 msgstr "Pasirinkite paveikslėlį..."
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Visi failai"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Paveikslėliai"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Vertimas"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Keisti"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Neaiškus"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Išsaugokite įrašą prieš pridedant vertimą!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Jokia kita kalba nėra prieinama!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 msgid "Add existing record"
 msgstr "Pridėti turimą įrašą"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 msgid "Remove selected record <Del>"
 msgstr "Pašalinti pasirinktą įrašą <Del>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 msgid "Open a record <F2>"
 msgstr "Atverti įrašą <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 msgid "Search a record <F2>"
 msgstr "Ieškoti įrašo <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 msgid "Remove selected record"
 msgstr "Pašalinti pasirinktą įrašą"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 msgid "Edit selected record <F2>"
 msgstr "Keisti pasirinktą įrašą <F2>"
 
@@ -1892,33 +1877,25 @@ msgstr "Pasirinkite teksto spalvą"
 msgid "Select a background color"
 msgstr "Pasirinkite fono spalvą"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Įrašyti kaip"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Paveiklėlio dydis"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Plotis:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Vertimas"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Aukštis"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Keisti"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG paveikslėlis (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Neaiškus"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Paveikslėlis yra per didelis!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Išsaugokite įrašą prieš pridedant vertimą!"
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Jokia kita kalba nėra prieinama!"
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/nl_NL/LC_MESSAGES/tryton.mo b/share/locale/nl_NL/LC_MESSAGES/tryton.mo
index edd81bc..a8d6b3b 100644
Binary files a/share/locale/nl_NL/LC_MESSAGES/tryton.mo and b/share/locale/nl_NL/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/nl_NL/LC_MESSAGES/tryton.po b/share/locale/nl_NL/LC_MESSAGES/tryton.po
index e726389..e4c5d0a 100644
--- a/share/locale/nl_NL/LC_MESSAGES/tryton.po
+++ b/share/locale/nl_NL/LC_MESSAGES/tryton.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Tryton 1.8\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
 "PO-Revision-Date: 2012-04-23 11:07+0200\n"
 "Last-Translator: Bram van der Sar <avdsar at telfort.nl>\n"
 "Language-Team: \n"
@@ -11,46 +11,46 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "specificeer een vervangend configuratiebestand"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr ""
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr "logboek bijhouden op INFO niveau"
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr ""
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "specificeer de inlog gebruiker"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr " Stel de serverpoort in"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "Stel de servernaam in"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr ""
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr "Bestand \"%s\" niet gevonden"
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr "Kan configuratiebestand %s niet opslaan! "
@@ -80,42 +80,42 @@ msgstr "Server:"
 msgid "Port:"
 msgstr "Poort:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Selectie"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "Uw selectie:"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Opslaan als..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "Altijd deze waarschuwing negeren."
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr ""
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Bevestiging"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Simultaan gebruik"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 #, fuzzy
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
@@ -134,50 +134,50 @@ msgstr ""
 " - \"Vergelijk\" om de verschillen te vergelijken;\n"
 " - \"Toch opslaan\" om deze versie op te slaan. "
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Vergelijk"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Overschrijven"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Fout"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "Programmafout melden"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr "Programmafout"
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "Fout: "
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, fuzzy, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr "Om programmafouten aan te melden moet je een account hebben bij <u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr "Foutrapportage"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "Gebruiker:"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "Wachtwoord:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -186,11 +186,11 @@ msgstr ""
 "Om je op de hoogte te houden is je gebuikersnaam toegevoegd aan de lijst "
 "van belangstellenden"
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "Nieuwe foutmelding gemaakt met ID "
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
@@ -198,11 +198,11 @@ msgstr ""
 "Geen verbinding!\n"
 "Verkeerde gebruikersnaam of wachtwoord!"
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "Uitzondering:"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
@@ -213,12 +213,12 @@ msgstr ""
 "Het programma maakt geen verbinding meer met de server totdat de "
 "identificatiecode is hersteld."
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
 msgstr "Beveiligingsrisico!"
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
@@ -226,31 +226,31 @@ msgstr ""
 "Verbinding mislukt!\n"
 "Verbinden met de server niet mogelijk!"
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "Netwerkfout."
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr " J"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "M"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "w"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr " d"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "u"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "m"
 
@@ -271,65 +271,65 @@ msgstr "Open de kalender"
 msgid "Date Selection"
 msgstr "Datum selecteren"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr ""
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 #, fuzzy
 msgid "yes"
 msgstr "bytes"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 #, fuzzy
 msgid "true"
 msgstr "Waar"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr ""
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Waar"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Niet waar"
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 #, fuzzy
 msgid "Edit..."
 msgstr "Afsluiten"
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 #, fuzzy
 msgid "Attachments..."
 msgstr "Bijlage:"
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 #, fuzzy
 msgid "Actions..."
 msgstr "_Acties.."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 #, fuzzy
 msgid "Relate..."
 msgstr "Verwijderen... "
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 #, fuzzy
 msgid "Report..."
 msgstr "_Importeer gegevens... "
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 #, fuzzy
 msgid "E-Mail..."
 msgstr "E-mail"
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 #, fuzzy
 msgid "Print..."
 msgstr "Afdrukken"
@@ -355,10 +355,10 @@ msgid "_Help"
 msgstr "_Help"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Zoeken"
 
@@ -528,17 +528,17 @@ msgstr "I_nfo..."
 msgid "Manage Favorites"
 msgstr ""
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
 msgstr ""
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Tabblad sluiten"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
@@ -546,7 +546,7 @@ msgstr ""
 "U gaat een Tryton database verwijderen.\n"
 "Weet u zeker dat u door wil gaan?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -554,28 +554,28 @@ msgstr ""
 "Verkeerde wachtwoord voor de Tryton server\n"
 "Probeer het opnieuw."
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "Geen toegang!"
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr "Verwijderen database is mislukt met foutmelding:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "Database kan niet worden verwijderd."
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "Database succesvol verwijderd!"
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "Open reservekopie om te herstellen..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -583,11 +583,11 @@ msgstr ""
 "Een met een wachtwoord beveiligde database kan niet terug gezet worden.\n"
 "Voer deze handeling handmatig uit."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "Database beveiligd met een wachtwoord!"
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -595,19 +595,19 @@ msgstr ""
 "Verkeerde wachtwoord voor de Tryton server\n"
 "Probeer het opnieuw."
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr "Herstellen database is mislukt met foutmelding:\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "Database terugzetten mislukt!"
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "Database succesvol teruggezet!"
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -615,15 +615,15 @@ msgstr ""
 "Een met een wachtwoord beveiligde database kan niet verwijderd worden.\n"
 "Voer deze handeling handmatig uit."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "Verwijderen database is mislukt met foutmelding:\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr "Database verwijderen mislukt!"
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "Reservekopie van database gemaakt!"
 
@@ -636,7 +636,7 @@ msgid "Create a new record"
 msgstr "Maak een nieuw item"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "Opslaan"
 
@@ -646,7 +646,7 @@ msgstr "Bewaar dit item"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "Omschakelen"
 
@@ -832,38 +832,15 @@ msgstr "Bevestig admin wachtwoord:"
 msgid "Type the Admin password again"
 msgstr "Admin wachtwoord opnieuw invoeren"
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"De naam van de database is beperkt tot alfa-numerieke karakters en \"_\" "
-"(underscore). Vermijd alle accenten, spaties en andere bijzondere "
-"karakters."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Ongeldige tekens in database naam!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr "Het nieuwe wachtwoord voor admin komt niet overeen met de bevestiging.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "Wachtwoorden komen niet overeen!"
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"Admin wachtwoord en bevestiging zijn nodig om een nieuwe database te "
-"maken."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Wachtwoord admin ontbreekt!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -871,15 +848,15 @@ msgstr ""
 "Een database met deze naam bestaat al.\n"
 "Probeer een andere database naam. "
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "Deze database bestaat al!"
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr "Sorry, verkeerde wachtwoord voor de Tryton server. Probeer het opnieuw. "
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -892,7 +869,7 @@ msgstr ""
 "informatie.\n"
 "Foutmelding:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "Database maken mislukt!"
 
@@ -959,12 +936,12 @@ msgstr ""
 msgid "Profile"
 msgstr ""
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "_Toevoegen"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "_Verwijderen"
@@ -994,7 +971,7 @@ msgstr "Gebruikersnaam:"
 msgid "Could not connect to the server"
 msgstr "Geen verbinding met de server!"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 #, fuzzy
 msgid "Incompatible version of the server"
 msgstr "Deze versie is onverenigbaar met de server! "
@@ -1122,8 +1099,8 @@ msgstr "Bijlage:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Vorige"
 
@@ -1133,8 +1110,8 @@ msgstr "Vorige item"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Volgende"
 
@@ -1244,23 +1221,23 @@ msgstr "Laatste wijzigingsdatum:"
 msgid "Model:"
 msgstr "Model:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr "Weet je zeker dat je dit item wilt verwijderen?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr "Weet je zeker dat je deze items wilt verwijderen?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr "Items niet verwijderd!"
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr "Items verwijderd!"
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr "Je werkt nu met het gekopieerde item!"
 
@@ -1272,11 +1249,11 @@ msgstr "Item opgeslagen!"
 msgid "Invalid form!"
 msgstr "Ongeldige invoer in formulier!"
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " van "
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1284,54 +1261,53 @@ msgstr ""
 "Item is aangepast.\n"
 "Wil je de wijzigingen opslaan?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Actie"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr ""
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 #, fuzzy
 msgid "Relate"
 msgstr "Aan_maken"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 #, fuzzy
 msgid "Open related records"
 msgstr "Item openen"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 #, fuzzy
 msgid "Report"
 msgstr "Rapporten"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 #, fuzzy
 msgid "Open report"
 msgstr "Item openen"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 #, fuzzy
 msgid "E-Mail"
 msgstr "E-mail"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr ""
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Afdrukken"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr ""
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Onbekend"
 
@@ -1516,67 +1492,77 @@ msgstr "Tips"
 msgid "_Display a new tip next time"
 msgstr "Volgende keer een tip"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Exporteer naar CSV"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Voorgedefinieerde exportinstellingen</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Alle velden</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Wissen"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Exportgegevens opslaan"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Exportgegevens verwijderen"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Velden om te exporteren</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Opties</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Open"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Voeg veldnamen toe"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "Naam"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr "Wat is de naam voor deze export?"
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "%d item opgeslagen!"
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "%d items opgeslagen!"
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1600,20 +1586,19 @@ msgid "Remove <Del>"
 msgstr ""
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 #, fuzzy
 msgid "Create a new record <F3>"
 msgstr "Maak een nieuw item"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 #, fuzzy
 msgid "Delete selected record <Del>"
 msgstr "Geselecteerd item verwijderen"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 #, fuzzy
 msgid "Undelete selected record <Ins>"
 msgstr "Geselecteerd item verwijderen"
@@ -1636,10 +1621,10 @@ msgstr "Bestand om te importeren:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Openen..."
 
@@ -1691,75 +1676,105 @@ msgstr "%d item geïmporteerd!"
 msgid "%d records imported!"
 msgstr "%d items geïmporteerd!"
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Assistent"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Lege opdracht"
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 #, fuzzy
 msgid "ID"
 msgstr " d"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 #, fuzzy
 msgid "Creation User"
 msgstr "Aangemaakt door:"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 #, fuzzy
 msgid "Creation Date"
 msgstr "Aanmaakdatum"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 #, fuzzy
 msgid "Modification User"
 msgstr "Laatste wijzigingsdatum:"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 #, fuzzy
 msgid "Modification Date"
 msgstr "Laatste wijzigingsdatum:"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr ""
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 #, fuzzy
 msgid "Unable to set view tree state"
 msgstr "Kan omgeving %s niet instellen"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Opslaan als"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Afbeeldingsgrootte"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Breedte:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Hoogte:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG afbeelding (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Afbeelding te groot!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 #, fuzzy
 msgid "F_ilters"
 msgstr "_Bestand"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Vind"
 
@@ -1791,86 +1806,55 @@ msgstr "Kies een bestand"
 msgid "Show plain text"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 #, fuzzy
 msgid "Select an Image..."
 msgstr "Kies een bestand"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Alle bestanden"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Afbeeldingen"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-#, fuzzy
-msgid "Translation"
-msgstr "Voeg vertaling toe"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Gegevens eerst opslaan voordat u een vertaling toevoegt! "
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Geen andere taal beschikbaar!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 #, fuzzy
 msgid "Add existing record"
 msgstr "Bewaar dit item"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 #, fuzzy
 msgid "Remove selected record <Del>"
 msgstr "Geselecteerd item verwijderen"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 #, fuzzy
 msgid "Open a record <F2>"
 msgstr "Item openen"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 #, fuzzy
 msgid "Search a record <F2>"
 msgstr "Item zoeken"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 #, fuzzy
 msgid "Remove selected record"
 msgstr "Geselecteerd item verwijderen"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 #, fuzzy
 msgid "Edit selected record <F2>"
 msgstr "Geselecteerd item aanpassen"
@@ -1931,33 +1915,26 @@ msgstr ""
 msgid "Select a background color"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Opslaan als"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Afbeeldingsgrootte"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Breedte:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+#, fuzzy
+msgid "Translation"
+msgstr "Voeg vertaling toe"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Hoogte:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG afbeelding (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Afbeelding te groot!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Gegevens eerst opslaan voordat u een vertaling toevoegt! "
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ":"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Geen andere taal beschikbaar!"
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/ru_RU/LC_MESSAGES/tryton.mo b/share/locale/ru_RU/LC_MESSAGES/tryton.mo
index 528c04b..be768b8 100644
Binary files a/share/locale/ru_RU/LC_MESSAGES/tryton.mo and b/share/locale/ru_RU/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/ru_RU/LC_MESSAGES/tryton.po b/share/locale/ru_RU/LC_MESSAGES/tryton.po
index 42f18b1..59df63b 100644
--- a/share/locale/ru_RU/LC_MESSAGES/tryton.po
+++ b/share/locale/ru_RU/LC_MESSAGES/tryton.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tryton 1.3.0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
 "PO-Revision-Date: 2013-04-12 23:16+0500\n"
 "Last-Translator: Ilya Melnikov <rayanayar at mail.ru>\n"
 "Language-Team: ru_RU <k-dmitry2 at narod.ru>\n"
@@ -16,46 +16,46 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "указать альтернативный конфигурационный файл"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr "режим разработки"
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr "все сообщения на уровне INFO"
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr "указать уровень вывода сообщений: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "указать имя пользователя"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr "укажите порт сервера"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "укажите имя сервера"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr "Слишком много аргументов"
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr "Файл \"%s\" не найден"
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr "Невозможно записать файл конфигурации %s!"
@@ -85,42 +85,42 @@ msgstr "Сервер:"
 msgid "Port:"
 msgstr "Порт:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Выбор"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "Ваш выбор:"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Сохранить как..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "Всегда игнорировать это предупреждение."
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr "Вы хотите продолжить?"
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Подтвердите"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Прерывание конкурентных записей"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
 "\n"
@@ -138,50 +138,50 @@ msgstr ""
 "- \" Сравнить \", чтобы увидеть модифицированный вариант;\n"
 "- \" Переписать \", чтобы сохранить вашу текущую версию."
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Сравнить"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Записать все равно"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Ошибка"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "Сообщить об ошибке"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr "Ошибка приложения!"
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "Ошибка: "
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr "Вы можете отправить отчет об ошибке если вы зарегистрированны на <u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr "Система сбора ошибок"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "Пользователь:"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "Пароль:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -190,11 +190,11 @@ msgstr ""
 "Чтобы держать вас в курсе ваше имя пользователя будет добавлен в список "
 "перечень по этому вопросу"
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "Создан новый отчет об ошибке с идентификатором"
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
@@ -202,11 +202,11 @@ msgstr ""
 "Ошибка соединения!\n"
 "Неверное имя пользователя или пароль!"
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "Исключительная ситуация:"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
@@ -216,12 +216,12 @@ msgstr ""
 "Подключение к серверу приостановлено до тех пор пока сертификат не будет "
 "исправлен."
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
 msgstr "Угроза безопасности!"
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
@@ -229,31 +229,31 @@ msgstr ""
 "Ошибка соединения!\n"
 "Невозможно соединиться с сервером!"
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "Сетевая ошибка!"
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr "Г"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "М"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "н"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr "д"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "ч"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "м"
 
@@ -273,58 +273,58 @@ msgstr "Открыть календарь <F2>"
 msgid "Date Selection"
 msgstr "Выбор даты"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr ""
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "yes"
 msgstr "да"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "true"
 msgstr "истинный"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr ""
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Истинный"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Ложный"
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 #, fuzzy
 msgid "Edit..."
 msgstr "_Выход..."
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 msgid "Attachments..."
 msgstr "Вложения..."
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 msgid "Actions..."
 msgstr "Действия..."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 msgid "Relate..."
 msgstr "Связанные..."
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 msgid "Report..."
 msgstr "Отчет..."
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 msgid "E-Mail..."
 msgstr "Эл.почта..."
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 msgid "Print..."
 msgstr "Печать..."
 
@@ -349,10 +349,10 @@ msgid "_Help"
 msgstr "Помощь"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Поиск"
 
@@ -521,7 +521,7 @@ msgstr "О программе"
 msgid "Manage Favorites"
 msgstr "Управление закладками"
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
@@ -529,11 +529,11 @@ msgstr ""
 "Данное действие приведет к закрытию всех вкладок.\n"
 "Продолжить?"
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Закрыть вкладку"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
@@ -541,7 +541,7 @@ msgstr ""
 "Вы собираетесь удалить базу данных.\n"
 "Вы действительно уверены, продолжить?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -549,28 +549,28 @@ msgstr ""
 "Неверный административный пароль сервера Tryton\n"
 "Пожалуйста, попробуйте снова"
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "Доступ запрещен!"
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr "Удаление базы данных завершено с сообщением об ошибке:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "Не удалось удалить базу данных!"
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "База успешно удалена!"
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "Открыть файл для восстановления..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -578,11 +578,11 @@ msgstr ""
 "Не возможно восстановить на защищенной паролем базе данных.\n"
 "Резервное копирование и восстановление необходимо выполнить вручную."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "База данных защищена паролем!"
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -590,19 +590,19 @@ msgstr ""
 "Неверный административный пароль сервера Tryton\n"
 "Пожалуйста, попробуйте снова"
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr "Восстановление базы данных с сообщением об ошибке:\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "Базу данных восстановить не удалось!"
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "База данных восстановлена полностью!"
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -610,15 +610,15 @@ msgstr ""
 "Не возможно сделать снимок на защищенной паролем базе данных. \n"
 "Резервное копирование и восстановление необходимо выполнить вручную."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "Резервное копирование базы данных завершилось с сообщением об ошибке:\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr "Не удалось выполнить резервное копирование базы данных!"
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "База данных сохранена успешно!"
 
@@ -631,7 +631,7 @@ msgid "Create a new record"
 msgstr "Создать новую запись"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "Сохранить"
 
@@ -641,7 +641,7 @@ msgstr "Сохранить эту запись"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "Переключить"
 
@@ -825,36 +825,15 @@ msgstr "Подтвердите пароль администратора:"
 msgid "Type the Admin password again"
 msgstr "Введите административный пароль повторно"
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Имя базы данных ограничивается символами, цифрами и \" _ \" "
-"(Подчеркивание). Недопустимо использование пробелов и других специальных "
-"символов."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Недопустимые символы в имени базы данных!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr "Новый пароль не совпадает с полем подтверждения.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "Пароли не совпадают!"
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr "Пароль администратора необходим для создания новой базы данных."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Отсутствует административный пароль!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -862,15 +841,15 @@ msgstr ""
 "База данных с таким же названием уже существует.\n"
 "Попробуйте другое имя базы данных."
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "Такая база данных уже существует!"
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr "Извините, неверный пароль для сервера. Попробуйте еще раз."
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -882,7 +861,7 @@ msgstr ""
 "данных! Дополнительная информация может быть в сообщении об ошибке.\n"
 "Сообщение об ошибке:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "Ошибка создания базы данных!"
 
@@ -947,12 +926,12 @@ msgstr "Редактор профилей"
 msgid "Profile"
 msgstr "Профиль"
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "_Добавить"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "_Удалить"
@@ -977,7 +956,7 @@ msgstr "Имя пользователя:"
 msgid "Could not connect to the server"
 msgstr "Не удается подключиться к серверу!"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 msgid "Incompatible version of the server"
 msgstr "Несовместимая версия сервера"
 
@@ -1103,8 +1082,8 @@ msgstr "Вложение:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Предыдущий"
 
@@ -1114,8 +1093,8 @@ msgstr "Предыдущая запись"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Следующий"
 
@@ -1220,23 +1199,23 @@ msgstr "Дата изменения:"
 msgid "Model:"
 msgstr "Модель:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr "Вы уверены что хотите удалить эту запись?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr "Вы уверены что хотите удалить эти записи?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr "Записи не удалены!"
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr "Записи удалены!"
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr "Сейчас работает на дублирующихся записях!"
 
@@ -1248,11 +1227,11 @@ msgstr "Запись сохранена!"
 msgid "Invalid form!"
 msgstr "Недопустимая форма!"
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr "из"
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1260,49 +1239,48 @@ msgstr ""
 "Эта запись была изменена\n"
 "Вы хотите её сохранить?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Действие"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr "Выполнить действие"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Relate"
 msgstr "Связанные"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Open related records"
 msgstr "Открыть связанные записи"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Report"
 msgstr "Отчет"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Open report"
 msgstr "Открыть отчет"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail"
 msgstr "Эл.почта"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr "Отправить отчет по Эл.почте"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Печать"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr "Печать отчета"
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Неизвестно"
 
@@ -1482,67 +1460,77 @@ msgstr "Советы"
 msgid "_Display a new tip next time"
 msgstr "Показывать  новый совет при следующем запуске"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Экспорт в CSV"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Предопределенные экспорты</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Все поля</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Очистить"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Сохранить настройку экспорта"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Удалить настройку экспорта"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Поля для экспорта</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Опции</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Открыть"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Добавить имя поля"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "Имя"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr "Укажите имя для экспорта."
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "%d запись сохранена!"
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "%d записей сохранено!"
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1566,18 +1554,17 @@ msgid "Remove <Del>"
 msgstr "Удалить <Del>"
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 msgid "Create a new record <F3>"
 msgstr "Создать новую запись <F3>"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 msgid "Delete selected record <Del>"
 msgstr "Удалить выбраную запись <Del>"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 msgid "Undelete selected record <Ins>"
 msgstr "Восстановить выбраную запись <Ins>"
 
@@ -1599,10 +1586,10 @@ msgstr "Файл для импорта:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Открыть..."
 
@@ -1653,73 +1640,103 @@ msgstr "%d запись импортирована!"
 msgid "%d records imported!"
 msgstr "%d записей импортировано!"
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Мастер"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Нет строковых атрибутов"
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 msgid "ID"
 msgstr "ID"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 #, fuzzy
 msgid "Creation User"
 msgstr "Создано пользователем"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 #, fuzzy
 msgid "Creation Date"
 msgstr "Дата создания"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 #, fuzzy
 msgid "Modification User"
 msgstr "Дата изменения:"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 #, fuzzy
 msgid "Modification Date"
 msgstr "Дата изменения:"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr ""
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 #, fuzzy
 msgid "Unable to set view tree state"
 msgstr "Не удается установить локализацию %s"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Сохранить как"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Размер изображения"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Ширина:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Ввысота:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG изображение (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Размер изображения слишком большой!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ".."
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 msgid "F_ilters"
 msgstr "Фильтры"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr "Показать сохраненные фильтры"
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr "Удалить эту закладку"
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr "Запомнить этот фильтр"
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr "Имя закладки:"
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Найти"
 
@@ -1750,79 +1767,49 @@ msgstr "Выбрать файл..."
 msgid "Show plain text"
 msgstr "Показать в виде текста"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr "Добавить значение"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr "Удалить \"%s\""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 msgid "Select an Image..."
 msgstr "Выбрать изображение..."
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Все фалы"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Изображения"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Перевод"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Редактировать"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Неточный"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Необходимо сохранить запись перед добавлением перевода!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Отсутствуют другие доступные языки!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 msgid "Add existing record"
 msgstr "Добавить существующую запись"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 msgid "Remove selected record <Del>"
 msgstr "Удалить выбраную запись <Del>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 msgid "Open a record <F2>"
 msgstr "Открыть запись <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 msgid "Search a record <F2>"
 msgstr "Поиск записи <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 msgid "Remove selected record"
 msgstr "Удалить выбраную запись"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 msgid "Edit selected record <F2>"
 msgstr "Изменить выбранную запись <F2>"
 
@@ -1882,33 +1869,25 @@ msgstr "Выбрать цвет"
 msgid "Select a background color"
 msgstr "Выбрать цвет фона"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Сохранить как"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Размер изображения"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Ширина:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Перевод"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Ввысота:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Редактировать"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG изображение (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Неточный"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Размер изображения слишком большой!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Необходимо сохранить запись перед добавлением перевода!"
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Отсутствуют другие доступные языки!"
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/sl_SI/LC_MESSAGES/tryton.mo b/share/locale/sl_SI/LC_MESSAGES/tryton.mo
index 06bef10..8016491 100644
Binary files a/share/locale/sl_SI/LC_MESSAGES/tryton.mo and b/share/locale/sl_SI/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/sl_SI/LC_MESSAGES/tryton.po b/share/locale/sl_SI/LC_MESSAGES/tryton.po
index 29fa4e8..5c6addb 100644
--- a/share/locale/sl_SI/LC_MESSAGES/tryton.po
+++ b/share/locale/sl_SI/LC_MESSAGES/tryton.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tryton 3.0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-03-22 17:10+0100\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-10-15 11:36+0200\n"
 "Last-Translator: Venceslav Vezjak <vezjakv at gmail.com>\n"
 "Language-Team: sl_SI <LL at li.org>\n"
 "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 "
@@ -16,46 +16,46 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr "določi alterntivno konfiguracijsko datoteko"
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr "Razvijalski način"
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr "beleženje vsega na INFO ravni"
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr "določi nivo beleženja: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr "določi uporabniško ime"
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr "določi strežniška vrata"
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr "določi strežniškega gostitelja"
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr "Preveč argumentov"
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr "Datoteke \"%s\" ni moč najti"
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr "Ni možno zapisati konfiguracijske datoteke %s!"
@@ -85,42 +85,42 @@ msgstr "Strežnik:"
 msgid "Port:"
 msgstr "Vrata:"
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr "Izbira"
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr "Vaša izbira:"
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr "Shrani kot..."
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr "Vedno prezri to opozorilo."
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr "Ali želite nadaljevati?"
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr "Potrditev"
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr "Izjema sočasnega izvajanja"
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
 "\n"
@@ -138,50 +138,50 @@ msgstr ""
 "    - \"Primerjaj\" za vpogled v spremenjeno inačico;\n"
 "    - \"Vseeno zapiši\" za shranitev vaše trenutne inačice."
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr "Primerjaj"
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr "Vseeno zapiši"
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr "Napaka"
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr "Prijava programske napake"
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr "Napaka programa!"
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr "Napaka: "
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr "Za prijavo programskih napak morate imeti odprt račun pri <u>%s</u>"
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr "Sledilnik programskih napak"
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr "Uporabnik:"
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr "Geslo:"
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
@@ -190,11 +190,11 @@ msgstr ""
 "Zaradi obveščanja je vaše uporabniško ime dodano na seznam te programske "
 "napake"
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr "Evidentirana je nova programska napaka z ID "
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
@@ -202,11 +202,11 @@ msgstr ""
 "Napaka pri povezavovanju!\n"
 "Napačno uporabniško ime ali geslo!"
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr "Izjema:"
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
@@ -216,12 +216,12 @@ msgstr ""
 "Program bo ustavil povezovanje na ta strežnik, dokler ne bo njegov prstni"
 " odtis popravljen."
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
 msgstr "Varnostno tveganje"
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
@@ -229,31 +229,31 @@ msgstr ""
 "Napaka pri povezovanju!\n"
 "Ni se možno povezati na strežnik!"
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr "Napaka mreže!"
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr "l"
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr "M"
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr "t"
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr "d"
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr "u"
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr "m"
 
@@ -273,57 +273,57 @@ msgstr "Odpri koledar <F2>"
 msgid "Date Selection"
 msgstr "Izbira datuma"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr "d"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "yes"
 msgstr "da"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "true"
 msgstr "da"
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr "t"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr "Da"
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr "Ne"
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 msgid "Edit..."
 msgstr "Uredi ..."
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 msgid "Attachments..."
 msgstr "Priponke..."
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 msgid "Actions..."
 msgstr "_Ukrepi..."
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 msgid "Relate..."
 msgstr "_Veze..."
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 msgid "Report..."
 msgstr "Poročila..."
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 msgid "E-Mail..."
 msgstr "_Elektronska pošta..."
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 msgid "Print..."
 msgstr "_Izpis..."
 
@@ -348,10 +348,10 @@ msgid "_Help"
 msgstr "_Pomoč"
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr "Išči"
 
@@ -519,7 +519,7 @@ msgstr "_Vizitka..."
 msgid "Manage Favorites"
 msgstr "_Upravljaj zaznamke"
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
@@ -527,11 +527,11 @@ msgstr ""
 "Za naslednji ukrep morajo biti vsi zavihki zaprti.\n"
 "Ali želite nadaljevati?"
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr "Zapri zavihek"
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
@@ -539,7 +539,7 @@ msgstr ""
 "Nameravate izbrisati Tryton podatkovno bazo.\n"
 "Ali ste res želite nadaljevati?"
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
@@ -547,28 +547,28 @@ msgstr ""
 "Napačno geslo za Tryton strežnik.\n"
 "Prosimo, poskusite še enkrat."
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr "Dostop zavrnjen!"
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr "Brisanje podatkovne baze je odpovedalo z napako:\n"
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr "Brisanje podatkovne baze je odpovedalo!"
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr "Brisanje podatkovne baze uspešno zaključeno!"
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr "Odpri varnostno kopijo za obnovitev..."
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
@@ -576,11 +576,11 @@ msgstr ""
 "Ni možno obnoviti podatkovne baze, ki so zaščitene z geslom.\n"
 "Varnostno kopiranje in obnovitev se mora ročno izvesti."
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr "Podatkovna baza je zaščitena z geslom!"
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
@@ -588,19 +588,19 @@ msgstr ""
 "Napačno geslo za Tryton strežnik.\n"
 "Prosimo, poskusite še enkrat."
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr "Obnovitev podatkovne baze je odpovedala z napako:\n"
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr "Obnovitev podatkovne baze je odpovedala!"
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr "Obnovitev podatkovne baze uspešno zaključena!"
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
@@ -608,15 +608,15 @@ msgstr ""
 "Ni možno zapisati podatkovne baze, ki je zaščitena z geslom.\n"
 "Varnostno kopiranje in obnovitev se mora ročno izvesti."
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr "Zapisovanje podatkovne baze je odpovedalo z napako:\n"
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr "Zapisovanje podatkovne baze odpovedalo!"
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr "Varnostno kopiranje podatkovne baze uspešno zaključeno!"
 
@@ -629,7 +629,7 @@ msgid "Create a new record"
 msgstr "Ustvari nov zapis"
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr "Shrani"
 
@@ -639,7 +639,7 @@ msgstr "Shrani ta zapis"
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr "Preklopi"
 
@@ -821,38 +821,15 @@ msgstr "Potrdi skrbniško geslo:"
 msgid "Type the Admin password again"
 msgstr "Ponovno vtipkaj skrbniško geslo"
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Ime podatkovne baze je omejeno na alfanumerične znake in \"_\" "
-"(podčrtaj). Izogibaj se vsem znakom za naglaševanje, presledku ali drugim"
-" posebnim znakom."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Nedovoljeni znaki v imenu podatkovne baze!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr "Novo skrbniško geslo se ne ujema s tistim v potrditvenem polju.\n"
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr "Gesli se ne ujemata!"
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"Skrbniško geslo in potrditev gesla sta potrebna za izdelavo podatkovne "
-"baze."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Manjka skrbniško geslo!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
@@ -860,15 +837,15 @@ msgstr ""
 "Podatkovna baza s tem imenom že obstaja.\n"
 "Poskusi z drugim imenom."
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr "To ime podatkovne baze že obstaja!"
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr "Žal napačno geslo za Tryton strežnik. Prosim, poskusi znova."
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -880,7 +857,7 @@ msgstr ""
 "zbrišete! Prosimo, preveri sporočilo napake za dodatne informacije.\n"
 "Sporočilo napake:\n"
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr "Napaka pri izdelavi podatkovne baze!"
 
@@ -945,12 +922,12 @@ msgstr "Urejevalnik profilov"
 msgid "Profile"
 msgstr "Profil"
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr "_Dodaj"
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr "_Odstrani"
@@ -975,7 +952,7 @@ msgstr "Uporabniško ime:"
 msgid "Could not connect to the server"
 msgstr "Ni se možno povezati s strežnikom"
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 msgid "Incompatible version of the server"
 msgstr "Nezdružljiva inačica strežnika"
 
@@ -1102,8 +1079,8 @@ msgstr "Priponka:"
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr "Prejšnji"
 
@@ -1113,8 +1090,8 @@ msgstr "Prejšnji zapis"
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr "Naslednji"
 
@@ -1219,23 +1196,23 @@ msgstr "Nazadnje popravljeno:"
 msgid "Model:"
 msgstr "Model:"
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr "Ali res želiš izbrisati ta zapis?"
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr "Ali res želiš izbrisati te zapise?"
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr "Zapisi niso izbrisani!"
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr "Zapisi izbrisani!"
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr "Sedaj se dela na podvojenih zapisih!"
 
@@ -1247,11 +1224,11 @@ msgstr "Zapis shranjen!"
 msgid "Invalid form!"
 msgstr "Neveljaven obrazec!"
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr " od "
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
@@ -1259,49 +1236,48 @@ msgstr ""
 "Ta zapis je bil spremenjen,\n"
 "ga želiš shraniti?"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr "Ukrep"
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr "Zaženi ukrep"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Relate"
 msgstr "Veza"
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Open related records"
 msgstr "Odpri vezo"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Report"
 msgstr "Poročila"
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Open report"
 msgstr "Odpri poročilo"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail"
 msgstr "Pošlji"
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr "Pošlji poročilo"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr "Tisk"
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr "Izpis poročila"
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr "Neznano"
 
@@ -1476,67 +1452,77 @@ msgstr "Namigi"
 msgid "_Display a new tip next time"
 msgstr "Naslednjič _prikaži nov namig"
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr "Izvozi v CSV"
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr "<b>Predefinirani izvozi</b>"
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr "<b>Vsa polja</b>"
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr "Počisti"
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr "Shrani izvoz"
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr "Izbriši izvoz"
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr "<b>Polja za izvoz</b>"
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr "<b>Možnosti</b>"
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr "Odpri"
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr "Dodaj imena _polj"
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr "Naziv"
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (niz)"
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr "Kako se imenuje ta izvoz?"
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "Prepišem definicijo izvoza '%s'?"
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr "%d zapis shranjen!"
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr "%d zapisov shranjenih!"
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1560,18 +1546,17 @@ msgid "Remove <Del>"
 msgstr "Odstrani <Del>"
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 msgid "Create a new record <F3>"
 msgstr "Ustvari nov zapis <F3>"
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 msgid "Delete selected record <Del>"
 msgstr "Zbriši izbran zapis <Del>"
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 msgid "Undelete selected record <Ins>"
 msgstr "Povrni izbran zapis <Ins>"
 
@@ -1593,10 +1578,10 @@ msgstr "Datoteka za uvoz:"
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr "Odpri..."
 
@@ -1647,68 +1632,98 @@ msgstr "%d zapis uvožen!"
 msgid "%d records imported!"
 msgstr "%d zapisov uvoženih!"
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr "Čarovnik"
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Ni atributov."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 msgid "ID"
 msgstr "ID"
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 msgid "Creation User"
 msgstr "Ustvaril"
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 msgid "Creation Date"
 msgstr "Ustvarjeno"
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 msgid "Modification User"
 msgstr "Popravil"
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 msgid "Modification Date"
 msgstr "Popravljeno"
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr "Stanja obrazca ni možno dobiti"
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 msgid "Unable to set view tree state"
 msgstr "Ni možno nastaviti stanja obrazca"
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Shrani kot"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Velikost slike"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Širina:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Velikost:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG slika (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Slika je prevelika!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ".."
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 msgid "F_ilters"
 msgstr "_Filtri"
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr "Prikaži zaznamke filtrov"
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr "Odstrani ta zaznamek"
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr "Shrani ta filter"
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr "Ime zaznamka:"
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr "Najdi"
 
@@ -1736,79 +1751,49 @@ msgstr "Izberi datoteko..."
 msgid "Show plain text"
 msgstr "Prikaži navadno besedilo"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr "Dodaj vrednost"
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr "Odstrani \"%s\""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 msgid "Select an Image..."
 msgstr "Izberi sliko..."
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr "Vse datoteke"
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr "Slike"
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Prevod"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Uredi"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Nejasno"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Pred dodajanjem prevodov morate zapis shraniti!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Drugih jezikov ni na voljo!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 msgid "Add existing record"
 msgstr "Dodaj obstoječi zapis"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 msgid "Remove selected record <Del>"
 msgstr "Odstrani izbran zapis <Del>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 msgid "Open a record <F2>"
 msgstr "Odpri zapis <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 msgid "Search a record <F2>"
 msgstr "Poišči zapis <F2>"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 msgid "Remove selected record"
 msgstr "Odstrani izbran zapis"
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 msgid "Edit selected record <F2>"
 msgstr "Uredi izbran zapis <F2>"
 
@@ -1868,33 +1853,25 @@ msgstr "Izberi barvo besedila"
 msgid "Select a background color"
 msgstr "Izberi barvo ozadja"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Shrani kot"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Velikost slike"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Širina:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Prevod"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Velikost:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Uredi"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG slika (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Nejasno"
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Slika je prevelika!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Pred dodajanjem prevodov morate zapis shraniti!"
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Drugih jezikov ni na voljo!"
 
 #: tryton/plugins/translation/__init__.py:18
 msgid "Translate view"
diff --git a/share/locale/tryton.pot b/share/locale/tryton.pot
index f479a6b..266ef12 100644
--- a/share/locale/tryton.pot
+++ b/share/locale/tryton.pot
@@ -6,55 +6,55 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: tryton 3.1.dev0\n"
+"Project-Id-Version: tryton 3.3.dev0\n"
 "Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
 
-#: tryton/config.py:83
+#: tryton/config.py:84
 msgid "specify alternate config file"
 msgstr ""
 
-#: tryton/config.py:86
+#: tryton/config.py:87
 msgid "development mode"
 msgstr ""
 
-#: tryton/config.py:89
+#: tryton/config.py:90
 msgid "logging everything at INFO level"
 msgstr ""
 
-#: tryton/config.py:91
+#: tryton/config.py:92
 msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
 msgstr ""
 
-#: tryton/config.py:94
+#: tryton/config.py:95
 msgid "specify the login user"
 msgstr ""
 
-#: tryton/config.py:96
+#: tryton/config.py:97
 msgid "specify the server port"
 msgstr ""
 
-#: tryton/config.py:98
+#: tryton/config.py:99
 msgid "specify the server hostname"
 msgstr ""
 
-#: tryton/config.py:102
+#: tryton/config.py:103
 msgid "Too much arguments"
 msgstr ""
 
-#: tryton/config.py:105
+#: tryton/config.py:106
 #, python-format
 msgid "File \"%s\" not found"
 msgstr ""
 
-#: tryton/config.py:143
+#: tryton/config.py:144
 #, python-format
 msgid "Unable to write config file %s!"
 msgstr ""
@@ -84,42 +84,42 @@ msgstr ""
 msgid "Port:"
 msgstr ""
 
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
 msgid "Selection"
 msgstr ""
 
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
 msgid "Your selection:"
 msgstr ""
 
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
 msgid "Save As..."
 msgstr ""
 
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
 msgid "Always ignore this warning."
 msgstr ""
 
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
 msgid "Do you want to proceed?"
 msgstr ""
 
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
 msgid "Confirmation"
 msgstr ""
 
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
 msgid "Concurrency Exception"
 msgstr ""
 
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
 msgid ""
 "<b>Write Concurrency Warning:</b>\n"
 "\n"
@@ -130,112 +130,112 @@ msgid ""
 "    - \"Write Anyway\" to save your current version."
 msgstr ""
 
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
 msgid "Compare"
 msgstr ""
 
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
 msgid "Write Anyway"
 msgstr ""
 
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
 #: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
 msgid "Error"
 msgstr ""
 
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
 msgid "Report Bug"
 msgstr ""
 
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
 msgid "Application Error!"
 msgstr ""
 
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
 msgid "Error: "
 msgstr ""
 
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
 #, python-format
 msgid "To report bugs you must have an account on <u>%s</u>"
 msgstr ""
 
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
 msgid "Bug Tracker"
 msgstr ""
 
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
 msgid "User:"
 msgstr ""
 
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
 #: tryton/gui/window/dblogin.py:462
 msgid "Password:"
 msgstr ""
 
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
 msgid ""
 "The same bug was already reported by another user.\n"
 "To keep you informed your username is added to the nosy-list of this issue"
 msgstr ""
 
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
 msgid "Created new bug with ID "
 msgstr ""
 
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
 msgid ""
 "Connection error!\n"
 "Bad username or password!"
 msgstr ""
 
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
 msgid "Exception:"
 msgstr ""
 
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
 msgid ""
 "The server fingerprint has changed since last connection!\n"
 "The application will stop connecting to this server until its fingerprint"
 " is fixed."
 msgstr ""
 
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
 msgid "Security risk!"
 msgstr ""
 
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
 msgid ""
 "Connection error!\n"
 "Unable to connect to the server!"
 msgstr ""
 
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
 msgid "Network Error!"
 msgstr ""
 
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
 msgid "Y"
 msgstr ""
 
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
 msgid "M"
 msgstr ""
 
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
 msgid "w"
 msgstr ""
 
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
 msgid "d"
 msgstr ""
 
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
 msgid "h"
 msgstr ""
 
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
 msgid "m"
 msgstr ""
 
@@ -255,57 +255,57 @@ msgstr ""
 msgid "Date Selection"
 msgstr ""
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "y"
 msgstr ""
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "yes"
 msgstr ""
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "true"
 msgstr ""
 
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
 msgid "t"
 msgstr ""
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "True"
 msgstr ""
 
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
 msgid "False"
 msgstr ""
 
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
 msgid "Edit..."
 msgstr ""
 
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
 msgid "Attachments..."
 msgstr ""
 
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
 msgid "Actions..."
 msgstr ""
 
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
 msgid "Relate..."
 msgstr ""
 
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
 msgid "Report..."
 msgstr ""
 
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
 msgid "E-Mail..."
 msgstr ""
 
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
 msgid "Print..."
 msgstr ""
 
@@ -330,10 +330,10 @@ msgid "_Help"
 msgstr ""
 
 #: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
 msgid "Search"
 msgstr ""
 
@@ -501,92 +501,92 @@ msgstr ""
 msgid "Manage Favorites"
 msgstr ""
 
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
 msgid ""
 "The following action requires to close all tabs.\n"
 "Do you want to continue?"
 msgstr ""
 
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
 msgid "Close Tab"
 msgstr ""
 
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
 msgid ""
 "You are going to delete a Tryton database.\n"
 "Are you really sure to proceed?"
 msgstr ""
 
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
 msgid ""
 "Wrong Tryton Server Password\n"
 "Please try again."
 msgstr ""
 
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
 msgid "Access denied!"
 msgstr ""
 
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
 msgid "Database drop failed with error message:\n"
 msgstr ""
 
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
 msgid "Database drop failed!"
 msgstr ""
 
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
 msgid "Database dropped successfully!"
 msgstr ""
 
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
 msgid "Open Backup File to Restore..."
 msgstr ""
 
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
 msgid ""
 "It is not possible to restore a password protected database.\n"
 "Backup and restore needed to be proceed manual."
 msgstr ""
 
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
 msgid "Database is password protected!"
 msgstr ""
 
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
 msgid ""
 "Wrong Tryton Server Password.\n"
 "Please try again."
 msgstr ""
 
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
 msgid "Database restore failed with error message:\n"
 msgstr ""
 
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
 msgid "Database restore failed!"
 msgstr ""
 
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
 msgid "Database restored successfully!"
 msgstr ""
 
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
 msgid ""
 "It is not possible to dump a password protected Database.\n"
 "Backup and restore needed to be proceed manual."
 msgstr ""
 
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
 msgid "Database dump failed with error message:\n"
 msgstr ""
 
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
 msgid "Database dump failed!"
 msgstr ""
 
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
 msgid "Database backuped successfully!"
 msgstr ""
 
@@ -599,7 +599,7 @@ msgid "Create a new record"
 msgstr ""
 
 #: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
 msgid "Save"
 msgstr ""
 
@@ -609,7 +609,7 @@ msgstr ""
 
 #: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
 #: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
 msgid "Switch"
 msgstr ""
 
@@ -767,47 +767,29 @@ msgstr ""
 msgid "Type the Admin password again"
 msgstr ""
 
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr ""
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
 msgid "The new admin password doesn't match the confirmation field.\n"
 msgstr ""
 
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
 msgid "Passwords doesn't match!"
 msgstr ""
 
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr ""
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
 msgid ""
 "A database with the same name already exists.\n"
 "Try another database name."
 msgstr ""
 
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
 msgid "This database name already exist!"
 msgstr ""
 
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
 msgid "Sorry, wrong password for the Tryton server. Please try again."
 msgstr ""
 
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
 msgid ""
 "Can't create the database, caused by an unknown reason.\n"
 "If there is a database created, it could be broken. Maybe drop this "
@@ -815,7 +797,7 @@ msgid ""
 "Error message:\n"
 msgstr ""
 
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
 msgid "Error creating database!"
 msgstr ""
 
@@ -880,12 +862,12 @@ msgstr ""
 msgid "Profile"
 msgstr ""
 
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
 #: tryton/gui/window/win_import.py:47
 msgid "_Add"
 msgstr ""
 
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
 #: tryton/gui/window/win_import.py:55
 msgid "_Remove"
 msgstr ""
@@ -910,7 +892,7 @@ msgstr ""
 msgid "Could not connect to the server"
 msgstr ""
 
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
 msgid "Incompatible version of the server"
 msgstr ""
 
@@ -1030,8 +1012,8 @@ msgstr ""
 
 #: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
 #: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
 msgid "Previous"
 msgstr ""
 
@@ -1041,8 +1023,8 @@ msgstr ""
 
 #: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
 #: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
 msgid "Next"
 msgstr ""
 
@@ -1147,23 +1129,23 @@ msgstr ""
 msgid "Model:"
 msgstr ""
 
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
 msgid "Are you sure to remove this record?"
 msgstr ""
 
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
 msgid "Are you sure to remove those records?"
 msgstr ""
 
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
 msgid "Records not removed!"
 msgstr ""
 
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
 msgid "Records removed!"
 msgstr ""
 
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
 msgid "Working now on the duplicated record(s)!"
 msgstr ""
 
@@ -1175,59 +1157,58 @@ msgstr ""
 msgid "Invalid form!"
 msgstr ""
 
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
 msgid " of "
 msgstr ""
 
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
 msgid ""
 "This record has been modified\n"
 "do you want to save it ?"
 msgstr ""
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Action"
 msgstr ""
 
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
 msgid "Launch action"
 msgstr ""
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Relate"
 msgstr ""
 
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
 msgid "Open related records"
 msgstr ""
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Report"
 msgstr ""
 
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
 msgid "Open report"
 msgstr ""
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail"
 msgstr ""
 
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
 msgid "E-Mail report"
 msgstr ""
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print"
 msgstr ""
 
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
 msgid "Print report"
 msgstr ""
 
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
 msgid "Unknown"
 msgstr ""
 
@@ -1381,67 +1362,77 @@ msgstr ""
 msgid "_Display a new tip next time"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
 msgid "Export to CSV"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
 msgid "<b>Predefined exports</b>"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
 msgid "<b>All fields</b>"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
 msgid "Clear"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
 msgid "Save Export"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
 msgid "Delete Export"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
 msgid "<b>Fields to export</b>"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
 msgid "<b>Options</b>"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
 msgid "Open"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
 msgid "Add _field names"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
 msgid "Name"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
 msgid "What is the name of this export?"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
 #, python-format
 msgid "%d record saved!"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
 #, python-format
 msgid "%d records saved!"
 msgstr ""
 
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
 #, python-format
 msgid ""
 "Operation failed!\n"
@@ -1462,18 +1453,17 @@ msgid "Remove <Del>"
 msgstr ""
 
 #: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
 msgid "Create a new record <F3>"
 msgstr ""
 
 #: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
 msgid "Delete selected record <Del>"
 msgstr ""
 
 #: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
 msgid "Undelete selected record <Ins>"
 msgstr ""
 
@@ -1495,10 +1485,10 @@ msgstr ""
 
 #: tryton/gui/window/win_import.py:111
 #: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
 msgid "Open..."
 msgstr ""
 
@@ -1549,68 +1539,98 @@ msgstr ""
 msgid "%d records imported!"
 msgstr ""
 
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
 msgid "Wizard"
 msgstr ""
 
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr ""
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
 msgid "ID"
 msgstr ""
 
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
 msgid "Creation User"
 msgstr ""
 
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
 msgid "Creation Date"
 msgstr ""
 
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
 msgid "Modification User"
 msgstr ""
 
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
 msgid "Modification Date"
 msgstr ""
 
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
 msgid "Unable to get view tree state"
 msgstr ""
 
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
 msgid "Unable to set view tree state"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
 msgid ".."
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
 msgid "F_ilters"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
 msgid "Show bookmarks of filters"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
 msgid "Remove this bookmark"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
 msgid "Bookmark this filter"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
 msgid "Bookmark Name:"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
 msgid "Find"
 msgstr ""
 
@@ -1638,79 +1658,49 @@ msgstr ""
 msgid "Show plain text"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
 msgid "Add value"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
 #, python-format
 msgid "Remove \"%s\""
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
 msgid "Select an Image..."
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
 msgid "All files"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
 msgid "Images"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
 msgid "Add existing record"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
 msgid "Remove selected record <Del>"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
 msgid "Open a record <F2>"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
 msgid "Search a record <F2>"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
 msgid "Remove selected record"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
 msgid "Edit selected record <F2>"
 msgstr ""
 
@@ -1770,32 +1760,24 @@ msgstr ""
 msgid "Select a background color"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
 msgstr ""
 
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
 msgstr ""
 
 #: tryton/plugins/translation/__init__.py:18
diff --git a/tryton.desktop b/tryton.desktop
index c7d0b24..9339198 100644
--- a/tryton.desktop
+++ b/tryton.desktop
@@ -6,6 +6,7 @@ GenericName=Client for the Tryton Application Platform
 GenericName[ca_ES]=Client per l'aplicació Tryton
 GenericName[de]=Client für die Tryton Applikationsplattform
 GenericName[es_AR]=Cliente para la aplicación Tryton
+GenericName[es_EC]=Cliente para la aplicación Tryton
 GenericName[es_ES]=Cliente para la aplicación Tryton
 GenericName[es_CO]=Cliente para la Aplicación Tryton
 GenericName[fr]=Client de la plate-forme applicative Tryton
@@ -14,6 +15,7 @@ GenericName[sl]=Odjemalec za Tryton programsko platformo
 Comment=Access Tryton server
 Comment[de]=Verbindet zu einem Tryton Server
 Comment[es_AR]=Acceso al servidor Tryton
+Comment[es_EC]=Acceso al servidor Tryton
 Comment[ca_ES]=Accés al servidor Tryton
 Comment[es_ES]=Acceso al servidor Tryton
 Comment[es_CO]=Acceso al servidor Tryton
diff --git a/tryton.egg-info/PKG-INFO b/tryton.egg-info/PKG-INFO
index 8bd6c16..d23ca40 100644
--- a/tryton.egg-info/PKG-INFO
+++ b/tryton.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: tryton
-Version: 3.2.4
+Version: 3.4.0
 Summary: Tryton client
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: issue_tracker at tryton.org
 License: GPL-3
-Download-URL: http://downloads.tryton.org/3.2/
+Download-URL: http://downloads.tryton.org/3.4/
 Description: tryton
         ======
         
diff --git a/tryton.egg-info/SOURCES.txt b/tryton.egg-info/SOURCES.txt
index 136190b..a4daab6 100644
--- a/tryton.egg-info/SOURCES.txt
+++ b/tryton.egg-info/SOURCES.txt
@@ -56,6 +56,8 @@ share/locale/es_AR/LC_MESSAGES/tryton.mo
 share/locale/es_AR/LC_MESSAGES/tryton.po
 share/locale/es_CO/LC_MESSAGES/tryton.mo
 share/locale/es_CO/LC_MESSAGES/tryton.po
+share/locale/es_EC/LC_MESSAGES/tryton.mo
+share/locale/es_EC/LC_MESSAGES/tryton.po
 share/locale/es_ES/LC_MESSAGES/tryton.mo
 share/locale/es_ES/LC_MESSAGES/tryton.po
 share/locale/fr_FR/LC_MESSAGES/tryton.mo
@@ -169,6 +171,7 @@ tryton/common/focus.py
 tryton/common/placeholder_entry.py
 tryton/common/popup_menu.py
 tryton/common/selection.py
+tryton/common/treeviewcontrol.py
 tryton/gui/__init__.py
 tryton/gui/main.py
 tryton/gui/window/__init__.py
@@ -196,7 +199,6 @@ tryton/gui/window/window.py
 tryton/gui/window/wizard.py
 tryton/gui/window/view_board/__init__.py
 tryton/gui/window/view_board/action.py
-tryton/gui/window/view_board/parser.py
 tryton/gui/window/view_board/view_board.py
 tryton/gui/window/view_form/__init__.py
 tryton/gui/window/view_form/model/__init__.py
@@ -209,14 +211,11 @@ tryton/gui/window/view_form/view/__init__.py
 tryton/gui/window/view_form/view/calendar_.py
 tryton/gui/window/view_form/view/form.py
 tryton/gui/window/view_form/view/graph.py
-tryton/gui/window/view_form/view/interface.py
 tryton/gui/window/view_form/view/list.py
 tryton/gui/window/view_form/view/screen_container.py
-tryton/gui/window/view_form/view/widget_parse.py
 tryton/gui/window/view_form/view/calendar_gtk/__init__.py
 tryton/gui/window/view_form/view/calendar_gtk/calendar_.py
 tryton/gui/window/view_form/view/calendar_gtk/dates_period.py
-tryton/gui/window/view_form/view/calendar_gtk/parser.py
 tryton/gui/window/view_form/view/calendar_gtk/toolbar.py
 tryton/gui/window/view_form/view/form_gtk/__init__.py
 tryton/gui/window/view_form/view/form_gtk/binary.py
@@ -228,27 +227,26 @@ tryton/gui/window/view_form/view/form_gtk/float.py
 tryton/gui/window/view_form/view/form_gtk/float_time.py
 tryton/gui/window/view_form/view/form_gtk/image.py
 tryton/gui/window/view_form/view/form_gtk/integer.py
-tryton/gui/window/view_form/view/form_gtk/interface.py
 tryton/gui/window/view_form/view/form_gtk/many2many.py
 tryton/gui/window/view_form/view/form_gtk/many2one.py
 tryton/gui/window/view_form/view/form_gtk/multiselection.py
 tryton/gui/window/view_form/view/form_gtk/one2many.py
 tryton/gui/window/view_form/view/form_gtk/one2one.py
-tryton/gui/window/view_form/view/form_gtk/parser.py
 tryton/gui/window/view_form/view/form_gtk/progressbar.py
 tryton/gui/window/view_form/view/form_gtk/reference.py
 tryton/gui/window/view_form/view/form_gtk/richtextbox.py
 tryton/gui/window/view_form/view/form_gtk/selection.py
+tryton/gui/window/view_form/view/form_gtk/state_widget.py
 tryton/gui/window/view_form/view/form_gtk/textbox.py
 tryton/gui/window/view_form/view/form_gtk/url.py
+tryton/gui/window/view_form/view/form_gtk/widget.py
 tryton/gui/window/view_form/view/graph_gtk/__init__.py
 tryton/gui/window/view_form/view/graph_gtk/bar.py
 tryton/gui/window/view_form/view/graph_gtk/graph.py
 tryton/gui/window/view_form/view/graph_gtk/line.py
-tryton/gui/window/view_form/view/graph_gtk/parser.py
 tryton/gui/window/view_form/view/graph_gtk/pie.py
 tryton/gui/window/view_form/view/list_gtk/__init__.py
 tryton/gui/window/view_form/view/list_gtk/editabletree.py
-tryton/gui/window/view_form/view/list_gtk/parser.py
+tryton/gui/window/view_form/view/list_gtk/widget.py
 tryton/plugins/__init__.py
 tryton/plugins/translation/__init__.py
\ No newline at end of file
diff --git a/tryton/common/cellrendererbinary.py b/tryton/common/cellrendererbinary.py
index 792593d..a4e96c7 100644
--- a/tryton/common/cellrendererbinary.py
+++ b/tryton/common/cellrendererbinary.py
@@ -10,9 +10,9 @@ BUTTON_SPACING = 2
 
 class CellRendererBinary(gtk.GenericCellRenderer):
     __gproperties__ = {
-        'visible': (gobject.TYPE_INT, 'Visible', 'Visible', 0, 10, 0,
+        'visible': (gobject.TYPE_BOOLEAN, 'Visible', 'Visible', True,
             gobject.PARAM_READWRITE),
-        'editable': (gobject.TYPE_INT, 'Editable', 'Editable', 0, 10, 0,
+        'editable': (gobject.TYPE_BOOLEAN, 'Editable', 'Editable', False,
             gobject.PARAM_READWRITE),
         'size': (gobject.TYPE_STRING, 'Size', 'Size', '',
             gobject.PARAM_READWRITE),
@@ -31,6 +31,7 @@ class CellRendererBinary(gtk.GenericCellRenderer):
     def __init__(self, use_filename):
         self.__gobject_init__()
         self.visible = True
+        self.editable = False
         self.set_property('mode', gtk.CELL_RENDERER_MODE_EDITABLE)
         self.use_filename = use_filename
         if use_filename:
diff --git a/tryton/common/common.py b/tryton/common/common.py
index efc39ae..03e65d1 100644
--- a/tryton/common/common.py
+++ b/tryton/common/common.py
@@ -322,19 +322,17 @@ def request_server(server_widget):
     dialog.show_all()
     dialog.set_default_response(gtk.RESPONSE_OK)
 
-    url_m = re.match('^([\w.-]+):(\d{1,5})',
-        server_widget.get_text())
-    if url_m:
-        entry_server.set_text(url_m.group(1))
-        entry_port.set_text(url_m.group(2))
+    netloc = server_widget.get_text()
+    entry_server.set_text(get_hostname(netloc))
+    entry_port.set_text(str(get_port(netloc)))
 
     res = dialog.run()
     if res == gtk.RESPONSE_OK:
         host = entry_server.get_text()
-        port = int(entry_port.get_text())
-        url = '%s:%d' % (host, port)
+        port = entry_port.get_text()
+        url = '%s:%s' % (host, port)
         server_widget.set_text(url)
-        result = (host, port)
+        result = (get_hostname(url), get_port(url))
     parent.present()
     dialog.destroy()
     return result
@@ -1067,7 +1065,6 @@ def process_exception(exception, *args, **kwargs):
                 'until its fingerprint is fixed.'), _('Security risk!'))
             from tryton.gui.main import Main
             Main.sig_quit()
-            sys.exit()
         elif exception.faultCode == 'NotLogged':
             if rpc.CONNECTION is None:
                 message(_('Connection error!\n'
@@ -1131,8 +1128,7 @@ def process_exception(exception, *args, **kwargs):
                 while True:
                     password = ask(_('Password:'), visibility=False)
                     if password is None:
-                        Main.get_main().sig_logout()
-                        return False
+                        Main.get_main().sig_quit()
                     res = rpc.login(rpc._USERNAME, password, hostname, port,
                             rpc._DATABASE)
                     if res == -1:
@@ -1534,3 +1530,55 @@ def humanize(size):
         if size < 1000:
             return '%3.1f%s' % (size, x)
         size /= 1000.0
+
+
+def get_hostname(netloc):
+    if '[' in netloc and ']' in netloc:
+        return netloc.split(']')[0][1:]
+    elif ':' in netloc:
+        return netloc.split(':')[0]
+    else:
+        return netloc
+
+
+def get_port(netloc):
+    netloc = netloc.split(']')[-1]
+    if ':' in netloc:
+        try:
+            return int(netloc.split(':')[1])
+        except ValueError:
+            pass
+    return 8000
+
+
+def resize_pixbuf(pixbuf, width, height):
+    img_height = pixbuf.get_height()
+    height = min(img_height, height) if height != -1 else img_height
+    img_width = pixbuf.get_width()
+    width = min(img_width, width) if width != -1 else img_width
+
+    if img_width / width < img_height / height:
+        width = float(img_width) / float(img_height) * float(height)
+    else:
+        height = float(img_height) / float(img_width) * float(width)
+    return pixbuf.scale_simple(int(width), int(height),
+        gtk.gdk.INTERP_BILINEAR)
+
+
+def _data2pixbuf(data):
+    loader = gtk.gdk.PixbufLoader()
+    loader.write(data, len(data))
+    loader.close()
+    return loader.get_pixbuf()
+
+BIG_IMAGE_SIZE = 10 ** 6
+with open(os.path.join(PIXMAPS_DIR, 'tryton-noimage.png'), 'rb') as no_image:
+    NO_IMG_PIXBUF = _data2pixbuf(no_image.read())
+
+
+def data2pixbuf(data):
+    try:
+        pixbuf = _data2pixbuf(data)
+    except glib.GError:
+        pixbuf = NO_IMG_PIXBUF
+    return pixbuf
diff --git a/tryton/common/domain_parser.py b/tryton/common/domain_parser.py
index 935b245..6006702 100644
--- a/tryton/common/domain_parser.py
+++ b/tryton/common/domain_parser.py
@@ -117,12 +117,20 @@ def quote(value):
     "Quote string if needed"
     if not isinstance(value, basestring):
         return value
+    if '"' in value:
+        value = value.replace('"', '\\"')
     for test in (':', ' ', '(', ')') + OPERATORS:
         if test in value:
             return '"%s"' % value
     return value
 
 
+def test_quote():
+    assert quote('test') == 'test'
+    assert quote('foo bar') == '"foo bar"'
+    assert quote('"foo"') == '\\\"foo\\\"'
+
+
 def ending_clause(domain, deep=0):
     "Return the ending clause"
     if not domain:
@@ -1082,7 +1090,7 @@ class DomainParser(object):
                             rvalue = convert_value(field, rvalue)
                             yield iter([
                                     (field_name, '>=', lvalue),
-                                    (field_name, '<', rvalue),
+                                    (field_name, '<=', rvalue),
                                     ])
                             continue
                     if isinstance(value, list):
@@ -1284,6 +1292,9 @@ def test_group():
         ('Name', '=', None),
         ('Name', None, 'Doe'),
         ]
+    assert rlist(dom.group(udlex(u'Name: \\"foo\\"'))) == [
+        ('Name', None, '"foo"'),
+        ]
 
 
 def test_parse_clause():
@@ -1355,7 +1366,7 @@ def test_parse_clause():
         ]
     assert rlist(dom.parse_clause([('Integer', None, '3..5')])) == [[
             ('integer', '>=', 3),
-            ('integer', '<', 5),
+            ('integer', '<=', 5),
             ]]
     assert rlist(dom.parse_clause([('Reference', None, 'foo')])) == [
         ('reference', 'ilike', '%foo%'),
diff --git a/tryton/common/focus.py b/tryton/common/focus.py
index c2150f9..9d54df1 100644
--- a/tryton/common/focus.py
+++ b/tryton/common/focus.py
@@ -1,5 +1,8 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
+from functools import cmp_to_key
+
+import gtk
 
 
 def get_invisible_ancestor(widget):
@@ -21,6 +24,23 @@ def find_focused_child(widget):
             return focused_widget
 
 
+def tab_compare(a, b):
+    text_direction = gtk.widget_get_default_direction()
+    y1 = a.allocation.y + a.allocation.height // 2
+    y2 = b.allocation.y + b.allocation.height // 2
+
+    if y1 == y2:
+        x1 = a.allocation.x + a.allocation.width // 2
+        x2 = b.allocation.x + b.allocation.width // 2
+
+        if text_direction == gtk.TEXT_DIR_RTL:
+            return (x2 > x1) - (x2 < x1)
+        else:
+            return (x1 > x2) - (x1 < x2)
+    else:
+        return (y1 > y2) - (y1 < y2)
+
+
 def find_focusable_child(widget):
     if not widget.get_visible():
         return None
@@ -33,7 +53,7 @@ def find_focusable_child(widget):
     # search into all its children widgets
     widgets = (focus_chain
         if focus_chain is not None
-        else widget.get_children())
+        else sorted(widget.get_children(), key=cmp_to_key(tab_compare)))
     for child in widgets:
         focusable = find_focusable_child(child)
         if focusable:
diff --git a/tryton/common/selection.py b/tryton/common/selection.py
index a05ed71..fe62052 100644
--- a/tryton/common/selection.py
+++ b/tryton/common/selection.py
@@ -21,17 +21,18 @@ class SelectionMixin(object):
         self._values2selection = {}
         self._domain_cache = {}
 
-    def init_selection(self, key=None):
-        if key is None:
-            key = tuple(sorted((k, None)
-                    for k in self.attrs.get('selection_change_with') or []))
+    def init_selection(self, value=None):
+        if value is None:
+            value = dict((k, None)
+                for k in self.attrs.get('selection_change_with') or [])
+        key = freeze_value(value)
         selection = self.attrs.get('selection', [])[:]
         if (not isinstance(selection, (list, tuple))
                 and key not in self._values2selection):
             try:
                 if self.attrs.get('selection_change_with'):
                     selection = RPCExecute('model', self.model_name, selection,
-                        dict(key))
+                        value)
                 else:
                     selection = RPCExecute('model', self.model_name, selection)
             except RPCException:
@@ -55,15 +56,13 @@ class SelectionMixin(object):
             domain = []
         if 'relation' not in self.attrs:
             change_with = self.attrs.get('selection_change_with') or []
-            args = record._get_on_change_args(change_with)
-            del args['id']
-            key = args.items()
-            key.sort()
-            self.init_selection(tuple(key))
+            value = record._get_on_change_args(change_with)
+            del value['id']
+            self.init_selection(value)
             self.filter_selection(domain, record, field)
         else:
-            context = record[self.field_name].context_get(record)
-            domain_cache_key = str(domain) + str(context)
+            context = field.context_get(record)
+            domain_cache_key = (freeze_value(domain), freeze_value(context))
             if domain_cache_key in self._domain_cache:
                 self.selection = self._domain_cache[domain_cache_key]
                 self._last_domain = (domain, context)
@@ -123,6 +122,16 @@ def selection_shortcuts(entry):
     return entry
 
 
+def freeze_value(value):
+    if isinstance(value, dict):
+        return tuple(sorted((k, freeze_value(v))
+                for k, v in value.iteritems()))
+    elif isinstance(value, (list, set)):
+        return tuple(freeze_value(v) for v in value)
+    else:
+        return value
+
+
 class PopdownMixin(object):
 
     def set_popdown(self, selection, entry):
@@ -190,3 +199,10 @@ class PopdownMixin(object):
                 return False
         entry.set_active(active)
         return True
+
+
+def test_freeze_value():
+    assert freeze_value({'foo': 'bar'}) == (('foo', 'bar'),)
+    assert freeze_value([1, 42, 2, 3]) == (1, 42, 2, 3)
+    assert freeze_value('foo') == 'foo'
+    assert freeze_value({'foo': {'bar': 42}}) == (('foo', (('bar', 42),)),)
diff --git a/tryton/common/treeviewcontrol.py b/tryton/common/treeviewcontrol.py
new file mode 100644
index 0000000..79c4192
--- /dev/null
+++ b/tryton/common/treeviewcontrol.py
@@ -0,0 +1,32 @@
+# This file is part of Tryton.  The COPYRIGHT file at the top level of this
+# repository contains the full copyright notices and license terms.
+import gtk
+import gobject
+
+MOVEMENT_KEYS = {gtk.keysyms.Up, gtk.keysyms.Down, gtk.keysyms.space,
+    gtk.keysyms.Left, gtk.keysyms.KP_Left,
+    gtk.keysyms.Right, gtk.keysyms.KP_Right,
+    gtk.keysyms.Home, gtk.keysyms.KP_Home,
+    gtk.keysyms.End, gtk.keysyms.KP_End}
+
+__all__ = ['TreeViewControl']
+
+
+class TreeViewControl(gtk.TreeView):
+    __gsignals__ = {
+        'button-press-event': 'override',
+        'key-press-event': 'override',
+        }
+
+    def do_button_press_event(self, event):
+        self.grab_focus()  # grab focus because it doesn't whith CONTROL MASK
+        if event.button == 1:
+            event.state ^= gtk.gdk.CONTROL_MASK
+        return gtk.TreeView.do_button_press_event(self, event)
+
+    def do_key_press_event(self, event):
+        if event.keyval in MOVEMENT_KEYS:
+            event.state ^= gtk.gdk.CONTROL_MASK
+        return gtk.TreeView.do_key_press_event(self, event)
+
+gobject.type_register(TreeViewControl)
diff --git a/tryton/config.py b/tryton/config.py
index f6a6d58..cbd13de 100644
--- a/tryton/config.py
+++ b/tryton/config.py
@@ -10,6 +10,7 @@ import logging
 import sys
 import locale
 import gtk
+import site
 
 from tryton.exceptions import TrytonError
 
@@ -179,9 +180,11 @@ else:
     CURRENT_DIR = os.path.abspath(os.path.normpath(os.path.join(
         unicode(os.path.dirname(__file__), sys.getfilesystemencoding()),
         '..')))
-PIXMAPS_DIR = os.path.join(CURRENT_DIR, 'share', 'pixmaps', 'tryton')
-if not os.path.isdir(PIXMAPS_DIR):
-    PIXMAPS_DIR = os.path.join(sys.prefix, 'share', 'pixmaps', 'tryton')
+
+for dir in [CURRENT_DIR, site.USER_BASE, sys.prefix]:
+    PIXMAPS_DIR = os.path.join(dir, 'share', 'pixmaps', 'tryton')
+    if os.path.isdir(PIXMAPS_DIR):
+        break
 
 TRYTON_ICON = gtk.gdk.pixbuf_new_from_file(
         os.path.join(PIXMAPS_DIR, 'tryton-icon.png').encode('utf-8'))
diff --git a/tryton/gui/main.py b/tryton/gui/main.py
index c7c3d42..fcdaec0 100644
--- a/tryton/gui/main.py
+++ b/tryton/gui/main.py
@@ -144,9 +144,6 @@ class Main(object):
         self.menuitem_user = None
         self.menuitem_favorite = None
 
-        if self.macapp is not None:
-            self.macapp.ready()
-
         self.buttons = {}
 
         self.pane = gtk.HPaned()
@@ -204,6 +201,9 @@ class Main(object):
         # Register plugins
         tryton.plugins.register()
 
+        if self.macapp is not None:
+            self.macapp.ready()
+
         _MAIN.append(self)
 
     def set_menubar(self):
@@ -358,9 +358,9 @@ class Main(object):
                 widget.emit('changed')
                 end()
 
-            RPCExecute('model', 'ir.model', 'global_search',
-                    search_text, CONFIG['client.limit'],
-                    self.menu_screen.model_name, callback=set_result)
+            RPCExecute('model', 'ir.model', 'global_search', search_text,
+                CONFIG['client.limit'], self.menu_screen.model_name,
+                context=self.menu_screen.context, callback=set_result)
             return False
 
         def changed(widget):
@@ -764,7 +764,7 @@ class Main(object):
 
     def favorite_set(self):
         if not self.menu_screen:
-            return
+            return False
 
         def _action_favorite(widget, id_):
             Action.exec_keyword('tree_open', {
@@ -801,12 +801,19 @@ class Main(object):
         menu.add(manage_favorites)
         menu.show_all()
         self.menuitem_favorite.set_submenu(menu)
+        return True
 
     def favorite_unset(self):
+        had_submenu = self.menuitem_favorite.get_submenu()
         self.menuitem_favorite.remove_submenu()
         # Set a submenu to get keyboard shortcut working
         self.menuitem_favorite.set_submenu(gtk.Menu())
 
+        if self.macapp and had_submenu:
+            # As the select event is not managed by the mac menu,
+            # it is done using a timeout
+            gobject.timeout_add(1000, lambda: not self.favorite_set())
+
     def sig_accel_change(self, value):
         CONFIG['client.can_change_accelerators'] = value
         return self.sig_accel()
@@ -1044,21 +1051,23 @@ class Main(object):
         elif action.get('view_id', False):
             view_ids = [action['view_id'][0]]
         ctx = rpc.CONTEXT.copy()
-        domain = PYSONDecoder(ctx).decode(action['pyson_domain'])
-        screen = Screen(action['res_model'], mode=['tree'],
-            view_ids=view_ids, domain=domain, readonly=True)
+        decoder = PYSONDecoder(ctx)
+        action_ctx = decoder.decode(action.get('pyson_context') or '{}')
+        domain = decoder.decode(action['pyson_domain'])
+        screen = Screen(action['res_model'], mode=['tree'], view_ids=view_ids,
+            domain=domain, context=action_ctx, readonly=True)
         # Use alternate view to not show search box
         screen.screen_container.alternate_view = True
         screen.switch_view(view_type=screen.current_view.view_type)
 
         vbox.pack_start(screen.screen_container.alternate_viewport, True, True)
-        screen.current_view.widget_tree.set_headers_visible(False)
+        treeview = screen.current_view.treeview
+        treeview.set_headers_visible(False)
 
         self.menu_expander.add(vbox)
         self.menu_expander.show()
 
         # Favorite column
-        treeview = screen.current_view.widget_tree
         column = gtk.TreeViewColumn()
         column.name = None
         column._type = None
@@ -1123,6 +1132,7 @@ class Main(object):
         gtk.accel_map_save(os.path.join(get_config_dir(), 'accel.map'))
 
         cls.tryton_client.quit_mainloop()
+        sys.exit()
 
     def sig_close(self, widget, event=None):
         if not self.sig_logout(widget):
@@ -1139,14 +1149,6 @@ class Main(object):
     def sig_window_state(self, widget, event):
         CONFIG['client.maximize'] = (event.new_window_state ==
                 gtk.gdk.WINDOW_STATE_MAXIMIZED)
-
-        if event.new_window_state == gtk.gdk.WINDOW_STATE_ICONIFIED:
-            meth = 'iconify'
-        else:
-            meth = 'deiconify'
-        for toplevel in gtk.window_list_toplevels():
-            getattr(toplevel, meth)()
-
         return False
 
     def win_add(self, page, hide_current=False, allow_similar=True):
diff --git a/tryton/gui/window/dbcreate.py b/tryton/gui/window/dbcreate.py
index 739bcf9..6dd4ee3 100644
--- a/tryton/gui/window/dbcreate.py
+++ b/tryton/gui/window/dbcreate.py
@@ -3,7 +3,7 @@
 import gtk
 import gobject
 import gettext
-import re
+
 import tryton.common as common
 from tryton.config import CONFIG, TRYTON_ICON
 from tryton.exceptions import TrytonServerError
@@ -320,95 +320,72 @@ class DBCreate(object):
             self.dialog.props.sensitive = True
             res = self.dialog.run()
             dbname = self.entry_dbname.get_text()
-            url = self.entry_server_connection.get_text()
-            url_m = re.match('^([\w.\-]+):(\d{1,5})', url or '')
+            netloc = self.entry_server_connection.get_text()
+            host = common.get_hostname(netloc)
+            port = common.get_port(netloc)
             langidx = self.combo_language.get_active_iter()
             langreal = langidx \
                 and self.combo_language.get_model().get_value(langidx, 1)
             passwd = pass_widget.get_text()
             if res == gtk.RESPONSE_OK:
-                if (not dbname
-                        or not re.match('^[a-zA-Z0-9_]+$', dbname)):
-                    common.warning(_('The database name is restricted to '
-                            'alpha-nummerical characters '
-                            'and "_" (underscore). '
-                            'Avoid all accents, space '
-                            'and any other special characters.'),
-                        _('Wrong characters in database name!'))
-                    continue
-                elif admin_passwd.get_text() != admin_passwd2.get_text():
+                if admin_passwd.get_text() != admin_passwd2.get_text():
                     common.warning(
                         _("The new admin password "
                             "doesn't match the confirmation field.\n"),
                         _("Passwords doesn't match!"))
                     continue
-                elif not admin_passwd.get_text():
-                    common.warning(_("Admin password and confirmation are "
-                            "required to create a new database."),
-                        _('Missing admin password!'))
+                try:
+                    exist = rpc.db_exec(host, port, 'db_exist', dbname)
+                except TrytonServerError, exception:
+                    common.process_exception(exception)
                     continue
-                elif url_m.group(1) \
-                        and int(url_m.group(2)) \
-                        and dbname \
-                        and langreal \
-                        and passwd \
-                        and admin_passwd.get_text():
+                if exist:
+                    common.warning(_("A database with the same name "
+                            "already exists.\n"
+                            "Try another database name."),
+                        _("This database name already exist!"))
+                    self.entry_dbname.set_text("")
+                    self.entry_dbname.grab_focus()
+                    continue
+                else:  # Everything runs fine, break the block here
+                    self.dialog.props.sensitive = False
                     try:
-                        exist = rpc.db_exec(url_m.group(1),
-                                int(url_m.group(2)), 'db_exist', dbname)
+                        rpcprogress = common.RPCProgress('db_exec',
+                            (host, port, 'create', dbname, passwd, langreal,
+                                admin_passwd.get_text()))
+                        rpcprogress.run(False)
                     except TrytonServerError, exception:
-                        common.process_exception(exception)
-                        continue
-                    if exist:
-                        common.warning(_("A database with the same name "
-                                "already exists.\n"
-                                "Try another database name."),
-                            _("This database name already exist!"))
-                        self.entry_dbname.set_text("")
-                        self.entry_dbname.grab_focus()
-                        continue
-                    else:  # Everything runs fine, break the block here
-                        host = url_m.group(1)
-                        port = url_m.group(2)
-                        self.dialog.props.sensitive = False
-                        try:
-                            rpcprogress = common.RPCProgress('db_exec',
-                                    (host, int(port), 'create', dbname, passwd,
-                                        langreal, admin_passwd.get_text()))
-                            rpcprogress.run(False)
-                        except TrytonServerError, exception:
-                            if str(exception.faultCode) == "AccessDenied":
-                                common.warning(_("Sorry, wrong password for "
-                                        "the Tryton server. "
-                                        "Please try again."),
-                                    _("Access denied!"))
-                                self.entry_serverpasswd.set_text("")
-                                self.entry_serverpasswd.grab_focus()
-                                continue
-                            else:  # Unclassified error
-                                common.warning(_("Can't create the "
-                                    "database, caused by an unknown reason.\n"
-                                    "If there is a database created, it could "
-                                    "be broken. Maybe drop this database! "
-                                    "Please check the error message for "
-                                    "possible informations.\n"
-                                    "Error message:\n")
-                                    + str(exception.faultCode),
-                                    _("Error creating database!"))
-                            parent.present()
-                            self.dialog.destroy()
-                            rpc.logout()
-                            break
+                        if str(exception.faultCode) == "AccessDenied":
+                            common.warning(_("Sorry, wrong password for "
+                                    "the Tryton server. "
+                                    "Please try again."),
+                                _("Access denied!"))
+                            self.entry_serverpasswd.set_text("")
+                            self.entry_serverpasswd.grab_focus()
+                            continue
+                        else:  # Unclassified error
+                            common.warning(_("Can't create the "
+                                "database, caused by an unknown reason.\n"
+                                "If there is a database created, it could "
+                                "be broken. Maybe drop this database! "
+                                "Please check the error message for "
+                                "possible informations.\n"
+                                "Error message:\n")
+                                + str(exception.faultCode),
+                                _("Error creating database!"))
                         parent.present()
                         self.dialog.destroy()
-                        if self.sig_login:
-                            CONFIG['login.server'] = host
-                            CONFIG['login.port'] = port
-                            CONFIG['login.db'] = dbname
-                            CONFIG['login.login'] = 'admin'
-                            self.sig_login()
+                        rpc.logout()
                         break
-
+                    parent.present()
+                    self.dialog.destroy()
+                    if self.sig_login:
+                        CONFIG['login.server'] = host
+                        CONFIG['login.port'] = str(port)
+                        CONFIG['login.db'] = dbname
+                        CONFIG['login.login'] = 'admin'
+                        self.sig_login()
+                    break
             break
         parent.present()
         self.dialog.destroy()
diff --git a/tryton/gui/window/dblogin.py b/tryton/gui/window/dblogin.py
index 272d95e..5a6cae6 100644
--- a/tryton/gui/window/dblogin.py
+++ b/tryton/gui/window/dblogin.py
@@ -528,9 +528,9 @@ class DBLogin(object):
 
     def clear_profile_combo(self, entry, event):
         netloc = self.entry_host.get_text()
-        host = self.get_hostname(netloc)
+        host = common.get_hostname(netloc)
         try:
-            port = str(self.get_port(netloc))
+            port = str(common.get_port(netloc))
         except ValueError:
             host = ''
             port = ''
@@ -555,21 +555,6 @@ class DBLogin(object):
         self.entry_database.props.visible = visibility
         self.label_database.props.visible = visibility
 
-    def get_hostname(self, netloc):
-        if '[' in netloc and ']' in netloc:
-            return netloc.split(']')[0][1:]
-        elif ':' in netloc:
-            return netloc.split(':')[0]
-        else:
-            return netloc
-
-    def get_port(self, netloc):
-        netloc = netloc.split(']')[-1]
-        if ':' in netloc:
-            return int(netloc.split(':')[1])
-        else:
-            return 8000
-
     def run(self):
         profile_name = CONFIG['login.profile']
         can_use_profile = self.profiles.has_section(profile_name)
@@ -620,9 +605,9 @@ class DBLogin(object):
                 profile = self.profile_store[active_profile][0]
                 CONFIG['login.profile'] = profile
             netloc = self.entry_host.get_text()
-            host = self.get_hostname(netloc)
+            host = common.get_hostname(netloc)
             try:
-                port = self.get_port(netloc)
+                port = common.get_port(netloc)
             except ValueError:
                 continue
             try:
diff --git a/tryton/gui/window/form.py b/tryton/gui/window/form.py
index 76caded..e347dd8 100644
--- a/tryton/gui/window/form.py
+++ b/tryton/gui/window/form.py
@@ -273,6 +273,10 @@ class Form(SignalEvent, TabContent):
             return
         revision = self.screen.context.get('_datetime')
         revision = Revision(revisions, revision).run()
+        # Prevent too old revision in form view
+        if (self.screen.current_view.view_type == 'form'
+                and revision < revisions[-1][0]):
+                revision = revisions[-1][0]
         if revision != self.screen.context.get('_datetime'):
             self.screen.clear()
             # Update root group context that will be propagated
@@ -311,20 +315,13 @@ class Form(SignalEvent, TabContent):
                 self.message_info(_('Records removed!'), 'green')
 
     def sig_import(self, widget=None):
-        while(self.screen.view_to_load):
-            self.screen.load_view_to_load()
-        fields = {}
-        for name, field in self.screen.group.fields.iteritems():
-            fields[name] = field.attrs
         WinImport(self.model, self.screen.context)
 
     def sig_save_as(self, widget=None):
-        while self.screen.view_to_load:
-            self.screen.load_view_to_load()
-        fields = {}
-        for name, field in self.screen.group.fields.iteritems():
-            fields[name] = field.attrs
-        WinExport(self.model, self.ids_get(), context=self.screen.context)
+        export = WinExport(self.model, self.ids_get(),
+            context=self.screen.context)
+        for name in self.screen.current_view.get_fields():
+            export.sel_field(name)
 
     def sig_new(self, widget=None, autosave=True):
         if not common.MODELACCESS[self.model]['create']:
@@ -346,6 +343,9 @@ class Form(SignalEvent, TabContent):
             'green')
 
     def sig_save(self, widget=None):
+        if widget:
+            # Called from button so we must save the tree state
+            self.screen.save_tree_state()
         if not common.MODELACCESS[self.model]['write']:
             return
         if self.screen.save_current():
@@ -370,11 +370,13 @@ class Form(SignalEvent, TabContent):
         self.activate_save()
 
     def sig_reload(self, test_modified=True):
-        if test_modified and not self.modified_save():
+        if test_modified:
+            if not self.modified_save():
                 return False
+        else:
+            self.screen.save_tree_state(store=False)
         self.screen.cancel_current()
         set_cursor = False
-        self.screen.save_tree_state(store=False)
         record_id = (self.screen.current_record.id
             if self.screen.current_record else None)
         if self.screen.current_view.view_type != 'form':
diff --git a/tryton/gui/window/view_board/action.py b/tryton/gui/window/view_board/action.py
index 77b17c0..747815d 100644
--- a/tryton/gui/window/view_board/action.py
+++ b/tryton/gui/window/view_board/action.py
@@ -94,7 +94,7 @@ class Action(SignalEvent):
             return
 
         if (self.screen.current_view.view_type == 'tree' and
-                self.screen.current_view.widget_tree.keyword_open):
+                self.screen.current_view.treeview.keyword_open):
             GenericAction.exec_keyword('tree_open', {
                 'model': self.screen.model_name,
                 'id': self.screen.id_get(),
diff --git a/tryton/gui/window/view_board/parser.py b/tryton/gui/window/view_board/parser.py
deleted file mode 100644
index e22021c..0000000
--- a/tryton/gui/window/view_board/parser.py
+++ /dev/null
@@ -1,161 +0,0 @@
-#This file is part of Tryton.  The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-'Parser'
-import gtk
-import gettext
-from tryton.gui.window.view_form.view.form_gtk.parser import _container, VBox
-import tryton.common as common
-from action import Action
-from tryton.config import CONFIG
-
-_ = gettext.gettext
-
-
-class ParserBoard(object):
-
-    def __init__(self, context=None):
-        self.title = None
-        self.context = context
-
-    def parse(self, root_node, notebook=None, paned=None, tooltips=None):
-        widgets = []
-
-        attrs = common.node_attributes(root_node)
-        if not tooltips:
-            tooltips = common.Tooltips()
-
-        container = _container(tooltips)
-        container.new(col=int(attrs.get('col', 4)))
-
-        if not self.title:
-            self.title = attrs.get('string', 'Unknown')
-
-        for node in root_node.childNodes:
-            if not node.nodeType == node.ELEMENT_NODE:
-                continue
-            attrs = common.node_attributes(node)
-            yexpand = int(attrs.get('yexpand', 0))
-            yfill = int(attrs.get('yfill', 0))
-            xexpand = int(attrs.get('xexpand', 1))
-            xfill = int(attrs.get('xfill', 1))
-            colspan = int(attrs.get('colspan', 1))
-            if node.localName == 'image':
-                common.ICONFACTORY.register_icon(attrs['name'])
-                icon = gtk.Image()
-                icon.set_from_stock(attrs['name'], gtk.ICON_SIZE_DIALOG)
-                container.wid_add(icon,
-                    help_tip=attrs.get('help', False),
-                    colspan=colspan,
-                    yexpand=yexpand, yfill=yfill, ypadding=10,
-                    xexpand=xexpand, xfill=xfill)
-            elif node.localName == 'separator':
-                text = attrs.get('string', '')
-                vbox = VBox(attrs=attrs)
-                if text:
-                    label = gtk.Label(text)
-                    label.set_use_markup(True)
-                    label.set_alignment(float(attrs.get('align', 0.0)), 0.5)
-                    vbox.pack_start(label)
-                vbox.pack_start(gtk.HSeparator())
-                container.wid_add(vbox,
-                    help_tip=attrs.get('help', False),
-                    colspan=colspan,
-                    yexpand=yexpand, yfill=yfill, ypadding=10,
-                    xexpand=xexpand, xfill=xfill)
-            elif node.localName == 'label':
-                text = attrs.get('string', '')
-                if not text:
-                    container.empty_add(int(attrs.get('colspan', 1)))
-                    continue
-                label = gtk.Label(text)
-                label.set_use_markup(True)
-                label.set_alignment(float(attrs.get('xalign', 1.0)),
-                    float(attrs.get('yalign', 0.0)))
-                label.set_angle(int(attrs.get('angle', 0)))
-                xexpand = bool(attrs.get('xexpand', 0))
-                container.wid_add(label,
-                    help_tip=attrs.get('help', False),
-                    colspan=colspan,
-                    yexpand=yexpand, yfill=yfill,
-                    xexpand=xexpand, xfill=xfill)
-            elif node.localName == 'newline':
-                container.newline()
-            elif node.localName == 'notebook':
-                notebook = gtk.Notebook()
-                if CONFIG['client.form_tab'] == 'top':
-                    pos = gtk.POS_TOP
-                elif CONFIG['client.form_tab'] == 'left':
-                    pos = gtk.POS_LEFT
-                elif CONFIG['client.form_tab'] == 'right':
-                    pos = gtk.POS_RIGHT
-                elif CONFIG['client.form_tab'] == 'bottom':
-                    pos = gtk.POS_BOTTOM
-                notebook.set_tab_pos(pos)
-                notebook.set_border_width(3)
-                container.wid_add(notebook,
-                    colspan=int(attrs.get('colspan', 4)),
-                    yexpand=True, yfill=True)
-                widget, new_widgets = self.parse(node, notebook,
-                    tooltips=tooltips)
-                widgets += new_widgets
-            elif node.localName == 'page':
-                if CONFIG['client.form_tab'] == 'left':
-                    angle = 90
-                elif CONFIG['client.form_tab'] == 'right':
-                    angle = -90
-                else:
-                    angle = 0
-                label = gtk.Label(attrs.get('string', _('No String Attr.')))
-                label.set_angle(angle)
-                widget, new_widgets = self.parse(node, notebook,
-                    tooltips=tooltips)
-                widgets += new_widgets
-                notebook.append_page(widget, label)
-            elif node.localName == 'group':
-                widget, new_widgets = self.parse(node, tooltips=tooltips)
-                widgets += new_widgets
-                if attrs.get('string', None):
-                    frame = gtk.Frame(attrs['string'])
-                    frame.add(widget)
-                else:
-                    frame = widget
-                container.wid_add(frame,
-                    colspan=colspan,
-                    yexpand=yexpand, yfill=yfill, ypadding=0,
-                    xexpand=xexpand, xfill=xfill, xpadding=0)
-            elif node.localName == 'hpaned':
-                hpaned = gtk.HPaned()
-                container.wid_add(hpaned, colspan=int(attrs.get('colspan', 4)),
-                        yexpand=True, yfill=True)
-                widget, new_widgets = self.parse(node, paned=hpaned,
-                    tooltips=tooltips)
-                widgets += new_widgets
-                if 'position' in attrs:
-                    hpaned.set_position(int(attrs['position']))
-            elif node.localName == 'vpaned':
-                vpaned = gtk.VPaned()
-                container.wid_add(vpaned, colspan=int(attrs.get('colspan', 4)),
-                        yexpand=True, yfill=True)
-                widget, new_widgets = self.parse(node, paned=vpaned,
-                    tooltips=tooltips)
-                widgets += new_widgets
-                if 'position' in attrs:
-                    vpaned.set_position(int(attrs['position']))
-            elif node.localName == 'child':
-                widget, new_widgets = self.parse(node, paned=paned,
-                    tooltips=tooltips)
-                widgets += new_widgets
-                if not paned.get_child1():
-                    paned.pack1(widget, resize=True, shrink=True)
-                elif not paned.get_child2():
-                    paned.pack2(widget, resize=True, shrink=True)
-            elif node.localName == 'action':
-                widget_act = Action(attrs, self.context)
-                widgets.append(widget_act)
-                yexpand = bool(attrs.get('yexpand', 1))
-                yfill = bool(attrs.get('yfill', 1))
-                container.wid_add(widget_act.widget,
-                    colspan=colspan,
-                    yexpand=yexpand, yfill=yfill,
-                    xexpand=xexpand, xfill=xfill)
-        return container.pop(), widgets
diff --git a/tryton/gui/window/view_board/view_board.py b/tryton/gui/window/view_board/view_board.py
index 688e0cf..10d3ddb 100644
--- a/tryton/gui/window/view_board/view_board.py
+++ b/tryton/gui/window/view_board/view_board.py
@@ -1,10 +1,15 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-'View board'
+import gtk
+import gettext
 
 import xml.dom.minidom
-from parser import ParserBoard
-from tryton.gui.window.view_board.action import Action
+from tryton.gui.window.view_form.view.form import Container
+from tryton.common import node_attributes, ICONFACTORY
+from tryton.config import CONFIG
+from .action import Action
+
+_ = gettext.gettext
 
 
 class ViewBoard(object):
@@ -12,21 +17,174 @@ class ViewBoard(object):
 
     def __init__(self, arch, context=None):
         self.context = context
+        self.widgets = []
+        self.actions = []
 
         xml_dom = xml.dom.minidom.parseString(arch)
-        parser = ParserBoard(context)
         for node in xml_dom.childNodes:
-            if not node.nodeType == node.ELEMENT_NODE:
-                continue
-            self.widget, self.widgets = parser.parse(node)
-            break
-        self.actions = [x for x in self.widgets if isinstance(x, Action)]
-        for action in self.actions:
-            action.signal_connect(self, 'active-changed',
-                    self._active_changed)
+            if node.nodeType == node.ELEMENT_NODE:
+                break
+
+        self.attributes = node_attributes(node)
+        self.widget = self.parse(node).table
         self.widget.show_all()
+
         self._active_changed(None)
 
+    def parse(self, node, container=None):
+        if not container:
+            node_attrs = node_attributes(node)
+            container = Container(int(node_attrs.get('col', 4)))
+        for node in node.childNodes:
+            if node.nodeType != node.ELEMENT_NODE:
+                continue
+            node_attrs = node_attributes(node)
+            for i_field in ('yexpand', 'yfill', 'xexpand', 'xfill', 'colspan',
+                    'position'):
+                if i_field in node_attrs:
+                    node_attrs[i_field] = int(node_attrs[i_field])
+
+            parser = getattr(self, '_parse_%s' % node.tagName)
+            parser(node, container, node_attrs)
+        return container
+
+    def _parse_image(self, node, container, attributes):
+        ICONFACTORY.register_icon(attributes['name'])
+        image = gtk.Image()
+        image.set_from_stock(attributes['name'], gtk.ICON_SIZE_DIALOG)
+        container.add(image, attributes)
+
+    def _parse_separator(self, node, container, attributes):
+        vbox = gtk.VBox()
+        if attributes.get('string'):
+            label = gtk.Label(attributes['string'])
+            label.set_alignment(float(attributes.get('xalign', 0.0)),
+                float(attributes.get('yalign', 0.5)))
+            vbox.pack_start(label)
+        vbox.pack_start(gtk.HSeparator())
+        container.add(vbox, attributes)
+
+    def _parse_label(self, node, container, attributes):
+        if not attributes.get('string'):
+            container.add(None, attributes)
+            return
+        label = gtk.Label(attributes['string'])
+        label.set_alignment(float(attributes.get('xalign', 0.0)),
+            float(attributes.get('yalign', 0.5)))
+        label.set_angle(int(attributes.get('angle', 0)))
+        attributes.setdefault('xexpand', 0)
+        container.add(label, attributes)
+
+    def _parse_newline(self, node, container, attributes):
+        container.add_row()
+
+    def _parse_notebook(self, node, container, attributes):
+        attributes.setdefault('yexpand', True)
+        attributes.setdefault('yfill', True)
+        notebook = gtk.Notebook()
+        notebook.set_scrollable(True)
+        positions = {
+            'top': gtk.POS_TOP,
+            'left': gtk.POS_LEFT,
+            'right': gtk.POS_RIGHT,
+            'bottom': gtk.POS_BOTTOM,
+            }
+        notebook.set_tab_pos(positions[CONFIG['client.form_tab']])
+        container.add(notebook, attributes)
+        self.parse(node, notebook)
+
+    def _parse_page(self, node, notebook, attributes):
+        if CONFIG['client.form_tab'] == 'left':
+            angle = 90
+            tab_box = gtk.VBox(spacing=3)
+            image_pos, image_rotate = ('end',
+                gtk.gdk.PIXBUF_ROTATE_COUNTERCLOCKWISE)
+        elif CONFIG['client.form_tab'] == 'right':
+            angle = -90
+            tab_box = gtk.VBox(spacing=3)
+            image_pos, image_rotate = ('start',
+                gtk.gdk.PIXBUF_ROTATE_CLOCKWISE)
+        else:
+            angle = 0
+            tab_box = gtk.HBox(spacing=3)
+            image_pos, image_rotate = ('start',
+                gtk.gdk.PIXBUF_ROTATE_NONE)
+        if '_' not in attributes['string']:
+            attributes['string'] = '_' + attributes['string']
+        label = gtk.Label(attributes['string'])
+        label.set_angle(angle)
+        label.set_use_underline(True)
+        tab_box.pack_start(label)
+
+        if 'icon' in attributes:
+            ICONFACTORY.register_icon(attributes['icon'])
+            pixbuf = tab_box.render_icon(attributes['icon'],
+                gtk.ICON_SIZE_SMALL_TOOLBAR)
+            pixbuf = pixbuf.rotate_simple(image_rotate)
+            icon = gtk.Image()
+            icon.set_from_pixbuf(pixbuf)
+            if image_pos == 'end':
+                tab_box.pack_end(icon)
+            else:
+                tab_box.pack_start(icon)
+        tab_box.show_all()
+
+        viewport = gtk.Viewport()
+        viewport.set_shadow_type(gtk.SHADOW_NONE)
+        scrolledwindow = gtk.ScrolledWindow()
+        scrolledwindow.set_shadow_type(gtk.SHADOW_NONE)
+        scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        scrolledwindow.add(viewport)
+        scrolledwindow.show_all()
+        notebook.append_page(scrolledwindow, tab_box)
+        container = self.parse(node)
+        viewport.add(container.table)
+
+    def _parse_group(self, node, container, attributes):
+        group = self.parse(node)
+        group.table.set_homogeneous(attributes.get('homogeneous', False))
+        frame = gtk.Frame(attributes.get('string'))
+        if not attributes.get('string'):
+            frame.set_shadow_type(gtk.SHADOW_NONE)
+        frame.set_border_width(0)
+        frame.add(group.table)
+        container.add(frame, attributes)
+
+    def _parse_paned(self, node, container, attributes, Paned):
+        attributes.setdefault('yexpand', True)
+        attributes.setdefault('yfill', True)
+        paned = Paned()
+        if 'position' in attributes:
+            paned.set_position(attributes['position'])
+        container.add(paned, attributes)
+        self.parse(node, paned)
+
+    def _parse_hpaned(self, node, container, attributes):
+        self._parse_paned(node, container, attributes, gtk.HPaned)
+
+    def _parse_vpaned(self, node, container, attributes):
+        self._parse_paned(node, container, attributes, gtk.VPaned)
+
+    def _parse_child(self, node, paned, attributes):
+        container = self.parse(node)
+        if not paned.get_child1():
+            pack = paned.pack1
+        else:
+            pack = paned.pack2
+        pack(container.table, resize=True, shrink=True)
+
+    def _parse_action(self, node, container, attributes):
+        attributes.setdefault('yexpand', True)
+        attributes.setdefault('yfill', True)
+        action = Action(attributes, self.context)
+        action.signal_connect(self, 'active-changed', self._active_changed)
+        self.actions.append(action)
+        container.add(action.widget, attributes)
+
+    @property
+    def title(self):
+        self.attributes.get('string', '')
+
     def widget_get(self):
         return self.widget
 
diff --git a/tryton/gui/window/view_form/model/field.py b/tryton/gui/window/view_form/model/field.py
index 452d573..24ae6aa 100644
--- a/tryton/gui/window/view_form/model/field.py
+++ b/tryton/gui/window/view_form/model/field.py
@@ -37,13 +37,14 @@ class Field(object):
     def sig_changed(self, record):
         if self.get_state_attrs(record).get('readonly', False):
             return
-        if self.attrs.get('on_change', False):
-            record.on_change(self.name, self.attrs['on_change'])
-        record.on_change_with(self.name)
+        record.on_change([self.name])
+        record.on_change_with([self.name])
         record.autocomplete_with(self.name)
+        record.set_field_context()
 
-    def domains_get(self, record):
-        screen_domain = domain_inversion(record.group.domain4inversion,
+    def domains_get(self, record, pre_validate=None):
+        screen_domain = domain_inversion(
+            [record.group.domain4inversion, pre_validate or []],
             self.name, EvalEnvironment(record))
         if isinstance(screen_domain, bool) and not screen_domain:
             screen_domain = [('id', '=', None)]
@@ -56,8 +57,8 @@ class Field(object):
         screen_domain, attr_domain = self.domains_get(record)
         return concat(localize_domain(screen_domain), attr_domain)
 
-    def validation_domains(self, record):
-        return concat(*self.domains_get(record))
+    def validation_domains(self, record, pre_validate=None):
+        return concat(*self.domains_get(record, pre_validate))
 
     def context_get(self, record):
         context = record.context_get().copy()
@@ -74,12 +75,12 @@ class Field(object):
                 return False
         return True
 
-    def validate(self, record, softvalidation=False):
+    def validate(self, record, softvalidation=False, pre_validate=None):
         if self.attrs.get('readonly'):
             return True
         res = True
         self.get_state_attrs(record)['domain_readonly'] = False
-        domain = simplify(self.validation_domains(record))
+        domain = simplify(self.validation_domains(record, pre_validate))
         if not softvalidation:
             res = res and self.check_required(record)
         if isinstance(domain, bool):
@@ -155,7 +156,7 @@ class Field(object):
 
     def set_on_change(self, record, value):
         record.modified_fields.setdefault(self.name)
-        return self.set(record, value)
+        self.set(record, value)
 
     def state_set(self, record, states=('readonly', 'required', 'invisible')):
         state_changes = record.expr_eval(self.attrs.get('states', {}))
@@ -377,13 +378,6 @@ class M2OField(Field):
 
     _default = None
 
-    def get(self, record):
-        value = record.value.get(self.name)
-        if (record.parent_name == self.name
-                and self.attrs['relation'] == record.group.parent.model_name):
-            value = record.parent.id if record.parent else None
-        return value
-
     def get_client(self, record):
         rec_name = record.value.get(self.name + '.rec_name')
         if rec_name is None:
@@ -405,30 +399,15 @@ class M2OField(Field):
 
     def set(self, record, value):
         rec_name = record.value.get(self.name + '.rec_name') or ''
-        if value is False:
-            value = None
-        if (record.parent_name == self.name
-                and self.attrs['relation'] == record.group.parent.model_name):
-            if record.parent:
-                value = record.parent.id
-                if 'rec_name' in record.parent.value:
-                    rec_name = record.parent.value['rec_name'] or ''
-            else:
-                value = None
         if not rec_name and value >= 0:
             try:
                 result, = RPCExecute('model', self.attrs['relation'], 'read',
                     [value], ['rec_name'])
             except RPCException:
-                return False
+                return
             rec_name = result['rec_name'] or ''
         record.value[self.name + '.rec_name'] = rec_name
         record.value[self.name] = value
-        if (record.parent_name == self.name
-                and self.attrs['relation'] == record.group.parent.model_name):
-            if record.parent:
-                if 'rec_name' not in record.parent.value:
-                    record.parent.value['rec_name'] = rec_name
 
     def context_get(self, record):
         context = super(M2OField, self).context_get(record)
@@ -437,8 +416,8 @@ class M2OField(Field):
                 )[self.attrs.get('datetime_field')]
         return context
 
-    def validation_domains(self, record):
-        screen_domain, attr_domain = self.domains_get(record)
+    def validation_domains(self, record, pre_validate=None):
+        screen_domain, attr_domain = self.domains_get(record, pre_validate)
         return screen_domain
 
     def domain_get(self, record):
@@ -446,13 +425,11 @@ class M2OField(Field):
         return concat(localize_domain(inverse_leaf(screen_domain), self.name),
             attr_domain)
 
-    def get_state_attrs(self, record):
-        result = super(M2OField, self).get_state_attrs(record)
-        if (record.parent_name == self.name
-                and self.attrs['relation'] == record.group.parent.model_name):
-            result = result.copy()
-            result['readonly'] = True
-        return result
+    def get_on_change_value(self, record):
+        if record.parent_name == self.name and record.parent:
+            return record.parent.get_on_change_value(
+                skip={record.group.child_name})
+        return super(M2OField, self).get_on_change_value(record)
 
 
 class O2OField(M2OField):
@@ -469,7 +446,6 @@ class O2MField(Field):
     def __init__(self, attrs):
         super(O2MField, self).__init__(attrs)
         self.in_on_change = False
-        self.context = {}
 
     def sig_changed(self, record):
         if not self.in_on_change:
@@ -504,11 +480,12 @@ class O2MField(Field):
         from group import Group
         parent_name = self.attrs.get('relation_field', '')
         fields = fields or {}
+        context = record.expr_eval(self.attrs.get('context', {}))
         group = Group(self.attrs['relation'], fields,
                 parent=record,
                 parent_name=parent_name,
                 child_name=self.name,
-                context=self.context,
+                context=context,
                 parent_datetime_field=self.attrs.get('datetime_field'))
         if not fields and record.model_name == self.attrs['relation']:
             group.fields = record.group.fields
@@ -586,7 +563,8 @@ class O2MField(Field):
         for record2 in record.value[self.name]:
             if not (record2.deleted or record2.removed):
                 result.append(
-                    record2.get_on_change_value())
+                    record2.get_on_change_value(
+                        skip={self.attrs.get('relation_field', '')}))
         return result
 
     def _set_value(self, record, value, default=False):
@@ -671,11 +649,12 @@ class O2MField(Field):
         record.modified_fields.setdefault(self.name)
 
     def set_on_change(self, record, value):
+        self._set_default_value(record)
         if isinstance(value, (list, tuple)):
             self._set_value(record, value)
             record.modified_fields.setdefault(self.name)
             record.signal('record-modified')
-            return True
+            return
 
         if value and (value.get('add') or value.get('update')):
             context = self.context_get(record)
@@ -689,7 +668,7 @@ class O2MField(Field):
                     fields = RPCExecute('model', self.attrs['relation'],
                         'fields_get', list(field_names), context=context)
                 except RPCException:
-                    return False
+                    return
             else:
                 fields = {}
 
@@ -710,8 +689,10 @@ class O2MField(Field):
             record.value[self.name].add_fields(fields, signal=False)
             for index, vals in value.get('add', []):
                 new_record = record.value[self.name].new(default=False)
-                record.value[self.name].add(new_record, index)
+                record.value[self.name].add(new_record, index, signal=False)
                 new_record.set_on_change(vals)
+            if value.get('add'):
+                record.value[self.name].signal('group-changed', new_record)
 
             for vals in value.get('update', []):
                 if 'id' not in vals:
@@ -719,28 +700,32 @@ class O2MField(Field):
                 record2 = record.value[self.name].get(vals['id'])
                 if record2 is not None:
                     record2.set_on_change(vals)
-        return True
 
-    def validation_domains(self, record):
-        screen_domain, attr_domain = self.domains_get(record)
+    def validation_domains(self, record, pre_validate=None):
+        screen_domain, attr_domain = self.domains_get(record, pre_validate)
         return screen_domain
 
-    def validate(self, record, softvalidation=False):
+    def validate(self, record, softvalidation=False, pre_validate=None):
         if self.attrs.get('readonly'):
             return True
-        res = True
+        test = True
+        ldomain = localize_domain(domain_inversion(
+                record.group.clean4inversion(pre_validate or []), self.name,
+                EvalEnvironment(record)), self.name)
+        if isinstance(ldomain, bool):
+            if ldomain:
+                ldomain = []
+            else:
+                ldomain = [('id', '=', None)]
         for record2 in record.value.get(self.name, []):
             if not record2.loaded and record2.id >= 0:
                 continue
-            if not record2.validate(softvalidation=softvalidation):
-                if not record2.modified:
-                    record.value[self.name].remove(record2)
-                else:
-                    res = False
-        if not super(O2MField, self).validate(record, softvalidation):
-            res = False
-        self.get_state_attrs(record)['valid'] = res
-        return res
+            test &= record2.validate(softvalidation=softvalidation,
+                pre_validate=ldomain)
+        test &= super(O2MField, self).validate(record, softvalidation,
+            pre_validate)
+        self.get_state_attrs(record)['valid'] = test
+        return test
 
     def state_set(self, record, states=('readonly', 'required', 'invisible')):
         self._set_default_value(record)
@@ -776,12 +761,6 @@ class ReferenceField(Field):
             return None
 
     def get(self, record):
-        if record.parent_name == self.name:
-            if record.parent:
-                return '%s,%s' % (record.group.parent.model_name,
-                    record.parent.id)
-            else:
-                return None
         if (record.value.get(self.name)
                 and record.value[self.name][0]
                 and record.value[self.name][1] >= -1):
@@ -811,12 +790,6 @@ class ReferenceField(Field):
             force_change=force_change)
 
     def set(self, record, value):
-        if record.parent_name == self.name:
-            if record.parent:
-                value = '%s,%s' % (record.group.parent.model_name,
-                    record.parent.id)
-            else:
-                value = None
         if not value:
             record.value[self.name] = self._default
             return
@@ -847,6 +820,12 @@ class ReferenceField(Field):
         record.value[self.name] = ref_model, ref_id
         record.value[self.name + '.rec_name'] = rec_name
 
+    def get_on_change_value(self, record):
+        if record.parent_name == self.name and record.parent:
+            return record.parent.model_name, record.parent.get_on_change_value(
+                skip={record.group.child_name})
+        return super(ReferenceField, self).get_on_change_value(record)
+
 
 class BinaryField(Field):
 
@@ -905,11 +884,14 @@ class DictField(Field):
 
     _default = {}
 
+    def get(self, record):
+        return super(DictField, self).get(record) or self._default
+
     def get_client(self, record):
         return super(DictField, self).get_client(record) or self._default
 
-    def validation_domains(self, record):
-        screen_domain, attr_domain = self.domains_get(record)
+    def validation_domains(self, record, pre_validate=None):
+        screen_domain, attr_domain = self.domains_get(record, pre_validate)
         return screen_domain
 
     def domain_get(self, record):
diff --git a/tryton/gui/window/view_form/model/group.py b/tryton/gui/window/view_form/model/group.py
index cea94f5..be82c80 100644
--- a/tryton/gui/window/view_form/model/group.py
+++ b/tryton/gui/window/view_form/model/group.py
@@ -1,9 +1,7 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from weakref import WeakSet
-
 from record import Record
-from field import Field, O2MField
+from field import Field, M2OField, ReferenceField
 from tryton.signal_event import SignalEvent
 from tryton.common.domain_inversion import is_leaf
 from tryton.common import RPCExecute, RPCException, MODELACCESS
@@ -37,7 +35,6 @@ class Group(SignalEvent, list):
         self.__id2record = {}
         self.__field_childs = None
         self.exclude_field = None
-        self.pool = WeakSet()
         self.skip_model_access = False
 
         if self.parent and self.parent.model_name == model_name:
@@ -80,9 +77,13 @@ class Group(SignalEvent, list):
         return [head] + self.clean4inversion(tail)
 
     def __get_domain4inversion(self):
-        if self.__domain4inversion is None:
-            self.__domain4inversion = self.clean4inversion(self.domain)
-        return self.__domain4inversion
+        domain = self.domain
+        if (self.__domain4inversion is None
+                or self.__domain4inversion[0] != domain):
+            self.__domain4inversion = (
+                domain, self.clean4inversion(domain))
+        domain, domain4inversion = self.__domain4inversion
+        return domain4inversion
 
     domain4inversion = property(__get_domain4inversion)
 
@@ -153,11 +154,6 @@ class Group(SignalEvent, list):
             field = Field.get_field(attr['type'])
             attr['name'] = name
             self.fields[name] = field(attr)
-            if isinstance(self.fields[name], O2MField) \
-                    and '_datetime' in self._context:
-                self.fields[name].context.update({
-                    '_datetime': self._context['_datetime'],
-                    })
 
     def save(self):
         saved = []
@@ -246,7 +242,8 @@ class Group(SignalEvent, list):
         self.current_idx = 0
         return True
 
-    def _get_context(self):
+    @property
+    def context(self):
         ctx = self._context.copy()
         if self.parent:
             ctx.update(self.parent.context_get())
@@ -259,9 +256,11 @@ class Group(SignalEvent, list):
                 )[self.parent_datetime_field]
         return ctx
 
-    context = property(_get_context)
+    @context.setter
+    def context(self, value):
+        self._context = value.copy()
 
-    def add(self, record, position=-1):
+    def add(self, record, position=-1, signal=True):
         if record.group is not self:
             record.signal_unconnect(record.group)
             record.group = self
@@ -281,7 +280,16 @@ class Group(SignalEvent, list):
         self.current_idx = position
         record.modified_fields.setdefault('id')
         record.signal('record-modified')
-        self.signal('group-changed', record)
+        if signal:
+            self.signal('group-changed', record)
+        # Set parent field to trigger on_change
+        if self.parent and self.parent_name in self.fields:
+            field = self.fields[self.parent_name]
+            if isinstance(field, (M2OField, ReferenceField)):
+                value = self.parent.id, ''
+                if isinstance(field, ReferenceField):
+                    value = self.parent.model_name, value
+                field.set_client(record, value)
         return record
 
     def set_sequence(self, field='sequence'):
diff --git a/tryton/gui/window/view_form/model/record.py b/tryton/gui/window/view_form/model/record.py
index 3241c0c..e47cfb8 100644
--- a/tryton/gui/window/view_form/model/record.py
+++ b/tryton/gui/window/view_form/model/record.py
@@ -36,7 +36,6 @@ class Record(SignalEvent):
         self.autocompletion = {}
         self.exception = False
         self.destroyed = False
-        self.pool.add(self)
 
     def __getitem__(self, name):
         if name not in self._loaded and self.id >= 0:
@@ -73,43 +72,39 @@ class Record(SignalEvent):
 
             record_context = self.context_get()
             if loading == 'eager':
-                limit = CONFIG['client.limit']
-                if not self.parent:
-                    # If not a children no need to load too much
-                    limit = int(limit / len(fnames))
+                limit = int(CONFIG['client.limit'] / len(fnames))
 
                 def filter_group(record):
                     return name not in record._loaded and record.id >= 0
 
-                def filter_pool(record):
+                def filter_parent_group(record):
                     return (filter_group(record)
                         and record.id not in id2record
-                        and record.context_get() == record_context)
+                        and ((record.group == self.group)
+                            # Don't compute context for same group
+                            or (record.context_get() == record_context)))
 
                 if self.parent:
-                    pool = list(self.pool)
+                    group = sum(self.parent.group.children, [])
+                    filter_ = filter_parent_group
                 else:
-                    # Don't look at the pool if it is the root
-                    pool = []
-                for group, filter_ in (
-                        (self.group, filter_group),
-                        (pool, filter_pool),
-                        ):
-                    if self in group:
-                        idx = group.index(self)
-                        length = len(group)
-                        n = 1
-                        while len(id2record) < limit and (idx - n >= 0
-                                or idx + n < length) and n < 2 * limit:
-                            if idx - n >= 0:
-                                record = group[idx - n]
-                                if filter_(record):
-                                    id2record[record.id] = record
-                            if idx + n < length:
-                                record = group[idx + n]
-                                if filter_(record):
-                                    id2record[record.id] = record
-                            n += 1
+                    group = self.group
+                    filter_ = filter_group
+                if self in group:
+                    idx = group.index(self)
+                    length = len(group)
+                    n = 1
+                    while len(id2record) < limit and (idx - n >= 0
+                            or idx + n < length) and n < 2 * limit:
+                        if idx - n >= 0:
+                            record = group[idx - n]
+                            if filter_(record):
+                                id2record[record.id] = record
+                        if idx + n < length:
+                            record = group[idx + n]
+                            if filter_(record):
+                                id2record[record.id] = record
+                        n += 1
 
             ctx = record_context.copy()
             ctx.update(dict(('%s.%s' % (self.model_name, fname), 'size')
@@ -144,14 +139,6 @@ class Record(SignalEvent):
         return bool(self.modified_fields)
 
     @property
-    def pool(self):
-        group = self.group
-        while (group.parent is not None
-                and group.parent.model_name == self.model_name):
-            group = group.parent
-        return group.pool
-
-    @property
     def parent(self):
         return self.group.parent
 
@@ -267,10 +254,14 @@ class Record(SignalEvent):
         value['id'] = self.id
         return value
 
-    def get_on_change_value(self):
+    def get_on_change_value(self, skip=None):
         value = {}
         for name, field in self.group.fields.iteritems():
-            if name not in self._loaded and self.id >= 0:
+            if skip and name in skip:
+                continue
+            if (self.id >= 0
+                    and (name not in self._loaded
+                        or name not in self.modified_fields)):
                 continue
             value[name] = field.get_on_change_value(self)
         value['id'] = self.id
@@ -387,7 +378,7 @@ class Record(SignalEvent):
         except RPCException:
             return ''
 
-    def validate(self, fields=None, softvalidation=False):
+    def validate(self, fields=None, softvalidation=False, pre_validate=None):
         if isinstance(fields, list) and fields:
             self._check_load(fields)
         elif fields is None:
@@ -400,7 +391,7 @@ class Record(SignalEvent):
                 continue
             if field_name == self.group.exclude_field:
                 continue
-            if not field.validate(self, softvalidation):
+            if not field.validate(self, softvalidation, pre_validate):
                 res = False
         return res
 
@@ -417,6 +408,7 @@ class Record(SignalEvent):
         return self.group.context
 
     def set_default(self, val, signal=True):
+        fieldnames = []
         for fieldname, value in val.items():
             if fieldname not in self.group.fields:
                 continue
@@ -431,6 +423,9 @@ class Record(SignalEvent):
                     del self.value[field_rec_name]
             self.group.fields[fieldname].set_default(self, value)
             self._loaded.add(fieldname)
+            fieldnames.append(fieldname)
+        self.on_change(fieldnames)
+        self.on_change_with(fieldnames)
         self.validate(softvalidation=True)
         if signal:
             self.signal('record-changed')
@@ -528,18 +523,25 @@ class Record(SignalEvent):
         res['id'] = self.id
         return res
 
-    def on_change(self, fieldname, attr):
-        if isinstance(attr, basestring):
-            attr = PYSONDecoder().decode(attr)
-        args = self._get_on_change_args(attr)
-        try:
-            res = RPCExecute('model', self.model_name, 'on_change_' +
-                fieldname, args, context=self.context_get())
-        except RPCException:
-            return
-        self.set_on_change(res)
+    def on_change(self, fieldnames):
+        values = {}
+        for fieldname in fieldnames:
+            on_change = self.group.fields[fieldname].attrs.get('on_change')
+            if not on_change:
+                continue
+            values.update(self._get_on_change_args(on_change))
+
+        if values:
+            try:
+                changes = RPCExecute('model', self.model_name, 'on_change',
+                    values, fieldnames, context=self.context_get())
+            except RPCException:
+                return
+            for change in changes:
+                self.set_on_change(change)
 
-    def on_change_with(self, field_name):
+    def on_change_with(self, field_names):
+        field_names = set(field_names)
         fieldnames = set()
         values = {}
         later = set()
@@ -548,9 +550,7 @@ class Record(SignalEvent):
                     'on_change_with')
             if not on_change_with:
                 continue
-            if field_name not in on_change_with:
-                continue
-            if field_name == fieldname:
+            if not field_names & set(on_change_with):
                 continue
             if fieldnames & set(on_change_with):
                 later.add(fieldname)
@@ -600,6 +600,16 @@ class Record(SignalEvent):
             res = []
         self.autocompletion[fieldname] = res
 
+    def set_field_context(self):
+        from .group import Group
+        for name, field in self.group.fields.iteritems():
+            value = self.value.get(name)
+            if not isinstance(value, Group):
+                continue
+            context = field.attrs.get('context')
+            if context:
+                value.context = self.expr_eval(context)
+
     def get_attachment_count(self, reload=False):
         if self.id < 0:
             return 0
@@ -615,11 +625,8 @@ class Record(SignalEvent):
         return self.attachment_count
 
     def destroy(self):
-        # Get reference to pool before unref group
-        pool = self.pool
         for v in self.value.itervalues():
             if hasattr(v, 'destroy'):
                 v.destroy()
         super(Record, self).destroy()
         self.destroyed = True
-        pool.remove(self)
diff --git a/tryton/gui/window/view_form/screen/screen.py b/tryton/gui/window/view_form/screen/screen.py
index c495db1..be8368a 100644
--- a/tryton/gui/window/view_form/screen/screen.py
+++ b/tryton/gui/window/view_form/screen/screen.py
@@ -18,6 +18,7 @@ import logging
 
 from tryton.gui.window.view_form.model.group import Group
 from tryton.gui.window.view_form.view.screen_container import ScreenContainer
+from tryton.gui.window.view_form.view import View
 from tryton.signal_event import SignalEvent
 from tryton.config import CONFIG
 from tryton.exceptions import TrytonServerError, TrytonServerUnavailable
@@ -276,8 +277,8 @@ class Screen(SignalEvent):
             if hasattr(view, 'group_list_changed'):
                 view.group_list_changed(group, signal)
 
-    def _record_modified(self, group, signal, *args):
-        self.signal('record-modified')
+    def _record_modified(self, group, signal):
+        self.signal('record-modified', signal)
 
     def _group_changed(self, group, record):
         if not self.parent:
@@ -329,7 +330,7 @@ class Screen(SignalEvent):
 
     def default_row_activate(self):
         if (self.current_view.view_type == 'tree' and
-                self.current_view.widget_tree.keyword_open):
+                self.current_view.attributes.get('keyword_open')):
             return Action.exec_keyword('tree_open', {
                 'model': self.model_name,
                 'id': self.id_get(),
@@ -372,7 +373,8 @@ class Screen(SignalEvent):
                     break
         self.screen_container.set(self.current_view.widget)
         self.display()
-        self.set_cursor()
+        # Postpone set of the cursor to ensure widgets are allocated
+        gobject.idle_add(self.set_cursor)
 
     def load_view_to_load(self):
         if len(self.view_to_load):
@@ -402,14 +404,13 @@ class Screen(SignalEvent):
         view_id = view['view_id']
 
         xml_dom = xml.dom.minidom.parseString(arch)
-        for node in xml_dom.childNodes:
-            if node.localName == 'tree':
-                self.fields_view_tree = view
-            break
+        root, = xml_dom.childNodes
+        if root.tagName == 'tree':
+            self.fields_view_tree = view
 
         # Ensure that loading is always lazy for fields on form view
         # and always eager for fields on tree or graph view
-        if node.localName == 'form':
+        if root.tagName == 'form':
             loading = 'lazy'
         else:
             loading = 'eager'
@@ -419,18 +420,11 @@ class Screen(SignalEvent):
             else:
                 fields[field]['loading'] = \
                     self.group.fields[field].attrs['loading']
-
-        children_field = view.get('field_childs')
-
-        from tryton.gui.window.view_form.view.widget_parse import WidgetParse
         self.group.add_fields(fields)
-
-        parser = WidgetParse(parent=self.parent)
-        view = parser.parse(self, xml_dom, self.group.fields,
-                children_field=children_field)
+        view = View.parse(self, xml_dom, view.get('field_childs'))
         view.view_id = view_id
-
         self.views.append(view)
+
         return view
 
     def new(self, default=True):
@@ -451,14 +445,14 @@ class Screen(SignalEvent):
             previous_view.set_default_date(record, selected_date)
         self.current_record = record
         self.display()
-        self.set_cursor(new=True)
+        # Postpone set of the cursor to ensure widgets are allocated
+        gobject.idle_add(self.set_cursor, True)
         return self.current_record
 
     def new_model_position(self):
         position = -1
         if (self.current_view and self.current_view.view_type == 'tree'
-                and hasattr(self.current_view.widget_tree, 'editable')
-                and self.current_view.widget_tree.editable == 'top'):
+                and self.current_view.attributes.get('editable') == 'top'):
             position = 0
         return position
 
@@ -609,53 +603,81 @@ class Screen(SignalEvent):
 
     def set_tree_state(self):
         view = self.current_view
-        if (not CONFIG['client.save_tree_state']
-                or not view
-                or view.view_type != 'tree'
-                or not self.group):
+        if view.view_type not in ('tree', 'form'):
             return
         if id(view) in self.tree_states_done:
             return
+        if view.view_type == 'form' and self.tree_states_done:
+            return
         parent = self.parent.id if self.parent else None
+        expanded_nodes, selected_nodes = [], []
+        timestamp = self.parent._timestamp if self.parent else None
         state = self.tree_states[parent][view.children_field]
-        if state is None:
+        if state:
+            state_timestamp, expanded_nodes, selected_nodes = state
+            if (timestamp != state_timestamp
+                    and view.view_type != 'form'):
+                state = None
+        if state is None and CONFIG['client.save_tree_state']:
             json_domain = self.get_tree_domain(parent)
             try:
                 expanded_nodes, selected_nodes = RPCExecute('model',
                     'ir.ui.view_tree_state', 'get',
                     self.model_name, json_domain,
-                    self.current_view.children_field)
+                    view.children_field)
                 expanded_nodes = json.loads(expanded_nodes)
                 selected_nodes = json.loads(selected_nodes)
             except RPCException:
                 logging.getLogger(__name__).warn(
                     _('Unable to get view tree state'))
-                expanded_nodes = []
-                selected_nodes = []
             self.tree_states[parent][view.children_field] = (
-                expanded_nodes, selected_nodes)
+                timestamp, expanded_nodes, selected_nodes)
+        if view.view_type == 'tree':
+            view.expand_nodes(expanded_nodes)
+            view.select_nodes(selected_nodes)
         else:
-            expanded_nodes, selected_nodes = state
-        view.expand_nodes(expanded_nodes)
-        view.select_nodes(selected_nodes)
+            if selected_nodes:
+                record = None
+                for node in selected_nodes[0]:
+                    new_record = self.group.get(node)
+                    if node < 0 and -node < len(self.group):
+                        # Negative id is the index of the new record
+                        new_record = self.group[-node]
+                    if not new_record:
+                        break
+                    else:
+                        record = new_record
+                if record and record != self.current_record:
+                    self.current_record = record
+                    # Force a display of the view to synchronize the
+                    # widgets with the new record
+                    view.display()
         self.tree_states_done.add(id(view))
 
     def save_tree_state(self, store=True):
         if not CONFIG['client.save_tree_state']:
             return
+        parent = self.parent.id if self.parent else None
+        timestamp = self.parent._timestamp if self.parent else None
         for view in self.views:
             if view.view_type == 'form':
                 for widgets in view.widgets.itervalues():
                     for widget in widgets:
                         if hasattr(widget, 'screen'):
                             widget.screen.save_tree_state(store)
-            elif (view.view_type == 'tree' and view.children_field):
-                parent = self.parent.id if self.parent else None
+                if len(self.views) == 1 and self.current_record:
+                    path = self.current_record.id
+                    if path < 0:
+                        path = -self.current_record.group.index(
+                            self.current_record)
+                    self.tree_states[parent][view.children_field] = (
+                        timestamp, [], [[path]])
+            elif view.view_type == 'tree':
                 paths = view.get_expanded_paths()
                 selected_paths = view.get_selected_paths()
                 self.tree_states[parent][view.children_field] = (
-                    paths, selected_paths)
-                if store:
+                    timestamp, paths, selected_paths)
+                if store and view.attributes.get('tree_state', False):
                     json_domain = self.get_tree_domain(parent)
                     json_paths = json.dumps(paths)
                     json_selected_path = json.dumps(selected_paths)
@@ -681,7 +703,7 @@ class Screen(SignalEvent):
         self.tree_states_done.clear()
         self.group.load(ids, modified=modified)
         self.current_view.reset()
-        if ids:
+        if ids and self.current_view.view_type != 'calendar':
             self.display(ids[0])
         else:
             self.current_record = None
@@ -696,7 +718,7 @@ class Screen(SignalEvent):
             if (self.current_record
                     and self.current_record in self.current_record.group):
                 pass
-            elif self.group:
+            elif self.group and self.current_view.view_type != 'calendar':
                 self.current_record = self.group[0]
             else:
                 self.current_record = None
@@ -720,12 +742,14 @@ class Screen(SignalEvent):
         view.set_value()
         self.set_cursor(reset_view=False)
         if view.view_type == 'tree' and len(self.group):
-            start, end = view.widget_tree.get_visible_range()
-            vadjustment = view.widget_tree.get_vadjustment()
-            vadjustment.value = vadjustment.value + vadjustment.page_increment
-            store = view.store
-            iter_ = store.get_iter(end)
-            self.current_record = store.get_value(iter_, 0)
+            start, end = view.treeview.get_visible_range()
+            vadjustment = view.treeview.get_vadjustment()
+            vadjustment.value = min(
+                vadjustment.value + vadjustment.page_increment,
+                vadjustment.get_upper())
+            model = view.treeview.get_model()
+            iter_ = model.get_iter(end)
+            self.current_record = model.get_value(iter_, 0)
         elif (view.view_type == 'form'
                 and self.current_record
                 and self.current_record.group):
@@ -756,7 +780,7 @@ class Screen(SignalEvent):
             self.current_record = record
         elif view.view_type == 'calendar':
             record = self.current_record
-            goocalendar = view.children['goocalendar']
+            goocalendar = view.widgets['goocalendar']
             date = goocalendar.selected_date
             year = date.year
             month = date.month
@@ -785,12 +809,14 @@ class Screen(SignalEvent):
         view.set_value()
         self.set_cursor(reset_view=False)
         if view.view_type == 'tree' and len(self.group):
-            start, end = view.widget_tree.get_visible_range()
-            vadjustment = view.widget_tree.get_vadjustment()
-            vadjustment.value = vadjustment.value - vadjustment.page_increment
-            store = view.store
-            iter_ = store.get_iter(start)
-            self.current_record = store.get_value(iter_, 0)
+            start, end = view.treeview.get_visible_range()
+            vadjustment = view.treeview.get_vadjustment()
+            vadjustment.value = min(
+                vadjustment.value - vadjustment.page_increment,
+                vadjustment.get_lower())
+            model = view.treeview.get_model()
+            iter_ = model.get_iter(start)
+            self.current_record = model.get_value(iter_, 0)
         elif (view.view_type == 'form'
                 and self.current_record
                 and self.current_record.group):
@@ -811,7 +837,7 @@ class Screen(SignalEvent):
             self.current_record = record
         elif view.view_type == 'calendar':
             record = self.current_record
-            goocalendar = view.children['goocalendar']
+            goocalendar = view.widgets['goocalendar']
             date = goocalendar.selected_date
             year = date.year
             month = date.month
@@ -875,12 +901,22 @@ class Screen(SignalEvent):
         return buttons
 
     def button(self, button):
-        'Execute button on the current record'
+        'Execute button on the selected records'
         if button.get('confirm', False) and not sur(button['confirm']):
             return
-        record = self.current_record
-        if not record.save(force_reload=False):
+        self.current_view.set_value()
+        if not self.current_record.save(force_reload=False):
             return
+        fields = self.current_view.get_fields()
+        for record in self.selected_records:
+            domain = record.expr_eval(
+                button.get('states', {})).get('pre_validate', [])
+            if not record.validate(fields, pre_validate=domain):
+                self.display(set_cursor=True)
+                if domain:
+                    # Reset valid state with normal domain
+                    record.validate(fields)
+                return
         ids = [r.id for r in self.selected_records]
         try:
             action = RPCExecute('model', self.model_name, button['name'],
diff --git a/tryton/gui/window/view_form/view/__init__.py b/tryton/gui/window/view_form/view/__init__.py
index c86640b..ef1268c 100644
--- a/tryton/gui/window/view_form/view/__init__.py
+++ b/tryton/gui/window/view_form/view/__init__.py
@@ -1,2 +1,49 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
+from tryton.common import node_attributes
+
+
+class View(object):
+    view_type = None
+    widget = None
+    view_id = None
+    modified = None
+    editable = None
+    children_field = None
+
+    def __init__(self, screen, xml):
+        self.screen = screen
+        self.fields = {}
+        self.attributes = node_attributes(xml)
+        screen.set_on_write(self.attributes.get('on_write'))
+
+    def set_value(self):
+        raise NotImplementedError
+
+    def get_fields(self):
+        raise NotImplementedError
+
+    def get_buttons(self):
+        raise NotImplementedError
+
+    @property
+    def title(self):
+        return self.attributes.get('string', '')
+
+    @staticmethod
+    def parse(screen, xml, children_field):
+        from .list import ViewTree
+        from .form import ViewForm
+        from .graph import ViewGraph
+        from .calendar_ import ViewCalendar
+
+        root, = xml.childNodes
+        tagname = root.tagName
+        if tagname == 'tree':
+            return ViewTree(screen, root, children_field)
+        elif tagname == 'form':
+            return ViewForm(screen, root)
+        elif tagname == 'graph':
+            return ViewGraph(screen, root)
+        elif tagname == 'calendar':
+            return ViewCalendar(screen, root)
diff --git a/tryton/gui/window/view_form/view/calendar_.py b/tryton/gui/window/view_form/view/calendar_.py
index 93d4c74..a3a8a24 100644
--- a/tryton/gui/window/view_form/view/calendar_.py
+++ b/tryton/gui/window/view_form/view/calendar_.py
@@ -2,27 +2,112 @@
 #this repository contains the full copyright notices and license terms.
 from functools import wraps
 
-from interface import ParserView
+import gtk
+import datetime
+import gettext
+
+from tryton.common import node_attributes
+from . import View
+try:
+    from .calendar_gtk.calendar_ import Calendar_
+    from .calendar_gtk.toolbar import Toolbar
+except ImportError:
+    Calendar_ = None
+    Toolbar = None
+
+_ = gettext.gettext
 
 
 def goocalendar_required(func):
     "Decorator for goocalendar required"
     @wraps(func)
     def wrapper(self, *args, **kwargs):
-        if 'goocalendar' not in self.children:
+        if 'goocalendar' not in self.widgets:
             return
         return func(self, *args, **kwargs)
     return wrapper
 
 
-class ViewCalendar(ParserView):
+class ViewCalendar(View):
 
-    def __init__(self, screen, widget, children=None, buttons=None,
-            notebooks=None, cursor_widget=None, children_field=None):
-        super(ViewCalendar, self).__init__(screen, widget, children, buttons,
-            notebooks, cursor_widget, children_field)
+    def __init__(self, screen, xml):
+        super(ViewCalendar, self).__init__(screen, xml)
         self.view_type = 'calendar'
         self.editable = False
+        self.widgets = {}
+        self.widget = self.parse(xml)
+
+    def parse(self, node):
+        vbox = gtk.VBox()
+        if not Calendar_:
+            return vbox
+        fields = []
+        for node in node.childNodes:
+            if node.nodeType != node.ELEMENT_NODE:
+                continue
+            if node.tagName == 'field':
+                fields.append(node_attributes(node))
+        goocalendar = Calendar_(attrs=self.attributes, screen=self.screen,
+            fields=fields)
+        toolbar = Toolbar(goocalendar)
+        self.widgets['toolbar'] = toolbar
+        goocalendar.connect('view-changed', self.on_view_changed, toolbar)
+        goocalendar.connect('page-changed', self.on_page_changed, toolbar)
+        goocalendar.connect('event-pressed', self.on_event_pressed)
+        goocalendar.connect('event-activated', self.on_event_activated)
+        goocalendar.connect('event-released', self.on_event_released)
+        goocalendar.connect('day-pressed', self.on_day_pressed)
+        goocalendar.connect('day-activated', self.on_day_activated)
+        self.widgets['goocalendar'] = goocalendar
+        scrolledWindow = gtk.ScrolledWindow()
+        scrolledWindow.add_with_viewport(goocalendar)
+        vbox.pack_start(toolbar, False, False)
+        vbox.pack_start(scrolledWindow, True, True)
+        return vbox
+
+    def on_page_changed(self, goocalendar, day, toolbar):
+        toolbar.update_displayed_date()
+        if goocalendar.update_domain():
+            self.screen.search_filter()
+
+    def on_view_changed(self, goocalendar, view, toolbar):
+        toolbar.update_displayed_date()
+        if goocalendar.update_domain():
+            self.screen.search_filter()
+
+    def on_event_pressed(self, goocalendar, event):
+        self.screen.current_record = event.record
+
+    def on_event_activated(self, goocalendar, event):
+        self.screen.switch_view('form')
+
+    def on_event_released(self, goocalendar, event):
+        dtstart = self.attributes.get('dtstart')
+        dtend = self.attributes.get('dtend') or dtstart
+        record = event.record
+        group = record.group
+        previous_start = record[dtstart].get(record)
+        new_start = event.start
+        new_end = event.end
+        if not isinstance(previous_start, datetime.datetime):
+            new_start = event.start.date()
+            new_end = event.end.date() if event.end else None
+        if previous_start <= new_start:
+            if new_end:
+                group.fields[dtend].set_client(record, new_end)
+            group.fields[dtstart].set_client(record, new_start)
+        else:
+            group.fields[dtstart].set_client(record, new_start)
+            if new_end:
+                group.fields[dtend].set_client(record, new_end)
+        goocalendar.select(new_start)
+        record.save()
+
+    def on_day_pressed(self, goocalendar, day):
+        self.screen.current_record = None
+
+    def on_day_activated(self, goocalendar, day):
+        self.screen.new()
 
     def __getitem__(self, name):
         return None
@@ -30,19 +115,19 @@ class ViewCalendar(ParserView):
     @goocalendar_required
     def destroy(self):
         self.widget.destroy()
-        self.children['goocalendar'].destroy()
+        self.widgets['goocalendar'].destroy()
 
     @goocalendar_required
     def get_selected_date(self):
-        return self.children['goocalendar'].selected_date
+        return self.widgets['goocalendar'].selected_date
 
     @goocalendar_required
     def set_default_date(self, record, selected_date):
-        self.children['goocalendar'].set_default_date(record, selected_date)
+        self.widgets['goocalendar'].set_default_date(record, selected_date)
 
     def current_domain(self):
-        if 'goocalendar' in self.children:
-            return self.children['goocalendar'].current_domain()
+        if 'goocalendar' in self.widgets:
+            return self.widgets['goocalendar'].current_domain()
         else:
             # No need to load any record as nothing will be shown
             return [('id', '=', -1)]
@@ -55,14 +140,14 @@ class ViewCalendar(ParserView):
 
     @goocalendar_required
     def display(self):
-        self.children['goocalendar'].display(self.screen.group)
-        gtkcal = self.children['toolbar'].gtkcal
+        self.widgets['goocalendar'].display(self.screen.group)
+        gtkcal = self.widgets['toolbar'].gtkcal
         if gtkcal and not gtkcal.is_drawable():
             import goocanvas
             # disable gtk.Calendar if it is not drawable anymore
-            self.children['toolbar'].gtkcal_item.set_property('visibility',
+            self.widgets['toolbar'].gtkcal_item.set_property('visibility',
                 goocanvas.ITEM_INVISIBLE)
-            self.children['toolbar'].current_page.set_active(False)
+            self.widgets['toolbar'].current_page.set_active(False)
 
     def set_cursor(self, new=False, reset_view=True):
         pass
diff --git a/tryton/gui/window/view_form/view/calendar_gtk/__init__.py b/tryton/gui/window/view_form/view/calendar_gtk/__init__.py
index 5218f22..c86640b 100644
--- a/tryton/gui/window/view_form/view/calendar_gtk/__init__.py
+++ b/tryton/gui/window/view_form/view/calendar_gtk/__init__.py
@@ -1,3 +1,2 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from parser import *
diff --git a/tryton/gui/window/view_form/view/calendar_gtk/calendar_.py b/tryton/gui/window/view_form/view/calendar_gtk/calendar_.py
index bc799ab..a30e262 100644
--- a/tryton/gui/window/view_form/view/calendar_gtk/calendar_.py
+++ b/tryton/gui/window/view_form/view/calendar_gtk/calendar_.py
@@ -3,27 +3,22 @@
 import calendar
 import datetime
 import goocalendar
-import tryton.common as common
 from dates_period import DatesPeriod
 
 
 class Calendar_(goocalendar.Calendar):
     'Calendar'
 
-    def __init__(self, attrs, model, root_node, fields, screen,
-            event_store=None):
+    def __init__(self, attrs, screen, fields, event_store=None):
         super(Calendar_, self).__init__(event_store)
         self.attrs = attrs
-        self.model = model
-        self.root_node = root_node
-        self.fields = fields
         self.screen = screen
+        self.fields = fields
         self.event_store = event_store
         self.current_domain_period = self.get_displayed_period()
 
     def set_default_date(self, record, selected_date):
-        attrs = common.node_attributes(self.root_node)
-        dtstart = attrs.get('dtstart')
+        dtstart = self.attrs.get('dtstart')
         record[dtstart].set(record, datetime.datetime.combine(selected_date,
             datetime.time(0)))
 
@@ -54,9 +49,8 @@ class Calendar_(goocalendar.Calendar):
     def current_domain(self):
         first_datetime, last_datetime = \
             self.current_domain_period.get_dates(True)
-        attrs = common.node_attributes(self.root_node)
-        dtstart = attrs.get('dtstart')
-        dtend = attrs.get('dtend') or dtstart
+        dtstart = self.attrs.get('dtstart')
+        dtend = self.attrs.get('dtend') or dtstart
         domain = ['OR',
             ['AND', (dtstart, '>=', first_datetime),
                 (dtstart, '<', last_datetime)],
@@ -67,9 +61,8 @@ class Calendar_(goocalendar.Calendar):
         return domain
 
     def display(self, group):
-        attrs = common.node_attributes(self.root_node)
-        dtstart = attrs.get('dtstart')
-        dtend = attrs.get('dtend') or dtstart
+        dtstart = self.attrs.get('dtstart')
+        dtend = self.attrs.get('dtend') or dtstart
         if self.screen.current_record:
             record = self.screen.current_record
             date = record[dtstart].get(record)
@@ -82,14 +75,6 @@ class Calendar_(goocalendar.Calendar):
             event_store = goocalendar.EventStore()
             self.event_store = event_store
 
-        fields = []
-        for node in self.root_node.childNodes:
-            if not node.nodeType == node.ELEMENT_NODE:
-                continue
-            if node.localName == 'field':
-                attrs = common.node_attributes(node)
-                fields.append(attrs.get('name'))
-
         for record in group:
             if not record[dtstart].get(record):
                 continue
@@ -107,8 +92,8 @@ class Calendar_(goocalendar.Calendar):
                 all_day = True
 
             # TODO define color code
-            label = '\n'.join(record[name].get_client(record)
-                for name in fields).rstrip()
+            label = '\n'.join(record[attrs['name']].get_client(record)
+                for attrs in self.fields).rstrip()
             event = goocalendar.Event(label, start, end,
                 bg_color='lightblue', all_day=all_day)
             event.record = record
diff --git a/tryton/gui/window/view_form/view/calendar_gtk/parser.py b/tryton/gui/window/view_form/view/calendar_gtk/parser.py
deleted file mode 100644
index 579f059..0000000
--- a/tryton/gui/window/view_form/view/calendar_gtk/parser.py
+++ /dev/null
@@ -1,85 +0,0 @@
-#This file is part of Tryton.  The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-import datetime
-import gettext
-import gtk
-from tryton.gui.window.view_form.view.interface import ParserInterface
-import tryton.common as common
-try:
-    from calendar_ import Calendar_
-    from toolbar import Toolbar
-except ImportError:
-    Calendar_ = None
-    Toolbar = None
-
-_ = gettext.gettext
-
-
-class ParserCalendar(ParserInterface):
-
-    def on_page_changed(self, goocalendar, day, toolbar):
-        toolbar.update_displayed_date()
-        if goocalendar.update_domain():
-            self.screen.search_filter()
-
-    def on_view_changed(self, goocalendar, view, toolbar):
-        toolbar.update_displayed_date()
-        if goocalendar.update_domain():
-            self.screen.search_filter()
-
-    def on_event_pressed(self, goocalendar, event):
-        self.screen.current_record = event.record
-
-    def on_event_activated(self, goocalendar, event):
-        self.screen.switch_view('form')
-
-    def on_event_released(self, goocalendar, event, attrs):
-        dtstart = attrs.get('dtstart')
-        dtend = attrs.get('dtend') or dtstart
-        record = event.record
-        group = record.group
-        previous_start = record[dtstart].get(record)
-        new_start = event.start
-        new_end = event.end
-        if not isinstance(previous_start, datetime.datetime):
-            new_start = event.start.date()
-            new_end = event.end.date() if event.end else None
-        if previous_start <= new_start:
-            if new_end:
-                group.fields[dtend].set_client(record, new_end)
-            group.fields[dtstart].set_client(record, new_start)
-        else:
-            group.fields[dtstart].set_client(record, new_start)
-            if new_end:
-                group.fields[dtend].set_client(record, new_end)
-        goocalendar.select(new_start)
-        record.save()
-
-    def on_day_pressed(self, goocalendar, day):
-        self.screen.current_record = None
-
-    def on_day_activated(self, goocalendar, day):
-        self.screen.new()
-
-    def parse(self, model, root_node, fields):
-        attrs = common.node_attributes(root_node)
-        self.title = attrs.get('string', 'Unknown')
-        vbox = gtk.VBox()
-        if not Calendar_:
-            return vbox, {}, [], '', [], None
-        goocalendar = Calendar_(attrs=attrs, model=model, root_node=root_node,
-            fields=fields, screen=self.screen)
-        toolbar = Toolbar(goocalendar)
-        goocalendar.connect('view-changed', self.on_view_changed, toolbar)
-        goocalendar.connect('page-changed', self.on_page_changed, toolbar)
-        goocalendar.connect('event-pressed', self.on_event_pressed)
-        goocalendar.connect('event-activated', self.on_event_activated)
-        goocalendar.connect('event-released', self.on_event_released, attrs)
-        goocalendar.connect('day-pressed', self.on_day_pressed)
-        goocalendar.connect('day-activated', self.on_day_activated)
-        scrolledWindow = gtk.ScrolledWindow()
-        scrolledWindow.add_with_viewport(goocalendar)
-        vbox.pack_start(toolbar, False, False)
-        vbox.pack_start(scrolledWindow, True, True)
-        return vbox, {'root': scrolledWindow, 'toolbar': toolbar,
-            'goocalendar': goocalendar}, [], '', [], None
diff --git a/tryton/gui/window/view_form/view/form.py b/tryton/gui/window/view_form/view/form.py
index 62a18f0..a19e6b4 100644
--- a/tryton/gui/window/view_form/view/form.py
+++ b/tryton/gui/window/view_form/view/form.py
@@ -1,48 +1,116 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 import operator
-from functools import reduce
+from functools import cmp_to_key
 import gtk
 import gettext
-from interface import ParserView
+from collections import defaultdict
+
+from . import View
 from tryton.common.focus import (get_invisible_ancestor, find_focused_child,
-    next_focus_widget)
+    next_focus_widget, find_focusable_child, tab_compare)
+from tryton.common import Tooltips, node_attributes, ICONFACTORY
+from tryton.common.button import Button
+from tryton.config import CONFIG
+from .form_gtk.calendar import Calendar, DateTime, Time
+from .form_gtk.float import Float
+from .form_gtk.integer import Integer
+from .form_gtk.selection import Selection
+from .form_gtk.char import Char, Password
+from .form_gtk.float_time import FloatTime
+from .form_gtk.checkbox import CheckBox
+from .form_gtk.reference import Reference
+from .form_gtk.binary import Binary
+from .form_gtk.textbox import TextBox
+from .form_gtk.one2many import One2Many
+from .form_gtk.many2many import Many2Many
+from .form_gtk.many2one import Many2One
+from .form_gtk.url import Email, URL, CallTo, SIP
+from .form_gtk.image import Image as Image2
+from .form_gtk.progressbar import ProgressBar
+from .form_gtk.one2one import One2One
+from .form_gtk.richtextbox import RichTextBox
+from .form_gtk.dictionary import DictWidget
+from .form_gtk.multiselection import MultiSelection
+from .form_gtk.state_widget import (Label, VBox, Image, Frame, ScrolledWindow,
+    Notebook, Alignment)
 
 _ = gettext.gettext
 
 
-class ViewForm(ParserView):
+class Container(object):
+    def __init__(self, col=4):
+        if CONFIG['client.modepda']:
+            col = 1
+        self.col = col
+        self.table = gtk.Table(1, col)
+        self.table.set_homogeneous(False)
+        self.table.set_col_spacings(0)
+        self.table.set_row_spacings(0)
+        self.table.set_border_width(0)
+        self.last = (0, 0)
+        self.tooltips = Tooltips()
+        self.tooltips.enable()
 
-    def __init__(self, screen, widget, children=None, state_widgets=None,
-            notebooks=None, cursor_widget='', children_field=None):
-        super(ViewForm, self).__init__(screen, widget, children, state_widgets,
-            notebooks, cursor_widget, children_field)
-        self.view_type = 'form'
-        self.editable = True
+    def add_row(self):
+        height, width = self.last
+        self.table.resize(height + 1, self.col)
+        self.last = (height + 1, 0)
 
-        for button in self.get_buttons():
-            button.connect('clicked', self.button_clicked)
+    def add(self, widget, attributes):
+        height, width = self.last
 
-        # Force to display the first time it switches on a page
-        # This avoids glitch in position of widgets
-        display_done = {}
-        for notebook in notebooks:
-            def switch(notebook, page, page_num):
-                if page_num not in display_done.setdefault(notebook, []):
-                    notebook.grab_focus()
-                    display_done[notebook].append(page_num)
-                    self.display()
-            notebook.connect('switch-page', switch)
-
-        self.widgets = children
-        for widgets in self.widgets.itervalues():
-            for widget in widgets:
-                widget.view = self
+        colspan = attributes.get('colspan', 1)
+        if colspan > self.col:
+            colspan = self.col
+
+        if width + colspan > self.col:
+            self.add_row()
+            height, width = self.last
+        self.last = height, width + colspan
+
+        if not widget:
+            return
+
+        yopt = 0
+        if attributes.get('yexpand'):
+            yopt |= gtk.EXPAND
+        if attributes.get('yfill'):
+            yopt |= gtk.FILL
+
+        xopt = 0
+        if attributes.get('xexpand', True):
+            xopt |= gtk.EXPAND
+        if attributes.get('xfill', True):
+            xopt |= gtk.FILL
+
+        if attributes.get('help'):
+            self.tooltips.set_tip(widget, attributes['help'])
+
+        widget.show_all()
+        self.table.attach(widget,
+            width, width + colspan,
+            height, height + 1,
+            yoptions=yopt, xoptions=xopt,
+            ypadding=1, xpadding=2)
+
+
+class ViewForm(View):
+    editable = True
+
+    def __init__(self, screen, xml):
+        super(ViewForm, self).__init__(screen, xml)
+        self.view_type = 'form'
+        self.widgets = defaultdict(list)
+        self.state_widgets = []
+        self.notebooks = []
+
+        container = self.parse(xml)
 
         vbox = gtk.VBox()
         vp = gtk.Viewport()
         vp.set_shadow_type(gtk.SHADOW_NONE)
-        vp.add(self.widget)
+        vp.add(container.table)
         scroll = gtk.ScrolledWindow()
         scroll.add(vp)
         scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
@@ -53,6 +121,286 @@ class ViewForm(ParserView):
         vbox.pack_start(viewport, expand=True, fill=True)
 
         self.widget = vbox
+        self._viewport = vp
+
+    def parse(self, node, container=None):
+        if not container:
+            node_attrs = node_attributes(node)
+            container = Container(int(node_attrs.get('col', 4)))
+        for node in node.childNodes:
+            if node.nodeType != node.ELEMENT_NODE:
+                continue
+            node_attrs = node_attributes(node)
+            for b_field in ('readonly', 'homogeneous'):
+                if b_field in node_attrs:
+                    node_attrs[b_field] = bool(int(node_attrs[b_field]))
+            for i_field in ('yexpand', 'yfill', 'xexpand', 'xfill', 'colspan',
+                    'position'):
+                if i_field in node_attrs:
+                    node_attrs[i_field] = int(node_attrs[i_field])
+
+            parser = getattr(self, '_parse_%s' % node.tagName)
+            parser(node, container, node_attrs)
+        return container
+
+    def _parse_image(self, node, container, attributes):
+        ICONFACTORY.register_icon(attributes['name'])
+        image = Image(attrs=attributes)
+        image.set_from_stock(attributes['name'], gtk.ICON_SIZE_DIALOG)
+        self.state_widgets.append(image)
+        container.add(image, attributes)
+
+    def _parse_separator(self, node, container, attributes):
+        if 'name' in attributes:
+            field = self.screen.group.fields[attributes['name']]
+            for attr in ('states', 'string'):
+                if attr not in attributes and attr in field.attrs:
+                    attributes[attr] = field.attrs[attr]
+        vbox = VBox(attrs=attributes)
+        if attributes.get('string'):
+            label = gtk.Label(attributes['string'])
+            label.set_alignment(float(attributes.get('xalign', 0.0)),
+                float(attributes.get('yalign', 0.5)))
+            vbox.pack_start(label)
+        vbox.pack_start(gtk.HSeparator())
+        self.state_widgets.append(vbox)
+        container.add(vbox, attributes)
+
+    def _parse_label(self, node, container, attributes):
+        if 'name' in attributes:
+            field = self.screen.group.fields[attributes['name']]
+            if attributes['name'] == self.screen.exclude_field:
+                container.add(None, attributes)
+                return
+            if 'states' not in attributes and 'states' in field.attrs:
+                attributes['states'] = field.attrs['states']
+            if 'string' not in attributes:
+                if gtk.widget_get_default_direction() == \
+                        gtk.TEXT_DIR_RTL:
+                    attributes['string'] = _(':') + field.attrs['string']
+                else:
+                    attributes['string'] = field.attrs['string'] + _(':')
+        if CONFIG['client.modepda']:
+            attributes['xalign'] = 0.0
+
+        label = Label(attributes.get('string', ''), attrs=attributes)
+        label.set_alignment(float(attributes.get('xalign', 1.0)),
+            float(attributes.get('yalign', 0.0)))
+        label.set_angle(int(attributes.get('angle', 0)))
+        attributes.setdefault('xexpand', 0)
+        self.state_widgets.append(label)
+        container.add(label, attributes)
+
+    def _parse_newline(self, node, container, attributes):
+        container.add_row()
+
+    def _parse_button(self, node, container, attributes):
+        button = Button(attributes)
+        button.connect('clicked', self.button_clicked)
+        self.state_widgets.append(button)
+        container.add(button, attributes)
+
+    def _parse_notebook(self, node, container, attributes):
+        attributes.setdefault('yexpand', True)
+        attributes.setdefault('yfill', True)
+        attributes.setdefault('colspan', 4)
+        notebook = Notebook(attrs=attributes)
+        notebook.set_scrollable(True)
+        positions = {
+            'top': gtk.POS_TOP,
+            'left': gtk.POS_LEFT,
+            'right': gtk.POS_RIGHT,
+            'bottom': gtk.POS_BOTTOM,
+            }
+        notebook.set_tab_pos(positions[CONFIG['client.form_tab']])
+        notebook.set_border_width(3)
+
+        # Force to display the first time it switches on a page
+        # This avoids glitch in position of widgets
+        def switch(notebook, page, page_num):
+            if not self.widget:
+                # Not yet finish to parse
+                return
+            notebook.grab_focus()
+            self.display()
+            notebook.disconnect(handler_id)
+        handler_id = notebook.connect('switch-page', switch)
+        self.state_widgets.append(notebook)
+
+        self.notebooks.append(notebook)
+        container.add(notebook, attributes)
+        self.parse(node, notebook)
+
+    def _parse_page(self, node, notebook, attributes):
+        if CONFIG['client.form_tab'] == 'left':
+            angle = 90
+            tab_box = gtk.VBox(spacing=3)
+            image_pos, image_rotate = ('end',
+                gtk.gdk.PIXBUF_ROTATE_COUNTERCLOCKWISE)
+        elif CONFIG['client.form_tab'] == 'right':
+            angle = -90
+            tab_box = gtk.VBox(spacing=3)
+            image_pos, image_rotate = ('start',
+                gtk.gdk.PIXBUF_ROTATE_CLOCKWISE)
+        else:
+            angle = 0
+            tab_box = gtk.HBox(spacing=3)
+            image_pos, image_rotate = ('start',
+                gtk.gdk.PIXBUF_ROTATE_NONE)
+        if 'name' in attributes:
+            field = self.screen.group.fields[attributes['name']]
+            if attributes['name'] == self.screen.exclude_field:
+                return
+            for attr in ('states', 'string'):
+                if attr not in attributes and attr in field.attrs:
+                    attributes[attr] = field.attrs[attr]
+        if '_' not in attributes['string']:
+            attributes['string'] = '_' + attributes['string']
+        label = gtk.Label(attributes['string'])
+        label.set_angle(angle)
+        label.set_use_underline(True)
+        tab_box.pack_start(label)
+
+        if 'icon' in attributes:
+            ICONFACTORY.register_icon(attributes['icon'])
+            pixbuf = tab_box.render_icon(attributes['icon'],
+                gtk.ICON_SIZE_SMALL_TOOLBAR)
+            pixbuf = pixbuf.rotate_simple(image_rotate)
+            icon = gtk.Image()
+            icon.set_from_pixbuf(pixbuf)
+            if image_pos == 'end':
+                tab_box.pack_end(icon)
+            else:
+                tab_box.pack_start(icon)
+        tab_box.show_all()
+
+        viewport = gtk.Viewport()
+        viewport.set_shadow_type(gtk.SHADOW_NONE)
+        scrolledwindow = ScrolledWindow(attrs=attributes)
+        scrolledwindow.set_shadow_type(gtk.SHADOW_NONE)
+        scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        scrolledwindow.add(viewport)
+        scrolledwindow.show_all()
+        self.state_widgets.append(scrolledwindow)
+        notebook.append_page(scrolledwindow, tab_box)
+        container = self.parse(node)
+        viewport.add(container.table)
+
+    def _parse_field(self, node, container, attributes):
+        name = attributes['name']
+        field = self.screen.group.fields[name]
+
+        if (name not in self.screen.group.fields
+                or name == self.screen.exclude_field):
+            container.add(None, attributes)
+            return
+
+        if 'widget' not in attributes:
+            attributes['widget'] = field.attrs['type']
+
+        for i_field in ('width', 'height'):
+            if i_field in attributes:
+                attributes[i_field] = int(attributes[i_field])
+
+        for attr in ('relation', 'domain', 'selection',
+                'relation_field', 'string', 'help', 'views',
+                'add_remove', 'sort', 'context', 'size', 'filename',
+                'autocomplete', 'translate', 'create', 'delete',
+                'selection_change_with', 'schema_model'):
+            if attr in field.attrs and attr not in attributes:
+                attributes[attr] = field.attrs[attr]
+
+        Widget = self.get_widget(attributes['widget'])
+        widget = Widget(self, attributes)
+        self.widgets[name].append(widget)
+
+        if Widget.expand:
+            attributes.setdefault('yexpand', True)
+            attributes.setdefault('yfill', True)
+
+        if attributes.get('height') or attributes.get('width'):
+            widget.widget.set_size_request(
+                int(attributes.get('width', -1)),
+                int(attributes.get('height', -1)))
+        container.add(Alignment(widget.widget, attributes), attributes)
+
+    def _parse_group(self, node, container, attributes):
+        group = self.parse(node)
+        group.table.set_homogeneous(attributes.get('homogeneous', False))
+        if 'name' in attributes:
+            field = self.screen.group.fields[attributes['name']]
+            if attributes['name'] == self.screen.exclude_field:
+                container.add(None, attributes)
+                return
+            for attr in ('states', 'string'):
+                if attr not in attributes and attr in field.attrs:
+                    attributes[attr] = field.attrs[attr]
+
+        frame = Frame(attributes.get('string'), attrs=attributes)
+        frame.add(group.table)
+        self.state_widgets.append(frame)
+        container.add(frame, attributes)
+
+    def _parse_paned(self, node, container, attributes, Paned):
+        attributes.setdefault('yexpand', True)
+        attributes.setdefault('yfill', True)
+        paned = Paned()
+        if 'position' in attributes:
+            paned.set_position(attributes['position'])
+        container.add(paned, attributes)
+        self.parse(node, paned)
+
+    def _parse_hpaned(self, node, container, attributes):
+        self._parse_paned(node, container, attributes, gtk.HPaned)
+
+    def _parse_vpaned(self, node, container, attributes):
+        self._parse_paned(node, container, attributes, gtk.VPaned)
+
+    def _parse_child(self, node, paned, attributes):
+        container = self.parse(node)
+        if not paned.get_child1():
+            pack = paned.pack1
+        else:
+            pack = paned.pack2
+        pack(container.table, resize=True, shrink=True)
+
+    WIDGETS = {
+        'date': Calendar,
+        'datetime': DateTime,
+        'time': Time,
+        'float': Float,
+        'numeric': Float,
+        'integer': Integer,
+        'biginteger': Integer,
+        'selection': Selection,
+        'char': Char,
+        'password': Password,
+        'float_time': FloatTime,
+        'boolean': CheckBox,
+        'reference': Reference,
+        'binary': Binary,
+        'text': TextBox,
+        'one2many': One2Many,
+        'many2many': Many2Many,
+        'many2one': Many2One,
+        'email': Email,
+        'url': URL,
+        'callto': CallTo,
+        'sip': SIP,
+        'image': Image2,
+        'progressbar': ProgressBar,
+        'one2one': One2One,
+        'richtext': RichTextBox,
+        'dict': DictWidget,
+        'multiselection': MultiSelection,
+        }
+
+    @classmethod
+    def get_widget(cls, name):
+        return cls.WIDGETS[name]
+
+    def get_fields(self):
+        return self.widgets.keys()
 
     def __getitem__(self, name):
         return self.widgets[name][0]
@@ -135,39 +483,38 @@ class ViewForm(ParserView):
             if reset_view:
                 for notebook in self.notebooks:
                     notebook.set_current_page(0)
-            if self.cursor_widget in self.widgets:
-                focus_widget = self.widgets[self.cursor_widget][0]
+            if self.attributes.get('cursor') in self.widgets:
+                focus_widget = find_focused_child(self.widgets[
+                        self.attributes['cursor']][0].widget)
+            else:
+                child = find_focusable_child(self._viewport)
+                if child:
+                    child.grab_focus()
         record = self.screen.current_record
-        position = reduce(lambda x, y: x + len(y), self.widgets, 0)
         if record:
+            invalid_widgets = []
             for name, widgets in self.widgets.iteritems():
                 for widget in widgets:
                     field = record.group.fields.get(name)
                     if not field:
                         continue
                     if not field.get_state_attrs(record).get('valid', True):
-                        if widget.position > position:
-                            continue
-                        position = widget.position
-                        focus_widget = widget
+                        invalid_widgets.append(
+                            find_focusable_child(widget.widget))
+            invalid_widgets.sort(key=cmp_to_key(tab_compare))
+            if invalid_widgets:
+                focus_widget = invalid_widgets[0]
         if focus_widget:
             for notebook in self.notebooks:
                 for i in range(notebook.get_n_pages()):
                     child = notebook.get_nth_page(i)
-                    if focus_widget.widget.is_ancestor(child):
+                    if focus_widget.is_ancestor(child):
                         notebook.set_current_page(i)
             focus_widget.grab_focus()
 
     def button_clicked(self, widget):
-        record = self.screen.current_record
-        self.set_value()
-        fields = self.get_fields()
-        if not record.validate(fields):
-            self.screen.display(set_cursor=True)
-            return
-        else:
-            widget.handler_block_by_func(self.button_clicked)
-            try:
-                self.screen.button(widget.attrs)
-            finally:
-                widget.handler_unblock_by_func(self.button_clicked)
+        widget.handler_block_by_func(self.button_clicked)
+        try:
+            self.screen.button(widget.attrs)
+        finally:
+            widget.handler_unblock_by_func(self.button_clicked)
diff --git a/tryton/gui/window/view_form/view/form_gtk/__init__.py b/tryton/gui/window/view_form/view/form_gtk/__init__.py
index 5218f22..c86640b 100644
--- a/tryton/gui/window/view_form/view/form_gtk/__init__.py
+++ b/tryton/gui/window/view_form/view/form_gtk/__init__.py
@@ -1,3 +1,2 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from parser import *
diff --git a/tryton/gui/window/view_form/view/form_gtk/binary.py b/tryton/gui/window/view_form/view/form_gtk/binary.py
index 26f704a..50bc773 100644
--- a/tryton/gui/window/view_form/view/form_gtk/binary.py
+++ b/tryton/gui/window/view_form/view/form_gtk/binary.py
@@ -6,16 +6,16 @@ import os
 import tempfile
 from tryton.common import common
 from tryton.common import file_selection, Tooltips, file_open, slugify
-from interface import WidgetInterface
+from .widget import Widget
 
 _ = gettext.gettext
 
 
-class Binary(WidgetInterface):
+class Binary(Widget):
     "Binary"
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(Binary, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(Binary, self).__init__(view, attrs)
 
         self.filename = attrs.get('filename')
 
@@ -103,12 +103,6 @@ class Binary(WidgetInterface):
                 focus_chain = [self.but_new, self.but_save_as, self.but_remove]
             self.widget.set_focus_chain(focus_chain)
 
-    def grab_focus(self):
-        if self.wid_text:
-            return self.wid_text.grab_focus()
-        else:
-            return self.wid_size.grab_focus()
-
     def sig_new(self, widget=None):
         filename = ''
         if self.last_open_file:
diff --git a/tryton/gui/window/view_form/view/form_gtk/calendar.py b/tryton/gui/window/view_form/view/form_gtk/calendar.py
index bfab553..2739a5d 100644
--- a/tryton/gui/window/view_form/view/form_gtk/calendar.py
+++ b/tryton/gui/window/view_form/view/form_gtk/calendar.py
@@ -3,24 +3,25 @@
 import gtk
 import gettext
 
-from interface import WidgetInterface
+from .widget import Widget
 from tryton.common.date_widget import DateEntry
 from tryton.translate import date_format
 
 _ = gettext.gettext
 
 
-class Calendar(WidgetInterface):
+class Calendar(Widget):
     "Calendar"
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(Calendar, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(Calendar, self).__init__(view, attrs)
 
         self.widget = gtk.HBox()
         self.entry = DateEntry('')
         self.entry.set_property('activates_default', True)
         self.entry.connect('key_press_event', self.sig_key_press)
         self.entry.connect('activate', self.sig_activate)
+        self.entry.connect('changed', lambda _: self.send_modified())
         self.entry.connect('focus-out-event', lambda x, y: self._focus_out())
         self.widget.pack_start(self.entry, expand=False, fill=False)
 
@@ -44,9 +45,6 @@ class Calendar(WidgetInterface):
     def sig_key_press(self, widget, event):
         self.send_modified()
 
-    def grab_focus(self):
-        return self.entry.grab_focus()
-
     def set_value(self, record, field):
         field.set_client(record, self.get_value())
 
@@ -76,9 +74,6 @@ class Calendar(WidgetInterface):
 class DateTime(Calendar):
     "DateTime"
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(DateTime, self).__init__(field_name, model_name, attrs=attrs)
-
     def get_format(self, record, field):
         return date_format() + ' ' + field.time_format(record)
 
@@ -86,8 +81,8 @@ class DateTime(Calendar):
 class Time(Calendar):
     "Time"
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(Time, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(Time, self).__init__(view, attrs)
         self.entry.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY, None)
 
     def get_format(self, record, field):
diff --git a/tryton/gui/window/view_form/view/form_gtk/char.py b/tryton/gui/window/view_form/view/form_gtk/char.py
index 3cf5a2a..746b173 100644
--- a/tryton/gui/window/view_form/view/form_gtk/char.py
+++ b/tryton/gui/window/view_form/view/form_gtk/char.py
@@ -4,31 +4,28 @@ import gettext
 
 import gobject
 import gtk
-from interface import WidgetInterface, TranslateMixin
+from .widget import Widget, TranslateMixin
 from tryton.common import Tooltips
 from tryton.common.entry_position import manage_entry_position
+from tryton.common.selection import PopdownMixin, selection_shortcuts
 
 _ = gettext.gettext
 
 
-class Char(WidgetInterface, TranslateMixin):
+class Char(Widget, TranslateMixin, PopdownMixin):
     "Char"
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(Char, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(Char, self).__init__(view, attrs)
 
         self.widget = gtk.HBox()
         self.autocomplete = bool(attrs.get('autocomplete'))
         if self.autocomplete:
             self.entry = gtk.ComboBoxEntry()
-            self.entry_store = gtk.ListStore(gobject.TYPE_STRING)
-            self.entry.set_model(self.entry_store)
-            self.entry.set_text_column(0)
-            completion = gtk.EntryCompletion()
-            completion.set_model(self.entry_store)
-            completion.set_text_column(0)
-            self.entry.get_child().set_completion(completion)
+            selection_shortcuts(self.entry)
             focus_entry = self.entry.get_child()
+            self.set_popdown([], self.entry)
+            self.entry.connect('changed', self.changed)
         else:
             self.entry = gtk.Entry()
             focus_entry = self.entry
@@ -45,8 +42,9 @@ class Char(WidgetInterface, TranslateMixin):
 
         self.button = None
         if attrs.get('translate'):
-            self.button = self.translate_button()
-            self.widget.pack_start(self.button, False, False)
+            self.entry.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY,
+                'tryton-locale')
+            self.entry.connect('icon-press', self.translate)
 
     def translate_widget(self):
         entry = gtk.Entry()
@@ -70,14 +68,20 @@ class Char(WidgetInterface, TranslateMixin):
         widget.set_editable(not value)
         widget.props.sensitive = not value
 
+    def changed(self, combobox):
+        def focus_out():
+            if combobox.props.window:
+                self._focus_out()
+        # Only when changed from pop list
+        if not combobox.get_child().has_focus():
+            # Must be deferred because it triggers a display of the form
+            gobject.idle_add(focus_out)
+
     def _color_widget(self):
         if self.autocomplete:
             return self.entry.get_child()
         return self.entry
 
-    def grab_focus(self):
-        return self.entry.grab_focus()
-
     @property
     def modified(self):
         if self.record and self.field:
@@ -97,15 +101,12 @@ class Char(WidgetInterface, TranslateMixin):
 
     def display(self, record, field):
         super(Char, self).display(record, field)
-        if record and self.autocomplete:
-            autocompletion = record.autocompletion.get(self.field_name, [])
-            current = [elem[0] for elem in self.entry_store]
-            if autocompletion != current:
-                self.entry_store.clear()
-                for row in autocompletion:
-                    self.entry_store.append((row,))
-        elif self.autocomplete:
-            self.entry_store.clear()
+        if self.autocomplete:
+            if record:
+                selection = record.autocompletion.get(self.field_name, [])
+            else:
+                selection = []
+            self.set_popdown([(x, x) for x in selection], self.entry)
 
         # Set size
         if self.autocomplete:
@@ -128,12 +129,10 @@ class Char(WidgetInterface, TranslateMixin):
         if not self.autocomplete:
             self.entry.set_text(value)
         else:
-            for idx, row in enumerate(self.entry_store):
-                if row[0] == value:
-                    self.entry.set_active(idx)
-                    return
-            else:
+            self.entry.handler_block_by_func(self.changed)
+            if not self.set_popdown_value(self.entry, value) or not value:
                 self.entry.get_child().set_text(value)
+            self.entry.handler_unblock_by_func(self.changed)
 
     def _readonly_set(self, value):
         sensitivity = {True: gtk.SENSITIVITY_OFF, False: gtk.SENSITIVITY_AUTO}
@@ -153,8 +152,8 @@ class Char(WidgetInterface, TranslateMixin):
 
 class Password(Char):
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(Password, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(Password, self).__init__(view, attrs)
         self.entry.props.visibility = False
 
         self.visibility_checkbox = gtk.CheckButton()
diff --git a/tryton/gui/window/view_form/view/form_gtk/checkbox.py b/tryton/gui/window/view_form/view/form_gtk/checkbox.py
index e6f94e3..25a6b88 100644
--- a/tryton/gui/window/view_form/view/form_gtk/checkbox.py
+++ b/tryton/gui/window/view_form/view/form_gtk/checkbox.py
@@ -1,16 +1,16 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 import gtk
-from interface import WidgetInterface
+from .widget import Widget
 import gettext
 
 _ = gettext.gettext
 
 
-class CheckBox(WidgetInterface):
+class CheckBox(Widget):
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(CheckBox, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(CheckBox, self).__init__(view, attrs)
         self.widget = gtk.CheckButton()
         self.widget.connect('focus-out-event', lambda x, y: self._focus_out())
         self.widget.connect_after('toggled', self.sig_activate)
diff --git a/tryton/gui/window/view_form/view/form_gtk/dictionary.py b/tryton/gui/window/view_form/view/form_gtk/dictionary.py
index f958067..faecc69 100644
--- a/tryton/gui/window/view_form/view/form_gtk/dictionary.py
+++ b/tryton/gui/window/view_form/view/form_gtk/dictionary.py
@@ -9,7 +9,7 @@ import decimal
 import gettext
 from decimal import Decimal
 
-from interface import WidgetInterface
+from .widget import Widget
 from tryton.config import CONFIG
 from tryton.gui.window.win_search import WinSearch
 from tryton.common import RPCExecute, RPCException, timezoned_date, \
@@ -94,8 +94,10 @@ class DictSelectionEntry(DictEntry):
         model.append(('',))
         self._selection = {'': None}
         width = 10
-        for value, name in sorted(self.definition['selection'],
-                key=operator.itemgetter(1)):
+        selection = self.definition['selection']
+        if self.definition.get('sorted', True):
+            selection.sort(key=operator.itemgetter(1))
+        for value, name in selection:
             name = str(name)
             self._selection[name] = value
             model.append((name,))
@@ -304,10 +306,10 @@ DICT_ENTRIES = {
     }
 
 
-class DictWidget(WidgetInterface):
+class DictWidget(Widget):
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(DictWidget, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(DictWidget, self).__init__(view, attrs)
         self.schema_model = attrs['schema_model']
         self.keys = {}
         self.fields = {}
@@ -367,16 +369,8 @@ class DictWidget(WidgetInterface):
 
     def _sig_add(self, *args):
         context = self.field.context_get(self.record)
-        value = self.wid_text.get_text()
+        value = self.wid_text.get_text().decode('utf-8')
         domain = self.field.domain_get(self.record)
-        dom = [('rec_name', 'ilike', '%%%s%%' % value)] if value else []
-        dom.append(('id', 'not in',
-                [self.keys[f]['id'] for f in self.fields]))
-        try:
-            ids = RPCExecute('model', self.schema_model, 'search',
-                domain + dom, 0, CONFIG['client.limit'], None, context=context)
-        except RPCException:
-            return False
 
         def callback(result):
             if result:
@@ -393,11 +387,9 @@ class DictWidget(WidgetInterface):
                         self.add_line(new_field['name'])
             self.wid_text.set_text('')
 
-        if len(ids) != 1:
-            WinSearch(self.schema_model, callback, sel_multi=True, ids=ids,
-                context=context, domain=domain, new=False)
-        else:
-            callback([(id, None) for id in ids])
+        win = WinSearch(self.schema_model, callback, sel_multi=True,
+            context=context, domain=domain, new=False)
+        win.screen.search_filter(value)
 
     def _sig_remove(self, button, key, modified=True):
         del self.fields[key]
@@ -476,16 +468,25 @@ class DictWidget(WidgetInterface):
         self.rows[key] = [label, alignment, remove_but]
         self.buttons[key] = remove_but
 
-    def add_key(self, key):
+    def add_keys(self, keys):
         context = self.field.context_get(self.record)
-        try:
-            key_ids = RPCExecute('model', self.schema_model, 'search',
-                [('name', '=', key)], 0, CONFIG['client.limit'],
-                None, context=context)
-            self.keys[key] = RPCExecute('model', self.schema_model,
-                'get_keys', key_ids, context=context)[0]
-        except RPCException:
-            pass
+        domain = self.field.domain_get(self.record)
+        batchlen = min(10, CONFIG['client.limit'])
+        for i in xrange(0, len(keys), batchlen):
+            sub_keys = keys[i:i + batchlen]
+            try:
+                key_ids = RPCExecute('model', self.schema_model, 'search',
+                    [('name', 'in', sub_keys), domain], 0,
+                    CONFIG['client.limit'], None, context=context)
+                if not key_ids:
+                    continue
+                values = RPCExecute('model', self.schema_model,
+                    'get_keys', key_ids, context=context)
+                if not values:
+                    continue
+            except RPCException:
+                pass
+            self.keys.update({k['name']: k for k in values})
 
     def display(self, record, field):
         super(DictWidget, self).display(record, field)
@@ -500,10 +501,12 @@ class DictWidget(WidgetInterface):
             self._record_id = record_id
 
         value = field.get_client(record) if field else {}
-        for key in sorted(value.iterkeys()):
-            val = value[key]
+        new_key_names = set(value.iterkeys()) - set(self.keys)
+        if new_key_names:
+            self.add_keys(list(new_key_names))
+        for key, val in sorted(value.iteritems()):
             if key not in self.keys:
-                self.add_key(key)
+                continue
             if key not in self.fields:
                 self.add_line(key)
             widget = self.fields[key]
diff --git a/tryton/gui/window/view_form/view/form_gtk/float.py b/tryton/gui/window/view_form/view/form_gtk/float.py
index 2ae2f77..c0555f3 100644
--- a/tryton/gui/window/view_form/view/form_gtk/float.py
+++ b/tryton/gui/window/view_form/view/form_gtk/float.py
@@ -2,14 +2,14 @@
 #this repository contains the full copyright notices and license terms.
 import gtk
 import locale
-from integer import Integer
+from .integer import Integer
 
 
 class Float(Integer):
     "Float"
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(Float, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(Float, self).__init__(view, attrs)
         self.entry.connect('key-press-event', self.key_press_event)
 
     def display(self, record, field):
diff --git a/tryton/gui/window/view_form/view/form_gtk/float_time.py b/tryton/gui/window/view_form/view/form_gtk/float_time.py
index 93d7592..c35cfde 100644
--- a/tryton/gui/window/view_form/view/form_gtk/float_time.py
+++ b/tryton/gui/window/view_form/view/form_gtk/float_time.py
@@ -1,15 +1,15 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 import gtk
-from interface import WidgetInterface
+from .widget import Widget
 import tryton.common as common
 import tryton.rpc as rpc
 
 
-class FloatTime(WidgetInterface):
+class FloatTime(Widget):
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(FloatTime, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(FloatTime, self).__init__(view, attrs)
 
         self.widget = gtk.HBox()
         self.entry = gtk.Entry()
@@ -28,9 +28,6 @@ class FloatTime(WidgetInterface):
     def _color_widget(self):
         return self.entry
 
-    def grab_focus(self):
-        return self.entry.grab_focus()
-
     @property
     def modified(self):
         if self.record and self.field:
diff --git a/tryton/gui/window/view_form/view/form_gtk/image.py b/tryton/gui/window/view_form/view/form_gtk/image.py
index ba5bdd0..0410f2f 100644
--- a/tryton/gui/window/view_form/view/form_gtk/image.py
+++ b/tryton/gui/window/view_form/view/form_gtk/image.py
@@ -1,24 +1,21 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 import gtk
-import glib
 import gettext
 import os
 import tempfile
-from tryton.common import file_selection, Tooltips, file_open, slugify
-from tryton.config import PIXMAPS_DIR
-from interface import WidgetInterface
+from tryton.common import (file_selection, Tooltips, file_open, slugify,
+    resize_pixbuf, data2pixbuf, BIG_IMAGE_SIZE)
+from .widget import Widget
 import urllib
 
 _ = gettext.gettext
 
-NOIMAGE = open(os.path.join(PIXMAPS_DIR, 'tryton-noimage.png'), 'rb').read()
 
+class Image(Widget):
 
-class Image(WidgetInterface):
-
-    def __init__(self, field_name, model_name, attrs=None):
-        super(Image, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(Image, self).__init__(view, attrs)
 
         self.filename = attrs.get('filename')
         self.height = int(attrs.get('img_height', 100))
@@ -102,9 +99,6 @@ class Image(WidgetInterface):
     def filename_field(self):
         return self.record.group.fields.get(self.filename)
 
-    def grab_focus(self):
-        return self.image.grab_focus()
-
     def _readonly_set(self, value):
         self._readonly = value
         if self.but_add:
@@ -199,52 +193,12 @@ class Image(WidgetInterface):
         if self.field:
             value = self.field.get_client(self.record)
         if isinstance(value, (int, long)):
-            if value > 10 ** 6:
+            if value > BIG_IMAGE_SIZE:
                 value = False
             else:
                 value = self.field.get_data(self.record)
-        if not value:
-            data = NOIMAGE
-        else:
-            data = value
-
-        pixbuf = None
-        for ftype in ('jpeg', 'gif', 'png', 'bmp', 'svg'):
-            try:
-                loader = gtk.gdk.PixbufLoader(ftype)
-                loader.write(data, len(data))
-                loader.close()
-                pixbuf = loader.get_pixbuf()
-            except glib.GError:
-                continue
-            if pixbuf:
-                break
-        if not pixbuf:
-            loader = gtk.gdk.PixbufLoader('png')
-            loader.write(NOIMAGE, len(NOIMAGE))
-            loader.close()
-            pixbuf = loader.get_pixbuf()
-
-        img_height = pixbuf.get_height()
-        if img_height > self.height:
-            height = self.height
-        else:
-            height = img_height
-
-        img_width = pixbuf.get_width()
-        if img_width > self.width:
-            width = self.width
-        else:
-            width = img_width
-
-        if (img_width / width) < (img_height / height):
-            width = float(img_width) / float(img_height) * float(height)
-        else:
-            height = float(img_height) / float(img_width) * float(width)
-
-        scaled = pixbuf.scale_simple(int(width), int(height),
-                gtk.gdk.INTERP_BILINEAR)
-        self.image.set_from_pixbuf(scaled)
+        pixbuf = resize_pixbuf(data2pixbuf(value), self.width, self.height)
+        self.image.set_from_pixbuf(pixbuf)
 
     def display(self, record, field):
         if not field:
diff --git a/tryton/gui/window/view_form/view/form_gtk/integer.py b/tryton/gui/window/view_form/view/form_gtk/integer.py
index cc8ee4d..256c344 100644
--- a/tryton/gui/window/view_form/view/form_gtk/integer.py
+++ b/tryton/gui/window/view_form/view/form_gtk/integer.py
@@ -1,14 +1,14 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from char import Char
+from .char import Char
 import locale
 
 
 class Integer(Char):
     "Integer"
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(Integer, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(Integer, self).__init__(view, attrs)
         self.entry.set_width_chars(8)
         _, _, padding, pack_type = self.widget.query_child_packing(
             self.entry)
diff --git a/tryton/gui/window/view_form/view/form_gtk/many2many.py b/tryton/gui/window/view_form/view/form_gtk/many2many.py
index fbc0dd6..075f438 100644
--- a/tryton/gui/window/view_form/view/form_gtk/many2many.py
+++ b/tryton/gui/window/view_form/view/form_gtk/many2many.py
@@ -3,23 +3,22 @@
 import gtk
 
 from tryton.gui.window.view_form.screen import Screen
-from interface import WidgetInterface
+from .widget import Widget
 from tryton.gui.window.win_search import WinSearch
 from tryton.gui.window.win_form import WinForm
-from tryton.config import CONFIG
 import tryton.common as common
 import gettext
-from tryton.common import RPCExecute, RPCException
 from tryton.common.placeholder_entry import PlaceholderEntry
 from tryton.common.completion import get_completion, update_completion
 
 _ = gettext.gettext
 
 
-class Many2Many(WidgetInterface):
+class Many2Many(Widget):
+    expand = True
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(Many2Many, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(Many2Many, self).__init__(view, attrs)
 
         self.widget = gtk.VBox(homogeneous=False, spacing=5)
         self._readonly = True
@@ -97,13 +96,10 @@ class Many2Many(WidgetInterface):
         self.wid_text.connect('key_press_event', self.on_keypress)
 
     def _color_widget(self):
-        if hasattr(self.screen.current_view, 'widget_tree'):
-            return self.screen.current_view.widget_tree
+        if hasattr(self.screen.current_view, 'treeview'):
+            return self.screen.current_view.treeview
         return super(Many2Many, self)._color_widget()
 
-    def grab_focus(self):
-        return self.wid_text.grab_focus()
-
     def on_keypress(self, widget, event):
         editable = self.wid_text.get_editable()
         activate_keys = [gtk.keysyms.Tab, gtk.keysyms.ISO_Left_Tab]
@@ -140,7 +136,7 @@ class Many2Many(WidgetInterface):
             widget.modify_text(gtk.STATE_INSENSITIVE,
                     self.colors['text_color_insensitive'])
 
-    def _sig_add(self, *args, **kwargs):
+    def _sig_add(self, *args):
         if not self.focus_out:
             return
         domain = self.field.domain_get(self.record)
@@ -148,19 +144,9 @@ class Many2Many(WidgetInterface):
         if add_remove:
             domain = [domain, add_remove]
         context = self.field.context_get(self.record)
-        value = self.wid_text.get_text()
+        value = self.wid_text.get_text().decode('utf-8')
 
         self.focus_out = False
-        try:
-            if value:
-                dom = [('rec_name', 'ilike', '%' + value + '%'), domain]
-            else:
-                dom = domain
-            ids = RPCExecute('model', self.attrs['relation'], 'search',
-                dom, 0, CONFIG['client.limit'], None, context=context)
-        except RPCException:
-            self.focus_out = True
-            return False
 
         def callback(result):
             self.focus_out = True
@@ -170,14 +156,12 @@ class Many2Many(WidgetInterface):
                 self.screen.display(res_id=ids[0])
             self.screen.set_cursor()
             self.wid_text.set_text('')
-        if len(ids) != 1 or not value or kwargs.get('win_search', False):
-            WinSearch(self.attrs['relation'], callback, sel_multi=True,
-                ids=ids, context=context, domain=domain,
-                view_ids=self.attrs.get('view_ids', '').split(','),
-                views_preload=self.attrs.get('views', {}),
-                new=self.attrs.get('create', True))
-        else:
-            callback([(i, None) for i in ids])
+        win = WinSearch(self.attrs['relation'], callback, sel_multi=True,
+            context=context, domain=domain,
+            view_ids=self.attrs.get('view_ids', '').split(','),
+            views_preload=self.attrs.get('views', {}),
+            new=self.attrs.get('create', True))
+        win.screen.search_filter(value)
 
     def _sig_remove(self, *args):
         self.screen.remove(remove=True)
@@ -271,7 +255,7 @@ class Many2Many(WidgetInterface):
 
     def _completion_action_activated(self, completion, index):
         if index == 0:
-            self._sig_add(win_search=True)
+            self._sig_add()
             self.wid_text.grab_focus()
         elif index == 1:
             model = self.attrs['relation']
diff --git a/tryton/gui/window/view_form/view/form_gtk/many2one.py b/tryton/gui/window/view_form/view/form_gtk/many2one.py
index dd72af3..99a795f 100644
--- a/tryton/gui/window/view_form/view/form_gtk/many2one.py
+++ b/tryton/gui/window/view_form/view/form_gtk/many2one.py
@@ -3,24 +3,23 @@
 import gtk
 import gobject
 import gettext
-from interface import WidgetInterface
+
+from .widget import Widget
 import tryton.common as common
 from tryton.gui.window.view_form.screen import Screen
 from tryton.gui.window.win_search import WinSearch
 from tryton.gui.window.win_form import WinForm
-from tryton.config import CONFIG
 from tryton.common.popup_menu import populate
-from tryton.common import RPCExecute, RPCException
 from tryton.common.completion import get_completion, update_completion
 from tryton.common.entry_position import manage_entry_position
 
 _ = gettext.gettext
 
 
-class Many2One(WidgetInterface):
+class Many2One(Widget):
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(Many2One, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(Many2One, self).__init__(view, attrs)
 
         self.widget = gtk.HBox(spacing=0)
         self.widget.set_property('sensitive', True)
@@ -49,38 +48,15 @@ class Many2One(WidgetInterface):
         else:
             self.wid_completion = None
 
-        self.but_open = gtk.Button()
-        img_find = gtk.Image()
-        img_find.set_from_stock('tryton-find', gtk.ICON_SIZE_SMALL_TOOLBAR)
-        self.but_open.set_image(img_find)
-        self.but_open.set_relief(gtk.RELIEF_NONE)
-        self.but_open.connect('clicked', self.sig_edit)
-        self.but_open.set_alignment(0.5, 0.5)
-
-        self.but_new = gtk.Button()
-        img_new = gtk.Image()
-        img_new.set_from_stock('tryton-new', gtk.ICON_SIZE_SMALL_TOOLBAR)
-        self.but_new.set_image(img_new)
-        self.but_new.set_relief(gtk.RELIEF_NONE)
-        self.but_new.connect('clicked', self.sig_new)
-        self.but_new.set_alignment(0.5, 0.5)
-
-        self.widget.pack_end(self.but_new, expand=False, fill=False)
-        self.widget.pack_end(self.but_open, expand=False, fill=False)
-        self.widget.pack_end(self.wid_text, expand=True, fill=True)
+        self.wid_text.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY,
+            'tryton-find')
+        self.wid_text.connect('icon-press', self.sig_edit)
 
+        self.widget.pack_start(self.wid_text, expand=True, fill=True)
         self.widget.set_focus_chain([self.wid_text])
 
-        self.tooltips = common.Tooltips()
-        self.tooltips.set_tip(self.but_new, _('Create a new record <F3>'))
-        self.tooltips.set_tip(self.but_open, _('Open a record <F2>'))
-        self.tooltips.enable()
-
         self._readonly = False
 
-    def grab_focus(self):
-        return self.wid_text.grab_focus()
-
     def get_model(self):
         return self.attrs['relation']
 
@@ -93,21 +69,24 @@ class Many2One(WidgetInterface):
             self.widget.set_focus_chain([self.wid_text])
 
     def _set_button_sensitive(self):
+        self.wid_text.set_editable(not self._readonly)
+        self.wid_text.set_icon_sensitive(gtk.ENTRY_ICON_SECONDARY,
+            self.read_access)
+
+    def get_access(self, type_):
         model = self.get_model()
         if model:
-            access = common.MODELACCESS[model]
+            return common.MODELACCESS[model][type_]
         else:
-            access = {
-                'create': True,
-                'read': True,
-                }
-        self.wid_text.set_editable(not self._readonly)
-        self.but_new.set_sensitive(bool(
-                not self._readonly
-                and self.attrs.get('create', True)
-                and access['create']))
-        self.but_open.set_sensitive(bool(
-                access['read']))
+            return True
+
+    @property
+    def read_access(self):
+        return self.get_access('read')
+
+    @property
+    def create_access(self):
+        return self.attrs.get('create', True) and self.get_access('create')
 
     @property
     def modified(self):
@@ -151,27 +130,7 @@ class Many2One(WidgetInterface):
                             self.record)['required'])):
                 domain = self.field.domain_get(self.record)
                 context = self.field.context_get(self.record)
-                self.wid_text.grab_focus()
-
-                try:
-                    if self.wid_text.get_text():
-                        dom = [('rec_name', 'ilike',
-                            '%' + self.wid_text.get_text() + '%'),
-                            domain]
-                    else:
-                        dom = domain
-                    ids = RPCExecute('model', model, 'search', dom, 0,
-                        CONFIG['client.limit'], None, context=context)
-                except RPCException:
-                    self.focus_out = True
-                    self.changed = True
-                    return
-                if len(ids) == 1:
-                    self.field.set_client(self.record,
-                        self.value_from_id(ids[0]), force_change=True)
-                    self.focus_out = True
-                    self.changed = True
-                    return
+                text = self.wid_text.get_text().decode('utf-8')
 
                 def callback(result):
                     if result:
@@ -182,11 +141,12 @@ class Many2One(WidgetInterface):
                     self.focus_out = True
                     self.changed = True
 
-                WinSearch(model, callback, sel_multi=False,
-                    ids=ids, context=context, domain=domain,
+                win = WinSearch(model, callback, sel_multi=False,
+                    context=context, domain=domain,
                     view_ids=self.attrs.get('view_ids', '').split(','),
                     views_preload=self.attrs.get('views', {}),
-                    new=self.but_new.get_property('sensitive'))
+                    new=self.create_access)
+                win.screen.search_filter(text)
                 return
         self.focus_out = True
         self.changed = True
@@ -243,26 +203,7 @@ class Many2One(WidgetInterface):
         elif model and not self._readonly:
             domain = self.field.domain_get(self.record)
             context = self.field.context_get(self.record)
-            self.wid_text.grab_focus()
-
-            try:
-                if self.wid_text.get_text():
-                    dom = [('rec_name', 'ilike',
-                        '%' + self.wid_text.get_text() + '%'),
-                        domain]
-                else:
-                    dom = domain
-                ids = RPCExecute('model', model, 'search', dom, 0,
-                    CONFIG['client.limit'], None, context=context)
-            except RPCException:
-                self.focus_out = True
-                self.changed = True
-                return False
-            if len(ids) == 1:
-                self.field.set_client(self.record, self.value_from_id(ids[0]),
-                    force_change=True)
-                self.focus_out = True
-                return True
+            text = self.wid_text.get_text().decode('utf-8')
 
             def callback(result):
                 if result:
@@ -270,11 +211,12 @@ class Many2One(WidgetInterface):
                         self.value_from_id(*result[0]), force_change=True)
                 self.focus_out = True
                 self.changed = True
-            WinSearch(model, callback, sel_multi=False,
-                ids=ids, context=context, domain=domain,
+            win = WinSearch(model, callback, sel_multi=False,
+                context=context, domain=domain,
                 view_ids=self.attrs.get('view_ids', '').split(','),
                 views_preload=self.attrs.get('views', {}),
-                new=self.but_new.get_property('sensitive'))
+                new=self.create_access)
+            win.screen.search_filter(text)
             return
         self.focus_out = True
         self.changed = True
@@ -287,11 +229,10 @@ class Many2One(WidgetInterface):
             activate_keys.append(gtk.keysyms.Return)
         if (event.keyval == gtk.keysyms.F3
                 and editable
-                and self.but_new.get_property('sensitive')):
+                and self.create_access):
             self.sig_new(widget, event)
             return True
-        elif (event.keyval == gtk.keysyms.F2
-                and self.but_open.get_property('sensitive')):
+        elif event.keyval == gtk.keysyms.F2 and self.read_access:
             self.sig_edit(widget)
             return True
         elif (event.keyval in activate_keys
@@ -316,9 +257,12 @@ class Many2One(WidgetInterface):
                 position = self.wid_text.get_position()
                 self.field.set_client(self.record,
                     self.value_from_id(None, ''))
-                # Restore text and position after display
-                self.wid_text.set_text(text)
-                self.wid_text.set_position(position)
+                # The value of the field could be different of None
+                # in such case, the original text should not be restored
+                if not self.wid_text.get_text():
+                    # Restore text and position after display
+                    self.wid_text.set_text(text)
+                    self.wid_text.set_position(position)
             gobject.idle_add(clean)
         return False
 
@@ -347,16 +291,13 @@ class Many2One(WidgetInterface):
             self.wid_text.set_position(0)
             self.changed = True
             return False
-        img = self.but_open.get_image()
-        current_stock = img.get_stock()[0]
         self.set_text(field.get_client(record))
-        value = field.get(record)
-        if self.has_target(value) and current_stock != 'tryton-open':
-            img.set_from_stock('tryton-open', gtk.ICON_SIZE_SMALL_TOOLBAR)
-            self.tooltips.set_tip(self.but_open, _('Open a record <F2>'))
-        elif not self.has_target(value) and current_stock != 'tryton-find':
-            img.set_from_stock('tryton-find', gtk.ICON_SIZE_SMALL_TOOLBAR)
-            self.tooltips.set_tip(self.but_open, _('Search a record <F2>'))
+        if self.has_target(field.get(record)):
+            stock, tooltip = 'tryton-open', _('Open a record <F2>')
+        else:
+            stock, tooltip = 'tryton-find', _('Search a record <F2>')
+        self.wid_text.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY, stock)
+        self.wid_text.set_icon_tooltip_text(gtk.ENTRY_ICON_SECONDARY, tooltip)
         self.changed = True
 
     def _populate_popup(self, widget, menu):
diff --git a/tryton/gui/window/view_form/view/form_gtk/multiselection.py b/tryton/gui/window/view_form/view/form_gtk/multiselection.py
index 0de0f68..c14682c 100644
--- a/tryton/gui/window/view_form/view/form_gtk/multiselection.py
+++ b/tryton/gui/window/view_form/view/form_gtk/multiselection.py
@@ -3,41 +3,32 @@
 import gtk
 import gobject
 
-from .interface import WidgetInterface
+from .widget import Widget
 from tryton.common.selection import SelectionMixin
+from tryton.common.treeviewcontrol import TreeViewControl
 
-MOVEMENT_KEYS = {gtk.keysyms.Up, gtk.keysyms.Down, gtk.keysyms.space,
-    gtk.keysyms.Left, gtk.keysyms.KP_Left,
-    gtk.keysyms.Right, gtk.keysyms.KP_Right,
-    gtk.keysyms.Home, gtk.keysyms.KP_Home,
-    gtk.keysyms.End, gtk.keysyms.KP_End}
 
+class MultiSelection(Widget, SelectionMixin):
+    expand = True
 
-class MultiSelection(WidgetInterface, SelectionMixin):
+    def __init__(self, view, attrs):
+        super(MultiSelection, self).__init__(view, attrs)
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(MultiSelection, self).__init__(field_name, model_name,
-            attrs=attrs)
-
-        self.widget = viewport = gtk.Viewport()
-        viewport.set_shadow_type(gtk.SHADOW_ETCHED_IN)
-        scroll = gtk.ScrolledWindow()
-        scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-        scroll.set_placement(gtk.CORNER_TOP_LEFT)
-        viewport.add(scroll)
+        self.widget = gtk.ScrolledWindow()
+        self.widget.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        self.widget.set_shadow_type(gtk.SHADOW_ETCHED_IN)
 
         self.model = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING)
-        self.tree = gtk.TreeView()
+        self.tree = TreeViewControl()
         self.tree.set_model(self.model)
         self.tree.set_search_column(1)
         self.tree.connect('focus-out-event', lambda *a: self._focus_out())
-        self.tree.connect('button-press-event', self.__button_press)
-        self.tree.connect('key_press_event', self.__key_press)
+        self.tree.set_headers_visible(False)
         selection = self.tree.get_selection()
         selection.set_mode(gtk.SELECTION_MULTIPLE)
-        selection.connect('changed', self.send_modified)
-        scroll.add(self.tree)
-        name_column = gtk.TreeViewColumn(attrs.get('string', ''))
+        selection.connect('changed', self.changed)
+        self.widget.add(self.tree)
+        name_column = gtk.TreeViewColumn()
         name_cell = gtk.CellRendererText()
         name_column.pack_start(name_cell)
         name_column.add_attribute(name_cell, 'text', 1)
@@ -50,9 +41,6 @@ class MultiSelection(WidgetInterface, SelectionMixin):
     def _color_widget(self):
         return self.tree
 
-    def grab_focus(self):
-        self.tree.grab_focus()
-
     @property
     def modified(self):
         if self.record and self.field:
@@ -61,9 +49,12 @@ class MultiSelection(WidgetInterface, SelectionMixin):
             return value != group
         return False
 
-    def send_modified(self, *args):
-        if self.record:
-            self.record.signal('record-modified')
+    def changed(self, selection):
+        def focus_out():
+            if self.widget.props.window:
+                self._focus_out()
+        # Must be deferred because it triggers a display of the form
+        gobject.idle_add(focus_out)
 
     def get_value(self):
         model, paths = self.tree.get_selection().get_selected_rows()
@@ -73,28 +64,24 @@ class MultiSelection(WidgetInterface, SelectionMixin):
         field.set_client(record, self.get_value())
 
     def display(self, record, field):
-        self.update_selection(record, field)
-        super(MultiSelection, self).display(record, field)
-        self.model.clear()
-        if field is None:
-            return
-        id2path = {}
-        for idx, (value, name) in enumerate(self.selection):
-            self.model.append((value, name))
-            id2path[value] = idx
         selection = self.tree.get_selection()
-        selection.unselect_all()
-        group = field.get_client(record)
-        for element in group:
-            if (element not in group.record_removed
-                    and element not in group.record_deleted
-                    and element.id in id2path):
-                selection.select_path(id2path[element.id])
-
-    def __button_press(self, treeview, event):
-        if event.button == 1:
-            event.state |= gtk.gdk.CONTROL_MASK
-
-    def __key_press(self, treeview, event):
-        if event.keyval in MOVEMENT_KEYS:
-            event.state |= gtk.gdk.CONTROL_MASK
+        selection.handler_block_by_func(self.changed)
+        try:
+            self.update_selection(record, field)
+            super(MultiSelection, self).display(record, field)
+            self.model.clear()
+            if field is None:
+                return
+            id2path = {}
+            for idx, (value, name) in enumerate(self.selection):
+                self.model.append((value, name))
+                id2path[value] = idx
+            selection.unselect_all()
+            group = field.get_client(record)
+            for element in group:
+                if (element not in group.record_removed
+                        and element not in group.record_deleted
+                        and element.id in id2path):
+                    selection.select_path(id2path[element.id])
+        finally:
+            selection.handler_unblock_by_func(self.changed)
diff --git a/tryton/gui/window/view_form/view/form_gtk/one2many.py b/tryton/gui/window/view_form/view/form_gtk/one2many.py
index ca9f02c..c4e644c 100644
--- a/tryton/gui/window/view_form/view/form_gtk/one2many.py
+++ b/tryton/gui/window/view_form/view/form_gtk/one2many.py
@@ -3,30 +3,29 @@
 import gtk
 import gettext
 
-from interface import WidgetInterface
+from .widget import Widget
 from tryton.gui.window.view_form.screen import Screen
 from tryton.gui.window.win_search import WinSearch
 from tryton.gui.window.win_form import WinForm
-from tryton.config import CONFIG
 import tryton.common as common
-from tryton.common import RPCExecute, RPCException
 from tryton.common.placeholder_entry import PlaceholderEntry
 from tryton.common.completion import get_completion, update_completion
 
 _ = gettext.gettext
 
 
-class One2Many(WidgetInterface):
+class One2Many(Widget):
+    expand = True
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(One2Many, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(One2Many, self).__init__(view, attrs)
 
         self.widget = gtk.VBox(homogeneous=False, spacing=2)
         self._readonly = True
         self._position = 0
         self._length = 0
 
-        hbox = gtk.HBox(homogeneous=False, spacing=0)
+        self.title_box = hbox = gtk.HBox(homogeneous=False, spacing=0)
         hbox.set_border_width(2)
 
         label = gtk.Label(attrs.get('string', ''))
@@ -192,13 +191,10 @@ class One2Many(WidgetInterface):
         but_switch.props.sensitive = self.screen.number_of_views > 1
 
     def _color_widget(self):
-        if hasattr(self.screen.current_view, 'widget_tree'):
-            return self.screen.current_view.widget_tree
+        if hasattr(self.screen.current_view, 'treeview'):
+            return self.screen.current_view.treeview
         return super(One2Many, self)._color_widget()
 
-    def grab_focus(self):
-        return self.screen.widget.grab_focus()
-
     def on_keypress(self, widget, event):
         if (event.keyval == gtk.keysyms.F3) \
                 and self.but_new.get_property('sensitive'):
@@ -264,6 +260,7 @@ class One2Many(WidgetInterface):
             size_limit = (field_size is not None
                 and o2m_size >= field_size >= 0)
         else:
+            o2m_size = None
             size_limit = False
 
         self.but_new.set_sensitive(bool(
@@ -302,6 +299,17 @@ class One2Many(WidgetInterface):
                     and access['write']
                     and access['read']))
 
+        # New button must be added to focus chain to allow keyboard only
+        # creation when there is no existing record on form view.
+        focus_chain = self.title_box.get_focus_chain()
+        if o2m_size == 0 and self.screen.current_view.view_type == 'form':
+            if self.but_new not in focus_chain:
+                focus_chain.append(self.but_new)
+        else:
+            if self.but_new in focus_chain:
+                focus_chain.remove(self.but_new)
+        self.title_box.set_focus_chain(focus_chain)
+
     def _validate(self):
         self.view.set_value()
         record = self.screen.current_record
@@ -324,7 +332,7 @@ class One2Many(WidgetInterface):
         sequence = None
         for view in self.screen.views:
             if view.view_type == 'tree':
-                sequence = view.widget_tree.sequence
+                sequence = view.attributes.get('sequence')
                 if sequence:
                     break
 
@@ -374,7 +382,7 @@ class One2Many(WidgetInterface):
     def _sig_undelete(self, button):
         self.screen.unremove()
 
-    def _sig_add(self, *args, **kwargs):
+    def _sig_add(self, *args):
         if not self.focus_out:
             return
         access = common.MODELACCESS[self.screen.model_name]
@@ -385,24 +393,14 @@ class One2Many(WidgetInterface):
         context = self.field.context_get(self.record)
         domain = [domain, self.record.expr_eval(self.attrs.get('add_remove'))]
         removed_ids = self.field.get_removed_ids(self.record)
+        domain = ['OR', domain, ('id', 'in', removed_ids)]
+        text = self.wid_text.get_text().decode('utf-8')
 
         self.focus_out = False
-        try:
-            if self.wid_text.get_text():
-                dom = [('rec_name', 'ilike',
-                        '%' + self.wid_text.get_text() + '%'),
-                    ['OR', domain, ('id', 'in', removed_ids)]]
-            else:
-                dom = ['OR', domain, ('id', 'in', removed_ids)]
-            ids = RPCExecute('model', self.attrs['relation'], 'search', dom,
-                    0, CONFIG['client.limit'], None, context=context)
-        except RPCException:
-            self.focus_out = True
-            return False
 
         sequence = None
         if self.screen.current_view.view_type == 'tree':
-            sequence = self.screen.current_view.widget_tree.sequence
+            sequence = self.screen.current_view.attributes.get('sequence')
 
         def callback(result):
             self.focus_out = True
@@ -415,14 +413,12 @@ class One2Many(WidgetInterface):
             self.screen.set_cursor()
             self.wid_text.set_text('')
 
-        if len(ids) != 1 or kwargs.get('win_search', False):
-            WinSearch(self.attrs['relation'], callback, sel_multi=True,
-                ids=ids, context=context, domain=domain,
-                view_ids=self.attrs.get('view_ids', '').split(','),
-                views_preload=self.attrs.get('views', {}),
-                new=self.but_new.get_property('sensitive'))
-        else:
-            callback([(i, None) for i in ids])
+        win = WinSearch(self.attrs['relation'], callback, sel_multi=True,
+            context=context, domain=domain,
+            view_ids=self.attrs.get('view_ids', '').split(','),
+            views_preload=self.attrs.get('views', {}),
+            new=self.but_new.get_property('sensitive'))
+        win.screen.search_filter(text)
 
     def _sig_label(self, screen, signal_data):
         self._position = signal_data[0]
@@ -501,7 +497,7 @@ class One2Many(WidgetInterface):
 
     def _completion_action_activated(self, completion, index):
         if index == 0:
-            self._sig_add(win_search=True)
+            self._sig_add()
             self.wid_text.grab_focus()
         elif index == 1:
             self._sig_new()
diff --git a/tryton/gui/window/view_form/view/form_gtk/one2one.py b/tryton/gui/window/view_form/view/form_gtk/one2one.py
index 3af021f..334c8af 100644
--- a/tryton/gui/window/view_form/view/form_gtk/one2one.py
+++ b/tryton/gui/window/view_form/view/form_gtk/one2one.py
@@ -1,6 +1,6 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from many2one import Many2One
+from .many2one import Many2One
 
 
 class One2One(Many2One):
diff --git a/tryton/gui/window/view_form/view/form_gtk/parser.py b/tryton/gui/window/view_form/view/form_gtk/parser.py
deleted file mode 100644
index e7c71f2..0000000
--- a/tryton/gui/window/view_form/view/form_gtk/parser.py
+++ /dev/null
@@ -1,572 +0,0 @@
-#This file is part of Tryton.  The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-import gtk
-import gettext
-import logging
-from tryton.gui.window.view_form.view.interface import ParserInterface
-import tryton.common as common
-from tryton.config import CONFIG
-from tryton.common.button import Button
-
-_ = gettext.gettext
-
-
-class StateMixin(object):
-
-    def __init__(self, *args, **kwargs):
-        self.attrs = kwargs.pop('attrs')
-        super(StateMixin, self).__init__(*args, **kwargs)
-
-    def state_set(self, record):
-        if record:
-            state_changes = record.expr_eval(self.attrs.get('states', {}))
-        else:
-            state_changes = {}
-        if state_changes.get('invisible', self.attrs.get('invisible')):
-            self.hide()
-        else:
-            self.show()
-
-
-class Label(StateMixin, gtk.Label):
-
-    def state_set(self, record):
-        super(Label, self).state_set(record)
-        if not self.attrs.get('string', True) and 'name' in self.attrs:
-            if record:
-                field = record.group.fields[self.attrs['name']]
-                text = field.get_client(record) or ''
-            else:
-                text = ''
-            self.set_text(text)
-
-
-class VBox(StateMixin, gtk.VBox):
-    pass
-
-
-class Image(StateMixin, gtk.Image):
-    pass
-
-
-class Frame(StateMixin, gtk.Frame):
-
-    def __init__(self, label=None, attrs=None, widgets=None):
-        if not label:  # label must be None to have no label widget
-            label = None
-        super(Frame, self).__init__(label=label, attrs=attrs)
-        self.widgets = widgets or {}
-        if not label:
-            self.set_shadow_type(gtk.SHADOW_NONE)
-        self.set_border_width(0)
-
-
-class ScrolledWindow(StateMixin, gtk.ScrolledWindow):
-    pass
-
-
-class Notebook(StateMixin, gtk.Notebook):
-
-    def state_set(self, record):
-        super(Notebook, self).state_set(record)
-        if record:
-            state_changes = record.expr_eval(self.attrs.get('states', {}))
-        else:
-            state_changes = {}
-        if state_changes.get('readonly', self.attrs.get('readonly')):
-            for widgets in self.widgets.itervalues():
-                for widget in widgets:
-                    widget._readonly_set(True)
-                    widget.color_set('readonly')
-
-
-class Alignment(gtk.Alignment):
-
-    def __init__(self, widget, attrs):
-        super(Alignment, self).__init__(
-            float(attrs.get('xalign', 0.0)),
-            float(attrs.get('yalign', 0.5)),
-            float(attrs.get('xexpand', 1.0)),
-            float(attrs.get('yexpand', 1.0)))
-        self.add(widget)
-        widget.connect('show', lambda *a: self.show())
-        widget.connect('hide', lambda *a: self.hide())
-
-
-class _container(object):
-    def __init__(self, tooltips):
-        self.cont = []
-        self.col = []
-        self.tooltips = tooltips
-
-    def new(self, col=4):
-        table = gtk.Table(1, col)
-        table.set_homogeneous(False)
-        table.set_col_spacings(0)
-        table.set_row_spacings(0)
-        table.set_border_width(0)
-        self.cont.append((table, 0, 0))
-        self.col.append(col)
-
-    def get(self):
-        return self.cont[-1][0]
-
-    def pop(self):
-        table = self.cont.pop()[0]
-        self.col.pop()
-        return table
-
-    def newline(self):
-        (table, width, height) = self.cont[-1]
-        if width > 0:
-            self.cont[-1] = (table, 0, height + 1)
-        table.resize(height + 1, self.col[-1])
-
-    def wid_add(self, widget, name='', yexpand=False, ypadding=2, rowspan=1,
-            colspan=1, fname=None, help_tip=False,
-            yfill=False, xexpand=True, xfill=True, xpadding=3):
-        (table, width, height) = self.cont[-1]
-        if colspan > self.col[-1]:
-            colspan = self.col[-1]
-        if colspan + width > self.col[-1]:
-            self.newline()
-            (table, width, height) = self.cont[-1]
-        yopt = False
-        if yexpand:
-            yopt = yopt | gtk.EXPAND
-        if yfill:
-            yopt = yopt | gtk.FILL
-        xopt = False
-        if xexpand:
-            xopt = xopt | gtk.EXPAND
-        if xfill:
-            xopt = xopt | gtk.FILL
-        if help_tip:
-            self.tooltips.set_tip(widget, help_tip)
-            self.tooltips.enable()
-        widget.show_all()
-        table.attach(widget, width, width + colspan,
-                height, height + rowspan,
-                yoptions=yopt, ypadding=ypadding,
-                xoptions=xopt, xpadding=xpadding)
-        self.cont[-1] = (table, width + colspan, height)
-        wid_list = table.get_children()
-        wid_list.reverse()
-        table.set_focus_chain(wid_list)
-
-    def empty_add(self, colspan=1):
-        (table, width, height) = self.cont[-1]
-        if colspan > self.col[-1]:
-            colspan = self.col[-1]
-        if colspan + width > self.col[-1]:
-            self.newline()
-            (table, width, height) = self.cont[-1]
-        self.cont[-1] = (table, width + colspan, height)
-
-
-class ParserForm(ParserInterface):
-
-    def __init__(self, parent=None, attrs=None, screen=None,
-            children_field=None):
-        super(ParserForm, self).__init__(parent=parent, attrs=attrs,
-            screen=screen, children_field=children_field)
-        self.widget_id = 0
-
-    def parse(self, model_name, root_node, fields, notebook=None, paned=None,
-            tooltips=None):
-        dict_widget = {}
-        state_widgets = []
-        notebook_list = []
-        attrs = common.node_attributes(root_node)
-        on_write = attrs.get('on_write', '')
-        if not tooltips:
-            tooltips = common.Tooltips()
-        container = _container(tooltips)
-        if CONFIG['client.modepda']:
-            container.new(col=1)
-        else:
-            container.new(col=int(attrs.get('col', 4)))
-        cursor_widget = attrs.get('cursor')
-
-        if not self.title:
-            self.title = attrs.get('string', 'Unknown')
-
-        for node in root_node.childNodes:
-            if not node.nodeType == node.ELEMENT_NODE:
-                continue
-            attrs = common.node_attributes(node)
-            if not cursor_widget:
-                if (attrs.get('name') and fields.get(attrs['name'])
-                        and not int(attrs.get('invisible', 0))
-                        and not int(attrs.get('readonly', 0))
-                        and attrs['name'] != self.screen.exclude_field):
-                    cursor_widget = attrs.get('name')
-            yexpand = int(attrs.get('yexpand', 0))
-            yfill = int(attrs.get('yfill', 0))
-            xexpand = int(attrs.get('xexpand', 1))
-            xfill = int(attrs.get('xfill', 1))
-            colspan = int(attrs.get('colspan', 1))
-            if node.localName == 'image':
-                common.ICONFACTORY.register_icon(attrs['name'])
-                icon = Image(attrs=attrs)
-                state_widgets.append(icon)
-                icon.set_from_stock(attrs['name'], gtk.ICON_SIZE_DIALOG)
-                container.wid_add(icon,
-                    help_tip=attrs.get('help', False),
-                    colspan=colspan,
-                    yexpand=yexpand, yfill=yfill, ypadding=10,
-                    xexpand=xexpand, xfill=xfill)
-            elif node.localName == 'separator':
-                text = attrs.get('string', '')
-                if 'name' in attrs:
-                    for attr_name in ('states', 'invisible'):
-                        if attr_name not in attrs and attrs['name'] in fields:
-                            if attr_name in fields[attrs['name']].attrs:
-                                attrs[attr_name] = fields[attrs['name']
-                                        ].attrs[attr_name]
-                    if not text:
-                        text = fields[attrs['name']].attrs['string']
-                vbox = VBox(attrs=attrs)
-                state_widgets.append(vbox)
-                if text:
-                    label = gtk.Label(text)
-                    label.set_alignment(float(attrs.get('xalign', 0.0)), 0.5)
-                    vbox.pack_start(label)
-                vbox.pack_start(gtk.HSeparator())
-                container.wid_add(vbox,
-                    help_tip=attrs.get('help', False),
-                    colspan=colspan,
-                    yexpand=yexpand, yfill=yfill, ypadding=10,
-                    xexpand=xexpand, xfill=xfill)
-            elif node.localName == 'label':
-                text = attrs.get('string', '')
-                if 'name' in attrs and attrs['name'] in fields:
-                    if attrs['name'] == self.screen.exclude_field:
-                        container.empty_add(int(attrs.get('colspan', 1)))
-                        continue
-                    for attr_name in ('states', 'invisible'):
-                        if attr_name not in attrs \
-                                and attr_name in fields[attrs['name']].attrs:
-                            attrs[attr_name] = fields[attrs['name']
-                                    ].attrs[attr_name]
-                    if 'string' not in attrs:
-                        if gtk.widget_get_default_direction() == \
-                                gtk.TEXT_DIR_RTL:
-                            text = _(':') + \
-                                fields[attrs['name']].attrs['string']
-                        else:
-                            text = fields[attrs['name']].attrs['string'] + \
-                                _(':')
-                    if 'xalign' not in attrs:
-                        attrs['xalign'] = 1.0
-                elif not text:
-                    for node in node.childNodes:
-                        if node.nodeType == node.TEXT_NODE:
-                            text += node.data
-                        else:
-                            text += node.toxml()
-                label = Label(text, attrs=attrs)
-                state_widgets.append(label)
-                if CONFIG['client.modepda']:
-                    attrs['xalign'] = 0.0
-                label.set_alignment(float(attrs.get('xalign', 1.0)),
-                    float(attrs.get('yalign', 0.0)))
-                label.set_angle(int(attrs.get('angle', 0)))
-                xexpand = bool(attrs.get('xexpand', 0))
-                container.wid_add(label,
-                    help_tip=attrs.get('help', False),
-                    colspan=colspan,
-                    yexpand=yexpand, yfill=yfill,
-                    xexpand=xexpand, xfill=xfill)
-
-            elif node.localName == 'newline':
-                container.newline()
-
-            elif node.localName == 'button':
-                button = Button(attrs)
-                state_widgets.append(button)
-                container.wid_add(button,
-                    help_tip=attrs.get('help', False),
-                    colspan=colspan,
-                    yexpand=yexpand, yfill=yfill,
-                    xexpand=xexpand, xfill=xfill)
-
-            elif node.localName == 'notebook':
-                notebook = Notebook(attrs=attrs)
-                state_widgets.append(notebook)
-                notebook.set_scrollable(True)
-                notebook_list.append(notebook)
-                if CONFIG['client.form_tab'] == 'top':
-                    pos = gtk.POS_TOP
-                elif CONFIG['client.form_tab'] == 'left':
-                    pos = gtk.POS_LEFT
-                elif CONFIG['client.form_tab'] == 'right':
-                    pos = gtk.POS_RIGHT
-                elif CONFIG['client.form_tab'] == 'bottom':
-                    pos = gtk.POS_BOTTOM
-                notebook.set_tab_pos(pos)
-                notebook.set_border_width(3)
-                colspan = int(attrs.get('colspan', 4))
-                yexpand = bool(attrs.get('yexpand', 1))
-                yfill = bool(attrs.get('yfill', 1))
-                container.wid_add(notebook,
-                    colspan=colspan,
-                    yexpand=yexpand, yfill=yfill,
-                    xexpand=xexpand, xfill=xfill)
-                (widget, widgets, state_widgets2, spam, notebook_list2,
-                    cursor_widget2) = self.parse(model_name, node, fields,
-                        notebook, tooltips=tooltips)
-                if not cursor_widget:
-                    cursor_widget = cursor_widget2
-                notebook_list.extend(notebook_list2)
-                state_widgets += state_widgets2
-                for widget_name, widgets in widgets.items():
-                    dict_widget.setdefault(widget_name, [])
-                    dict_widget[widget_name].extend(widgets)
-
-            elif node.localName == 'page':
-                if CONFIG['client.form_tab'] == 'left':
-                    angle = 90
-                    tab_box = gtk.VBox(spacing=3)
-                    image_pos, image_rotate = ('end',
-                        gtk.gdk.PIXBUF_ROTATE_COUNTERCLOCKWISE)
-                elif CONFIG['client.form_tab'] == 'right':
-                    angle = -90
-                    tab_box = gtk.VBox(spacing=3)
-                    image_pos, image_rotate = ('start',
-                        gtk.gdk.PIXBUF_ROTATE_CLOCKWISE)
-                else:
-                    angle = 0
-                    tab_box = gtk.HBox(spacing=3)
-                    image_pos, image_rotate = ('start',
-                        gtk.gdk.PIXBUF_ROTATE_NONE)
-                text = attrs.get('string', '')
-                if 'name' in attrs and attrs['name'] in fields:
-                    if attrs['name'] == self.screen.exclude_field:
-                        continue
-                    for attr_name in ('states', 'invisible'):
-                        if attr_name in fields[attrs['name']].attrs:
-                            attrs[attr_name] = \
-                                fields[attrs['name']].attrs[attr_name]
-                    if not text:
-                        text = fields[attrs['name']].attrs['string']
-                if not text:
-                    text = _('No String Attr.')
-                if '_' not in text:
-                    text = '_' + text
-                tab_label = gtk.Label(text)
-                tab_label.set_angle(angle)
-                tab_label.set_use_underline(True)
-                tab_box.pack_start(tab_label)
-                if 'icon' in attrs:
-                    common.ICONFACTORY.register_icon(attrs['icon'])
-                    pixbuf = tab_box.render_icon(attrs['icon'],
-                        gtk.ICON_SIZE_SMALL_TOOLBAR)
-                    pixbuf = pixbuf.rotate_simple(image_rotate)
-                    icon = gtk.Image()
-                    icon.set_from_pixbuf(pixbuf)
-                    if image_pos == 'end':
-                        tab_box.pack_end(icon)
-                    else:
-                        tab_box.pack_start(icon)
-                tab_box.show_all()
-                (widget, widgets, state_widgets2, spam, notebook_list2,
-                    cursor_widget2) = self.parse(model_name, node, fields,
-                        notebook, tooltips=tooltips)
-                if not cursor_widget:
-                    cursor_widget = cursor_widget2
-                notebook_list.extend(notebook_list2)
-                state_widgets += state_widgets2
-                for widget_name, widgets in widgets.iteritems():
-                    dict_widget.setdefault(widget_name, [])
-                    dict_widget[widget_name].extend(widgets)
-
-                viewport = gtk.Viewport()
-                viewport.set_shadow_type(gtk.SHADOW_NONE)
-                viewport.add(widget)
-                viewport.show()
-                scrolledwindow = ScrolledWindow(attrs=attrs)
-                scrolledwindow.set_shadow_type(gtk.SHADOW_NONE)
-                scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC,
-                        gtk.POLICY_AUTOMATIC)
-                scrolledwindow.add(viewport)
-
-                state_widgets.append(scrolledwindow)
-                notebook.append_page(scrolledwindow, tab_box)
-
-            elif node.localName == 'field':
-                name = str(attrs['name'])
-                if name == self.screen.exclude_field:
-                    container.empty_add(int(attrs.get('colspan', 1)))
-                    continue
-                if name not in fields:
-                    container.empty_add(int(attrs.get('colspan', 1)))
-                    log = logging.getLogger(__name__)
-                    log.error('Unknown field "%s"' % str(name))
-                    continue
-                ftype = attrs.get('widget', fields[name].attrs['type'])
-                if not ftype in WIDGETS_TYPE:
-                    container.empty_add(int(attrs.get('colspan', 1)))
-                    continue
-                for attr_name in ('relation', 'domain', 'selection',
-                        'relation_field', 'string', 'views', 'invisible',
-                        'add_remove', 'sort', 'context', 'size', 'filename',
-                        'autocomplete', 'translate', 'create', 'delete',
-                        'selection_change_with', 'schema_model'):
-                    if attr_name in fields[name].attrs and \
-                            not attr_name in attrs:
-                        attrs[attr_name] = fields[name].attrs[attr_name]
-
-                widget_act = WIDGETS_TYPE[ftype][0](name, model_name, attrs)
-                self.widget_id += 1
-                widget_act.position = self.widget_id
-                dict_widget.setdefault(name, [])
-                dict_widget[name].append(widget_act)
-                yexpand = bool(attrs.get('yexpand', WIDGETS_TYPE[ftype][2]))
-                yfill = bool(attrs.get('yfill', WIDGETS_TYPE[ftype][3]))
-                hlp = fields[name].attrs.get('help', attrs.get('help', False))
-                if attrs.get('height', False) or attrs.get('width', False):
-                    widget_act.widget.set_size_request(
-                            int(attrs.get('width', -1)),
-                            int(attrs.get('height', -1)))
-                container.wid_add(Alignment(widget_act.widget, attrs),
-                    fields[name].attrs['string'], fname=name,
-                    help_tip=hlp,
-                    colspan=colspan,
-                    yexpand=yexpand, yfill=yfill,
-                    xexpand=xexpand, xfill=xfill)
-
-            elif node.localName == 'group':
-                (widget, widgets, state_widgets2, spam, notebook_list2,
-                    cursor_widget2) = self.parse(model_name, node, fields,
-                        tooltips=tooltips)
-                if not cursor_widget:
-                    cursor_widget = cursor_widget2
-                notebook_list.extend(notebook_list2)
-                for widget_name, lwidgets in widgets.iteritems():
-                    dict_widget.setdefault(widget_name, [])
-                    dict_widget[widget_name].extend(lwidgets)
-                state_widgets += state_widgets2
-                text = ''
-                if 'name' in attrs and attrs['name'] in fields:
-                    if attrs['name'] == self.screen.exclude_field:
-                        container.empty_add(int(attrs.get('colspan', 1)))
-                        continue
-                    for attr_name in ('states', 'invisible'):
-                        if attr_name in fields[attrs['name']].attrs:
-                            attrs[attr_name] = fields[attrs['name']
-                                    ].attrs[attr_name]
-                    text = fields[attrs['name']].attrs['string']
-                if attrs.get('string'):
-                    text = attrs['string']
-                widget.set_homogeneous(bool(int(attrs.get('homogeneous', 0))))
-
-                frame = Frame(text, attrs=attrs, widgets=widgets)
-                frame.add(widget)
-                state_widgets.append(frame)
-                container.wid_add(frame,
-                    colspan=colspan,
-                    yexpand=yexpand, yfill=yfill, ypadding=0,
-                    xexpand=xexpand, xfill=xfill, xpadding=0)
-            elif node.localName == 'hpaned':
-                hpaned = gtk.HPaned()
-                container.wid_add(hpaned, colspan=int(attrs.get('colspan', 4)),
-                        yexpand=True, yfill=True)
-                (widget, widgets, state_widgets2, spam, notebook_list2,
-                    cursor_widget2) = self.parse(model_name, node, fields,
-                        paned=hpaned, tooltips=tooltips)
-                if not cursor_widget:
-                    cursor_widget = cursor_widget2
-                notebook_list.extend(notebook_list2)
-                state_widgets += state_widgets2
-                for widget_name, widgets in widgets.iteritems():
-                    dict_widget.setdefault(widget_name, [])
-                    dict_widget[widget_name].extend(widgets)
-                if 'position' in attrs:
-                    hpaned.set_position(int(attrs['position']))
-            elif node.localName == 'vpaned':
-                vpaned = gtk.VPaned()
-                container.wid_add(vpaned, colspan=int(attrs.get('colspan', 4)),
-                        yexpand=True, yfill=True)
-                (widget, widgets, state_widgets2, spam, notebook_list2,
-                    cursor_widget2) = self.parse(model_name, node, fields,
-                        paned=vpaned, tooltips=tooltips)
-                if not cursor_widget:
-                    cursor_widget = cursor_widget2
-                notebook_list.extend(notebook_list2)
-                state_widgets += state_widgets2
-                for widget_name, widgets in widgets.iteritems():
-                    dict_widget.setdefault(widget_name, [])
-                    dict_widget[widget_name].extend(widgets)
-                if 'position' in attrs:
-                    vpaned.set_position(int(attrs['position']))
-            elif node.localName == 'child':
-                (widget, widgets, state_widgets2, spam, notebook_list2,
-                    cursor_widget2) = self.parse(model_name, node, fields,
-                        paned=paned, tooltips=tooltips)
-                if not cursor_widget:
-                    cursor_widget = cursor_widget2
-                notebook_list.extend(notebook_list2)
-                state_widgets += state_widgets2
-                for widget_name, widgets in widgets.iteritems():
-                    dict_widget.setdefault(widget_name, [])
-                    dict_widget[widget_name].extend(widgets)
-                if not paned.get_child1():
-                    paned.pack1(widget, resize=True, shrink=True)
-                elif not paned.get_child2():
-                    paned.pack2(widget, resize=True, shrink=True)
-        return container.pop(), dict_widget, state_widgets, on_write, \
-            notebook_list, cursor_widget
-
-from calendar import Calendar, DateTime, Time
-from float import Float
-from integer import Integer
-from selection import Selection
-from char import Char, Password
-from float_time import FloatTime
-from checkbox import CheckBox
-from reference import Reference
-from binary import Binary
-from textbox import TextBox
-from one2many import One2Many
-from many2many import Many2Many
-from many2one import Many2One
-from url import Email, URL, CallTo, SIP
-from image import Image as Image2
-from progressbar import ProgressBar
-from one2one import One2One
-from richtextbox import RichTextBox
-from dictionary import DictWidget
-from multiselection import MultiSelection
-
-
-WIDGETS_TYPE = {
-    'date': (Calendar, 1, False, False),
-    'datetime': (DateTime, 1, False, False),
-    'time': (Time, 1, False, False),
-    'float': (Float, 1, False, False),
-    'numeric': (Float, 1, False, False),
-    'integer': (Integer, 1, False, False),
-    'biginteger': (Integer, 1, False, False),
-    'selection': (Selection, 1, False, False),
-    'char': (Char, 1, False, False),
-    'password': (Password, 1, False, False),
-    'float_time': (FloatTime, 1, False, False),
-    'boolean': (CheckBox, 1, False, False),
-    'reference': (Reference, 1, False, False),
-    'binary': (Binary, 1, False, False),
-    'text': (TextBox, 1, True, True),
-    'one2many': (One2Many, 1, True, True),
-    'many2many': (Many2Many, 1, True, True),
-    'many2one': (Many2One, 1, False, False),
-    'email': (Email, 1, False, False),
-    'url': (URL, 1, False, False),
-    'callto': (CallTo, 1, False, False),
-    'sip': (SIP, 1, False, False),
-    'image': (Image2, 1, False, False),
-    'progressbar': (ProgressBar, 1, False, False),
-    'one2one': (One2One, 1, False, False),
-    'richtext': (RichTextBox, 1, True, True),
-    'dict': (DictWidget, 1, False, False),
-    'multiselection': (MultiSelection, 1, True, True),
-}
diff --git a/tryton/gui/window/view_form/view/form_gtk/progressbar.py b/tryton/gui/window/view_form/view/form_gtk/progressbar.py
index 23e9b6e..4051149 100644
--- a/tryton/gui/window/view_form/view/form_gtk/progressbar.py
+++ b/tryton/gui/window/view_form/view/form_gtk/progressbar.py
@@ -1,11 +1,11 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 import gtk
-from interface import WidgetInterface
+from .widget import Widget
 import locale
 
 
-class ProgressBar(WidgetInterface):
+class ProgressBar(Widget):
     'Progress Bar'
     orientations = {
         'left_to_right': gtk.PROGRESS_LEFT_TO_RIGHT,
@@ -14,8 +14,8 @@ class ProgressBar(WidgetInterface):
         'top_to_bottom': gtk.PROGRESS_TOP_TO_BOTTOM,
     }
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(ProgressBar, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(ProgressBar, self).__init__(view, attrs)
         self.widget = gtk.ProgressBar()
         orientation = self.orientations.get(attrs.get('orientation',
             'left_to_right'), gtk.PROGRESS_LEFT_TO_RIGHT)
diff --git a/tryton/gui/window/view_form/view/form_gtk/reference.py b/tryton/gui/window/view_form/view/form_gtk/reference.py
index 0455e23..089c9f2 100644
--- a/tryton/gui/window/view_form/view/form_gtk/reference.py
+++ b/tryton/gui/window/view_form/view/form_gtk/reference.py
@@ -3,7 +3,7 @@
 import gtk
 import gettext
 
-from many2one import Many2One
+from .many2one import Many2One
 from tryton.common.selection import SelectionMixin, PopdownMixin
 
 _ = gettext.gettext
@@ -11,8 +11,8 @@ _ = gettext.gettext
 
 class Reference(Many2One, SelectionMixin, PopdownMixin):
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(Reference, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(Reference, self).__init__(view, attrs)
 
         self.widget_combo = gtk.ComboBoxEntry()
         child = self.widget_combo.get_child()
@@ -27,9 +27,6 @@ class Reference(Many2One, SelectionMixin, PopdownMixin):
 
         self.widget.set_focus_chain([self.widget_combo, self.wid_text])
 
-    def grab_focus(self):
-        return self.widget_combo.grab_focus()
-
     def get_model(self):
         active = self.widget_combo.get_active()
         if active < 0:
diff --git a/tryton/gui/window/view_form/view/form_gtk/richtextbox.py b/tryton/gui/window/view_form/view/form_gtk/richtextbox.py
index 69b8584..d804f63 100644
--- a/tryton/gui/window/view_form/view/form_gtk/richtextbox.py
+++ b/tryton/gui/window/view_form/view/form_gtk/richtextbox.py
@@ -5,7 +5,7 @@ import gtk
 import pango
 import re
 from gettext import gettext as _
-from textbox import TextBox
+from .textbox import TextBox
 from tryton.common import get_toplevel_window
 
 
@@ -64,8 +64,8 @@ def formalize_text_markup(text):
 class RichTextBox(TextBox):
     '''Implements a rich text editor as widget to Tryton Client'''
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(RichTextBox, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(RichTextBox, self).__init__(view, attrs)
         self.table_tag = gtk.TextTagTable()
         self.text_buffer = gtk.TextBuffer(self.table_tag)
         self.textview.set_buffer(self.text_buffer)
diff --git a/tryton/gui/window/view_form/view/form_gtk/selection.py b/tryton/gui/window/view_form/view/form_gtk/selection.py
index 09a977b..fe49d9d 100644
--- a/tryton/gui/window/view_form/view/form_gtk/selection.py
+++ b/tryton/gui/window/view_form/view/form_gtk/selection.py
@@ -3,15 +3,15 @@
 import gtk
 import gobject
 
-from interface import WidgetInterface
+from .widget import Widget
 from tryton.common.selection import SelectionMixin, selection_shortcuts, \
     PopdownMixin
 
 
-class Selection(WidgetInterface, SelectionMixin, PopdownMixin):
+class Selection(Widget, SelectionMixin, PopdownMixin):
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(Selection, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(Selection, self).__init__(view, attrs)
 
         self.widget = gtk.HBox(spacing=3)
         self.entry = gtk.ComboBoxEntry()
@@ -39,9 +39,6 @@ class Selection(WidgetInterface, SelectionMixin, PopdownMixin):
         # Must be deferred because it triggers a display of the form
         gobject.idle_add(focus_out)
 
-    def grab_focus(self):
-        return self.entry.grab_focus()
-
     def _readonly_set(self, value):
         super(Selection, self)._readonly_set(value)
         self.entry.set_sensitive(not value)
@@ -78,6 +75,8 @@ class Selection(WidgetInterface, SelectionMixin, PopdownMixin):
             # Compatibility with Many2One
             value = value[0]
 
+        self.entry.handler_block_by_func(self.changed)
         if not self.set_popdown_value(self.entry, value):
             self.get_inactive_selection(value)
             self.set_popdown_value(self.entry, value)
+        self.entry.handler_unblock_by_func(self.changed)
diff --git a/tryton/gui/window/view_form/view/form_gtk/state_widget.py b/tryton/gui/window/view_form/view/form_gtk/state_widget.py
new file mode 100644
index 0000000..a88369b
--- /dev/null
+++ b/tryton/gui/window/view_form/view/form_gtk/state_widget.py
@@ -0,0 +1,84 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+import gtk
+
+
+class StateMixin(object):
+
+    def __init__(self, *args, **kwargs):
+        self.attrs = kwargs.pop('attrs')
+        super(StateMixin, self).__init__(*args, **kwargs)
+
+    def state_set(self, record):
+        if record:
+            state_changes = record.expr_eval(self.attrs.get('states', {}))
+        else:
+            state_changes = {}
+        if state_changes.get('invisible', self.attrs.get('invisible')):
+            self.hide()
+        else:
+            self.show()
+
+
+class Label(StateMixin, gtk.Label):
+
+    def state_set(self, record):
+        super(Label, self).state_set(record)
+        if not self.attrs.get('string', True) and 'name' in self.attrs:
+            if record:
+                field = record.group.fields[self.attrs['name']]
+                text = field.get_client(record) or ''
+            else:
+                text = ''
+            self.set_text(text)
+
+
+class VBox(StateMixin, gtk.VBox):
+    pass
+
+
+class Image(StateMixin, gtk.Image):
+    pass
+
+
+class Frame(StateMixin, gtk.Frame):
+
+    def __init__(self, label=None, attrs=None):
+        if not label:  # label must be None to have no label widget
+            label = None
+        super(Frame, self).__init__(label=label, attrs=attrs)
+        if not label:
+            self.set_shadow_type(gtk.SHADOW_NONE)
+        self.set_border_width(0)
+
+
+class ScrolledWindow(StateMixin, gtk.ScrolledWindow):
+    pass
+
+
+class Notebook(StateMixin, gtk.Notebook):
+
+    def state_set(self, record):
+        super(Notebook, self).state_set(record)
+        if record:
+            state_changes = record.expr_eval(self.attrs.get('states', {}))
+        else:
+            state_changes = {}
+        if state_changes.get('readonly', self.attrs.get('readonly')):
+            for widgets in self.widgets.itervalues():
+                for widget in widgets:
+                    widget._readonly_set(True)
+                    widget.color_set('readonly')
+
+
+class Alignment(gtk.Alignment):
+
+    def __init__(self, widget, attrs):
+        super(Alignment, self).__init__(
+            float(attrs.get('xalign', 0.0)),
+            float(attrs.get('yalign', 0.5)),
+            float(attrs.get('xexpand', 1.0)),
+            float(attrs.get('yexpand', 1.0)))
+        self.add(widget)
+        widget.connect('show', lambda *a: self.show())
+        widget.connect('hide', lambda *a: self.hide())
diff --git a/tryton/gui/window/view_form/view/form_gtk/textbox.py b/tryton/gui/window/view_form/view/form_gtk/textbox.py
index 176189b..d09754e 100644
--- a/tryton/gui/window/view_form/view/form_gtk/textbox.py
+++ b/tryton/gui/window/view_form/view/form_gtk/textbox.py
@@ -1,7 +1,7 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 import gtk
-from interface import WidgetInterface, TranslateMixin
+from .widget import Widget, TranslateMixin
 from tryton.config import CONFIG
 
 try:
@@ -10,10 +10,11 @@ except ImportError:
     gtkspell = None
 
 
-class TextBox(WidgetInterface, TranslateMixin):
+class TextBox(Widget, TranslateMixin):
+    expand = True
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(TextBox, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(TextBox, self).__init__(view, attrs)
 
         self.widget = gtk.VBox()
         self.scrolledwindow = gtk.ScrolledWindow()
@@ -76,9 +77,6 @@ class TextBox(WidgetInterface, TranslateMixin):
         textview.set_editable(not value)
         textview.props.sensitive = not value
 
-    def grab_focus(self):
-        return self.textview.grab_focus()
-
     def _readonly_set(self, value):
         super(TextBox, self)._readonly_set(value)
         self.textview.set_editable(not value)
diff --git a/tryton/gui/window/view_form/view/form_gtk/url.py b/tryton/gui/window/view_form/view/form_gtk/url.py
index 870e0ff..9edb072 100644
--- a/tryton/gui/window/view_form/view/form_gtk/url.py
+++ b/tryton/gui/window/view_form/view/form_gtk/url.py
@@ -1,7 +1,7 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 import gtk
-from char import Char
+from .char import Char
 import webbrowser
 import tryton.common as common
 
@@ -9,8 +9,8 @@ import tryton.common as common
 class URL(Char):
     "url"
 
-    def __init__(self, field_name, model_name, attrs=None):
-        super(URL, self).__init__(field_name, model_name, attrs=attrs)
+    def __init__(self, view, attrs):
+        super(URL, self).__init__(view, attrs)
 
         self.tooltips = common.Tooltips()
         self.button = gtk.Button()
diff --git a/tryton/gui/window/view_form/view/form_gtk/interface.py b/tryton/gui/window/view_form/view/form_gtk/widget.py
similarity index 93%
rename from tryton/gui/window/view_form/view/form_gtk/interface.py
rename to tryton/gui/window/view_form/view/form_gtk/widget.py
index 22ef029..b1b9bdf 100644
--- a/tryton/gui/window/view_form/view/form_gtk/interface.py
+++ b/tryton/gui/window/view_form/view/form_gtk/widget.py
@@ -13,35 +13,35 @@ from tryton.common import RPCExecute, RPCException
 _ = gettext.gettext
 
 
-class WidgetInterface(object):
-
-    def __init__(self, field_name, model_name, attrs=None):
-        super(WidgetInterface, self).__init__()
-        self.field_name = field_name
-        self.model_name = model_name
-        self.view = None  # Filled by ViewForm
-        self.attrs = attrs or {}
-        for attr_name in ('readonly', 'invisible'):
-            if attr_name in self.attrs:
-                self.attrs[attr_name] = bool(int(self.attrs[attr_name]))
+class Widget(object):
+    expand = False
+
+    def __init__(self, view, attrs):
+        super(Widget, self).__init__()
+        self.view = view
+        self.attrs = attrs
         self.widget = None
-        self.position = 0
         self.colors = {}
         self.visible = True
         self.color_name = None
 
-    def __get_record(self):
-        if self.view and self.view.screen:
-            return self.view.screen.current_record
+    @property
+    def field_name(self):
+        return self.attrs['name']
+
+    @property
+    def model_name(self):
+        return self.view.screen.model_name
 
-    record = property(__get_record)
+    @property
+    def record(self):
+        return self.view.screen.current_record
 
-    def __get_field(self):
+    @property
+    def field(self):
         if self.record:
             return self.record.group.fields[self.field_name]
 
-    field = property(__get_field)
-
     def destroy(self):
         pass
 
@@ -58,9 +58,6 @@ class WidgetInterface(object):
     def _invisible_widget(self):
         return self.widget
 
-    def grab_focus(self):
-        return self.widget.grab_focus()
-
     @property
     def modified(self):
         return False
@@ -302,7 +299,7 @@ class TranslateMixin:
         button.connect('clicked', self.translate)
         return button
 
-    def translate(self, widget):
+    def translate(self, *args):
         if self.record.id < 0 or self.record.modified:
             common.message(
                 _('You need to save the record before adding translations!'))
diff --git a/tryton/gui/window/view_form/view/graph.py b/tryton/gui/window/view_form/view/graph.py
index 850d608..2105130 100644
--- a/tryton/gui/window/view_form/view/graph.py
+++ b/tryton/gui/window/view_form/view/graph.py
@@ -1,26 +1,80 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from interface import ParserView
+import sys
+import os
 
+import gtk
+import gettext
 
-class ViewGraph(ParserView):
+from . import View
+from tryton.common import node_attributes, get_toplevel_window, message
+from tryton.config import TRYTON_ICON, CONFIG
+from .graph_gtk.bar import VerticalBar, HorizontalBar
+from .graph_gtk.line import Line
+from .graph_gtk.pie import Pie
 
-    def __init__(self, screen, widget, children=None, state_widgets=None,
-            notebooks=None, cursor_widget=None, children_field=None):
-        super(ViewGraph, self).__init__(screen, widget, children,
-            state_widgets, notebooks, cursor_widget, children_field)
+_ = gettext.gettext
+
+
+class ViewGraph(View):
+
+    def __init__(self, screen, xml):
+        super(ViewGraph, self).__init__(screen, xml)
         self.view_type = 'graph'
-        self.widgets = children
-        self.editable = False
+        self.widgets = {}
+        self.widget = self.parse(xml)
+
+    def parse(self, node):
+        xfield = None
+        yfields = []
+
+        for node in node.childNodes:
+            if node.nodeType != node.ELEMENT_NODE:
+                continue
+            if node.tagName == 'x':
+                for child in node.childNodes:
+                    if not child.nodeType == child.ELEMENT_NODE:
+                        continue
+                    xfield = node_attributes(child)
+                    field = self.screen.group.fields[xfield['name']]
+                    if not xfield.get('string'):
+                        xfield['string'] = field.attrs['string']
+            elif node.tagName == 'y':
+                for child in node.childNodes:
+                    if not child.nodeType == child.ELEMENT_NODE:
+                        continue
+                    yattrs = node_attributes(child)
+                    if not yattrs.get('string') and yattrs['name'] != '#':
+                        field = self.screen.group.fields[yattrs['name']]
+                        yattrs['string'] = field.attrs['string']
+                    yfields.append(yattrs)
+
+        Widget = self.get_widget(self.attributes.get('type', 'vbar'))
+        widget = Widget(self, xfield, yfields)
+        self.widgets['root'] = widget
+        event = gtk.EventBox()
+        event.add(widget)
+        event.connect('button-press-event', self.button_press)
+        return event
+
+    WIDGETS = {
+        'vbar': VerticalBar,
+        'hbar': HorizontalBar,
+        'line': Line,
+        'pie': Pie,
+        }
+
+    @classmethod
+    def get_widget(cls, name):
+        return cls.WIDGETS[name]
 
     def __getitem__(self, name):
         return None
 
     def destroy(self):
         self.widget.destroy()
-        for widget in self.widgets.keys():
-            self.widgets[widget].destroy()
-            del self.widgets[widget]
+        self.widgets['root'].destroy()
+        self.widgets.clear()
 
     def set_value(self):
         pass
@@ -29,8 +83,7 @@ class ViewGraph(ParserView):
         pass
 
     def display(self):
-        for widget in self.widgets.itervalues():
-            widget.display(self.screen.group)
+        self.widgets['root'].display(self.screen.group)
         return True
 
     def set_cursor(self, new=False, reset_view=True):
@@ -38,3 +91,98 @@ class ViewGraph(ParserView):
 
     def get_fields(self):
         return []
+
+    def get_buttons(self):
+        return []
+
+    def save(self, widget, graph):
+        parent = get_toplevel_window()
+        dia = gtk.Dialog(_('Save As'), parent,
+            gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
+            (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+                gtk.STOCK_OK, gtk.RESPONSE_OK))
+        dia.set_icon(TRYTON_ICON)
+        dia.set_has_separator(True)
+        dia.set_default_response(gtk.RESPONSE_OK)
+
+        dia.vbox.set_spacing(5)
+        dia.vbox.set_homogeneous(False)
+
+        title = gtk.Label('<b>' + _('Image Size') + '</b>')
+        title.set_alignment(0.0, 0.5)
+        title.set_use_markup(True)
+        dia.vbox.pack_start(title)
+
+        table = gtk.Table(2, 2)
+        table.set_col_spacings(3)
+        table.set_row_spacings(3)
+        table.set_border_width(1)
+        table.attach(gtk.Label(_('Width:')), 0, 1, 0, 1, yoptions=False,
+                xoptions=gtk.FILL)
+        spinwidth = gtk.SpinButton(gtk.Adjustment(400.0,
+                0.0, sys.maxint, 1.0, 10.0))
+        spinwidth.set_numeric(True)
+        spinwidth.set_activates_default(True)
+        table.attach(spinwidth, 1, 2, 0, 1, yoptions=False, xoptions=gtk.FILL)
+        table.attach(gtk.Label(_('Height:')), 0, 1, 1, 2, yoptions=False,
+                xoptions=gtk.FILL)
+        spinheight = gtk.SpinButton(gtk.Adjustment(200.0,
+                0.0, sys.maxint, 1.0, 10.0))
+        spinheight.set_numeric(True)
+        spinheight.set_activates_default(True)
+        table.attach(spinheight, 1, 2, 1, 2, yoptions=False, xoptions=gtk.FILL)
+        dia.vbox.pack_start(table)
+
+        filechooser = gtk.FileChooserWidget(gtk.FILE_CHOOSER_ACTION_SAVE, None)
+        filechooser.set_current_folder(CONFIG['client.default_path'])
+        filter = gtk.FileFilter()
+        filter.set_name(_('PNG image (*.png)'))
+        filter.add_mime_type('image/png')
+        filter.add_pattern('*.png')
+        filechooser.add_filter(filter)
+        dia.vbox.pack_start(filechooser)
+
+        dia.show_all()
+
+        while True:
+            response = dia.run()
+            width = spinwidth.get_value_as_int()
+            height = spinheight.get_value_as_int()
+            filename = filechooser.get_filename()
+            if filename:
+                filename = filename.decode('utf-8')
+                try:
+                    CONFIG['client.default_path'] = \
+                        os.path.dirname(filename)
+                    CONFIG.save()
+                except IOError:
+                    pass
+            if response == gtk.RESPONSE_OK:
+                if width and height and filename:
+                    if not filename.endswith('.png'):
+                        filename = filename + '.png'
+                    try:
+                        graph.export_png(filename, width, height)
+                        break
+                    except MemoryError:
+                        message(_('Image size too large!'), dia,
+                                gtk.MESSAGE_ERROR)
+            else:
+                break
+        parent.present()
+        dia.destroy()
+
+    def button_press(self, widget, event):
+        if event.button == 3:
+            menu = gtk.Menu()
+            item = gtk.ImageMenuItem(_('Save As...'))
+            img = gtk.Image()
+            img.set_from_stock('tryton-save-as', gtk.ICON_SIZE_MENU)
+            item.set_image(img)
+            item.connect('activate', self.save)
+            item.show()
+            menu.append(item)
+            menu.popup(None, None, None, event.button, event.time)
+            return True
+        elif event.button == 1:
+            self.widgets['root'].action()
diff --git a/tryton/gui/window/view_form/view/graph_gtk/graph.py b/tryton/gui/window/view_form/view/graph_gtk/graph.py
index 8038ff5..76a4a05 100644
--- a/tryton/gui/window/view_form/view/graph_gtk/graph.py
+++ b/tryton/gui/window/view_form/view/graph_gtk/graph.py
@@ -71,8 +71,9 @@ class Graph(gtk.DrawingArea):
 
     __gsignals__ = {"expose-event": "override"}
 
-    def __init__(self, xfield, yfields, attrs, model):
+    def __init__(self, view, xfield, yfields):
         super(Graph, self).__init__()
+        self.view = view
         self.xfield = xfield
         self.yfields = yfields
         self.datas = {}
@@ -84,8 +85,14 @@ class Graph(gtk.DrawingArea):
         self.connect('motion-notify-event', self.motion)
         self.connect('leave-notify-event', self.leave)
         self.popup = Popup(self)
-        self.attrs = attrs
-        self.model = model
+
+    @property
+    def attrs(self):
+        return self.view.attributes
+
+    @property
+    def model(self):
+        return self.view.screen.model_name
 
     def destroy(self):
         self.popup.destroy()
diff --git a/tryton/gui/window/view_form/view/graph_gtk/parser.py b/tryton/gui/window/view_form/view/graph_gtk/parser.py
deleted file mode 100644
index 396fb1d..0000000
--- a/tryton/gui/window/view_form/view/graph_gtk/parser.py
+++ /dev/null
@@ -1,155 +0,0 @@
-#This file is part of Tryton.  The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-from tryton.gui.window.view_form.view.interface import ParserInterface
-import tryton.common as common
-import gtk
-from bar import VerticalBar, HorizontalBar
-from line import Line
-from pie import Pie
-from tryton.config import TRYTON_ICON, CONFIG
-import sys
-import os
-import gettext
-
-_ = gettext.gettext
-
-GRAPH_TYPE = {
-    'vbar': VerticalBar,
-    'hbar': HorizontalBar,
-    'line': Line,
-    'pie': Pie,
-}
-
-
-def save(widget, graph):
-    parent = common.get_toplevel_window()
-    dia = gtk.Dialog(_('Save As'), parent,
-        gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-        (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK))
-    dia.set_icon(TRYTON_ICON)
-    dia.set_has_separator(True)
-    dia.set_default_response(gtk.RESPONSE_OK)
-
-    dia.vbox.set_spacing(5)
-    dia.vbox.set_homogeneous(False)
-
-    title = gtk.Label('<b>' + _('Image Size') + '</b>')
-    title.set_alignment(0.0, 0.5)
-    title.set_use_markup(True)
-    dia.vbox.pack_start(title)
-
-    table = gtk.Table(2, 2)
-    table.set_col_spacings(3)
-    table.set_row_spacings(3)
-    table.set_border_width(1)
-    table.attach(gtk.Label(_('Width:')), 0, 1, 0, 1, yoptions=False,
-            xoptions=gtk.FILL)
-    spinwidth = gtk.SpinButton(gtk.Adjustment(400.0,
-            0.0, sys.maxint, 1.0, 10.0))
-    spinwidth.set_numeric(True)
-    spinwidth.set_activates_default(True)
-    table.attach(spinwidth, 1, 2, 0, 1, yoptions=False, xoptions=gtk.FILL)
-    table.attach(gtk.Label(_('Height:')), 0, 1, 1, 2, yoptions=False,
-            xoptions=gtk.FILL)
-    spinheight = gtk.SpinButton(gtk.Adjustment(200.0,
-            0.0, sys.maxint, 1.0, 10.0))
-    spinheight.set_numeric(True)
-    spinheight.set_activates_default(True)
-    table.attach(spinheight, 1, 2, 1, 2, yoptions=False, xoptions=gtk.FILL)
-    dia.vbox.pack_start(table)
-
-    filechooser = gtk.FileChooserWidget(gtk.FILE_CHOOSER_ACTION_SAVE, None)
-    filechooser.set_current_folder(CONFIG['client.default_path'])
-    filter = gtk.FileFilter()
-    filter.set_name(_('PNG image (*.png)'))
-    filter.add_mime_type('image/png')
-    filter.add_pattern('*.png')
-    filechooser.add_filter(filter)
-    dia.vbox.pack_start(filechooser)
-
-    dia.show_all()
-
-    while True:
-        response = dia.run()
-        width = spinwidth.get_value_as_int()
-        height = spinheight.get_value_as_int()
-        filename = filechooser.get_filename()
-        if filename:
-            filename = filename.decode('utf-8')
-            try:
-                CONFIG['client.default_path'] = \
-                    os.path.dirname(filename)
-                CONFIG.save()
-            except IOError:
-                pass
-        if response == gtk.RESPONSE_OK:
-            if width and height and filename:
-                if not filename.endswith('.png'):
-                    filename = filename + '.png'
-                try:
-                    graph.export_png(filename, width, height)
-                    break
-                except MemoryError:
-                    common.message(_('Image size too large!'), dia,
-                            gtk.MESSAGE_ERROR)
-        else:
-            break
-    parent.present()
-    dia.destroy()
-    return
-
-
-def button_press(widget, event, graph):
-    if event.button == 3:
-        menu = gtk.Menu()
-        item = gtk.ImageMenuItem(_('Save As...'))
-        img = gtk.Image()
-        img.set_from_stock('tryton-save-as', gtk.ICON_SIZE_MENU)
-        item.set_image(img)
-        item.connect('activate', save, graph)
-        item.show()
-        menu.append(item)
-        menu.popup(None, None, None, event.button, event.time)
-        return True
-    elif event.button == 1:
-        graph.action()
-
-
-class ParserGraph(ParserInterface):
-
-    def parse(self, model, root_node, fields):
-        attrs = common.node_attributes(root_node)
-        self.title = attrs.get('string', 'Unknown')
-        xfield = None
-        yfields = []
-
-        for node in root_node.childNodes:
-            if not node.nodeType == node.ELEMENT_NODE:
-                continue
-
-            if node.localName == 'x':
-                for child in node.childNodes:
-                    if not child.nodeType == child.ELEMENT_NODE:
-                        continue
-                    xfield = common.node_attributes(child)
-                    if not xfield.get('string'):
-                        xfield['string'] = fields[xfield['name']
-                            ].attrs['string']
-                    break
-            elif node.localName == 'y':
-                for child in node.childNodes:
-                    if not child.nodeType == child.ELEMENT_NODE:
-                        continue
-                    yattrs = common.node_attributes(child)
-                    if not yattrs.get('string') and yattrs['name'] != '#':
-                        yattrs['string'] = fields[yattrs['name']
-                            ].attrs['string']
-                    yfields.append(yattrs)
-
-        widget = GRAPH_TYPE[attrs.get('type', 'vbar')
-            ](xfield, yfields, attrs, model)
-        event = gtk.EventBox()
-        event.add(widget)
-        event.connect('button-press-event', button_press, widget)
-
-        return event, {'root': widget}, [], '', [], None
diff --git a/tryton/gui/window/view_form/view/interface.py b/tryton/gui/window/view_form/view/interface.py
deleted file mode 100644
index 051beb5..0000000
--- a/tryton/gui/window/view_form/view/interface.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#This file is part of Tryton.  The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-"Interfaces"
-
-
-class ParserInterface(object):
-
-    def __init__(self, parent=None, attrs=None, screen=None,
-            children_field=None):
-        self.parent = parent
-        self.attrs = attrs
-        self.title = None
-        self.state_widgets = {}
-        self.screen = screen
-        self.children_field = children_field
-
-
-class ParserView(object):
-
-    def __init__(self, screen, widget, children=None, state_widgets=None,
-            notebooks=None, cursor_widget=None, children_field=None):
-        self.screen = screen
-        self.widget = widget
-        self.children = children
-        if state_widgets is None:
-            state_widgets = []
-        self.state_widgets = state_widgets
-        if notebooks is None:
-            notebooks = []
-        self.notebooks = notebooks
-        self.cursor_widget = cursor_widget
-        self.children_field = children_field
-        self.view_id = None
-
-    @property
-    def selected_records(self):
-        return []
-
-    def get_fields(self):
-        return self.children.keys()
-
-    def get_buttons(self):
-        return []
-
-    @property
-    def modified(self):
-        return False
diff --git a/tryton/gui/window/view_form/view/list.py b/tryton/gui/window/view_form/view/list.py
index 9aff350..554eda4 100644
--- a/tryton/gui/window/view_form/view/list.py
+++ b/tryton/gui/window/view_form/view/list.py
@@ -8,18 +8,39 @@ try:
 except ImportError:
     import json
 import locale
-from interface import ParserView
 import gettext
+from functools import wraps
+
 from tryton.config import CONFIG
 from tryton.common.cellrendererbutton import CellRendererButton
 from tryton.common.cellrenderertoggle import CellRendererToggle
 from tryton.gui.window import Window
 from tryton.common.popup_menu import populate
-from tryton.common import RPCExecute, RPCException
+from tryton.common import RPCExecute, RPCException, node_attributes, Tooltips
+from . import View
+from .list_gtk.editabletree import EditableTreeView, TreeView
+from .list_gtk.widget import (Affix, Char, Int, Boolean, URL, Date, Datetime,
+    Time, Float, FloatTime, Binary, M2O, O2O, O2M, M2M, Selection, Reference,
+    ProgressBar, Button, Image)
 
 _ = gettext.gettext
 
 
+def delay(func):
+    """Decorator for ViewTree method to delay execution when idle and if
+    display counter did not change"""
+    @wraps(func)
+    def wrapper(self, *args, **kwargs):
+        def wait():
+            if not self.treeview.props.window:
+                return
+            if self.treeview.display_counter == display_counter:
+                func(self, *args, **kwargs)
+        display_counter = self.treeview.display_counter
+        gobject.idle_add(wait)
+    return wrapper
+
+
 def path_convert_id2pos(model, id_path):
     "This function will transform a path of id into a path of position"
     group = model.group
@@ -238,90 +259,344 @@ class AdaptModelGroup(gtk.GenericTreeModel):
         return record.parent
 
 
-class ViewList(ParserView):
+class ViewTree(View):
 
-    def __init__(self, screen, widget, children=None, state_widgets=None,
-            notebooks=None, cursor_widget=None, children_field=None):
-        super(ViewList, self).__init__(screen, widget, children, state_widgets,
-            notebooks, cursor_widget, children_field)
-        self.store = None
+    def __init__(self, screen, xml, children_field):
+        super(ViewTree, self).__init__(screen, xml)
         self.view_type = 'tree'
+        self.widgets = {}
+        self.state_widgets = []
+        self.children_field = children_field
+        self.sum_widgets = []
+        self.sum_box = gtk.HBox()
+        self.reload = False
+        if self.attributes.get('editable'):
+            self.treeview = EditableTreeView(self.attributes['editable'], self)
+        else:
+            self.treeview = TreeView()
 
-        vbox = gtk.VBox()
+        self.parse(xml)
+
+        self.treeview.set_property('rules-hint', True)
+        self.treeview.set_fixed_height_mode(True)
+        self.treeview.connect('button-press-event', self.__button_press)
+        self.treeview.connect('key-press-event', self.on_keypress)
+        self.treeview.connect_after('row-activated', self.__sig_switch)
+        if self.children_field:
+            self.treeview.connect('test-expand-row', self.test_expand_row)
+            self.treeview.set_expander_column(self.treeview.get_column(0))
+        self.treeview.set_rubber_banding(True)
+
+        selection = self.treeview.get_selection()
+        selection.set_mode(gtk.SELECTION_MULTIPLE)
+        selection.connect('changed', self.__select_changed)
+
+        self.set_drag_and_drop()
+
+        self.widget = gtk.VBox()
         scroll = gtk.ScrolledWindow()
-        scroll.add(self.widget)
+        scroll.add(self.treeview)
         scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
         scroll.set_placement(gtk.CORNER_TOP_LEFT)
         viewport = gtk.Viewport()
         viewport.set_shadow_type(gtk.SHADOW_ETCHED_IN)
         viewport.add(scroll)
-        self.widget_tree = self.widget
-
-        vbox.pack_start(viewport, expand=True, fill=True)
+        self.widget.pack_start(viewport, expand=True, fill=True)
 
-        self.widget_tree.screen = screen
-
-        self.widget = vbox
-        self.reload = False
-        self.children = children
-
-        if children:
-            hbox = gtk.HBox()
-            self.widget.pack_start(hbox, expand=False, fill=False, padding=2)
-            keys = children.keys()
-            keys.sort()
-            for i in keys:
-                hbox2 = gtk.HBox()
-                hbox2.pack_start(children[i][1], expand=True, fill=False)
-                hbox2.pack_start(children[i][2], expand=True, fill=False)
-                hbox.pack_start(hbox2, expand=False, fill=False, padding=12)
-            hbox.show_all()
+        self.sum_box.show()
+        self.widget.pack_start(self.sum_box, expand=False, fill=False)
 
         self.display()
 
-        self.widget_tree.connect('button-press-event', self.__button_press)
-        self.widget_tree.connect_after('row-activated', self.__sig_switch)
-        if hasattr(self.widget_tree, 'set_rubber_banding'):
-            self.widget_tree.set_rubber_banding(True)
-        selection = self.widget_tree.get_selection()
-        selection.set_mode(gtk.SELECTION_MULTIPLE)
-        selection.connect('changed', self.__select_changed)
+    def parse(self, xml):
+        for node in xml.childNodes:
+            if node.nodeType != node.ELEMENT_NODE:
+                continue
+            if node.tagName == 'field':
+                self._parse_field(node)
+            elif node.tagName == 'button':
+                self._parse_button(node)
+
+        self.add_last_column()
+
+    def _parse_field(self, node):
+        group = self.screen.group
+        node_attrs = node_attributes(node)
+        name = node_attrs['name']
+        field = group.fields[name]
+        for b_field in ('readonly', 'expand', 'tree_invisible'):
+            if b_field in node_attrs:
+                node_attrs[b_field] = bool(int(node_attrs[b_field]))
+        for i_field in ('width', 'height'):
+            if i_field in node_attrs:
+                node_attrs[i_field] = int(node_attrs[i_field])
+        if 'widget' not in node_attrs:
+            node_attrs['widget'] = field.attrs['type']
+
+        for attr in ('relation', 'domain', 'selection',
+                'relation_field', 'string', 'views', 'invisible',
+                'add_remove', 'sort', 'context', 'size', 'filename',
+                'autocomplete', 'translate', 'create', 'delete',
+                'selection_change_with', 'schema_model'):
+            if (attr in field.attrs
+                    and attr not in node_attrs):
+                node_attrs[attr] = field.attrs[attr]
+
+        Widget = self.get_widget(node_attrs['widget'])
+        widget = Widget(self, node_attrs)
+        assert name not in self.widgets
+        self.widgets[name] = widget
+
+        column = gtk.TreeViewColumn(field.attrs['string'])
+        column._type = 'field'
+        column.name = name
+
+        prefixes = []
+        suffixes = []
+        if node_attrs['widget'] in ('url', 'email', 'callto', 'sip'):
+            prefixes.append(Affix(self, node_attrs,
+                    protocol=node_attrs['widget']))
+        if 'icon' in node_attrs:
+            prefixes.append(Affix(self, node_attrs))
+        for affix in node.childNodes:
+            affix_attrs = node_attributes(affix)
+            if 'name' not in affix_attrs:
+                affix_attrs['name'] = name
+            if affix.tagName == 'prefix':
+                list_ = prefixes
+            else:
+                list_ = suffixes
+            list_.append(Affix(self, affix_attrs))
+
+        for prefix in prefixes:
+            column.pack_start(prefix.renderer, expand=False)
+            column.set_cell_data_func(prefix.renderer,
+                prefix.setter)
+
+        column.pack_start(widget.renderer, expand=True)
+        column.set_cell_data_func(widget.renderer, widget.setter)
+
+        for suffix in suffixes:
+            column.pack_start(suffix.renderer, expand=False)
+            column.set_cell_data_func(suffix.renderer,
+                suffix.setter)
+
+        self.set_column_widget(column, field, node_attrs)
+        self.set_column_width(column, field, node_attrs)
+
+        if (not self.attributes.get('sequence')
+                and not self.children_field
+                and field.attrs.get('sortable', True)):
+            column.connect('clicked', self.sort_model)
+        column.set_visible(not node_attrs.get('tree_invisible', False))
+        if name == self.screen.exclude_field:
+            column.set_visible(False)
+
+        self.treeview.append_column(column)
+
+        self.add_sum(node_attrs)
+
+    def _parse_button(self, node):
+        node_attrs = node_attributes(node)
+        widget = Button(self, node_attrs)
+        self.state_widgets.append(widget)
+
+        column = gtk.TreeViewColumn(node_attrs.get('string', ''),
+            widget.renderer)
+        column._type = 'button'
+        column.name = None
+        column.set_cell_data_func(widget.renderer, widget.setter)
+
+        self.set_column_widget(column, None, node_attrs, arrow=False)
+        self.set_column_width(column, None, node_attrs)
+
+        column.set_visible(not node_attrs.get('tree_invisible', False))
+
+        self.treeview.append_column(column)
+
+    WIDGETS = {
+        'char': Char,
+        'many2one': M2O,
+        'date': Date,
+        'one2many': O2M,
+        'many2many': M2M,
+        'selection': Selection,
+        'float': Float,
+        'numeric': Float,
+        'float_time': FloatTime,
+        'integer': Int,
+        'biginteger': Int,
+        'datetime': Datetime,
+        'time': Time,
+        'boolean': Boolean,
+        'text': Char,
+        'url': URL,
+        'email': URL,
+        'callto': URL,
+        'sip': URL,
+        'progressbar': ProgressBar,
+        'reference': Reference,
+        'one2one': O2O,
+        'binary': Binary,
+        'image': Image,
+        }
+
+    @classmethod
+    def get_widget(cls, name):
+        return cls.WIDGETS[name]
+
+    @staticmethod
+    def set_column_widget(column, field, attributes, arrow=True):
+        tooltips = Tooltips()
+        hbox = gtk.HBox(False, 2)
+        label = gtk.Label(attributes['string'])
+        label.show()
+        help = attributes['string']
+        if field and field.attrs.get('help'):
+            help += '\n' + field.attrs['help']
+        elif attributes.get('help'):
+            help += '\n' + attributes['help']
+        tooltips.set_tip(label, help)
+        tooltips.enable()
+        arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_IN)
+        column.arrow = arrow
+        column.arrow_show = False
+        hbox.pack_start(label, True, True, 0)
+        if arrow:
+            hbox.pack_start(arrow, False, False, 0)
+            column.set_clickable(True)
+        hbox.show()
+        column.set_widget(hbox)
+
+    def set_column_width(self, column, field, attributes):
+        default_width = {
+            'integer': 60,
+            'biginteger': 60,
+            'float': 80,
+            'numeric': 80,
+            'float_time': 100,
+            'date': 110,
+            'datetime': 160,
+            'selection': 90,
+            'char': 100,
+            'one2many': 50,
+            'many2many': 50,
+            'boolean': 20,
+            'binary': 200,
+            }
+
+        width = self.screen.tree_column_width[self.screen.model_name].get(
+            column.name)
+        if not width:
+            if 'width' in attributes:
+                width = int(attributes['width'])
+            elif field:
+                width = default_width.get(field.attrs['type'], 100)
+            else:
+                width = 80
+        column.width = width
+        if width > 0:
+            column.set_fixed_width(width)
+        column.set_min_width(1)
+
+        expand = attributes.get('expand', False)
+        column.set_expand(expand)
+        column.set_resizable(True)
+        column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+
+    def add_sum(self, attributes):
+        if 'sum' not in attributes:
+            return
+        if gtk.widget_get_default_direction() == gtk.TEXT_DIR_RTL:
+            text = _(':') + attributes['sum']
+        else:
+            text = attributes['sum'] + _(':')
+        label, sum_ = gtk.Label(text), gtk.Label()
+
+        hbox = gtk.HBox()
+        hbox.pack_start(label, expand=True, fill=False, padding=2)
+        hbox.pack_start(sum_, expand=True, fill=False, padding=2)
+        hbox.show_all()
+        self.sum_box.pack_start(hbox, expand=False, fill=False)
+
+        self.sum_widgets.append((attributes['name'], sum_))
+
+    def sort_model(self, column):
+        for col in self.treeview.get_columns():
+            if col != column:
+                col.arrow_show = False
+                col.arrow.hide()
+        self.screen.order = None
+        if not column.arrow_show:
+            column.arrow_show = True
+            column.arrow.set(gtk.ARROW_DOWN, gtk.SHADOW_IN)
+            column.arrow.show()
+            self.screen.order = [(column.name, 'ASC')]
+        else:
+            if column.arrow.get_property('arrow-type') == gtk.ARROW_DOWN:
+                column.arrow.set(gtk.ARROW_UP, gtk.SHADOW_IN)
+                self.screen.order = [(column.name, 'DESC')]
+            else:
+                column.arrow_show = False
+                column.arrow.hide()
+        model = self.treeview.get_model()
+        unsaved_records = [x for x in model.group if x.id < 0]
+        search_string = self.screen.screen_container.get_text() or None
+        if (self.screen.search_count == len(model)
+                or unsaved_records
+                or self.screen.parent):
+            ids = self.screen.search_filter(
+                search_string=search_string, only_ids=True)
+            model.sort(ids)
+        else:
+            self.screen.search_filter(search_string=search_string)
 
+    def add_last_column(self):
+        for column in self.treeview.get_columns():
+            if column.get_expand():
+                break
+        else:
+            column = gtk.TreeViewColumn()
+            column._type = 'fill'
+            column.name = None
+            column.arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_IN)
+            column.arrow_show = False
+            column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+            self.treeview.append_column(column)
+
+    def set_drag_and_drop(self):
         dnd = False
         if self.children_field:
-            children_field = self.widget_tree.cells.get(self.children_field)
-            if children_field:
-                parent_name = children_field.attrs.get('relation_field')
-                dnd = parent_name in self.widget_tree.cells
-        elif self.widget_tree.sequence:
+            children = self.screen.group.fields.get(self.children_field)
+            if children:
+                parent_name = children.attrs.get('relation_field')
+                dnd = parent_name in self.widgets
+        elif self.attributes.get('sequence'):
             dnd = True
         # Disable DnD on mac until it is fully supported
         if sys.platform == 'darwin':
             dnd = False
-        if screen.readonly:
+        if self.screen.readonly:
             dnd = False
-        if dnd:
-            self.widget_tree.drag_source_set(
-                gtk.gdk.BUTTON1_MASK | gtk.gdk.BUTTON3_MASK,
-                [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0)],
-                gtk.gdk.ACTION_MOVE)
-            self.widget_tree.drag_dest_set(gtk.DEST_DEFAULT_ALL,
-                [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0)],
-                gtk.gdk.ACTION_MOVE)
-
-            self.widget_tree.connect('drag-begin', self.drag_begin)
-            self.widget_tree.connect('drag-motion', self.drag_motion)
-            self.widget_tree.connect('drag-drop', self.drag_drop)
-            self.widget_tree.connect("drag-data-get", self.drag_data_get)
-            self.widget_tree.connect('drag-data-received',
-                self.drag_data_received)
-            self.widget_tree.connect('drag-data-delete', self.drag_data_delete)
-
-        self.widget_tree.connect('key_press_event', self.on_keypress)
-        if self.children_field:
-            self.widget_tree.connect('test-expand-row', self.test_expand_row)
-            self.widget_tree.set_expander_column(
-                self.widget_tree.get_column(0))
+
+        if not dnd:
+            return
+
+        self.treeview.drag_source_set(
+            gtk.gdk.BUTTON1_MASK | gtk.gdk.BUTTON3_MASK,
+            [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0)],
+            gtk.gdk.ACTION_MOVE)
+        self.treeview.drag_dest_set(gtk.DEST_DEFAULT_ALL,
+            [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0)],
+            gtk.gdk.ACTION_MOVE)
+
+        self.treeview.connect('drag-begin', self.drag_begin)
+        self.treeview.connect('drag-motion', self.drag_motion)
+        self.treeview.connect('drag-drop', self.drag_drop)
+        self.treeview.connect("drag-data-get", self.drag_data_get)
+        self.treeview.connect('drag-data-received',
+            self.drag_data_received)
+        self.treeview.connect('drag-data-delete', self.drag_data_delete)
 
     @property
     def modified(self):
@@ -329,10 +604,10 @@ class ViewList(ParserView):
 
     @property
     def editable(self):
-        return bool(getattr(self.widget_tree, 'editable', False))
+        return bool(getattr(self.treeview, 'editable', False))
 
     def get_fields(self):
-        return [col.name for col in self.widget_tree.get_columns() if col.name]
+        return [col.name for col in self.treeview.get_columns() if col.name]
 
     def get_buttons(self):
         return [b for b in self.state_widgets
@@ -390,7 +665,7 @@ class ViewList(ParserView):
         iter_ = model.iter_children(iter_)
         if not iter_:
             return False
-        fields = [col.name for col in self.widget_tree.get_columns()
+        fields = [col.name for col in self.treeview.get_columns()
                 if col.name]
         while iter_:
             record = model.get_value(iter_, 0)
@@ -405,14 +680,14 @@ class ViewList(ParserView):
     def on_copy(self):
         for clipboard_type in (gtk.gdk.SELECTION_CLIPBOARD,
                 gtk.gdk.SELECTION_PRIMARY):
-            clipboard = self.widget_tree.get_clipboard(clipboard_type)
+            clipboard = self.treeview.get_clipboard(clipboard_type)
             targets = [
                 ('STRING', 0, 0),
                 ('TEXT', 0, 1),
                 ('COMPOUND_TEXT', 0, 2),
                 ('UTF8_STRING', 0, 3)
             ]
-            selection = self.widget_tree.get_selection()
+            selection = self.treeview.get_selection()
             # Set to clipboard directly if not too much selected rows
             # to speed up paste
             # Don't use set_with_data on mac see:
@@ -429,12 +704,12 @@ class ViewList(ParserView):
     def copy_foreach(self, treemodel, path, iter, data):
         record = treemodel.get_value(iter, 0)
         values = []
-        for col in self.widget_tree.get_columns():
+        for col in self.treeview.get_columns():
             if not col.get_visible() or not col.name:
                 continue
-            cell = self.widget_tree.cells[col.name]
+            widget = self.widgets[col.name]
             values.append('"'
-                + str(cell.get_textual_value(record)).replace('"', '""')
+                + str(widget.get_textual_value(record)).replace('"', '""')
                 + '"')
         data.append('\t'.join(values))
         return
@@ -461,15 +736,15 @@ class ViewList(ParserView):
         data = []
         for clipboard_type in (gtk.gdk.SELECTION_CLIPBOARD,
                 gtk.gdk.SELECTION_PRIMARY):
-            clipboard = self.widget_tree.get_clipboard(clipboard_type)
+            clipboard = self.treeview.get_clipboard(clipboard_type)
             text = clipboard.wait_for_text()
             if not text:
                 continue
             data = [[unquote(v) for v in l.split('\t')]
                 for l in text.splitlines()]
             break
-        col = self.widget_tree.get_cursor()[1]
-        columns = [c for c in self.widget_tree.get_columns()
+        col = self.treeview.get_cursor()[1]
+        columns = [c for c in self.treeview.get_columns()
             if c.get_visible() and c.name]
         if col in columns:
             idx = columns.index(col)
@@ -491,10 +766,10 @@ class ViewList(ParserView):
                 group.add(record)
             record = group[idx]
             for col, value in zip(columns, line):
-                cell = self.widget_tree.cells[col.name]
-                if cell.get_textual_value(record) != value:
-                    cell.value_from_text(record, value)
-                    if value and not cell.get_textual_value(record):
+                widget = self.widgets[col.name]
+                if widget.get_textual_value(record) != value:
+                    widget.value_from_text(record, value)
+                    if value and not widget.get_textual_value(record):
                         # Stop setting value if a value is correctly set
                         idx = len(group)
                         break
@@ -529,9 +804,9 @@ class ViewList(ParserView):
             etime):
         treeview.emit_stop_by_name('drag-data-get')
 
-        def _func_sel_get(store, path, iter_, data):
-            value = store.get_value(iter_, 0)
-            data.append(json.dumps(value.get_path(store.group)))
+        def _func_sel_get(model, path, iter_, data):
+            value = model.get_value(iter_, 0)
+            data.append(json.dumps(value.get_path(model.group)))
         data = []
         treeselection = treeview.get_selection()
         treeselection.selected_foreach(_func_sel_get, data)
@@ -544,8 +819,8 @@ class ViewList(ParserView):
     def drag_data_received(self, treeview, context, x, y, selection,
             info, etime):
         treeview.emit_stop_by_name('drag-data-received')
-        if treeview.sequence:
-            field = self.screen.group.fields[treeview.sequence]
+        if self.attributes.get('sequence'):
+            field = self.screen.group.fields[self.attributes['sequence']]
             for record in self.screen.group:
                 if field.get_state_attrs(
                         record).get('readonly', False):
@@ -561,13 +836,13 @@ class ViewList(ParserView):
                 if renderer.props.editing:
                     return
 
-        store = treeview.get_model()
+        model = treeview.get_model()
         try:
             data = json.loads(selection.data)
         except ValueError:
             return
-        record = store.group.get_by_path(data)
-        record_path = store.on_get_path(record)
+        record = model.group.get_by_path(data)
+        record_path = model.on_get_path(record)
         drop_info = treeview.get_dest_row_at_pos(x, y)
 
         def check_recursion(from_, to):
@@ -588,16 +863,16 @@ class ViewList(ParserView):
             if not check_recursion(record_path, check_path):
                 return
             if position == gtk.TREE_VIEW_DROP_BEFORE:
-                store.move_before(record, path)
+                model.move_before(record, path)
             elif position == gtk.TREE_VIEW_DROP_AFTER:
-                store.move_after(record, path)
+                model.move_after(record, path)
             elif self.children_field:
-                store.move_into(record, path)
+                model.move_into(record, path)
         else:
-            store.move_after(record, (len(store) - 1,))
+            model.move_after(record, (len(model) - 1,))
         context.drop_finish(False, etime)
-        if treeview.sequence:
-            record.group.set_sequence(field=treeview.sequence)
+        if self.attributes.get('sequence'):
+            record.group.set_sequence(field=self.attributes['sequence'])
         return True
 
     def drag_data_delete(self, treeview, context):
@@ -636,7 +911,7 @@ class ViewList(ParserView):
                     parent = parent.parent
                 else:
                     populate(menu, group.model_name, record)
-                for col in self.widget_tree.get_columns():
+                for col in self.treeview.get_columns():
                     if not col.get_visible() or not col.name:
                         continue
                     field = group.fields[col.name]
@@ -664,11 +939,12 @@ class ViewList(ParserView):
         return False
 
     def group_list_changed(self, group, signal):
-        if self.store is not None:
+        model = self.treeview.get_model()
+        if model is not None:
             if signal[0] == 'record-added':
-                self.store.added(group, signal[1])
+                model.added(group, signal[1])
             elif signal[0] == 'record-removed':
-                self.store.removed(group, signal[1])
+                model.removed(group, signal[1])
         self.display()
 
     def __str__(self):
@@ -682,7 +958,7 @@ class ViewList(ParserView):
             return
         fields = {}
         last_col = None
-        for col in self.widget_tree.get_columns():
+        for col in self.treeview.get_columns():
             if col.get_visible():
                 last_col = col
             if not hasattr(col, 'name') or not hasattr(col, 'width'):
@@ -706,7 +982,7 @@ class ViewList(ParserView):
 
     def destroy(self):
         self.save_width_height()
-        self.widget_tree.destroy()
+        self.treeview.destroy()
 
     def __sig_switch(self, treeview, path, column):
         if column._type == 'button':
@@ -770,40 +1046,39 @@ class ViewList(ParserView):
                             go_previous()
                 # Delay the pre_validate to let GTK process the current event
                 gobject.idle_add(pre_validate)
-        self.update_children()
+        self.update_sum()
 
     def set_value(self):
         if self.editable:
-            self.widget_tree.set_value()
+            self.treeview.set_value()
 
     def reset(self):
         pass
 
-    # self.widget.set_model(self.store) could be removed if the store
-    # has not changed -> better ergonomy. To test
     def display(self):
+        self.treeview.display_counter += 1
         current_record = self.screen.current_record
         if (self.reload
-                or not self.widget_tree.get_model()
+                or not self.treeview.get_model()
                 or (self.screen.group !=
-                    self.widget_tree.get_model().group)):
-            self.store = AdaptModelGroup(self.screen.group,
+                    self.treeview.get_model().group)):
+            model = AdaptModelGroup(self.screen.group,
                     self.children_field)
-            self.widget_tree.set_model(self.store)
+            self.treeview.set_model(model)
             # __select_changed resets current_record to None
             self.screen.current_record = current_record
             if current_record:
-                selection = self.widget_tree.get_selection()
-                path = self.store.on_get_path(current_record)
+                selection = self.treeview.get_selection()
+                path = model.on_get_path(current_record)
                 selection.select_path(path)
         self.reload = False
         if not current_record:
-            selection = self.widget_tree.get_selection()
+            selection = self.treeview.get_selection()
             selection.unselect_all()
-        self.widget_tree.queue_draw()
+        self.treeview.queue_draw()
         if self.editable:
             self.set_state()
-        self.update_children()
+        self.update_sum()
 
     def set_state(self):
         record = self.screen.current_record
@@ -813,62 +1088,64 @@ class ViewList(ParserView):
                 if field:
                     field.state_set(record)
 
-    def update_children(self):
+    @delay
+    def update_sum(self):
         selected_records = self.selected_records
-        for child in self.children:
-            value = 0
-            value_selected = 0
+        for name, label in self.sum_widgets:
+            sum_ = 0
+            selected_sum = 0
             loaded = True
-            child_fieldname = self.children[child][0]
+            digit = 0
             for record in self.screen.group:
-                if not record.get_loaded([child_fieldname]):
+                if not record.get_loaded([name]) and record.id >= 0:
                     loaded = False
                     break
-                field_value = record.fields_get()[child_fieldname].get(record)
-                if field_value is not None:
-                    value += field_value
+                field = record[name]
+                value = field.get(record)
+                if value is not None:
+                    sum_ += value
                     if record in selected_records or not selected_records:
-                        value_selected += field_value
+                        selected_sum += value
+                    digit = max(field.digits(record)[1], digit)
 
             if loaded:
-                label_str = locale.format('%.*f',
-                    (self.children[child][3], value_selected), True)
-                label_str += ' / '
-                label_str += locale.format('%.*f',
-                    (self.children[child][3], value), True)
+                text = '%s / %s' % (
+                    locale.format('%.*f', (digit, selected_sum), True),
+                    locale.format('%.*f', (digit, sum_), True))
             else:
-                label_str = '-'
-            self.children[child][2].set_text(label_str)
+                text = '-'
+            label.set_text(text)
 
     def set_cursor(self, new=False, reset_view=True):
-        self.widget_tree.grab_focus()
+        self.treeview.grab_focus()
         if self.screen.current_record:
-            path = self.store.on_get_path(self.screen.current_record)
-            if self.store.get_flags() & gtk.TREE_MODEL_LIST_ONLY:
+            model = self.treeview.get_model()
+            path = model.on_get_path(self.screen.current_record)
+            if model.get_flags() & gtk.TREE_MODEL_LIST_ONLY:
                 path = (path[0],)
-            focus_column = self.widget_tree.next_column(path, editable=new)
+            focus_column = self.treeview.next_column(path, editable=new)
             if path[:-1]:
-                self.widget_tree.expand_to_path(path[:-1])
-            self.widget_tree.scroll_to_cell(path, focus_column,
+                self.treeview.expand_to_path(path[:-1])
+            self.treeview.scroll_to_cell(path, focus_column,
                 use_align=False)
-            current_path = self.widget_tree.get_cursor()[0]
+            current_path = self.treeview.get_cursor()[0]
             selected_path = \
-                self.widget_tree.get_selection().get_selected_rows()[1]
+                self.treeview.get_selection().get_selected_rows()[1]
             if (current_path != path and path not in selected_path) or new:
-                self.widget_tree.set_cursor(path, focus_column, new)
+                self.treeview.set_cursor(path, focus_column, new)
 
     @property
     def selected_records(self):
-        def _func_sel_get(store, path, iter, records):
-            records.append(store.on_get_iter(path))
+        def _func_sel_get(model, path, iter, records):
+            records.append(model.on_get_iter(path))
         records = []
-        sel = self.widget_tree.get_selection()
+        sel = self.treeview.get_selection()
         sel.selected_foreach(_func_sel_get, records)
         return records
 
     def unset_editable(self):
-        self.widget_tree.editable = False
-        for col in self.widget_tree.get_columns():
+        self.treeview.editable = False
+        for col in self.treeview.get_columns():
             for renderer in col.get_cell_renderers():
                 if isinstance(renderer, CellRendererToggle):
                     renderer.set_property('activatable', False)
@@ -880,7 +1157,7 @@ class ViewList(ParserView):
                     renderer.set_property('editable', False)
 
     def get_selected_paths(self):
-        selection = self.widget_tree.get_selection()
+        selection = self.treeview.get_selection()
         model, rows = selection.get_selected_rows()
         id_paths = []
         for row in rows:
@@ -893,17 +1170,17 @@ class ViewList(ParserView):
         return id_paths
 
     def select_nodes(self, nodes):
-        selection = self.widget_tree.get_selection()
+        selection = self.treeview.get_selection()
         if not nodes:
             return
         selection.unselect_all()
         scroll = False
         for node in nodes:
-            path = path_convert_id2pos(self.store, node)
+            path = path_convert_id2pos(self.treeview.get_model(), node)
             if path:
                 selection.select_path(path)
                 if not scroll:
-                    self.widget_tree.scroll_to_cell(path)
+                    self.treeview.scroll_to_cell(path)
                     scroll = True
 
     def get_expanded_paths(self, starting_path=None, starting_id_path=None):
@@ -914,12 +1191,13 @@ class ViewList(ParserView):
         if not starting_id_path:
             starting_id_path = []
         id_paths = []
-        record = self.store.on_get_iter(starting_path)
-        for path_idx in range(self.store.on_iter_n_children(record)):
+        model = self.treeview.get_model()
+        record = model.on_get_iter(starting_path)
+        for path_idx in range(model.on_iter_n_children(record)):
             path = starting_path + [path_idx]
-            expanded = self.widget_tree.row_expanded(tuple(path))
+            expanded = self.treeview.row_expanded(tuple(path))
             if expanded:
-                expanded_record = self.store.on_get_iter(path)
+                expanded_record = model.on_get_iter(path)
                 id_path = starting_id_path + [expanded_record.id]
                 id_paths.append(id_path)
                 child_id_paths = self.get_expanded_paths(path, id_path)
@@ -927,7 +1205,8 @@ class ViewList(ParserView):
         return id_paths
 
     def expand_nodes(self, nodes):
+        model = self.treeview.get_model()
         for node in nodes:
-            expand_path = path_convert_id2pos(self.store, node)
+            expand_path = path_convert_id2pos(model, node)
             if expand_path:
-                self.widget_tree.expand_to_path(expand_path)
+                self.treeview.expand_to_path(expand_path)
diff --git a/tryton/gui/window/view_form/view/list_gtk/__init__.py b/tryton/gui/window/view_form/view/list_gtk/__init__.py
index 5218f22..c86640b 100644
--- a/tryton/gui/window/view_form/view/list_gtk/__init__.py
+++ b/tryton/gui/window/view_form/view/list_gtk/__init__.py
@@ -1,3 +1,2 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from parser import *
diff --git a/tryton/gui/window/view_form/view/list_gtk/editabletree.py b/tryton/gui/window/view_form/view/list_gtk/editabletree.py
index 2a566f4..eb24be4 100644
--- a/tryton/gui/window/view_form/view/list_gtk/editabletree.py
+++ b/tryton/gui/window/view_form/view/list_gtk/editabletree.py
@@ -1,7 +1,6 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 import gtk
-import parser
 import gettext
 import gobject
 from itertools import islice, cycle
@@ -13,10 +12,7 @@ _ = gettext.gettext
 
 
 class TreeView(gtk.TreeView):
-
-    def __init__(self):
-        super(TreeView, self).__init__()
-        self.cells = {}
+    display_counter = 0
 
     def next_column(self, path, column=None, editable=True, _sign=1):
         columns = self.get_columns()
@@ -53,44 +49,41 @@ class EditableTreeView(TreeView):
     leaving_events = leaving_record_events + (gtk.keysyms.Tab,
             gtk.keysyms.ISO_Left_Tab, gtk.keysyms.KP_Enter)
 
-    def __init__(self, position):
+    def __init__(self, position, view):
         super(EditableTreeView, self).__init__()
         self.editable = position
+        self.view = view
 
     def on_quit_cell(self, current_record, fieldname, value, callback=None):
         field = current_record[fieldname]
-        cell = self.cells[fieldname]
+        widget = self.view.widgets[fieldname]
 
         # The value has not changed and is valid ... do nothing.
-        if value == cell.get_textual_value(current_record) \
+        if value == widget.get_textual_value(current_record) \
                 and field.validate(current_record):
             if callback:
                 callback()
             return
-
-        try:
-            cell.value_from_text(current_record, value, callback=callback)
-        except parser.UnsettableColumn:
-            return
+        widget.value_from_text(current_record, value, callback=callback)
 
     def on_open_remote(self, current_record, fieldname, create, value,
             entry=None, callback=None):
-        cell = self.cells[fieldname]
-        if value != cell.get_textual_value(current_record) or not value:
+        widget = self.view.widgets[fieldname]
+        if value != widget.get_textual_value(current_record) or not value:
             changed = True
         else:
             changed = False
         try:
-            cell.open_remote(current_record, create, changed, value,
+            widget.open_remote(current_record, create, changed, value,
                 callback=callback)
         except NotImplementedError:
             pass
 
     def on_create_line(self):
-        access = MODELACCESS[self.screen.model_name]
+        access = MODELACCESS[self.view.screen.model_name]
         model = self.get_model()
-        if not access['create'] or (self.screen.size_limit is not None
-                and (len(model) >= self.screen.size_limit >= 0)):
+        if not access['create'] or (self.view.screen.size_limit is not None
+                and (len(model) >= self.view.screen.size_limit >= 0)):
             return
         if self.editable == 'top':
             method = model.prepend
@@ -128,6 +121,7 @@ class EditableTreeView(TreeView):
         path, column = self.get_cursor()
         model = self.get_model()
         record = model.get_value(model.get_iter(path), 0)
+        self.display_counter += 1  # Force a display
 
         leaving = False
         if event.keyval == gtk.keysyms.Right:
@@ -170,7 +164,7 @@ class EditableTreeView(TreeView):
                         gobject.idle_add(self.set_cursor, path,
                             self.prev_column(path, column), True)
                     elif keyval in self.leaving_record_events:
-                        fields = self.cells.keys()
+                        fields = self.view.widgets.keys()
                         if not record.validate(fields):
                             invalid_fields = record.invalid_fields
                             col = None
@@ -179,9 +173,9 @@ class EditableTreeView(TreeView):
                                     break
                             gobject.idle_add(self.set_cursor, path, col, True)
                             return
-                        if ((self.screen.pre_validate
+                        if ((self.view.screen.pre_validate
                                     and not record.pre_validate())
-                                or (not self.screen.parent
+                                or (not self.view.screen.parent
                                     and not record.save())):
                             gobject.idle_add(self.set_cursor, path, column,
                                 True)
@@ -211,8 +205,8 @@ class EditableTreeView(TreeView):
             entry.handler_block(entry.editing_done_id)
 
             def callback():
-                cell = self.cells[column.name]
-                value = cell.get_textual_value(record)
+                widget = self.view.widgets[column.name]
+                value = widget.get_textual_value(record)
                 if isinstance(entry, gtk.Entry):
                     entry.set_text(value)
                 else:
@@ -229,7 +223,7 @@ class EditableTreeView(TreeView):
             # set_value
             field.editabletree_entry = entry
 
-            def remove_widget(cell):
+            def remove_widget(widget):
                 if hasattr(field, 'editabletree_entry'):
                     del field.editabletree_entry
             entry.connect('remove-widget', remove_widget)
diff --git a/tryton/gui/window/view_form/view/list_gtk/parser.py b/tryton/gui/window/view_form/view/list_gtk/widget.py
similarity index 57%
rename from tryton/gui/window/view_form/view/list_gtk/parser.py
rename to tryton/gui/window/view_form/view/list_gtk/widget.py
index 478cd62..4067f10 100644
--- a/tryton/gui/window/view_form/view/list_gtk/parser.py
+++ b/tryton/gui/window/view_form/view/list_gtk/widget.py
@@ -10,14 +10,11 @@ import webbrowser
 
 from functools import wraps, partial
 
-from editabletree import EditableTreeView, TreeView
-from tryton.gui.window.view_form.view.interface import ParserInterface
 from tryton.gui.window.win_search import WinSearch
 from tryton.gui.window.win_form import WinForm
 from tryton.gui.window.view_form.screen import Screen
 import tryton.rpc as rpc
-from tryton.common import COLORS, node_attributes, \
-        file_selection, file_open, slugify
+from tryton.common import COLORS, file_selection, file_open, slugify
 import tryton.common as common
 from tryton.common.cellrendererbutton import CellRendererButton
 from tryton.common.cellrendererdate import CellRendererDate
@@ -31,7 +28,7 @@ from tryton.common.cellrendererbinary import CellRendererBinary
 from tryton.common.cellrendererclickablepixbuf import \
     CellRendererClickablePixbuf
 from tryton.translate import date_format
-from tryton.common import RPCExecute, RPCException
+from tryton.common import data2pixbuf
 from tryton.common.completion import get_completion, update_completion
 from tryton.common.selection import SelectionMixin, PopdownMixin
 
@@ -46,261 +43,75 @@ def send_keys(renderer, editable, position, treeview):
         editable.connect('changed', treeview.on_editing_done)
 
 
-def sort_model(column, treeview, screen):
-    for col in treeview.get_columns():
-        if col != column:
-            col.arrow_show = False
-            col.arrow.hide()
-    screen.order = None
-    if not column.arrow_show:
-        column.arrow_show = True
-        column.arrow.set(gtk.ARROW_DOWN, gtk.SHADOW_IN)
-        column.arrow.show()
-        screen.order = [(column.name, 'ASC')]
-    else:
-        if column.arrow.get_property('arrow-type') == gtk.ARROW_DOWN:
-            column.arrow.set(gtk.ARROW_UP, gtk.SHADOW_IN)
-            screen.order = [(column.name, 'DESC')]
-        else:
-            column.arrow_show = False
-            column.arrow.hide()
-    store = treeview.get_model()
-    unsaved_records = [x for x in store.group if x.id < 0]
-    search_string = screen.screen_container.get_text() or None
-    if screen.search_count == len(store) or unsaved_records or screen.parent:
-        ids = screen.search_filter(search_string=search_string, only_ids=True)
-        store.sort(ids)
-    else:
-        screen.search_filter(search_string=search_string)
-
-
 def realized(func):
     "Decorator for treeview realized"
     @wraps(func)
     def wrapper(self, *args, **kwargs):
-        if (hasattr(self.treeview, 'get_realized')
-                and not self.treeview.get_realized()):
+        if (hasattr(self.view.treeview, 'get_realized')
+                and not self.view.treeview.get_realized()):
             return
         return func(self, *args, **kwargs)
     return wrapper
 
 
-class ParserTree(ParserInterface):
-
-    def __init__(self, parent=None, attrs=None, screen=None,
-            children_field=None):
-        super(ParserTree, self).__init__(parent, attrs, screen,
-            children_field=children_field)
-        self.treeview = None
-
-    def parse(self, model_name, root_node, fields):
-        dict_widget = {}
-        state_widgets = []
-        attrs = node_attributes(root_node)
-        on_write = attrs.get('on_write', '')
-        editable = attrs.get('editable', False)
-        if editable:
-            treeview = EditableTreeView(editable)
-        else:
-            treeview = TreeView()
-            treeview.cells = {}
-        treeview.sequence = attrs.get('sequence', False)
-        treeview.colors = attrs.get('colors', '"black"')
-        treeview.keyword_open = attrs.get('keyword_open', False)
-        self.treeview = treeview
-        treeview.set_property('rules-hint', True)
-        if not self.title:
-            self.title = attrs.get('string', 'Unknown')
-        tooltips = common.Tooltips()
-        expandable = False
-
-        for node in root_node.childNodes:
-            node_attrs = node_attributes(node)
-            if node.localName == 'field':
-                fname = str(node_attrs['name'])
-                for boolean_fields in ('readonly', 'required', 'expand'):
-                    if boolean_fields in node_attrs:
-                        node_attrs[boolean_fields] = \
-                            bool(int(node_attrs[boolean_fields]))
-                if fname not in fields:
-                    continue
-                for attr_name in ('relation', 'domain', 'selection',
-                        'relation_field', 'string', 'views', 'invisible',
-                        'add_remove', 'sort', 'context', 'filename',
-                        'selection_change_with'):
-                    if attr_name in fields[fname].attrs and \
-                            not attr_name in node_attrs:
-                        node_attrs[attr_name] = fields[fname].attrs[attr_name]
-                cell_type = node_attrs.get('widget',
-                    fields[fname].attrs['type'])
-                cell = CELLTYPES.get(cell_type)(fname, model_name,
-                    treeview, node_attrs)
-                treeview.cells[fname] = cell
-                renderer = cell.renderer
-
-                readonly = not (editable and not node_attrs.get('readonly',
-                    fields[fname].attrs.get('readonly', False)))
-                if isinstance(renderer, CellRendererToggle):
-                    renderer.set_property('activatable', not readonly)
-                elif isinstance(renderer,
-                        (gtk.CellRendererProgress, CellRendererButton)):
-                    pass
-                else:
-                    renderer.set_property('editable', not readonly)
-                if (not readonly
-                        and not isinstance(renderer, CellRendererBinary)):
-                    renderer.connect_after('editing-started', send_keys,
-                            treeview)
-
-                col = gtk.TreeViewColumn(fields[fname].attrs['string'])
-
-                prefixes = []
-                suffixes = []
-                if cell_type in ('url', 'email', 'callto', 'sip'):
-                    prefixes.append(Affix(fname, self.treeview, node_attrs,
-                            protocol=cell_type))
-                if 'icon' in node_attrs:
-                    prefixes.append(Affix(fname, self.treeview, node_attrs))
-                for affix in node.childNodes:
-                    affix_attrs = node_attributes(affix)
-                    if affix.localName == 'prefix':
-                        list_ = prefixes
-                    else:
-                        list_ = suffixes
-                    list_.append(Affix(fname, self.treeview, affix_attrs))
-
-                for prefix in prefixes:
-                    col.pack_start(prefix.renderer, expand=False)
-                    col.set_cell_data_func(prefix.renderer, prefix.setter)
-
-                col.pack_start(renderer, expand=True)
-                col.set_cell_data_func(renderer, cell.setter)
-                col.name = fname
-
-                for suffix in suffixes:
-                    col.pack_start(suffix.renderer, expand=False)
-                    col.set_cell_data_func(suffix.renderer, suffix.setter)
-
-                hbox = gtk.HBox(False, 2)
-                label = gtk.Label(fields[fname].attrs['string'])
-                label.show()
-                help = fields[fname].attrs['string']
-                if fields[fname].attrs.get('help'):
-                    help += '\n' + fields[fname].attrs['help']
-                tooltips.set_tip(label, help)
-                tooltips.enable()
-                arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_IN)
-                col.arrow = arrow
-                col.arrow_show = False
-                hbox.pack_start(label, True, True, 0)
-                hbox.pack_start(arrow, False, False, 0)
-                hbox.show()
-                col.set_widget(hbox)
-
-                col._type = fields[fname].attrs['type']
-                col.set_clickable(True)
-                twidth = {
-                    'integer': 60,
-                    'biginteger': 60,
-                    'float': 80,
-                    'numeric': 80,
-                    'float_time': 100,
-                    'date': 110,
-                    'datetime': 160,
-                    'selection': 90,
-                    'char': 100,
-                    'one2many': 50,
-                    'many2many': 50,
-                    'boolean': 20,
-                    'binary': 200,
-                }
-                width = self.screen.tree_column_width[model_name].get(fname)
-                if not width:
-                    if 'width' in node_attrs:
-                        width = int(node_attrs['width'])
-                    else:
-                        width = twidth.get(fields[fname].attrs['type'], 100)
-                col.width = width
-                if width > 0:
-                    col.set_fixed_width(width)
-                col.set_min_width(1)
-                expand = node_attrs.get('expand', False)
-                col.set_expand(expand)
-                expandable |= expand
-                if (not treeview.sequence
-                        and not self.children_field
-                        and fields[fname].attrs.get('sortable', True)):
-                    col.connect('clicked', sort_model, treeview, self.screen)
-                col.set_resizable(True)
-                col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
-                col.set_visible(not node_attrs.get('tree_invisible',
-                    fields[fname].attrs.get('tree_invisible', False)))
-                if fname == self.screen.exclude_field:
-                    col.set_visible(False)
-                i = treeview.append_column(col)
-                if 'sum' in node_attrs and fields[fname].attrs['type'] \
-                        in ('integer', 'biginteger', 'float', 'numeric',
-                            'float_time'):
-                    label = gtk.Label(node_attrs['sum'] + _(': '))
-                    label_sum = gtk.Label()
-                    if isinstance(fields[fname].attrs.get('digits'),
-                            basestring):
-                        digits = 2
-                    else:
-                        digits = fields[fname].attrs.get('digits', (16, 2))[1]
-                    dict_widget[i] = (fname, label, label_sum, digits)
-            elif node.localName == 'button':
-                #TODO add shortcut
-                cell = Button(treeview, self.screen, node_attrs)
-                state_widgets.append(cell)
-                renderer = cell.renderer
-                string = node_attrs.get('string', _('Unknown'))
-                col = gtk.TreeViewColumn(string, renderer)
-                col.name = None
-                col.set_visible(not node_attrs.get('tree_invisible', False))
-
-                label = gtk.Label(string)
-                label.show()
-                help = string
-                if node_attrs.get('help'):
-                    help += '\n' + node_attrs['help']
-                tooltips.set_tip(label, help)
-                tooltips.enable()
-                arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_IN)
-                col.arrow = arrow
-                col.arrow_show = False
-                col.set_widget(label)
-
-                col._type = 'button'
-                col.set_cell_data_func(renderer, cell.setter)
-                if 'width' in node_attrs:
-                    width = int(node_attrs['width'])
+class CellCache(list):
+
+    methods = ('set_active', 'set_sensitive', 'set_property')
+
+    def apply(self, cell):
+        for method, args, kwargs in self:
+            getattr(cell, method)(*args, **kwargs)
+
+    def decorate(self, cell):
+        def decorate(func):
+            @wraps(func)
+            def wrapper(*args, **kwargs):
+                self.append((func.__name__, args, kwargs))
+                return func(*args, **kwargs)
+            wrapper.previous = func
+            return wrapper
+
+        for method in self.methods:
+            if getattr(cell, method, None):
+                setattr(cell, method, decorate(getattr(cell, method)))
+        cell.decorated = True
+        return cell
+
+    def undecorate(self, cell):
+        for method in self.methods:
+            if getattr(cell, method, None):
+                setattr(cell, method, getattr(cell, method).previous)
+        del cell.decorated
+
+    @classmethod
+    def cache(cls, func):
+        @wraps(func)
+        def wrapper(self, column, cell, store, iter):
+            if not hasattr(self, 'display_counters'):
+                self.display_counters = {}
+            if not hasattr(self, 'cell_caches'):
+                self.cell_caches = {}
+            record = store.get_value(iter, 0)
+            counter = self.view.treeview.display_counter
+            if (self.display_counters.get(record.id) != counter):
+                if getattr(cell, 'decorated', None):
+                    func(self, column, cell, store, iter)
                 else:
-                    width = 80
-                col.width = width
-                if width > 0:
-                    col.set_fixed_width(width)
-                col.set_resizable(True)
-                col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
-                i = treeview.append_column(col)
-        if not expandable:
-            col = gtk.TreeViewColumn()
-            col.name = None
-            arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_IN)
-            col.arrow = arrow
-            col.arrow_show = False
-            col._type = 'fill'
-            col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
-            treeview.append_column(col)
-        treeview.set_fixed_height_mode(True)
-        return treeview, dict_widget, state_widgets, on_write, [], None
+                    cache = cls()
+                    cache.decorate(cell)
+                    func(self, column, cell, store, iter)
+                    cache.undecorate(cell)
+                    self.cell_caches[record.id] = cache
+                    self.display_counters[record.id] = counter
+            else:
+                self.cell_caches[record.id].apply(cell)
+        return wrapper
 
 
 class Affix(object):
 
-    def __init__(self, field_name, treeview, attrs, protocol=None):
+    def __init__(self, view, attrs, protocol=None):
         super(Affix, self).__init__()
-        self.field_name = attrs.get('name', field_name)
         self.attrs = attrs
         self.protocol = protocol
         self.icon = attrs.get('icon')
@@ -313,12 +124,13 @@ class Affix(object):
             self.renderer = gtk.CellRendererPixbuf()
         else:
             self.renderer = gtk.CellRendererText()
-        self.treeview = treeview
+        self.view = view
 
     @realized
+    @CellCache.cache
     def setter(self, column, cell, store, iter_):
         record = store.get_value(iter_, 0)
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         field.state_set(record, states=('invisible',))
         invisible = field.get_state_attrs(record).get('invisible', False)
         cell.set_property('visible', not invisible)
@@ -328,7 +140,7 @@ class Affix(object):
             else:
                 value = self.icon
             common.ICONFACTORY.register_icon(value)
-            pixbuf = self.treeview.render_icon(stock_id=value,
+            pixbuf = self.view.treeview.render_icon(stock_id=value,
                 size=gtk.ICON_SIZE_BUTTON, detail=None)
             cell.set_property('pixbuf', pixbuf)
         else:
@@ -338,9 +150,9 @@ class Affix(object):
             cell.set_property('text', text)
 
     def clicked(self, renderer, path):
-        store = self.treeview.get_model()
+        store = self.view.treeview.get_model()
         record = store.get_value(store.get_iter(path), 0)
-        value = record[self.field_name].get(record)
+        value = record[self.attrs['name']].get(record)
         if value:
             if self.protocol == 'email':
                 value = 'mailto:%s' % value
@@ -353,19 +165,28 @@ class Affix(object):
 
 class Char(object):
 
-    def __init__(self, field_name, model_name, treeview, attrs=None,
-            renderer=None):
+    def __init__(self, view, attrs, renderer=None):
         super(Char, self).__init__()
-        self.field_name = field_name
-        self.model_name = model_name
-        self.attrs = attrs or {}
+        self.attrs = attrs
         if renderer is None:
             renderer = CellRendererText
         self.renderer = renderer()
         self.renderer.connect('editing-started', self.editing_started)
-        self.treeview = treeview
+        if not isinstance(self.renderer, CellRendererBinary):
+            self.renderer.connect_after('editing-started', send_keys,
+                view.treeview)
+        self.view = view
+
+    @property
+    def field_name(self):
+        return self.attrs['name']
+
+    @property
+    def model_name(self):
+        return self.view.screen.model_name
 
     @realized
+    @CellCache.cache
     def setter(self, column, cell, store, iter):
         record = store.get_value(iter, 0)
         text = self.get_textual_value(record)
@@ -385,7 +206,7 @@ class Char(object):
             else:
                 cell.set_property('foreground-set', True)
 
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
 
         if self.attrs.get('type', field.attrs.get('type')) in \
                 ('float', 'integer', 'biginteger', 'boolean',
@@ -394,17 +215,16 @@ class Char(object):
         else:
             align = 0
 
+        editable = getattr(self.view.treeview, 'editable', False)
         states = ('invisible',)
-        if hasattr(self.treeview, 'editable') \
-                and self.treeview.editable:
+        if editable:
             states = ('readonly', 'required', 'invisible')
 
         field.state_set(record, states=states)
         invisible = field.get_state_attrs(record).get('invisible', False)
         cell.set_property('visible', not invisible)
 
-        if hasattr(self.treeview, 'editable') \
-                and self.treeview.editable:
+        if editable:
             readonly = self.attrs.get('readonly',
                 field.get_state_attrs(record).get('readonly', False))
             if invisible:
@@ -427,8 +247,8 @@ class Char(object):
 
             if isinstance(cell, CellRendererToggle):
                 cell.set_property('activatable', not readonly)
-            elif isinstance(cell,
-                    (gtk.CellRendererProgress, CellRendererButton)):
+            elif isinstance(cell, (gtk.CellRendererProgress,
+                        CellRendererButton, gtk.CellRendererPixbuf)):
                 pass
             else:
                 cell.set_property('editable', not readonly)
@@ -436,7 +256,7 @@ class Char(object):
         cell.set_property('xalign', align)
 
     def get_color(self, record):
-        return record.expr_eval(self.treeview.colors)
+        return record.expr_eval(self.view.attributes.get('colors', '"black"'))
 
     def open_remote(self, record, create, changed=False, text=None,
             callback=None):
@@ -445,10 +265,10 @@ class Char(object):
     def get_textual_value(self, record):
         if not record:
             return ''
-        return record[self.field_name].get_client(record)
+        return record[self.attrs['name']].get_client(record)
 
     def value_from_text(self, record, text, callback=None):
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         field.set_client(record, text)
         if callback:
             callback()
@@ -457,29 +277,28 @@ class Char(object):
         return False
 
     def _get_record_field(self, path):
-        store = self.treeview.get_model()
+        store = self.view.treeview.get_model()
         record = store.get_value(store.get_iter(path), 0)
-        field = record.group.fields[self.field_name]
+        field = record.group.fields[self.attrs['name']]
         return record, field
 
 
 class Int(Char):
 
-    def __init__(self, field_name, model_name, treeview, attrs=None,
-            renderer=None):
+    def __init__(self, view, attrs, renderer=None):
         if renderer is None:
             renderer = CellRendererInteger
-        super(Int, self).__init__(field_name, model_name, treeview,
-            attrs=attrs, renderer=renderer)
+        super(Int, self).__init__(view, attrs, renderer=renderer)
         self.factor = float(attrs.get('factor', 1))
 
     def get_textual_value(self, record):
         if not record:
             return ''
-        return record[self.field_name].get_client(record, factor=self.factor)
+        return record[self.attrs['name']].get_client(
+            record, factor=self.factor)
 
     def value_from_text(self, record, text, callback=None):
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         field.set_client(record, text, factor=self.factor)
         if callback:
             callback()
@@ -487,33 +306,33 @@ class Int(Char):
 
 class Boolean(Char):
 
-    def __init__(self, field_name, model_name, treeview, attrs=None,
+    def __init__(self, view, attrs=None,
             renderer=None):
         if renderer is None:
             renderer = CellRendererToggle
-        super(Boolean, self).__init__(field_name, model_name, treeview,
-            attrs=attrs, renderer=renderer)
+        super(Boolean, self).__init__(view, attrs, renderer=renderer)
         self.renderer.connect('toggled', self._sig_toggled)
 
     def _sig_toggled(self, renderer, path):
-        store = self.treeview.get_model()
+        store = self.view.treeview.get_model()
         record = store.get_value(store.get_iter(path), 0)
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         if not self.attrs.get('readonly',
                 field.get_state_attrs(record).get('readonly', False)):
-            value = record[self.field_name].get_client(record)
-            record[self.field_name].set_client(record, int(not value))
-            self.treeview.set_cursor(path)
+            value = record[self.attrs['name']].get_client(record)
+            record[self.attrs['name']].set_client(record, int(not value))
+            self.view.treeview.set_cursor(path)
         return True
 
 
 class URL(Char):
 
     @realized
+    @CellCache.cache
     def setter(self, column, cell, store, iter):
         super(URL, self).setter(column, cell, store, iter)
         record = store.get_value(iter, 0)
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         field.state_set(record, states=('readonly',))
         readonly = field.get_state_attrs(record).get('readonly', False)
         cell.set_property('visible', not readonly)
@@ -521,12 +340,10 @@ class URL(Char):
 
 class Date(Char):
 
-    def __init__(self, field_name, model_name, treeview, attrs=None,
-            renderer=None):
+    def __init__(self, view, attrs, renderer=None):
         if renderer is None:
             renderer = partial(CellRendererDate, date_format())
-        super(Date, self).__init__(field_name, model_name, treeview,
-            attrs=attrs, renderer=renderer)
+        super(Date, self).__init__(view, attrs, renderer=renderer)
         self.renderer.connect('editing-started', self.editing_started)
 
 
@@ -536,7 +353,7 @@ class Datetime(Date):
     def setter(self, column, cell, store, iter):
         super(Datetime, self).setter(column, cell, store, iter)
         record = store.get_value(iter, 0)
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         time_format = field.time_format(record)
         self.renderer.format = date_format() + ' ' + time_format
 
@@ -547,45 +364,41 @@ class Time(Date):
     def setter(self, column, cell, store, iter):
         super(Time, self).setter(column, cell, store, iter)
         record = store.get_value(iter, 0)
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         time_format = field.time_format(record)
         self.renderer.format = time_format
 
 
 class Float(Int):
 
-    def __init__(self, field_name, model_name, treeview, attrs=None,
-            renderer=None):
+    def __init__(self, view, attrs, renderer=None):
         if renderer is None:
             renderer = CellRendererFloat
-        super(Float, self).__init__(field_name, model_name, treeview,
-            attrs=attrs, renderer=renderer)
+        super(Float, self).__init__(view, attrs, renderer=renderer)
 
     @realized
     def setter(self, column, cell, store, iter):
         super(Float, self).setter(column, cell, store, iter)
         record = store.get_value(iter, 0)
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         digits = field.digits(record, factor=self.factor)
         cell.digits = digits
 
 
 class FloatTime(Char):
 
-    def __init__(self, field_name, model_name, treeview, attrs=None,
-            renderer=None):
-        super(FloatTime, self).__init__(field_name, model_name, treeview,
-            attrs=attrs, renderer=renderer)
+    def __init__(self, view, attrs, renderer=None):
+        super(FloatTime, self).__init__(view, attrs, renderer=renderer)
         self.conv = None
         if attrs and attrs.get('float_time'):
             self.conv = rpc.CONTEXT.get(attrs['float_time'])
 
     def get_textual_value(self, record):
-        val = record[self.field_name].get(record)
+        val = record[self.attrs['name']].get(record)
         return common.float_time_to_text(val, self.conv)
 
     def value_from_text(self, record, text, callback=None):
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         digits = field.digits(record)
         field.set_client(record,
             common.text_to_float_time(text, self.conv, digits[1]))
@@ -595,13 +408,11 @@ class FloatTime(Char):
 
 class Binary(Char):
 
-    def __init__(self, field_name, model_name, treeview, attrs=None,
-            renderer=None):
+    def __init__(self, view, attrs, renderer=None):
         self.filename = attrs.get('filename')
         if renderer is None:
             renderer = partial(CellRendererBinary, bool(self.filename))
-        super(Binary, self).__init__(field_name, model_name, treeview,
-            attrs=attrs, renderer=renderer)
+        super(Binary, self).__init__(view, attrs, renderer=renderer)
         self.renderer.connect('new', self.new_binary)
         self.renderer.connect('open', self.open_binary)
         self.renderer.connect('save', self.save_binary)
@@ -616,9 +427,10 @@ class Binary(Char):
             callback()
 
     @realized
+    @CellCache.cache
     def setter(self, column, cell, store, iter):
         record = store.get_value(iter, 0)
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         if hasattr(field, 'get_size'):
             size = field.get_size(record)
         else:
@@ -626,14 +438,14 @@ class Binary(Char):
         cell.set_property('size', common.humanize(size) if size else '')
 
         states = ('invisible',)
-        if getattr(self.treeview, 'editable', False):
+        if getattr(self.view.treeview, 'editable', False):
             states = ('readonly', 'required', 'invisible')
 
         field.state_set(record, states=states)
         invisible = field.get_state_attrs(record).get('invisible', False)
         cell.set_property('visible', not invisible)
 
-        if getattr(self.treeview, 'editable', False):
+        if getattr(self.view.treeview, 'editable', False):
             readonly = self.attrs.get('readonly',
                 field.get_state_attrs(record).get('readonly', False))
             if invisible:
@@ -697,46 +509,57 @@ class Binary(Char):
         field.set_client(record, False)
 
 
+class Image(Char):
+
+    def __init__(self, view, attrs=None, renderer=None):
+        if renderer is None:
+            renderer = gtk.CellRendererPixbuf
+        super(Image, self).__init__(view, attrs, renderer)
+        self.renderer.set_fixed_size(self.attrs.get('width', -1),
+            self.attrs.get('height', -1))
+
+    @realized
+    @CellCache.cache
+    def setter(self, column, cell, store, iter_):
+        record = store.get_value(iter_, 0)
+        field = record[self.field_name]
+        value = field.get_client(record)
+        if isinstance(value, (int, long)):
+            if value > common.BIG_IMAGE_SIZE:
+                value = None
+            else:
+                value = field.get_data(record)
+        pixbuf = data2pixbuf(value)
+        if self.attrs['width'] != -1 or self.attrs['height'] != -1:
+            pixbuf = common.resize_pixbuf(pixbuf,
+                self.attrs['width'], self.attrs['height'])
+        cell.set_property('pixbuf', pixbuf)
+
+
 class M2O(Char):
 
-    def __init__(self, field_name, model_name, treeview, attrs=None,
-            renderer=None):
+    def __init__(self, view, attrs, renderer=None):
         if renderer is None and int(attrs.get('completion', 1)):
             renderer = partial(CellRendererTextCompletion, self.set_completion)
-        super(M2O, self).__init__(field_name, model_name, treeview,
-            attrs=attrs, renderer=renderer)
+        super(M2O, self).__init__(view, attrs, renderer=renderer)
 
     def value_from_text(self, record, text, callback=None):
-        field = record.group.fields[self.field_name]
+        field = record.group.fields[self.attrs['name']]
         if not text:
             field.set_client(record, (None, ''))
             if callback:
                 callback()
             return
 
-        relation = record[self.field_name].attrs['relation']
-        domain = record[self.field_name].domain_get(record)
-        context = record[self.field_name].context_get(record)
-        dom = [('rec_name', 'ilike', '%' + text + '%'), domain]
-        try:
-            ids = RPCExecute('model', relation, 'search', dom, 0, None, None,
-                context=context)
-        except RPCException:
-            field.set_client(record, (None, ''))
-            if callback:
-                callback()
-            return
-        if len(ids) != 1:
-            self.search_remote(record, relation, ids, domain=domain,
-                context=context, callback=callback)
-            return
-        field.set_client(record, ids[0])
-        if callback:
-            callback()
+        relation = record[self.attrs['name']].attrs['relation']
+        domain = record[self.attrs['name']].domain_get(record)
+        context = record[self.attrs['name']].context_get(record)
+        self.search_remote(record, relation, text, domain=domain,
+            context=context, callback=callback)
 
     def open_remote(self, record, create=True, changed=False, text=None,
             callback=None):
-        field = record.group.fields[self.field_name]
+        field = record.group.fields[self.attrs['name']]
         relation = field.attrs['relation']
 
         access = common.MODELACCESS[relation]
@@ -752,24 +575,7 @@ class M2O(Char):
         elif not changed:
             obj_id = field.get(record)
         else:
-            if text:
-                dom = [('rec_name', 'ilike', '%' + text + '%'), domain]
-            else:
-                dom = domain
-            try:
-                ids = RPCExecute('model', relation, 'search', dom, 0, None,
-                    None, context=context)
-            except RPCException:
-                field.set_client(record, False)
-                if callback:
-                    callback()
-                return
-            if len(ids) == 1:
-                field.set_client(record, ids[0])
-                if callback:
-                    callback()
-                return
-            self.search_remote(record, relation, ids, domain=domain,
+            self.search_remote(record, relation, text, domain=domain,
                 context=context, callback=callback)
             return
         screen = Screen(relation, domain=domain, context=context,
@@ -788,9 +594,9 @@ class M2O(Char):
         else:
             WinForm(screen, open_callback, new=True, save_current=True)
 
-    def search_remote(self, record, relation, ids=None, domain=None,
+    def search_remote(self, record, relation, text, domain=None,
             context=None, callback=None):
-        field = record.group.fields[self.field_name]
+        field = record.group.fields[self.attrs['name']]
 
         def search_callback(found):
             value = None
@@ -799,8 +605,9 @@ class M2O(Char):
             field.set_client(record, value)
             if callback:
                 callback()
-        WinSearch(relation, search_callback, sel_multi=False, ids=ids,
+        win = WinSearch(relation, search_callback, sel_multi=False,
             context=context, domain=domain)
+        win.screen.search_filter(text.decode('utf-8'))
 
     def set_completion(self, entry, path):
         if entry.get_completion():
@@ -858,12 +665,6 @@ class O2O(M2O):
     pass
 
 
-class UnsettableColumn(Exception):
-
-    def __init__(self):
-        Exception.__init__()
-
-
 class O2M(Char):
 
     @realized
@@ -872,7 +673,7 @@ class O2M(Char):
         cell.set_property('xalign', 0.5)
 
     def get_textual_value(self, record):
-        return '( ' + str(len(record[self.field_name]
+        return '( ' + str(len(record[self.attrs['name']]
                 .get_eval(record))) + ' )'
 
     def value_from_text(self, record, text, callback=None):
@@ -881,8 +682,8 @@ class O2M(Char):
 
     def open_remote(self, record, create=True, changed=False, text=None,
             callback=None):
-        group = record.value[self.field_name]
-        field = record.group.fields[self.field_name]
+        group = record.value[self.attrs['name']]
+        field = record.group.fields[self.attrs['name']]
         relation = field.attrs['relation']
         context = field.context_get(record)
 
@@ -905,8 +706,8 @@ class M2M(O2M):
 
     def open_remote(self, record, create=True, changed=False, text=None,
             callback=None):
-        group = record.value[self.field_name]
-        field = record.group.fields[self.field_name]
+        group = record.value[self.attrs['name']]
+        field = record.group.fields[self.attrs['name']]
         relation = field.attrs['relation']
         context = field.context_get(record)
         domain = field.domain_get(record)
@@ -929,11 +730,12 @@ class Selection(Char, SelectionMixin, PopdownMixin):
         self.renderer = CellRendererCombo()
         self.renderer.connect('editing-started', self.editing_started)
         self.init_selection()
-        self.renderer.set_property('model', self.get_popdown_model(self.selection)[0])
+        self.renderer.set_property('model',
+            self.get_popdown_model(self.selection)[0])
         self.renderer.set_property('text-column', 0)
 
     def get_textual_value(self, record):
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         self.update_selection(record, field)
         value = field.get(record)
         text = dict(self.selection).get(value, '')
@@ -947,9 +749,9 @@ class Selection(Char, SelectionMixin, PopdownMixin):
 
     def editing_started(self, cell, editable, path):
         super(Selection, self).editing_started(cell, editable, path)
-        store = self.treeview.get_model()
+        store = self.view.treeview.get_model()
         record = store.get_value(store.get_iter(path), 0)
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
 
         set_value = lambda *a: self.set_value(editable, record, field)
         editable.child.connect('activate', set_value)
@@ -975,14 +777,12 @@ class Selection(Char, SelectionMixin, PopdownMixin):
 
 class Reference(Char, SelectionMixin):
 
-    def __init__(self, field_name, model_name, treeview, attrs=None,
-            renderer=None):
-        super(Reference, self).__init__(field_name, model_name, treeview,
-            attrs=attrs, renderer=renderer)
+    def __init__(self, view, attrs, renderer=None):
+        super(Reference, self).__init__(view, attrs, renderer=renderer)
         self.init_selection()
 
     def get_textual_value(self, record):
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         self.update_selection(record, field)
         value = field.get_client(record)
         if not value:
@@ -1007,21 +807,19 @@ class ProgressBar(object):
         'top_to_bottom': gtk.PROGRESS_TOP_TO_BOTTOM,
     }
 
-    def __init__(self, field_name, model_name, treeview, attrs=None):
+    def __init__(self, view, attrs):
         super(ProgressBar, self).__init__()
-        self.field_name = field_name
-        self.model_name = model_name
-        self.attrs = attrs or {}
+        self.attrs = attrs
         self.renderer = gtk.CellRendererProgress()
         orientation = self.orientations.get(self.attrs.get('orientation',
             'left_to_right'), gtk.PROGRESS_LEFT_TO_RIGHT)
         self.renderer.set_property('orientation', orientation)
-        self.treeview = treeview
 
     @realized
+    @CellCache.cache
     def setter(self, column, cell, store, iter):
         record = store.get_value(iter, 0)
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         value = float(self.get_textual_value(record) or 0.0)
         cell.set_property('value', value)
         digit = field.digits(record)[1]
@@ -1033,10 +831,10 @@ class ProgressBar(object):
         raise NotImplementedError
 
     def get_textual_value(self, record):
-        return record[self.field_name].get_client(record) or ''
+        return record[self.attrs['name']].get_client(record) or ''
 
     def value_from_text(self, record, text, callback=None):
-        field = record[self.field_name]
+        field = record[self.attrs['name']]
         field.set_client(record, float(text))
         if callback:
             callback()
@@ -1044,16 +842,16 @@ class ProgressBar(object):
 
 class Button(object):
 
-    def __init__(self, treeview, screen, attrs=None):
+    def __init__(self, view, attrs):
         super(Button, self).__init__()
-        self.attrs = attrs or {}
+        self.attrs = attrs
         self.renderer = CellRendererButton(attrs.get('string', _('Unknown')))
-        self.treeview = treeview
-        self.screen = screen
+        self.view = view
 
         self.renderer.connect('clicked', self.button_clicked)
 
     @realized
+    @CellCache.cache
     def setter(self, column, cell, store, iter):
         record = store.get_value(iter, 0)
         states = record.expr_eval(self.attrs.get('states', {}))
@@ -1074,7 +872,7 @@ class Button(object):
     def button_clicked(self, widget, path):
         if not path:
             return True
-        store = self.treeview.get_model()
+        store = self.view.treeview.get_model()
         record = store.get_value(store.get_iter(path), 0)
 
         state_changes = record.expr_eval(
@@ -1082,30 +880,4 @@ class Button(object):
         if state_changes.get('invisible') \
                 or state_changes.get('readonly'):
             return True
-        self.screen.button(self.attrs)
-
-CELLTYPES = {
-    'char': Char,
-    'many2one': M2O,
-    'date': Date,
-    'one2many': O2M,
-    'many2many': M2M,
-    'selection': Selection,
-    'float': Float,
-    'numeric': Float,
-    'float_time': FloatTime,
-    'integer': Int,
-    'biginteger': Int,
-    'datetime': Datetime,
-    'time': Time,
-    'boolean': Boolean,
-    'text': Char,
-    'url': URL,
-    'email': URL,
-    'callto': URL,
-    'sip': URL,
-    'progressbar': ProgressBar,
-    'reference': Reference,
-    'one2one': O2O,
-    'binary': Binary,
-}
+        self.view.screen.button(self.attrs)
diff --git a/tryton/gui/window/view_form/view/screen_container.py b/tryton/gui/window/view_form/view/screen_container.py
index 295d7c4..b071732 100644
--- a/tryton/gui/window/view_form/view/screen_container.py
+++ b/tryton/gui/window/view_form/view/screen_container.py
@@ -7,6 +7,7 @@ import gobject
 import tryton.common as common
 from tryton.common.domain_parser import quote
 from tryton.common.placeholder_entry import PlaceholderEntry
+from tryton.common.treeviewcontrol import TreeViewControl
 from tryton.translate import date_format
 from tryton.config import TRYTON_ICON
 from tryton.pyson import PYSONDecoder
@@ -35,14 +36,14 @@ class Dates(gtk.HBox):
         elif from_:
             return '>=%s' % quote(from_)
         elif to:
-            return '<%s' % quote(to)
+            return '<=%s' % quote(to)
 
 
 class Selection(gtk.ScrolledWindow):
 
     def __init__(self, selections):
         super(Selection, self).__init__()
-        self.treeview = gtk.TreeView()
+        self.treeview = TreeViewControl()
         model = gtk.ListStore(gobject.TYPE_STRING)
         for selection in selections:
             model.append((selection,))
@@ -57,6 +58,7 @@ class Selection(gtk.ScrolledWindow):
         self.treeview.set_headers_visible(False)
         self.add(self.treeview)
         self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        self.set_shadow_type(gtk.SHADOW_ETCHED_IN)
 
     def get_value(self):
         values = []
@@ -449,8 +451,9 @@ class ScreenContainer(object):
             self.search_table.fields = []
             for i, field in enumerate(fields):
                 label = gtk.Label(field['string'])
-                label.set_alignment(0.0, 0.5)
-                self.search_table.attach(label, 0, 1, i, i + 1, yoptions=False)
+                label.set_alignment(0.0, 0.0)
+                self.search_table.attach(label, 0, 1, i, i + 1,
+                    yoptions=gtk.FILL)
                 yoptions = False
                 if field['type'] == 'boolean':
                     if hasattr(gtk, 'ComboBoxText'):
diff --git a/tryton/gui/window/view_form/view/widget_parse.py b/tryton/gui/window/view_form/view/widget_parse.py
deleted file mode 100644
index 45a3311..0000000
--- a/tryton/gui/window/view_form/view/widget_parse.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#This file is part of Tryton.  The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-from interface import ParserInterface
-import form_gtk
-import list_gtk
-import graph_gtk
-import calendar_gtk
-from form import ViewForm
-from list import ViewList
-from graph import ViewGraph
-from calendar_ import ViewCalendar
-from tryton.exceptions import TrytonError
-
-PARSERS = {
-    'form': form_gtk.ParserForm,
-    'tree': list_gtk.ParserTree,
-    'graph': graph_gtk.ParserGraph,
-    'calendar': calendar_gtk.ParserCalendar,
-    }
-
-PARSERS2 = {
-    'form': ViewForm,
-    'tree': ViewList,
-    'graph': ViewGraph,
-    'calendar': ViewCalendar,
-    }
-
-
-class WidgetParse(ParserInterface):
-
-    def parse(self, screen, root_node, fields, children_field=None):
-        for node in root_node.childNodes:
-            if not node.nodeType == node.ELEMENT_NODE:
-                continue
-            if node.localName in PARSERS:
-                widget = PARSERS[node.localName](self.parent, self.attrs,
-                    screen, children_field)
-                (wid, child, state_widgets, on_write, notebooks,
-                    cursor_widget) = widget.parse(screen.model_name, node,
-                        fields)
-                screen.set_on_write(on_write)
-                res = PARSERS2[node.localName](screen, wid, child,
-                    state_widgets, notebooks, cursor_widget, children_field)
-                res.title = widget.title
-                return res
-            else:
-                raise TrytonError('Unknow view mode: %s' % node.localName)
diff --git a/tryton/gui/window/win_export.py b/tryton/gui/window/win_export.py
index 903b687..07f9731 100644
--- a/tryton/gui/window/win_export.py
+++ b/tryton/gui/window/win_export.py
@@ -1,5 +1,6 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of this
 #repository contains the full copyright notices and license terms.
+import sys
 import gtk
 import gobject
 import gettext
@@ -97,7 +98,7 @@ class WinExport(NoModal):
         img_button = gtk.Image()
         img_button.set_from_stock('tryton-save', gtk.ICON_SIZE_BUTTON)
         button_save_export.set_image(img_button)
-        button_save_export.connect_after('clicked', self.add_predef)
+        button_save_export.connect_after('clicked', self.addreplace_predef)
         vbox_buttons.pack_start(button_save_export, False, False, 0)
 
         button_del_export = gtk.Button(_("Delete Export"), stock=None,
@@ -159,7 +160,6 @@ class WinExport(NoModal):
 
         self.ids = ids
         self.model = model
-        self.fields_data = {}
         self.context = context
 
         self.view1 = gtk.TreeView()
@@ -190,7 +190,23 @@ class WinExport(NoModal):
         self.model_populate(self._get_fields(model))
 
         self.view1.set_model(self.model1)
+        self.view1.connect('row-activated', self.sig_sel)
         self.view2.set_model(self.model2)
+        self.view2.connect('row-activated', self.sig_unsel)
+        if sys.platform != 'darwin':
+            self.view2.drag_source_set(
+                gtk.gdk.BUTTON1_MASK | gtk.gdk.BUTTON3_MASK,
+                [('EXPORT_TREE', gtk.TARGET_SAME_WIDGET, 0)],
+                gtk.gdk.ACTION_MOVE)
+            self.view2.drag_dest_set(gtk.DEST_DEFAULT_ALL,
+                [('EXPORT_TREE', gtk.TARGET_SAME_WIDGET, 0)],
+                gtk.gdk.ACTION_MOVE)
+            self.view2.connect('drag-begin', self.drag_begin)
+            self.view2.connect('drag-motion', self.drag_motion)
+            self.view2.connect('drag-drop', self.drag_drop)
+            self.view2.connect("drag-data-get", self.drag_data_get)
+            self.view2.connect('drag-data-received', self.drag_data_received)
+            self.view2.connect('drag-data-delete', self.drag_data_delete)
 
         self.wid_action = combo_saveas
         self.wid_write_field_names = checkbox_add_field_names
@@ -202,7 +218,8 @@ class WinExport(NoModal):
             gtk.CellRendererText(), text=2))
         scrolledwindow_exports.add(self.pref_export)
 
-        self.pref_export.connect("row-activated", self.sel_predef)
+        self.pref_export.connect("button-press-event", self.export_click)
+        self.pref_export.connect("key-press-event", self.export_keypress)
 
         # Fill the predefined export tree view
         self.predef_model = gtk.ListStore(
@@ -221,23 +238,33 @@ class WinExport(NoModal):
 
     def model_populate(self, fields, parent_node=None, prefix_field='',
             prefix_name=''):
-        fields_order = fields.keys()
-        fields_order.sort(lambda x, y: -cmp(fields[x].get('string', ''),
-            fields[y].get('string', '')))
-        for field in fields_order:
-            self.fields_data[prefix_field + field] = fields[field]
-            name = fields[field]['string'] or field
-            if prefix_field:
-                self.fields_data[prefix_field + field]['string'] = '%s%s' % \
-                    (prefix_name, self.fields_data[prefix_field +
-                        field]['string'])
-            node = self.model1.insert(parent_node, 0, [name, prefix_field +
-                field, (fields[field].get('required', False) and
-                    common.COLORS['required']) or 'white'])
-            self.fields[prefix_field + field] = (name,
-                    fields[field].get('relation'))
-            if fields[field].get('relation'):
-                self.model1.insert(node, 0, [None, '', 'white'])
+        key = lambda (n, f): f.get('string') or n
+        for name, field in sorted(fields.items(), key=key, reverse=True):
+
+            string_ = field['string'] or name
+
+            items = [(name, field, string_)]
+            if field['type'] == 'selection':
+                items.insert(0, ('%s.translated' % name, field,
+                        _('%s (string)') % string_))
+
+            for name, field, string_ in items:
+                path = prefix_field + name
+                color = 'white'
+                if field.get('required'):
+                    color = common.COLORS['required']
+                long_string = string_
+                if prefix_field:
+                    long_string = prefix_name + string_
+                node = self.model1.insert(parent_node, 0,
+                    [string_, path, color])
+
+                self.fields[path] = (string_, long_string,
+                    field.get('relation'))
+                # Insert relation only to real field
+                if '.' not in name:
+                    if field.get('relation'):
+                        self.model1.insert(node, 0, [None, '', 'white'])
 
     def _get_fields(self, model):
         try:
@@ -250,25 +277,24 @@ class WinExport(NoModal):
         child = self.model1.iter_children(iter)
         if self.model1.get_value(child, 0) is None:
             prefix_field = self.model1.get_value(iter, 1)
-            _, model = self.fields[prefix_field]
-            name = self.fields_data[prefix_field]['string']
-            self.model_populate(self._get_fields(model), iter, prefix_field +
-                    '/', name + '/')
+            string_, long_string, relation = self.fields[prefix_field]
+            self.model_populate(self._get_fields(relation), iter,
+                prefix_field + '/', string_ + '/')
             self.model1.remove(child)
 
-    def sig_sel(self, widget=None):
+    def sig_sel(self, *args):
         sel = self.view1.get_selection()
         sel.selected_foreach(self._sig_sel_add)
 
     def _sig_sel_add(self, store, path, iter):
-        relation = self.fields[store.get_value(iter, 1)][1]
+        name = store.get_value(iter, 1)
+        string_, long_string, relation = self.fields[name]
         if relation:
             return
         num = self.model2.append()
-        name = self.fields_data[store.get_value(iter, 1)]['string']
-        self.model2.set(num, 0, name, 1, store.get_value(iter, 1))
+        self.model2.set(num, 0, long_string, 1, name)
 
-    def sig_unsel(self, widget=None):
+    def sig_unsel(self, *args):
         store, paths = self.view2.get_selection().get_selected_rows()
         while paths:
             store.remove(store.get_iter(paths[0]))
@@ -305,16 +331,31 @@ class WinExport(NoModal):
                 export['name']))
         self.pref_export.set_model(self.predef_model)
 
-    def add_predef(self, widget):
-        name = common.ask(_('What is the name of this export?'))
-        if not name:
-            return
+    def addreplace_predef(self, widget):
         iter = self.model2.get_iter_root()
         fields = []
         while iter:
             field_name = self.model2.get_value(iter, 1)
             fields.append(field_name)
             iter = self.model2.iter_next(iter)
+        if not fields:
+            return
+
+        selection = self.pref_export.get_selection().get_selected()
+        if selection is None:
+            return
+        model, iter_ = selection
+        if iter_ is None:
+            pref_id = None
+            name = common.ask(_('What is the name of this export?'))
+            if not name:
+                return
+        else:
+            pref_id = model.get_value(iter_, 0)
+            name = model.get_value(iter_, 2)
+            override = common.sur(_("Override '%s' definition?") % name)
+            if not override:
+                return
         try:
             new_id, = RPCExecute('model', 'ir.export', 'create', [{
                     'name': name,
@@ -323,13 +364,16 @@ class WinExport(NoModal):
                                         'name': x,
                                         } for x in fields])],
                     }], context=self.context)
+            if pref_id:
+                RPCExecute('model', 'ir.export', 'delete', [pref_id],
+                    context=self.context)
         except RPCException:
             return
-        self.predef_model.append((
-            new_id,
-            fields,
-            name))
-        self.pref_export.set_model(self.predef_model)
+        if iter_ is None:
+            self.predef_model.append((new_id, fields, name))
+        else:
+            model.set_value(iter_, 0, new_id)
+            model.set_value(iter_, 1, fields)
 
     def remove_predef(self, widget):
         sel = self.pref_export.get_selection().get_selected()
@@ -350,13 +394,13 @@ class WinExport(NoModal):
                 break
         self.pref_export.set_model(self.predef_model)
 
-    def sel_predef(self, widget, path, column):
+    def sel_predef(self, path):
         self.model2.clear()
-        for field in self.predef_model[path[0]][1]:
-            if field not in self.fields_data:
+        for name in self.predef_model[path[0]][1]:
+            if name not in self.fields:
                 iter = self.model1.get_iter_first()
                 prefix = ''
-                for parent in field.split('/')[:-1]:
+                for parent in name.split('/')[:-1]:
                     while iter:
                         if self.model1.get_value(iter, 1) == \
                                 (prefix + parent):
@@ -368,9 +412,15 @@ class WinExport(NoModal):
                         else:
                             iter = self.model1.iter_next(iter)
 
-            if field not in self.fields_data:
+            if name not in self.fields:
                 continue
-            self.model2.append((self.fields_data[field]['string'], field))
+            self.sel_field(name)
+
+    def sel_field(self, name):
+        _, long_string, relation = self.fields[name]
+        if relation:
+            return
+        self.model2.append((long_string, name))
 
     def destroy(self):
         super(WinExport, self).destroy()
@@ -441,3 +491,84 @@ class WinExport(NoModal):
             common.warning(_("Operation failed!\nError message:\n%s")
                 % (exception.faultCode,), _('Error'))
             return False
+
+    def drag_begin(self, treeview, context):
+        return True
+
+    def drag_motion(self, treeview, context, x, y, time):
+        try:
+            treeview.set_drag_dest_row(*treeview.get_dest_row_at_pos(x, y))
+        except TypeError:
+            treeview.set_drag_dest_row(len(treeview.get_model()) - 1,
+                gtk.TREE_VIEW_DROP_AFTER)
+        context.drag_status(gtk.gdk.ACTION_MOVE, time)
+        return True
+
+    def drag_drop(self, treeview, context, x, y, time):
+        treeview.emit_stop_by_name('drag-drop')
+        return True
+
+    def drag_data_get(self, treeview, context, selection, target_id,
+            etime):
+        treeview.emit_stop_by_name('drag-data-get')
+
+        def _func_sel_get(store, path, iter_, data):
+            data.append(path[0])
+        data = []
+        treeselection = treeview.get_selection()
+        treeselection.selected_foreach(_func_sel_get, data)
+        if not data:
+            return
+        selection.set('STRING', 8, ','.join(str(x) for x in data))
+        return True
+
+    def drag_data_received(self, treeview, context, x, y, selection,
+            info, etime):
+        treeview.emit_stop_by_name('drag-data-received')
+        if not selection.data:
+            return
+        store = treeview.get_model()
+
+        data_iters = [store.get_iter((int(i),))
+            for i in selection.data.split(',')]
+        drop_info = treeview.get_dest_row_at_pos(x, y)
+        if drop_info:
+            path, position = drop_info
+            pos = store.get_iter(path)
+        else:
+            pos = store.get_iter((len(store) - 1,))
+            position = gtk.TREE_VIEW_DROP_AFTER
+        if position == gtk.TREE_VIEW_DROP_AFTER:
+            data_iters = reversed(data_iters)
+        for item in data_iters:
+            if position == gtk.TREE_VIEW_DROP_BEFORE:
+                store.move_before(item, pos)
+            else:
+                store.move_after(item, pos)
+        context.drop_finish(False, etime)
+        return True
+
+    def drag_data_delete(self, treeview, context):
+        treeview.emit_stop_by_name('drag-data-delete')
+
+    def export_click(self, treeview, event):
+        path_at_pos = treeview.get_path_at_pos(int(event.x), int(event.y))
+        if not path_at_pos or event.button != 1:
+            return
+        path, col, x, y = path_at_pos
+        selection = treeview.get_selection()
+        if event.type == gtk.gdk._2BUTTON_PRESS:
+            self.sel_predef(path)
+            selection.select_path(path)
+            return True
+        elif selection.path_is_selected(path):
+            selection.unselect_path(path)
+            return True
+
+    def export_keypress(self, treeview, event):
+        if event.keyval not in (gtk.keysyms.Return, gtk.keysyms.space):
+            return
+        model, selected = treeview.get_selection().get_selected()
+        if not selected:
+            return
+        self.sel_predef(model.get_path(selected))
diff --git a/tryton/gui/window/win_form.py b/tryton/gui/window/win_form.py
index dcfef89..4a536e9 100644
--- a/tryton/gui/window/win_form.py
+++ b/tryton/gui/window/win_form.py
@@ -267,7 +267,7 @@ class WinForm(NoModal):
             self.screen.screen_container.alternate_viewport.connect(
                     'key-press-event', self.on_keypress)
 
-        if self.save_current:
+        if self.save_current and not new:
             self.screen.signal_connect(self, 'record-message',
                 self.activate_save)
             self.screen.signal_connect(self, 'record-modified',
diff --git a/tryton/gui/window/win_search.py b/tryton/gui/window/win_search.py
index c8d2026..5ee48c7 100644
--- a/tryton/gui/window/win_search.py
+++ b/tryton/gui/window/win_search.py
@@ -60,7 +60,7 @@ class WinSearch(NoModal):
         self.view.unset_editable()
         # Prevent to set tree_state
         self.screen.tree_states_done.add(id(self.view))
-        sel = self.view.widget_tree.get_selection()
+        sel = self.view.treeview.get_selection()
 
         if not sel_multi:
             sel.set_mode(gtk.SELECTION_SINGLE)
@@ -89,7 +89,7 @@ class WinSearch(NoModal):
         common.center_window(self.win, self.parent, self.sensible_widget)
 
     def sig_activate(self, *args):
-        self.view.widget_tree.emit_stop_by_name('row_activated')
+        self.view.treeview.emit_stop_by_name('row_activated')
         self.win.response(gtk.RESPONSE_OK)
         return True
 
diff --git a/tryton/gui/window/wizard.py b/tryton/gui/window/wizard.py
index 42d625e..b46a700 100644
--- a/tryton/gui/window/wizard.py
+++ b/tryton/gui/window/wizard.py
@@ -110,7 +110,7 @@ class Wizard(object):
                     Action._exec_action(*action, context=self.context.copy())
 
             if self.state == self.end_state:
-                self.end(execute_actions)
+                self.end(lambda *a: execute_actions())
             else:
                 execute_actions()
             self.__processing = False
@@ -150,8 +150,10 @@ class Wizard(object):
         button.show()
         return button
 
-    def _record_modified(self, screen, signal):
-        record = screen.current_record
+    def _record_modified(self, screen, record):
+        self.update_buttons(record)
+
+    def update_buttons(self, record):
         for button in self.states.itervalues():
             button.state_set(record)
 
@@ -223,6 +225,7 @@ class Wizard(object):
 
         self.screen.new(default=False)
         self.screen.current_record.set_default(defaults)
+        self.update_buttons(self.screen.current_record)
         self.screen.set_cursor()
 
 
@@ -341,17 +344,20 @@ class WizardDialog(Wizard, NoModal):
             dialog = self.page.dialogs[-1]
         else:
             dialog = self.page
-        if (getattr(dialog, 'screen', None)
-                and dialog.screen.current_record
-                and self.sensible_widget != main.window):
-            if dialog.screen.model_name == self.model:
-                ids = self.ids
-            else:
-                # Wizard run from a children record so reload parent record
-                ids = [dialog.screen.current_record.id]
-            dialog.screen.reload(ids, written=True)
+        screen = getattr(dialog, 'screen', None)
+        if self.sensible_widget == main.window:
+            screen = main.menu_screen
+        if screen:
+            if (screen.current_record
+                    and self.sensible_widget != main.window):
+                if screen.model_name == self.model:
+                    ids = self.ids
+                else:
+                    # Wizard run from a children record so reload parent record
+                    ids = [screen.current_record.id]
+                screen.reload(ids, written=True)
             if action:
-                dialog.screen.client_action(action)
+                screen.client_action(action)
 
     def end(self, callback=None):
         def end_callback(action):
diff --git a/tryton/plugins/__init__.py b/tryton/plugins/__init__.py
index d66d689..4aaa9c4 100644
--- a/tryton/plugins/__init__.py
+++ b/tryton/plugins/__init__.py
@@ -5,26 +5,37 @@ import sys
 import imp
 import gettext
 
+from tryton.config import get_config_dir
+
+__all__ = ['MODULES', 'register']
+
 _ = gettext.gettext
 
-PLUGINS_PATH = os.path.dirname(__file__)
-if not os.path.isdir(PLUGINS_PATH):
-    # try for py2exe
-    PLUGINS_PATH = os.path.join(os.path.abspath(os.path.normpath(
-        os.path.dirname(sys.argv[0]))), 'plugins')
 MODULES = []
 
 
 def register():
     global MODULES
-    if os.path.isdir(PLUGINS_PATH):
-        for plugin in os.listdir(PLUGINS_PATH):
-            if not os.path.isdir(os.path.join(PLUGINS_PATH, plugin)):
-                continue
+    paths = [
+        os.path.join(get_config_dir(), 'plugins'),
+        os.path.dirname(__file__),
+        #py2exe
+        os.path.join(os.path.abspath(os.path.normpath(
+                    os.path.dirname(sys.argv[0]))), 'plugins'),
+        ]
+    paths = filter(os.path.isdir, paths)
+
+    imported = set()
+    for path in paths:
+        for plugin in os.listdir(path):
             module = os.path.splitext(plugin)[0]
+            if module == '__init__' or module in imported:
+                continue
             try:
                 module = imp.load_module(module, *imp.find_module(module,
-                        [PLUGINS_PATH]))
+                        [path]))
                 MODULES.append(module)
             except ImportError:
                 continue
+            else:
+                imported.add(module.__name__)
diff --git a/tryton/pyson.py b/tryton/pyson.py
index 9f637a5..48c5b15 100644
--- a/tryton/pyson.py
+++ b/tryton/pyson.py
@@ -28,25 +28,25 @@ class PYSON(object):
             return Not(self)
 
     def __and__(self, other):
+        if (isinstance(other, PYSON)
+                and other.types() != set([bool])):
+            other = Bool(other)
         if (isinstance(self, And)
                 and not isinstance(self, Or)):
             self._statements.append(other)
             return self
-        if (isinstance(other, PYSON)
-                and other.types() != set([bool])):
-            other = Bool(other)
         if self.types() != set([bool]):
             return And(Bool(self), other)
         else:
             return And(self, other)
 
     def __or__(self, other):
-        if isinstance(self, Or):
-            self._statements.append(other)
-            return self
         if (isinstance(other, PYSON)
                 and other.types() != set([bool])):
             other = Bool(other)
+        if isinstance(self, Or):
+            self._statements.append(other)
+            return self
         if self.types() != set([bool]):
             return Or(Bool(self), other)
         else:
diff --git a/tryton/version.py b/tryton/version.py
index 451b8ce..75b5c60 100644
--- a/tryton/version.py
+++ b/tryton/version.py
@@ -1,6 +1,6 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 PACKAGE = "tryton"
-VERSION = "3.2.4"
+VERSION = "3.4.0"
 LICENSE = "GPL-3"
 WEBSITE = "http://www.tryton.org/"
-- 
tryton-client



More information about the tryton-debian-vcs mailing list