diff --git a/wcs/admin/forms.py b/wcs/admin/forms.py
index ca7f9c8..d29fc7d 100644
--- a/wcs/admin/forms.py
+++ b/wcs/admin/forms.py
@@ -206,7 +206,7 @@ class WorkflowRoleDirectory(Directory):
 
 class FormDefPage(Directory):
     _q_exports = ['', 'fields', 'delete', 'duplicate', 'export',
-                  'archive', 'invite', 'enable', 'workflow', 'category',
+                  'anonymise', 'invite', 'enable', 'workflow', 'category',
                   'role', ('workflow-options', 'workflow_options'),
                   ('workflow-status-remapping', 'workflow_status_remapping'),
                   'roles', 'title', 'options', ('acl-read', 'acl_read')]
@@ -381,7 +381,7 @@ class FormDefPage(Directory):
         r += htmltext('<li><a href="duplicate">%s</a></li>') % _('Duplicate')
         if ET:
             r += htmltext('<li><a href="export">%s</a></li>') % _('Export')
-        r += htmltext('<li><a href="archive">%s</a></li>') % _('Archive')
+        r += htmltext('<li><a href="anonymise">%s</a></li>') % _('Anonymise')
         if self.formdef.roles:
             r += htmltext('<li><a href="invite">%s</a></li>') % _('Invites')
         r += htmltext('</ul>')
@@ -712,19 +712,11 @@ class FormDefPage(Directory):
                 'attachment; filename=%s.wcs' % self.formdef.url_name)
         return '<?xml version="1.0" encoding="iso-8859-15"?>\n' + ET.tostring(x)
 
-    def archive(self):
-        if get_request().form.get('job'):
-            return self.archive_processing()
-        if get_request().form.get('download'):
-            return self.archive_download()
-
+    def anonymise(self):
         form = Form(enctype='multipart/form-data')
 
-        form.add(DateWidget, 'date', title = _('Archive forms handled before'))
-        form.add(CheckboxWidget, 'not-done', title = _('Include forms that have not been handled'),
-                value = False)
-        form.add(CheckboxWidget, 'keep', title = _('Do not remove forms'),
-                value = False)
+        form.widgets.append(HtmlWidget('<p>%s</p>' % _(
+            "You are about to irrevocably anonymise forms which are closed.")))
         form.add_submit('submit', _('Submit'))
         form.add_submit('cancel', _('Cancel'))
 
@@ -732,106 +724,28 @@ class FormDefPage(Directory):
             return redirect('.')
 
         if not form.is_submitted() or form.has_errors():
-            get_response().breadcrumb.append(('archive', _('Archive')))
-            html_top('forms', title = _('Archive Forms'))
+            get_response().breadcrumb.append(('anonymise', _('Anonymise')))
+            html_top('forms', title = _('Anonymise Forms'))
             r = TemplateIO(html=True)
-            r += htmltext('<h2>%s</h2>') % _('Archive Forms')
+            r += htmltext('<h2>%s</h2>') % _('Anonymise Forms')
             r += form.render()
             return r.getvalue()
         else:
-            return self.archive_submit(form)
+            return self.anonymise_submit(form)
 
-    def archive_submit(self, form):
+    def anonymise_submit(self, form):
 
-        class Archiver:
-            def __init__(self, formdef):
-                self.formdef = formdef
+        all_forms = self.formdef.data_class().select()
 
-            def archive(self, job=None):
-                all_forms = self.formdef.data_class().select()
-
-                if form.get_widget('not-done').parse() is False:
-                    not_endpoint_status = self.formdef.workflow.get_not_endpoint_status()
-                    not_endpoint_status_ids = ['wf-%s' % x.id for x in not_endpoint_status]
-                    all_forms = [x for x in all_forms if x.status not in not_endpoint_status_ids]
-
-                if form.get_widget('date').parse():
-                    date = form.get_widget('date').parse()
-                    date = time.strptime(date, misc.date_format())
-                    all_forms = [x for x in all_forms if (
-                        x.evolution and x.evolution[-1].time < date) or (
-                        x.receipt_time < date)]
-
-                self.fd = StringIO()
-                t = tarfile.open('wcs.tar.gz', 'w:gz', fileobj=self.fd)
-                t.add(self.formdef.get_object_filename(), 'formdef')
-                for formdata in all_forms:
-                    t.add(formdata.get_object_filename(), '%s/%s' % (self.formdef.url_name, str(formdata.id)))
-                t.close()
-
-                if form.get_widget('keep').parse() is False:
-                    for f in all_forms:
-                        f.remove_self()
-
-                if job:
-                    job.file_content = self.fd.getvalue()
-                    job.store()
-
-        count = self.formdef.data_class().count()
-        archiver = Archiver(self.formdef)
-        if count > 100: # Arbitrary threshold
-            job = get_response().add_after_job(
-                str(N_('Archiving forms')),
-                archiver.archive)
-            return redirect('archive?job=%s' % job.id)
-        else:
-            archiver.archive()
+        not_endpoint_status = self.formdef.workflow.get_not_endpoint_status()
+        not_endpoint_status_ids = ['wf-%s' % x.id for x in not_endpoint_status]
+        all_forms = [x for x in all_forms if x.status not in not_endpoint_status_ids]
 
