diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/GenericConstants.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/GenericConstants.java
index 1e3025c0832f6861add0219916616497a8d58d02..b71e52a13cd9aeaf675f663a8fa00d60b9c5c884 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/GenericConstants.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/GenericConstants.java
@@ -19,10 +19,17 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 import com.google.gwt.core.client.GWT;
 
 /**
+ * Some generic constants.
+ * 
  * @author Franz-Josef Elmer
  */
-public class GenericConstants
+public final class GenericConstants
 {
+    private GenericConstants()
+    {
+        // Can not be instantiated.
+    }
+
     /**
      * Prefix all widget IDs have to start with.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ISampleViewClientPlugin.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ISampleViewClientPlugin.java
index 625d329247a32cab2943bd709d1799c28c60e617..2d2e4dbeaf829c307ab1db2b6958814b8edf4033 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ISampleViewClientPlugin.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ISampleViewClientPlugin.java
@@ -35,7 +35,12 @@ public interface ISampleViewClientPlugin
     public ITabItem createSampleViewer(final String sampleIdentifier);
 
     /**
-     * Shows a registration form for samples of type <var>sampleTypeCode</var>.
+     * Shows a registration form for samples of given <var>sampleType</var>.
      */
-    public Widget createRegistrationClientForSampleType(SampleType sampleTypeCode);
+    public Widget createRegistrationForSampleType(final SampleType sampleType);
+
+    /**
+     * Shows a batch registration form for samples of given <var>sampleType</var>.
+     */
+    public Widget createBatchRegistrationForSampleType(final SampleType sampleType);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
index 755894ac2de0f853783327b0577877f97b3e8d6c..3bda86ea03699d0a09e44414e8b9fdff7207e774 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
@@ -20,7 +20,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.CommonView
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GroupsView;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.PersonsView;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.RolesView;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.SampleBatchRegistrationMock;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.SampleBatchRegistrationPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.SampleRegistrationPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment_browser.ExperimentBrowser;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample_browser.SampleBrowser;
@@ -47,7 +47,7 @@ final class ComponentProvider
 
     private final SampleRegistrationPanel sampleRegistration;
 
-    private final SampleBatchRegistrationMock sampleBatchRegistration;
+    private final SampleBatchRegistrationPanel sampleBatchRegistration;
 
     private final ExperimentBrowser experimentBrowser;
 
@@ -59,7 +59,7 @@ final class ComponentProvider
         rolesView = new RolesView(viewContext);
         personsView = new PersonsView(viewContext);
         sampleRegistration = new SampleRegistrationPanel(viewContext);
-        sampleBatchRegistration = new SampleBatchRegistrationMock(viewContext);
+        sampleBatchRegistration = new SampleBatchRegistrationPanel(viewContext);
         experimentBrowser = new ExperimentBrowser(viewContext);
     }
 
@@ -90,12 +90,12 @@ final class ComponentProvider
 
     public final ITabItem getSampleRegistration()
     {
-        return new ContentPanelAdapter(sampleRegistration);
+        return new DefaultTabItem("Sample registration", sampleRegistration);
     }
 
-    public ITabItem getSampleBatchRegistration()
+    public final ITabItem getSampleBatchRegistration()
     {
-        return new ContentPanelAdapter(sampleBatchRegistration);
+        return new DefaultTabItem("Sample batch registration", sampleBatchRegistration);
     }
 
     public ITabItem getExperimentBrowser()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ContentPanelAdapter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ContentPanelAdapter.java
index 5cc3a111b7922ea06da2dcdd215e8957df403976..c7dd0b33b0ab42620d0cd21f694c88240a26efbc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ContentPanelAdapter.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ContentPanelAdapter.java
@@ -22,6 +22,8 @@ import com.extjs.gxt.ui.client.widget.Component;
 import com.extjs.gxt.ui.client.widget.ContentPanel;
 import com.extjs.gxt.ui.client.widget.Header;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
