diff --git a/product/Formulator/StandardFields.py b/product/Formulator/StandardFields.py
index 712e1e67ad8070d38bcd2b32927fda532cd7d330..01b2c2e503773ec3fc831a56e94e5c9488e82212 100644
--- a/product/Formulator/StandardFields.py
+++ b/product/Formulator/StandardFields.py
@@ -127,6 +127,7 @@ class DateTimeField(ZMIField):
   widget = Widget.DateTimeWidgetInstance
   validator = Validator.DateTimeValidatorInstance
 
+  """
   def __init__(self, id, **kw):
     # icky but necessary...
     apply(ZMIField.__init__, (self, id), kw)
@@ -160,10 +161,7 @@ class DateTimeField(ZMIField):
     for field in self.sub_form.get_fields():
       field.values['css_class'] = value
       field._p_changed = 1
-
   def override_year_items(self):
-    """The method gets called to get the right amount of years.
-    """
     start_datetime = self.get_value('start_datetime')
     end_datetime = self.get_value('end_datetime')
     current_year = DateTime().year()
@@ -176,7 +174,7 @@ class DateTimeField(ZMIField):
     else:
       last_year = first_year + 11
     return create_items(first_year, last_year, digits=4)
-
+  """
   def _get_user_input_value(self, key, REQUEST):
     """
     Try to get a value of the field from the REQUEST
diff --git a/product/Formulator/Validator.py b/product/Formulator/Validator.py
index 27b8b72be4fa5d79e5bd909778c59e6dcba0847c..b72f5903a52a71f312438031fe2f7449515c78b4 100644
--- a/product/Formulator/Validator.py
+++ b/product/Formulator/Validator.py
@@ -278,9 +278,12 @@ class IntegerValidator(StringBaseValidator):
         value = int(value)
       except ValueError:
         self.raise_error('not_integer', field)
-
-      start = field.get_value('start')
-      end = field.get_value('end')
+      start = ""
+      end = ""
+      if hasattr(field, start):
+        start = field.get_value('start')
+      if hasattr(field, end):
+        end = field.get_value('end')
       if start != "" and value < start:
         self.raise_error('integer_out_of_range', field)
       if end != "" and value >= end:
@@ -734,29 +737,33 @@ class DateTimeValidator(Validator):
   not_datetime = 'You did not enter a valid date and time.'
   datetime_out_of_range = 'The date and time you entered were out of range.'
 
+  def validate_sub_field(self, field, key, name, REQUEST):
+    id = field.generate_subfield_key(name, validation = 1, key = key)
+    return IntegerValidatorInstance.validate(field, id, REQUEST)
+
   def validate(self, field, key, REQUEST):
     try:
-      year = field.validate_sub_field('year', REQUEST, key=key)
-      month = field.validate_sub_field('month', REQUEST, key=key)
+      year = self.validate_sub_field(field, key, 'year', REQUEST)
+      month = self.validate_sub_field(field, key, 'month', REQUEST)
       if field.get_value('hide_day'):
         day = 1
       else:
-        day = field.validate_sub_field('day', REQUEST, key=key)
+        day = self.validate_sub_field(field, key, 'day', REQUEST)
 
       if field.get_value('date_only'):
         hour = 0
         minute = 0
       elif field.get_value('allow_empty_time'):
-          hour = field.validate_sub_field('hour', REQUEST, key=key)
-          minute = field.validate_sub_field('minute', REQUEST, key=key)
+          hour = self.validate_sub_field(field, key, 'hour', REQUEST)
+          minute = self.validate_sub_field(field, key, 'minute', REQUEST)
           if hour == '' and minute == '':
             hour = 0
             minute = 0
           elif hour == '' or minute == '':
             raise ValidationError('not_datetime', field)
       else:
-        hour = field.validate_sub_field('hour', REQUEST, key=key)
-        minute = field.validate_sub_field('minute', REQUEST, key=key)
+        hour = self.validate_sub_field(field, key, 'hour', REQUEST)
+        minute = self.validate_sub_field(field, key, 'minute', REQUEST)
     except ValidationError:
       self.raise_error('not_datetime', field)
 
@@ -778,7 +785,7 @@ class DateTimeValidator(Validator):
       self.raise_error('not_datetime', field)
 
     if field.get_value('ampm_time_style'):
-      ampm = field.validate_sub_field('ampm', REQUEST, key=key)
+      ampm = self.validate_sub_field(field, key, 'ampm', REQUEST)
       if field.get_value('allow_empty_time'):
         if ampm == '':
           ampm = 'am'
@@ -794,9 +801,10 @@ class DateTimeValidator(Validator):
 
     # handle possible timezone input
     timezone = ''
+    """
     if field.get_value('timezone_style'):
       timezone =  field.validate_sub_field('timezone', REQUEST, key=key)
