Index: main/waeup.sirp/trunk/src/waeup/sirp/widgets/objectwidget.pt
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/widgets/objectwidget.pt	(revision 7705)
+++ main/waeup.sirp/trunk/src/waeup/sirp/widgets/objectwidget.pt	(revision 7795)
@@ -1,5 +1,7 @@
-  <td class="row" tal:repeat="widget context/subwidgets">
-    <span tal:define="error widget/error"
-	  tal:replace="structure error" tal:condition="error" />
-    <span tal:replace="structure widget" />
-  </td>
+  <div class="row">
+    <span tal:repeat="widget context/subwidgets">
+      <span tal:define="error widget/error"
+	    tal:replace="structure error" tal:condition="error" />
+      <span tal:replace="structure widget" />
+    </span>
+  </div>
Index: main/waeup.sirp/trunk/src/waeup/sirp/widgets/objectwidget.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/widgets/objectwidget.py	(revision 7705)
+++ main/waeup.sirp/trunk/src/waeup/sirp/widgets/objectwidget.py	(revision 7795)
@@ -60,4 +60,5 @@
         return SIRPObjectWidgetView(self, request)
 
+
 class SIRPObjectDisplayWidget(SIRPObjectWidget):
 
Index: main/waeup.sirp/trunk/src/waeup/sirp/widgets/sequencewidget.pt
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/widgets/sequencewidget.pt	(revision 7795)
+++ main/waeup.sirp/trunk/src/waeup/sirp/widgets/sequencewidget.pt	(revision 7795)
@@ -0,0 +1,29 @@
+<table border="0" class="sequencewidget"
+  i18n:domain="zope">
+  <tr tal:repeat="widget view/widgets">
+    <td>
+      <input class="editcheck" type="checkbox"
+             tal:attributes="
+                 name string:${view/name}.remove_${repeat/widget/index}"
+             tal:condition="view/need_delete" />
+    </td>
+    <td>
+      <span tal:define="error widget/error"
+            tal:replace="structure error" tal:condition="error" />
+      <input tal:replace="structure widget" />
+    </td>
+  </tr>
+  <tr>
+    <td colspan="2">
+      <input type="submit" value="Remove selected items"
+             tal:condition="view/need_delete"
+             tal:attributes="name string:${view/name}.remove"
+             i18n:attributes="value remove-selected-items" />
+      <input type="submit" value="Add foo"
+             tal:condition="view/need_add"
+             tal:attributes="name string:${view/name}.add;
+                             value view/addButtonLabel" />
+    </td>
+  </tr>
+</table>
+<input tal:replace="structure view/marker" />
Index: main/waeup.sirp/trunk/src/waeup/sirp/widgets/sequencewidget.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/widgets/sequencewidget.py	(revision 7795)
+++ main/waeup.sirp/trunk/src/waeup/sirp/widgets/sequencewidget.py	(revision 7795)
@@ -0,0 +1,43 @@
+## $Id$
+##
+## Copyright (C) 2012 Uli Fouquet & Henrik Bettermann
+## 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
+##
+"""An improved sequence widget.
+
+We provide a sequence widget that better suits our needs layout-wise
+than the default implementation from zope.formlib.
+"""
+import grok
+from zope.browserpage import ViewPageTemplateFile
+from zope.formlib.interfaces import IInputWidget
+from zope.formlib.widgets import ListSequenceWidget
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.schema.interfaces import IField, IList
+
+class SIRPSequenceWidget(ListSequenceWidget):
+    """A sequence widget for lists.
+
+    This is basically a plain copy from zope.formlib. We have,
+    however, the possibility to tweak the attached template.
+    """
+    template = ViewPageTemplateFile('sequencewidget.pt')
+
+
+# Register our sequence widget as default for lists.
+@grok.adapter(IList, IField, IBrowserRequest)
+@grok.implementer(IInputWidget)
+def seq_input_widget(obj, field, req, *args, **kw):
+    return SIRPSequenceWidget(obj, field, req, *args, **kw)
Index: main/waeup.sirp/trunk/src/waeup/sirp/widgets/tests/test_objectwidget.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/widgets/tests/test_objectwidget.py	(revision 7705)
+++ main/waeup.sirp/trunk/src/waeup/sirp/widgets/tests/test_objectwidget.py	(revision 7795)
@@ -21,5 +21,4 @@
 import unittest
 import sys
-from zope.component import testing
 from zope.interface import Interface, implements
 from zope.interface.verify import verifyClass
@@ -45,5 +44,5 @@
     name = TextLine()
     email = TextLine()
-    
+
 class TestContact(object):
     implements(ITestContact)
@@ -51,9 +50,9 @@
 class ITestContent(Interface):
     foo = Object(
-        ITestContact, 
+        ITestContact,
         title = u'Foo Title',
         description = u'',
         )
-    
+
 class ObjectWidgetInputErrorView(object):
     implements(IWidgetInputErrorView)
@@ -82,5 +81,5 @@
         provideAdapter(TextWidget, (ITextLine, IDefaultBrowserLayer),
                        IInputWidget)
-        
+
         class TestObject(object):
             implements(ITestContent)
@@ -120,5 +119,5 @@
         error_html = widget.error()
         if sys.version_info < (2, 5):
-            self.assertTrue("email: <zope.formlib.interfaces.Mis" 
+            self.assertTrue("email: <zope.formlib.interfaces.Mis"
                              in error_html)
             self.assertTrue("name: <zope.formlib.interfaces.Miss"
@@ -161,6 +160,6 @@
         widget1, widget2 = widget.subwidgets()
         self.assertTrue(widget1 is name_widget)
-        
-        
+
+
 class ObjectDisplayWidgetTest(BrowserWidgetTest):
     """Documents and tests the display variant of object widget.
@@ -184,5 +183,5 @@
         # adapter that can turn nearly any object into an ITraversable.
         provideAdapter(DefaultTraversable, (None,), ITraversable)
-        
+
         class TestObject(object):
             implements(ITestContent)
@@ -206,7 +205,6 @@
                        IDisplayWidget)
 
-        
+
     def test_interfaces(self):
-        from zope.interface.verify import DoesNotImplement
         self.assertTrue(IDisplayWidget.providedBy(self._widget))
         self.assertFalse(IInputWidget.providedBy(self._widget))
@@ -219,10 +217,11 @@
 
         check_list = [
-            '<td', 'class=', 'row',
+            '<div', 'class=', 'row',
+            '<span',
             'Foo Name',
-            '</td>', '<td', 'class=', 'row',
+            '</span>', '<span',
             'foo@foo.test',
-            '</td>']
-        self.verifyResult(widget(), check_list, inorder=True)    
+            '</div>']
+        self.verifyResult(widget(), check_list, inorder=True)
 
 def test_suite():