+
 /**
  * A {@link ITabItem} implementation to adapt a {@link ContentPanel}.
  * 
@@ -41,6 +43,9 @@ public final class ContentPanelAdapter implements ITabItem
     public ContentPanelAdapter(final ContentPanel contentPanel,
             final Listener<TabPanelEvent> tabPanelEventListener)
     {
+        // Note that if not set, is then automatically generated. So this is why we test for
+        // 'ID_PREFIX'. We want the user to set an unique id.
+        assert contentPanel.getId().startsWith(GenericConstants.ID_PREFIX) : "Unspecified component id.";
         this.contentPanel = contentPanel;
         this.tabPanelEventListener = tabPanelEventListener;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SampleBatchRegistrationMock.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SampleBatchRegistrationMock.java
deleted file mode 100644
index b21c921001f92f1865cff85fb6eb6cdcc80812d3..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SampleBatchRegistrationMock.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright 2008 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui;
-
-import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
-import com.extjs.gxt.ui.client.data.ModelData;
-import com.extjs.gxt.ui.client.event.ComponentEvent;
-import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
-import com.extjs.gxt.ui.client.event.SelectionChangedListener;
-import com.extjs.gxt.ui.client.event.SelectionListener;
-import com.extjs.gxt.ui.client.widget.ContentPanel;
-import com.extjs.gxt.ui.client.widget.MessageBox;
-import com.extjs.gxt.ui.client.widget.button.Button;
-import com.extjs.gxt.ui.client.widget.button.ButtonBar;
-import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem;
-import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem;
-import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
-import com.google.gwt.user.client.Element;
-import com.google.gwt.user.client.ui.FileUpload;
-
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.CommonViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample_browser.SampleTypeSelectionWidget;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleType;
-
-/**
- * @author Izabela Adamczyk
- */
-public class SampleBatchRegistrationMock extends ContentPanel
-{
-
-    private final SampleTypeSelectionWidget sampleTypeSelection;
-
-    public SampleBatchRegistrationMock(final CommonViewContext viewContext)
-    {
-        setHeading("Sample batch registration mock");
-        setBodyBorder(false);
-        sampleTypeSelection =
-                new SampleTypeSelectionWidget(viewContext, true, "sample-batch-registration");
-        sampleTypeSelection.addSelectionChangedListener(new SelectionChangedListener<ModelData>()
-            {
-                @Override
-                public void selectionChanged(final SelectionChangedEvent<ModelData> se)
-                {
-                    final SampleType selectedType = sampleTypeSelection.tryGetSelected();
-                    if (selectedType != null)
-                    {
-                        removeAll();
-                        add(new SampleBatchRegistrationForm(viewContext, selectedType));
-                        layout();
-                    }
-                }
-            });
-        final ToolBar toolBar = new ToolBar();
-        toolBar.add(new LabelToolItem("Sample type:"));
-        toolBar.add(new AdapterToolItem(sampleTypeSelection));
-        setTopComponent(toolBar);
-    }
-
-    @Override
-    protected void onRender(final Element parent, final int pos)
-    {
-        super.onRender(parent, pos);
-        createUI();
-    }
-
-    void createUI()
-    {
-
-    }
-
-    static class SampleBatchRegistrationForm extends ContentPanel
-    {
-
-        SampleBatchRegistrationForm(final CommonViewContext viewContext, final SampleType sampleType)
-        {
-            setStyleAttribute("margin", "30");
-            setHeaderVisible(false);
-            setBodyBorder(false);
-            setButtonAlign(HorizontalAlignment.LEFT);
-            final ButtonBar bb = new ButtonBar();
-            bb.setCellSpacing(20);
-
-            bb.add(new Button("View & Register", new SelectionListener<ComponentEvent>()
-                {
-
-                    @Override
-                    public void componentSelected(final ComponentEvent ce)
-                    {
-                        MessageBox
-                                .alert(
-                                        "Samples to be registered",
-                                        "List of samples which will be registered and REGISTER button (or parsing error message) will be shown.",
-                                        null);
-                    }
-                }));
-
-            bb.add(new Button("Register", new SelectionListener<ComponentEvent>()
-                {
-
-                    @Override
-                    public void componentSelected(final ComponentEvent ce)
-                    {
-                        MessageBox.alert("Registration finished",
-                                "List of registered samples is displayed or error message", null);
-                    }
-                }));
-            setButtonBar(bb);
-
-        }
-
-        @Override
-        protected void onRender(final Element target, final int index)
-        {
-            super.onRender(target, index);
-            refresh();
-        }
-
-        public void refresh()
-        {
-
-            final FileUpload upload = new FileUpload();
-            add(upload);
-
-        }
-    }
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SampleBatchRegistrationPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SampleBatchRegistrationPanel.java
new file mode 100644
index 0000000000000000000000000000000000000000..a14a11ddb8b1aafbd97e59e71eb328e68b080f4f
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SampleBatchRegistrationPanel.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2008 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui;
+
+import com.extjs.gxt.ui.client.Style.Scroll;
+import com.extjs.gxt.ui.client.data.ModelData;
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.CommonViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample_browser.SampleTypeSelectionWidget;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleType;
+
+/**
+ * The {@link LayoutContainer} extension for batch registering a sample.
+ * 
+ * @author Christian Ribeaud
+ */
+public final class SampleBatchRegistrationPanel extends LayoutContainer
+{
+    private static final String ID = "sample-batch-registration";
+
+    private final SampleTypeSelectionWidget sampleTypeSelection;
+
+    public SampleBatchRegistrationPanel(final CommonViewContext viewContext)
+    {
+        setId(GenericConstants.ID_PREFIX + ID);
+        setScrollMode(Scroll.AUTO);
+        sampleTypeSelection = new SampleTypeSelectionWidget(viewContext, true, ID);
+        final ToolBar toolBar = createToolBar();
+        add(toolBar);
+        sampleTypeSelection.addSelectionChangedListener(new SelectionChangedListener<ModelData>()
+            {
+
+                //
+                // SelectionChangedListener
+                //
+
+                @Override
+                public final void selectionChanged(final SelectionChangedEvent<ModelData> se)
+                {
+                    final SampleType sampleType = sampleTypeSelection.tryGetSelected();
+                    if (sampleType != null)
+                    {
+                        removeAll();
+                        add(toolBar);
+                        add(viewContext.getClientPluginFactoryProvider().getClientPluginFactory(
+                                sampleType.getCode()).createViewClientForSampleType(
+                                sampleType.getCode()).createBatchRegistrationForSampleType(
+                                sampleType));
+                        layout();
+                    }
+                }
+            });
+    }
+
+    private final ToolBar createToolBar()
+    {
+        final ToolBar toolBar = new ToolBar();
+        toolBar.add(new LabelToolItem("Sample type:"));
+        toolBar.add(new AdapterToolItem(sampleTypeSelection));
+        return toolBar;
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SampleRegistrationPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SampleRegistrationPanel.java
index 773944ebefeb3dbf2c279c52750133d03c1090c2..0c1770e432326cd73d43d49a3fa1b5791da400a2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SampleRegistrationPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SampleRegistrationPanel.java
@@ -20,31 +20,30 @@ import com.extjs.gxt.ui.client.Style.Scroll;
 import com.extjs.gxt.ui.client.data.ModelData;
 import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
 import com.extjs.gxt.ui.client.event.SelectionChangedListener;
-import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
 import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem;
 import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem;
 import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
-import com.google.gwt.user.client.Element;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.CommonViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample_browser.SampleTypeSelectionWidget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleType;
 
 /**
+ * The {@link LayoutContainer} extension for registering a sample.
+ * 
  * @author Izabela Adamczyk
  */
-public class SampleRegistrationPanel extends ContentPanel
+public final class SampleRegistrationPanel extends LayoutContainer
 {
-
     private final SampleTypeSelectionWidget sampleTypeSelection;
 
     public static final String ID = "sample-registration";
 
     public SampleRegistrationPanel(final CommonViewContext viewContext)
     {
-        setHeading("Sample registration");
-        setHeaderVisible(false);
-        setBodyBorder(false);
+        setId(GenericConstants.ID_PREFIX + ID);
         setScrollMode(Scroll.AUTO);
         sampleTypeSelection = new SampleTypeSelectionWidget(viewContext, true, ID);
         final ToolBar toolBar = new ToolBar();
@@ -53,6 +52,11 @@ public class SampleRegistrationPanel extends ContentPanel
         add(toolBar);
         sampleTypeSelection.addSelectionChangedListener(new SelectionChangedListener<ModelData>()
             {
+
+                //
+                // SelectionChangedListener
+                //
+
                 @Override
                 public void selectionChanged(final SelectionChangedEvent<ModelData> se)
                 {
@@ -63,23 +67,11 @@ public class SampleRegistrationPanel extends ContentPanel
                         add(toolBar);
                         add(viewContext.getClientPluginFactoryProvider().getClientPluginFactory(
                                 selectedType.getCode()).createViewClientForSampleType(
-                                selectedType.getCode()).createRegistrationClientForSampleType(
+                                selectedType.getCode()).createRegistrationForSampleType(
                                 selectedType));
                         layout();
                     }
                 }
             });
     }
-
-    @Override
-    protected void onRender(final Element parent, final int pos)
-    {
-        super.onRender(parent, pos);
-        createUI();
-    }
-
-    void createUI()
-    {
-
-    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java
index 2a913c62566a475b05b3b12443898d5192a9e2e5..68cef5113a196a88022d1e63a0e6917a2faf6775 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java
@@ -29,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleType;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
+import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.GenericSampleBatchRegistrationForm;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.GenericSampleRegistrationForm;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.GenericSampleViewer;
 
@@ -107,9 +108,15 @@ public final class ClientPluginFactory extends
                 };
         }
 
-        public Widget createRegistrationClientForSampleType(SampleType sampleType)
+        public final Widget createRegistrationForSampleType(final SampleType sampleType)
         {
             return new GenericSampleRegistrationForm(getViewContext(), sampleType);
         }
+
+        public final Widget createBatchRegistrationForSampleType(final SampleType sampleType)
+        {
+            return new GenericSampleBatchRegistrationForm(getViewContext(), sampleType);
+        }
+
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleBatchRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleBatchRegistrationForm.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd504e5f3d098625df8786cb2259b95fbcaf68db
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleBatchRegistrationForm.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2008 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample;
+
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.util.Format;
+import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FileUploadField;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.FormPanel.Encoding;
+import com.extjs.gxt.ui.client.widget.form.FormPanel.Method;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.extjs.gxt.ui.client.widget.layout.TableLayout;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleType;
+import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
+
+/**
+ * The <i>generic</i> sample batch registration panel.
+ * 
+ * @author Christian Ribeaud
+ */
+public final class GenericSampleBatchRegistrationForm extends LayoutContainer
+{
+    private static final String FIELD_LABEL_TEMPLATE = "File {0}";
+
+    private static final String FIELD_NAME_TEMPLATE = "sample_batch_registration_{0}";
+
+    private static final int NUMBER_OF_FIELDS = 1;
+
+    private final IViewContext<IGenericClientServiceAsync> viewContext;
+
+    private final SampleType sampleType;
+
+    private FormPanel formPanel;
+
+    private Button submitButton;
+
+    public GenericSampleBatchRegistrationForm(
+            final IViewContext<IGenericClientServiceAsync> viewContext, final SampleType sampleType)
+    {
+        super(createLayout());
+        this.viewContext = viewContext;
+        this.sampleType = sampleType;
+        add(createUI());
+    }
+
+    private final static TableLayout createLayout()
+    {
+        final TableLayout tableLayout = new TableLayout();
+        tableLayout.setCellSpacing(10);
+        return tableLayout;
+    }
+
+    private final Component createUI()
+    {
+        submitButton = createButton();
+        formPanel = createFormPanel(submitButton);
+        final FieldSet fieldSet = createFieldSet();
+        for (int i = 0; i < NUMBER_OF_FIELDS; i++)
+        {
+            fieldSet.add(createFileUploadField(i));
+        }
+        formPanel.add(fieldSet);
+        return formPanel;
+    }
+
+    private final static FieldSet createFieldSet()
+    {
+        final FieldSet fieldSet = new FieldSet();
+        fieldSet.setHeading("Upload files");
+        fieldSet.setLayout(createFormLayout());
+        return fieldSet;
+    }
+
+    private final static FormLayout createFormLayout()
+    {
+        final FormLayout formLayout = new FormLayout();
+        formLayout.setLabelWidth(GenericSampleRegistrationForm.LABEL_WIDTH);
+        formLayout.setDefaultWidth(GenericSampleRegistrationForm.FIELD_WIDTH);
+        return formLayout;
+    }
+
+    private final static FormPanel createFormPanel(final Button button)
+    {
+        final FormPanel panel = new FormPanel();
+        panel.setLayout(new FlowLayout());
+        panel.setWidth(GenericSampleRegistrationForm.LABEL_WIDTH
+                + GenericSampleRegistrationForm.FIELD_WIDTH + 50);
+        panel.setHeaderVisible(false);
+        panel.setBodyBorder(false);
+        panel.setAction(GenericConstants.createServicePath("upload"));
+        panel.setEncoding(Encoding.MULTIPART);
+        panel.setMethod(Method.POST);
+        panel.setButtonAlign(HorizontalAlignment.RIGHT);
+        panel.addButton(button);
+        return panel;
+    }
+
+    private final Button createButton()
+    {
+        final Button button =
+                new Button(viewContext.getMessageProvider().getMessage("button_submit"));
+        button.addSelectionListener(new SelectionListener<ButtonEvent>()
+            {
+
+                //
+                // SelectionListener
+                //
+
+                @Override
+                public final void componentSelected(final ButtonEvent ce)
+                {
+                    if (formPanel.isValid())
+                    {
+                        submitButton.setEnabled(false);
+                        formPanel.submit();
+                    }
+                }
+            });
+        return button;
+    }
+
+    private final static FileUploadField createFileUploadField(final int counter)
+    {
+        final FileUploadField file = new FileUploadField();
+        file.setAllowBlank(counter > 0);
+        final int number = counter + 1;
+        file.setFieldLabel(Format.substitute(FIELD_LABEL_TEMPLATE, number));
+        file.setName(Format.substitute(FIELD_NAME_TEMPLATE, number));
+        return file;
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java
index 8a94693c19fbc85091704ef21d26a37084e4798c..fc5c6326ec9b2d28c4fd7843668164b832684f65 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java
@@ -102,9 +102,9 @@ public final class GenericSampleRegistrationForm extends FormPanel
 
     private static final String MANDATORY_LABEL_SEPARATOR = ": *";
 
-    private static final int LABEL_WIDTH = 150;
+    static final int LABEL_WIDTH = 100;
 
-    private static final int FIELD_WIDTH = 400;
+    static final int FIELD_WIDTH = 400;
 
     public GenericSampleRegistrationForm(
             final IViewContext<IGenericClientServiceAsync> viewContext, final SampleType sampleType)
@@ -204,6 +204,7 @@ public final class GenericSampleRegistrationForm extends FormPanel
         setButtonAlign(HorizontalAlignment.RIGHT);
         final Button saveButton =
                 new Button(viewContext.getMessageProvider().getMessage("button_save"));
+        saveButton.setStyleAttribute("marginRight", "20px");
         saveButton.setId(SAVE_BUTTON_ID);
         saveButton.addSelectionListener(new SelectionListener<ComponentEvent>()
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java
index 773ae23260809ae70da68407754d46d6be4ab630..fb5c87755c242dddb93742823f8d33c83b2787cf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java
@@ -110,7 +110,12 @@ public final class ClientPluginFactory extends
                 };
         }
 
-        public Widget createRegistrationClientForSampleType(final SampleType sampleTypeCode)
+        public final Widget createRegistrationForSampleType(final SampleType sampleTypeCode)
+        {
+            return new DummyComponent();
+        }
+
+        public final Widget createBatchRegistrationForSampleType(SampleType sampleType)
         {
             return new DummyComponent();
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
index eaaf950e68d89d2ace5f9937dc142104e8e79bc6..b933728773d1e01781c52f37228b73af41a1e0dd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
@@ -26,6 +26,7 @@ var common = {
   //
   
   button_save: "save",
+  button_submit: "submit",
   
   //
   // LoginWidget