-
+    """
     try:
       # handling of hidden day, which can be first or last day of the month:
       if field.get_value('hidden_day_is_last_day'):
diff --git a/product/Formulator/Widget.py b/product/Formulator/Widget.py
index 29b4a79adf6b2afbd6045d74e93a469c42e96437..c892fc6dd44054cd341bb0165d5df80453fb0393 100644
--- a/product/Formulator/Widget.py
+++ b/product/Formulator/Widget.py
@@ -1417,10 +1417,6 @@ class DateTimeWidget(Widget):
   def render(self, field, key, value, REQUEST, render_prefix=None):
     use_ampm = field.get_value('ampm_time_style')
     use_timezone = field.get_value('timezone_style')
-    # FIXME: backwards compatibility hack:
-    if not hasattr(field, 'sub_form'):
-      from StandardFields import create_datetime_text_sub_form
-      field.sub_form = create_datetime_text_sub_form()
 
     # Is it still usefull to test the None value,
     # as DateTimeField should be considerer as the other field
@@ -1428,8 +1424,7 @@ class DateTimeWidget(Widget):
     # XXX hasattr(REQUEST, 'form') seems useless,
     # because REQUEST always has a form property
     if (value in (None, '')) and (field.get_value('default_now')) and \
-        ((REQUEST is None) or (not hasattr(REQUEST, 'form')) or \
-        (not REQUEST.form.has_key('subfield_%s_%s' % (key, 'year')))):
+        ((REQUEST is None) or (not REQUEST.form.has_key('subfield_%s_%s' % (key, 'year')))):
       value = DateTime()
     year   = None
     month  = None
@@ -1449,48 +1444,64 @@ class DateTimeWidget(Widget):
       minute = "%02d" % value.minute()
       ampm = value.ampm()
       timezone = value.timezone()
+    elif REQUEST is not None:
+      year = REQUEST.get(field.generate_subfield_key("year", key=key))
+      month = REQUEST.get(field.generate_subfield_key("month", key=key))
+      day = REQUEST.get(field.generate_subfield_key("day", key=key))
+      hour = REQUEST.get(field.generate_subfield_key("hour", key=key))
+      minute = REQUEST.get(field.generate_subfield_key("minute", key=key))
+      ampm = REQUEST.get(field.generate_subfield_key("ampm", key=key))
+      timezone = REQUEST.get(field.generate_subfield_key("timezone", key=key))
     input_order = self.getInputOrder(field)
     if input_order == 'ymd':
-      order = [('year', year),
-                ('month', month),
-                ('day', day)]
+      order = [['year', year, 4, 4],
+                ['month', month, 2, 2],
+                ['day', day, 2, 2]]
     elif input_order == 'dmy':
-      order = [('day', day),
-                ('month', month),
-                ('year', year)]
+      order = [['day', day, 2, 2],
+                ['month', month, 2, 2],
+                ['year', year, 4, 4]]
     elif input_order == 'mdy':
-      order = [('month', month),
-                ('day', day),
-                ('year', year)]
+      order = [['month', month, 2, 2],
+                ['day', day, 2, 2],
+                ['year', year, 4, 4]]
     elif input_order == 'my':
-      order = [('month', month),
-                ('year', year)]
+      order = [['month', month, 2, 2],
+                ['year', year, 4, 4]]
     elif input_order == 'ym':
-      order = [('year', year),
-                ('month', month)]
+      order = [['year', year, 4, 4],
+                ['month', month, 2, 2]]
     else:
-      order = [('year', year),
-                ('month', month),
-                ('day', day)]
+      order = [['year', year, 4 ,4],
+                ['month', month, 2, 2],
+                ['day', day, 2, 2]]
     result = []
-    for sub_field_name, sub_field_value in order:
-      result.append(field.render_sub_field(sub_field_name,
-                                            sub_field_value, REQUEST, key=key))
+    for sub_field_name, sub_field_value, size, maxlength in order:
+      result.append(self.render_sub_field(field, key, sub_field_name,
+                                            sub_field_value, size, maxlength, REQUEST))
     date_result = string.join(result, field.get_value('date_separator'))
     if not field.get_value('date_only'):
-      time_result = (field.render_sub_field('hour', hour, REQUEST, key=key) +
+      time_result = (self.render_sub_field(field, key, 'hour', hour, 2, 2, REQUEST) +
                       field.get_value('time_separator') +
-                      field.render_sub_field('minute', minute, REQUEST, key=key))
+                      self.render_sub_field(field, key, 'minute', minute, 2, 2, REQUEST))
 
       if use_ampm:
-        time_result += '&nbsp;' + field.render_sub_field('ampm',
-                                                      ampm, REQUEST, key=key)
+        time_result += '&nbsp;' + self.render_sub_field(field, key, 'ampm',
+                                                        ampm, 2, 2, REQUEST)
+      """
       if use_timezone:
         time_result += '&nbsp;' + field.render_sub_field('timezone',
                                                       timezone, REQUEST, key=key)
+      """
       return date_result + '&nbsp;&nbsp;&nbsp;' + time_result
     else:
       return date_result
+  def render_sub_field(self, field, key, name, value, size, maxlength, REQUEST):
+    if value is None:
+      value = ""
+    return render_element("input", type="text",
+                           name= field.generate_subfield_key(name, key=key),
+                           value=value, size=size, maxlength=maxlength)
 
   def format_value(self, field, value, mode='html'):
     # Is it still usefull to test the None value,