diff --git a/product/ERP5Form/Message.py b/product/ERP5Form/Message.py
new file mode 100755
index 0000000000000000000000000000000000000000..79dd1b0a92eec883d44074aa1fba090bbd1f2802
--- /dev/null
+++ b/product/ERP5Form/Message.py
@@ -0,0 +1,93 @@
+##############################################################################
+#
+# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved.
+#                    Aurélien Calonne <aurel@nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+
+from Globals import InitializeClass, Persistent
+from AccessControl import ClassSecurityInfo
+from Products.PythonScripts.Utility import allow_class
+from Products.PageTemplates.GlobalTranslationService import getGlobalTranslationService
+from Globals import get_request
+from cPickle import dumps, loads
+from base64 import b64encode, b64decode
+
+try:
+  from string import Template
+except ImportError:
+  from Products.ERP5Type.patches.string import Template
+
+  
+class Message(Persistent):
+  """
+  This class encapsulates message, mapping and domain for a given message
+  """
+
+  security = ClassSecurityInfo()
+  security.declareObjectPublic()
+
+  def __init__(self, domain = None, message = '', mapping = None,):
+    self.message = message
+    self.mapping = mapping
+    self.domain = domain
+
+  security.declarePublic('dump')
+  def dump(self):
+    """
+    Return a pickle version of the object
+    """
+    return b64encode(dumps(self, 2))
+   
+  security.declarePublic('load')
+  def load(self, string):
+    """
+    Get properties from pickle version
+    """
+    o = loads(b64decode(string))
+    self.message = o.message
+    self.domain = o.domain
+    self.mapping = o.mapping
+
+  def __str__(self):
+    """
+    Return the translated message
+    """
+    context = get_request()['PARENTS'][0]
+    translation_service = getGlobalTranslationService()
+    if self.domain is None or translation_service is None :
+      # Map the translated string with given parameters
+      if type(self.mapping) is type({}):
+        if isinstance(translated_str, unicode) :
+          translated_str = self.message.encode('utf8')
+        self.message = Template(self.message).substitute(mapping)
+        if not isinstance(self.message, unicode):
+          self.message = self.message.decode('utf8')
+      return self.message
+    else:
+      return translation_service.translate(self.domain, self.message, mapping=self.mapping, context=context).encode('utf8')
+
+
+InitializeClass(Message)
+allow_class(Message)