diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/ExcelFileSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/ExcelFileSection.java
index 1f81c132aa134034f6395e1a1e343319a81ebc22..9e9c052d2f8fd6b00f989620ab65c4c1d0fc3e7a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/ExcelFileSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/ExcelFileSection.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.shared.parser;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.commons.io.IOUtils;
@@ -104,77 +105,115 @@ public class ExcelFileSection
         }
     }
 
+    public static List<ExcelFileSection> extractSectionsFromWorkBook(Workbook wb,
+            String excelSheetName)
+    {
+        LinkedList<ExcelFileSection> sections = new LinkedList<ExcelFileSection>();
+        List<ExcelFileSection> defaultSheetSections = null;
+
+        Sheet sheet = null;
+        String prefix = excelSheetName + "-";
+        for (int i = 0; i < wb.getNumberOfSheets(); i++)
+        {
+            String sheetName = wb.getSheetName(i);
+            if (excelSheetName.equalsIgnoreCase(sheetName))
+            {
+                sheet = wb.getSheetAt(i);
+                defaultSheetSections = extractSectionsFromDefaultSheet(sheet);
+            } else if (sheetName.startsWith(prefix))
+            {
+                String sectionName = sheetName.substring(prefix.length());
+                sheet = wb.getSheetAt(i);
+                if (SECTION_FILE_DEFAULT.equalsIgnoreCase(sectionName))
+                {
+                    sections.addFirst(new ExcelFileSection(sheet, sectionName, 0, sheet
+                            .getLastRowNum()));
+                } else
+                {
+                    sections.add(new ExcelFileSection(sheet, sectionName, 0, sheet.getLastRowNum()));
+                }
+            }
+        }
+
+        // default sheet sections must be at the end of the file
+        if (defaultSheetSections != null)
+        {
+            sections.addAll(defaultSheetSections);
+        }
+
+        return sections;
+    }
+
     public static List<ExcelFileSection> extractSections(InputStream stream, String excelSheetName,
             String fileName)
     {
-        List<ExcelFileSection> sections = new ArrayList<ExcelFileSection>();
         try
         {
             Workbook wb = getWorkBook(stream, fileName);
 
-            Sheet sheet = null;
             if (excelSheetName == null)
             {
-                sheet = wb.getSheetAt(0);
+                return extractSectionsFromDefaultSheet(wb.getSheetAt(0));
             } else
             {
-                for (int i = 0; i < wb.getNumberOfSheets(); i++)
-                {
-                    if (excelSheetName.equalsIgnoreCase(wb.getSheetName(i)))
-                    {
-                        sheet = wb.getSheetAt(i);
-                        break;
-                    }
-                }
-                if (sheet == null)
-                {
-                    return sections;
-                }
+                return extractSectionsFromWorkBook(wb, excelSheetName);
             }
-            String sectionName = null;
-            Integer begin = null;
-            for (Row row : sheet)
+        } catch (IOException e)
+        {
+            throw new IOExceptionUnchecked(e);
+        } finally
+        {
+            IOUtils.closeQuietly(stream);
+        }
+    }
+
+    private static final List<ExcelFileSection> extractSectionsFromDefaultSheet(Sheet sheet)
+    {
+        List<ExcelFileSection> sections = new ArrayList<ExcelFileSection>();
+
+        if (sheet == null)
+        {
+            return sections;
+        }
+
+        String sectionName = null;
+        Integer begin = null;
+        for (Row row : sheet)
+        {
+            String newSectionName = tryGetSectionName(row);
+            if (newSectionName != null)
             {
-                String newSectionName = tryGetSectionName(row);
-                if (newSectionName != null)
+                if (sectionName != null && begin != null)
                 {
-                    if (sectionName != null && begin != null)
+                    if (sectionName.equals(newSectionName))
                     {
-                        if (sectionName.equals(newSectionName))
-                        {
-                            continue;
-                        }
-                        if (newSectionName.equals(SECTION_FILE_DEFAULT))
-                        {
-                            continue;
-                        } else
-                        {
-                            sections.add(new ExcelFileSection(sheet, sectionName, begin, row
-                                    .getRowNum() - 1));
-                            sectionName = newSectionName;
-                            begin = row.getRowNum() + 1;
-                        }
+                        continue;
+                    }
+                    if (newSectionName.equals(SECTION_FILE_DEFAULT))
+                    {
+                        continue;
                     } else
                     {
+                        sections.add(new ExcelFileSection(sheet, sectionName, begin, row
+                                .getRowNum() - 1));
                         sectionName = newSectionName;
                         begin = row.getRowNum() + 1;
                     }
-                } else if (sectionName == null || begin == null)
-                {
-                    throw new UserFailureException("Discovered the unnamed section in the file");
-                }
-                if (row.getRowNum() == sheet.getLastRowNum())
+                } else
                 {
-                    sections.add(new ExcelFileSection(sheet, sectionName, begin, row.getRowNum()));
+                    sectionName = newSectionName;
+                    begin = row.getRowNum() + 1;
                 }
+            } else if (sectionName == null || begin == null)
+            {
+                throw new UserFailureException("Discovered the unnamed section in the file");
+            }
+            if (row.getRowNum() == sheet.getLastRowNum())
+            {
+                sections.add(new ExcelFileSection(sheet, sectionName, begin, row.getRowNum()));
             }
-        } catch (IOException e)
-        {
-            throw new IOExceptionUnchecked(e);
-        } finally
-        {
-            IOUtils.closeQuietly(stream);
         }
