Index: main/waeup.kofa/trunk/src/waeup/kofa/utils/batching.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/utils/batching.py	(revision 8213)
+++ main/waeup.kofa/trunk/src/waeup/kofa/utils/batching.py	(revision 8214)
@@ -32,5 +32,5 @@
 from waeup.kofa.interfaces import (
     IBatchProcessor, FatalCSVError, IObjectConverter,
-    ICSVExporter, DELETIONMARKER)
+    ICSVExporter, DELETION_MARKER, IGNORE_MARKER)
 
 class BatchProcessor(grok.GlobalUtility):
@@ -205,8 +205,10 @@
             if hasattr(obj, key):
                 # Set attribute to None if value is marked for deletion
-                if value == DELETIONMARKER:
-                    setattr(obj, key, None)
-                elif value is not None:
+                if value != '<IGNORE>':
                     setattr(obj, key, value)
+                #if value == DELETIONMARKER:
+                #    setattr(obj, key, None)
+                #elif value is not None:
+                #    setattr(obj, key, value)
         return
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/utils/converters.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/utils/converters.py	(revision 8213)
+++ main/waeup.kofa/trunk/src/waeup/kofa/utils/converters.py	(revision 8214)
@@ -30,5 +30,5 @@
 from waeup.kofa.interfaces import (
     IObjectConverter, IResultEntryField, IFieldConverter, SubjectSource,
-    GradeSource)
+    GradeSource, DELETION_MARKER, IGNORE_MARKER)
 from waeup.kofa.schema.interfaces import IPhoneNumber
 from waeup.kofa.schoolgrades import ResultEntry
@@ -114,14 +114,16 @@
 class DefaultFieldConverter(grok.Adapter):
     grok.context(Interface)
-    grok.provides(IFieldConverter)
-
-    def request_data(self, name, value, schema_field, prefix=''):
+    grok.implements(IFieldConverter)
+
+    def request_data(self, name, value, schema_field, prefix='',
+                     mode='create'):
         return {prefix: value}
 
 class ListFieldConverter(grok.Adapter):
     grok.context(IList)
-    grok.provides(IFieldConverter)
-
-    def request_data(self, name, value, schema_field, prefix=''):
+    grok.implements(IFieldConverter)
+
+    def request_data(self, name, value, schema_field, prefix='',
+                     mode='create'):
         value_type = schema_field.value_type
         try:
@@ -144,7 +146,8 @@
     """
     grok.context(IPhoneNumber)
-    grok.provides(IFieldConverter)
-
-    def request_data(self, name, value, schema_field, prefix=''):
+    grok.implements(IFieldConverter)
+
+    def request_data(self, name, value, schema_field, prefix='',
+                     mode='create'):
         parts = value.split('-', 2)
         country = ''
@@ -168,7 +171,8 @@
 class ResultEntryConverter(grok.Adapter):
     grok.context(IResultEntryField)
-    grok.provides(IFieldConverter)
-
-    def request_data(self, name, value, schema_field, prefix=''):
+    grok.implements(IFieldConverter)
+
+    def request_data(self, name, value, schema_field, prefix='',
+                     mode='create'):
         """Turn CSV values into ResultEntry-compatible form data.
 
@@ -208,5 +212,5 @@
 
     grok.context(Interface)
-    grok.provides(IObjectConverter)
+    grok.implements(IObjectConverter)
 
     def __init__(self, iface):
@@ -217,5 +221,6 @@
         return
 
-    def fromStringDict(self, data_dict, context, form_fields=None):
+    def fromStringDict(self, data_dict, context, form_fields=None,
+                       mode='create'):
         """Convert values in `data_dict`.
 
@@ -262,4 +267,5 @@
 
         request = TestRequest(form={})
+        new_data = dict()
         for key, val in data_dict.items():
             field = form_fields.get(key, None)
@@ -269,4 +275,13 @@
                 schema_field = field.interface[field.__name__]
                 field_converter = IFieldConverter(schema_field)
+                if mode == 'update':
+                    if val == DELETION_MARKER:
+                        val = schema_field.missing_value
+                        if schema_field.required:
+                            val = schema_field.default
+                        new_data[key] = val
+                        continue
+                    if val == IGNORE_MARKER:
+                        continue
                 request.form.update(
                     field_converter.request_data(
@@ -283,5 +298,5 @@
             form_fields, 'form', obj, request)
 
-        new_data = dict()
+        #new_data = dict()
         errors = getWidgetsData(widgets, 'form', new_data)
 
