diff --git a/common/source/java/ch/systemsx/cisd/common/parser/IndexOutOfBoundsException.java b/common/source/java/ch/systemsx/cisd/common/parser/IndexOutOfBoundsException.java
index 5f615b245a461991be80044ed5afe7383b7b35b5..ea0c295e7e451e4c5be8c352f42069c2ff746d5c 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/IndexOutOfBoundsException.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/IndexOutOfBoundsException.java
@@ -32,16 +32,17 @@ public final class IndexOutOfBoundsException extends ParserException
 
     private final String[] lineTokens;
 
-    IndexOutOfBoundsException(final int column, final String[] lineTokens)
+    public IndexOutOfBoundsException(final int index, final String[] lineTokens)
     {
-        super(createMessage(column, lineTokens));
-        this.column = column;
+        super(createMessage(index, lineTokens));
+        this.column = index;
         this.lineTokens = lineTokens;
     }
 
     private final static String createMessage(final int index, final String[] lineTokens)
     {
         assert lineTokens != null : "Line tokens can not be null.";
+        assert index >= lineTokens.length : "Index must be out of range (otherwise no reason to call this exception).";
         return String.format(MESSAGE_FORMAT, index, lineTokens.length);
     }
 
diff --git a/common/source/java/ch/systemsx/cisd/common/parser/MandatoryPropertyMissingException.java b/common/source/java/ch/systemsx/cisd/common/parser/MandatoryPropertyMissingException.java
index 0b132316592f588b9f06af2b60e6f3fe3b5cb16a..c9042342c27ee4ae38681d3c8b3146f37a8fb5ba 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/MandatoryPropertyMissingException.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/MandatoryPropertyMissingException.java
@@ -40,9 +40,11 @@ public final class MandatoryPropertyMissingException extends ParserException
     /** The fields that are mandatory. */
     private final Set<String> mandatoryFields;
 
-    MandatoryPropertyMissingException(final Set<String> mandatoryFields, final Set<String> missingMandatoryProperties)
+    public MandatoryPropertyMissingException(final Set<String> mandatoryFields,
+            final Set<String> missingMandatoryProperties)
     {
         super(createMessage(missingMandatoryProperties));
+        assert mandatoryFields != null && mandatoryFields.size() > 0 : "Unspecified mandatory fields.";
         this.mandatoryFields = mandatoryFields;
         this.missingMandatoryProperties = missingMandatoryProperties;
     }
@@ -50,6 +52,7 @@ public final class MandatoryPropertyMissingException extends ParserException
     private final static String createMessage(final Set<String> missingMandatoryProperties)
     {
         assert missingMandatoryProperties != null : "Missing mandatory properties can not be null.";
+        assert missingMandatoryProperties.size() > 0 : "No reason to throw this exception.";
         return String.format(MESSAGE_FORMAT, toString(missingMandatoryProperties));
     }
 
@@ -60,7 +63,7 @@ public final class MandatoryPropertyMissingException extends ParserException
 
     public final Set<String> getMissingMandatoryProperties()
     {
-        return missingMandatoryProperties;
+        return Collections.unmodifiableSet(missingMandatoryProperties);
     }
 
     public final Set<String> getMandatoryFields()
diff --git a/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java b/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java
index e0d24ba110664a8fabcd0a9791d931b1e6c11774..6670c82c7424585efc9bcc928bd7a6a090269708 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java
@@ -110,7 +110,7 @@ public class TabFileLoader<T>
         }
     }
 
-    List<T> load(final Reader reader)
+    final List<T> load(final Reader reader)
     {
         final List<T> result = new ArrayList<T>();
         final Iterator<Line> lineIterator = createLineIterator(reader);
diff --git a/common/source/java/ch/systemsx/cisd/common/parser/UnmatchedPropertiesException.java b/common/source/java/ch/systemsx/cisd/common/parser/UnmatchedPropertiesException.java
index 9281902d4949ea564c439f7164527c6f468b3cee..dbd09511271b8a266de7e1dd8589eac345b71e20 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/UnmatchedPropertiesException.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/UnmatchedPropertiesException.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.common.parser;
 
+import java.util.Collections;
 import java.util.Set;
 
 /**
@@ -48,7 +49,7 @@ public final class UnmatchedPropertiesException extends ParserException
      */
     private final Set<String> propertyNames;
 
-    UnmatchedPropertiesException(final Class<?> beanClass, final Set<String> allPropertyNames,
+    public UnmatchedPropertiesException(final Class<?> beanClass, final Set<String> allPropertyNames,
             final Set<String> mandatoryNames, final Set<String> optionalNames, final Set<String> propertyNames)
     {
         super(createMessage(beanClass, propertyNames));
@@ -78,22 +79,22 @@ public final class UnmatchedPropertiesException extends ParserException
 
     public final Set<String> getAllPropertyNames()
     {
-        return allPropertyNames;
+        return Collections.unmodifiableSet(allPropertyNames);
     }
 
     public final Set<String> getPropertyNames()
     {
-        return propertyNames;
+        return Collections.unmodifiableSet(propertyNames);
     }
 
     public final Set<String> getMandatoryNames()
     {
-        return mandatoryNames;
+        return Collections.unmodifiableSet(mandatoryNames);
     }
 
     public final Set<String> getOptionalNames()
     {
-        return optionalNames;
+        return Collections.unmodifiableSet(optionalNames);
     }
 
 }
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java
index c34239fdcd8aa5aed527a4fbf3ae71c8487aabe6..3b29c1c185780f90afded53428318fcba80199b6 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java
@@ -68,7 +68,7 @@ public final class AbstractParserObjectFactoryTest
             fail("Following properties '[isnotin]' are not part of 'Bean'.");
         } catch (UnmatchedPropertiesException ex)
         {
-            assertEquals(String.format(UnmatchedPropertiesException.MESSAGE_FORMAT, "Bean", "IsNotIn"), ex.getMessage());
+            assertEquals("Following header columns are not part of 'Bean': IsNotIn", ex.getMessage());
         }
     }
 
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/parser/TabFileLoaderTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/parser/TabFileLoaderTest.java
index 43cbcaa28720d97b4bc760c1a820a1c9a98992e1..0e8cdd13512da22e0438860c8db87e2a9dd0ac64 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/parser/TabFileLoaderTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/parser/TabFileLoaderTest.java
@@ -24,56 +24,80 @@ import java.util.List;
 import org.testng.annotations.Test;
 
 /**
+ * Test cases for corresponding {@link TabFileLoader} class.
  * 
- *
  * @author Franz-Josef Elmer
  */