+
         return sections;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/SampleUploadSectionsParser.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/SampleUploadSectionsParser.java
index 66f5ed50f856a07f108e9e2e6e959b2e0d9dfdcb..cc1c99a61e084191d063df10bdcefd7cb3ad6d4a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/SampleUploadSectionsParser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/SampleUploadSectionsParser.java
@@ -19,7 +19,7 @@ package ch.systemsx.cisd.openbis.generic.shared.parser;
 import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -206,14 +206,13 @@ public class SampleUploadSectionsParser
                             multipartFile.getInputStream(), sampleType.getCode(), loweredFileName));
                 }
                 int sampleCounter = 0;
-                Map<String, String> defaults = Collections.emptyMap();
+                Map<String, String> defaults = new HashMap<String, String>();
                 for (ExcelFileSection fs : sampleSections)
                 {
                     if (fs.getSectionName().equals("DEFAULT"))
                     {
-                        defaults =
-                                Collections.unmodifiableMap(ExcelFileLoader.parseDefaults(
-                                        fs.getSheet(), fs.getBegin(), fs.getEnd()));
+                        defaults.putAll(ExcelFileLoader.parseDefaults(fs.getSheet(), fs.getBegin(),
+                                fs.getEnd()));
                     } else
                     {
                         SampleType typeFromSection = new SampleType();
@@ -250,14 +249,12 @@ public class SampleUploadSectionsParser
                             multipartFile.getInputStream(), sampleType.getCode()));
                 }
                 int sampleCounter = 0;
-                Map<String, String> defaults = Collections.emptyMap();
+                Map<String, String> defaults = new HashMap<String, String>();
                 for (FileSection fs : sampleSections)
                 {
                     if (fs.getSectionName().equals("DEFAULT"))
                     {
-                        defaults =
-                                Collections.unmodifiableMap(TabFileLoader.parseDefaults(fs
-                                        .getContentReader()));
+                        defaults.putAll(TabFileLoader.parseDefaults(fs.getContentReader()));
                     } else
                     {
                         Reader reader = fs.getContentReader();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/parser/MaterialUploadSectionsParser.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/parser/MaterialUploadSectionsParser.java
index ad0acf361cce12c6cae5501f91519f0a9775ea6a..7008fe4b90d1ffc92d865c0cfd5812a5eb3bbfdb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/parser/MaterialUploadSectionsParser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/parser/MaterialUploadSectionsParser.java
@@ -19,7 +19,7 @@ package ch.systemsx.cisd.openbis.plugin.generic.client.web.server.parser;
 import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -126,14 +126,13 @@ public class MaterialUploadSectionsParser
                                     loweredFileName));
                 }
                 int materialCounter = 0;
-                Map<String, String> defaults = Collections.emptyMap();
+                Map<String, String> defaults = new HashMap<String, String>();
                 for (ExcelFileSection fs : materialSections)
                 {
                     if (fs.getSectionName().equals("DEFAULT"))
                     {
-                        defaults =
-                                Collections.unmodifiableMap(ExcelFileLoader.parseDefaults(
-                                        fs.getSheet(), fs.getBegin(), fs.getEnd()));
+                        defaults.putAll(ExcelFileLoader.parseDefaults(fs.getSheet(), fs.getBegin(),
+                                fs.getEnd()));
                     } else
                     {
                         MaterialType typeFromSection = new MaterialType();
@@ -180,14 +179,12 @@ public class MaterialUploadSectionsParser
                             multipartFile.getInputStream(), materialType.getCode()));
                 }
                 int materialCounter = 0;
-                Map<String, String> defaults = Collections.emptyMap();
+                Map<String, String> defaults = new HashMap<String, String>();
                 for (FileSection fs : materialSections)
                 {
                     if (fs.getSectionName().equals("DEFAULT"))
                     {
-                        defaults =
-                                Collections.unmodifiableMap(TabFileLoader.parseDefaults(fs
-                                        .getContentReader()));
+                        defaults.putAll(TabFileLoader.parseDefaults(fs.getContentReader()));
                     } else
                     {
                         Reader reader = fs.getContentReader();