-            response = get_response()
-            response.set_content_type('application/x-wcs-archive')
-            response.set_header('content-disposition',
-                'attachment; filename=%s-archive.wcs' % self.formdef.url_name)
-            return archiver.fd.getvalue()
+        for formdata in all_forms:
+            if not formdata.anonymised:
+                formdata.anonymise()
 
-    def archive_processing(self):
-        try:
-            job = AfterJob.get(get_request().form.get('job'))
-        except KeyError:
-            return redirect('.')
-
-        html_top('forms', title=_('Archiving'))
-        r = TemplateIO(html=True)
-        r += get_session().display_message()
-        get_response().add_javascript(['jquery.js', 'afterjob.js'])
-        r += htmltext('<dl class="job-status">')
-        r += htmltext('<dt>')
-        r += _(job.label)
-        r += htmltext('</dt>')
-        r += htmltext('<dd>')
-        r += htmltext('<span class="afterjob" id="%s">') % job.id
-        r += _(job.status)
-        r += htmltext('</span>')
-        r += htmltext('</dd>')
-        r += htmltext('</dl>')
-
-        r += htmltext('<div class="done">')
-        r += htmltext('<a href="archive?download=%s">%s</a>') % (job.id, _('Download Archive'))
-        r += htmltext('</div>')
-        return r.getvalue()
-
-    def archive_download(self):
-        try:
-            job = AfterJob.get(get_request().form.get('download'))
-        except KeyError:
-            return redirect('.')
-
-        if not job.status == 'completed':
-            raise TraversalError()
-        response = get_response()
-        response.set_content_type('application/x-wcs-archive')
-        response.set_header('content-disposition',
-            'attachment; filename=%s-archive.wcs' % self.formdef.url_name)
-        return job.file_content
+        return redirect('.')
 
     def invite(self):
         if not self.formdef.roles:
diff --git a/wcs/fields.py b/wcs/fields.py
index 1ff779f..7d520ea 100644
--- a/wcs/fields.py
+++ b/wcs/fields.py
@@ -115,6 +115,7 @@ class Field:
     prefill = None
     store_display_value = None
 
+    anonymise = True
     stats = None
 
     def __init__(self, **kwargs):
@@ -547,6 +548,7 @@ class BoolField(WidgetField):
 
     widget_class = CheckboxWidget
     required = False
+    anonymise = False
 
     def perform_more_widget_changes(self, form, kwargs, edit = True):
         if not edit:
@@ -626,6 +628,7 @@ class FileField(WidgetField):
     key = 'file'
     description = N_('File Upload')
 
+    anonymise = False
     widget_class = FileWithPreviewWidget
 
     def get_view_value(self, value):
@@ -757,6 +760,7 @@ class ItemField(WidgetField):
 
     items = []
     show_as_radio = False
+    anonymise = False
     widget_class = SingleSelectHintWidget
     data_source = {}
 
@@ -891,6 +895,7 @@ class ItemsField(WidgetField):
 
     items = []
     max_choices = 0
+    anonymise = False
 
     widget_class = CheckboxesWidget
 
@@ -1099,7 +1104,7 @@ class TableField(WidgetField):
         r.append(' '.join([column.center(max_width) for column in ['/']+self.columns]))
         r.append(' '.join(['='*max_width]*(len(self.columns)+1)))
         for i, row in enumerate(self.rows):
-            r.append(' '.join([cell.center(max_width) for cell in [row] + 
+            r.append(' '.join([cell.center(max_width) for cell in [row] +
                     [value[i][x] for x in range(len(self.columns))]]))
         r.append(' '.join(['='*max_width]*(len(self.columns)+1)))
         return '\n'.join([indent + x for x in r])
@@ -1309,6 +1314,7 @@ class RankedItemsField(WidgetField):
     items = []
     randomize_items = False
     widget_class = RankedItemsWidget
+    anonymise = False
 
     def perform_more_widget_changes(self, form, kwargs, edit = True):
         kwargs['elements'] = self.items or []
diff --git a/wcs/formdata.py b/wcs/formdata.py
index 069f1f0..86c66a2 100644
--- a/wcs/formdata.py
+++ b/wcs/formdata.py
@@ -23,7 +23,7 @@ from quixote import get_request, get_publisher
 from qommon.storage import StorableObject
 import qommon.misc
 from qommon.substitution import Substitutions
-
+from wcs.fields import StringField
 
 def get_dict_with_varnames(fields, data):
     new_data = {}
@@ -130,6 +130,7 @@ class FormData(StorableObject):
     user_hash = None
     receipt_time = None
     status = None
+    anonymised = False
     page_no = None # page to use when restoring from draft
     evolution = None
     data = None
@@ -139,6 +140,7 @@ class FormData(StorableObject):
     workflow_data = None
     workflow_roles = None
 
+
     _formdef = None
     def get_formdef(self):
         if self._formdef:
@@ -438,6 +440,25 @@ class FormData(StorableObject):
 
         return status_action_roles
 
+    def anonymise(self):
+        for field in self.formdef.fields:
+            if field.anonymise:
+                self.data[field.id] = None
+        self.user_id = None
+        self.user_hash = None
+        self.anonymised = True
+        self.editable_by = None
+        self._signature = None
+        self.workflow_data = None
+        self.workflow_roles = None
+
+        for evo in self.evolution:
+            evo.who = None
+            evo.parts = None
+            evo.comment = None
+            evo.parts = None
+        self.store()
+
     def export_to_json(self):
         data = {}
         data['id'] = '%s/%s' % (self.formdef.url_name, self.id)