-public class TabFileLoaderTest
+public final class TabFileLoaderTest
 {
     public static final class ABC
     {
         private String a;
+
         private String b;
+
         private String c;
+
         public final String getA()
         {
             return a;
         }
+
         public final void setA(String a)
         {
             this.a = a;
         }
+
         public final String getB()
         {
             return b;
         }
+
         public final void setB(String b)
         {
             this.b = b;
         }
+
         public final String getC()
         {
             return c;
         }
+
         public final void setC(String c)
         {
             this.c = c;
         }
+
+        //
+        // Object
+        //
+
         @Override
         public String toString()
         {
             return a + b + c;
         }
-        
+
     }
-    
-    private static final class ABCFactoryFactory implements IParserObjectFactoryFactory<ABC>
+
+    public static final class ABCFactoryFactory implements IParserObjectFactoryFactory<ABC>
     {
-        public IParserObjectFactory<ABC> createFactory(IAliasPropertyMapper propertyMapper) throws ParserException
+
+        //
+        // IParserObjectFactoryFactory
+        //
+
+        public final IParserObjectFactory<ABC> createFactory(final IAliasPropertyMapper propertyMapper)
+                throws ParserException
         {
             return new IParserObjectFactory<ABC>()
                 {
-                    public ABC createObject(String[] lineTokens) throws ParserException
+
+                    //
+                    // IParserObjectFactory
+                    //
+
+                    public final ABC createObject(final String[] lineTokens) throws ParserException
                     {
                         ABC abc = new ABC();
                         abc.setA(lineTokens[0]);
@@ -84,22 +108,22 @@ public class TabFileLoaderTest
                 };
         }
     }
-    
+
     @Test
     public void testEmptyInput()
     {
         TabFileLoader<ABC> loader = new TabFileLoader<ABC>(new ABCFactoryFactory());
         List<ABC> list = loader.load(new StringReader(""));
-        
+
         assertEquals(0, list.size());
     }
-    
+
     @Test
     public void testFirstLineHasHeadersWithoutHashSymbolButNoRows()
     {
         TabFileLoader<ABC> loader = new TabFileLoader<ABC>(new ABCFactoryFactory());
         List<ABC> list = loader.load(new StringReader("A\tB\tC\n"));
-        
+
         assertEquals(list.toString(), 0, list.size());
     }
 
@@ -108,39 +132,39 @@ public class TabFileLoaderTest
     {
         loadAndCheck("");
     }
-    
+
     @Test
     public void testFirstLineWithHashSymbol()
     {
         loadAndCheck("#\n");
     }
-    
+
     @Test
     public void testFirstLineWithHashSymbolAndSomething()
     {
         loadAndCheck("#blabla\n");
     }
-    
+
     @Test
     public void testFirstLineHasMarkerAndSecondLineHasHeadersWithHashSymbol()
     {
         loadAndCheck("#\n#");
     }
-    
+
     @Test
     public void testFirstTwoLinesWithHashAndSomething()
     {
         loadAndCheck("#blabla\n" + "#blubub\n");
     }
-    
+
     private void loadAndCheck(String preamble)
     {
         TabFileLoader<ABC> loader = new TabFileLoader<ABC>(new ABCFactoryFactory());
         List<ABC> list = loader.load(new StringReader(preamble + "A\tB\tC\n" + "a1\tb1\tc1\n" + "a2\tb2\tc2\n"));
-        
+
         assertEquals(list.toString(), 2, list.size());
         assertEquals("a1b1c1", list.get(0).toString());
         assertEquals("a2b2c2", list.get(1).toString());
     }
-    
+
 }